Use Syntax.Comment in EditorTextView

This commit is contained in:
1024jp 2024-03-05 00:08:04 +09:00
parent 21b6520b4c
commit f5e9650eca
4 changed files with 16 additions and 20 deletions

View File

@ -85,8 +85,7 @@ struct CommentTypes: OptionSet {
protocol Commenting: NSTextView {
var inlineCommentDelimiter: String? { get }
var blockCommentDelimiters: Pair<String>? { get }
var commentDelimiters: Syntax.Comment { get }
}
@ -102,7 +101,7 @@ extension Commenting {
func commentOut(types: CommentTypes, fromLineHead: Bool) {
guard
self.blockCommentDelimiters != nil || self.inlineCommentDelimiter != nil,
self.commentDelimiters.block != nil || self.commentDelimiters.inline != nil,
let selectedRanges = self.rangesForUserTextChange?.map(\.rangeValue)
else { return }
@ -111,10 +110,10 @@ extension Commenting {
.map { fromLineHead ? self.string.lineContentsRange(for: $0) : $0 }
.unique
if types.contains(.inline), let delimiter = self.inlineCommentDelimiter {
if types.contains(.inline), let delimiter = self.commentDelimiters.inline {
return self.string.inlineCommentOut(delimiter: delimiter, ranges: targetRanges)
}
if types.contains(.block), let delimiters = self.blockCommentDelimiters {
if types.contains(.block), let delimiters = self.commentDelimiters.block {
return self.string.blockCommentOut(delimiters: delimiters, ranges: targetRanges)
}
return []
@ -135,18 +134,18 @@ extension Commenting {
func uncomment() {
guard
self.blockCommentDelimiters != nil || self.inlineCommentDelimiter != nil,
self.commentDelimiters.block != nil || self.commentDelimiters.inline != nil,
let selectedRanges = self.rangesForUserTextChange?.map(\.rangeValue)
else { return }
let deletionRanges: [NSRange] = {
if let delimiters = self.blockCommentDelimiters {
if let delimiters = self.commentDelimiters.block {
let targetRanges = selectedRanges.map { $0.isEmpty ? self.string.lineContentsRange(for: $0) : $0 }.unique
if let ranges = self.string.rangesOfBlockDelimiters(delimiters, ranges: targetRanges) {
return ranges
}
}
if let delimiter = self.inlineCommentDelimiter {
if let delimiter = self.commentDelimiters.inline {
let targetRanges = selectedRanges.map { self.string.lineContentsRange(for: $0) }.unique
if let ranges = self.string.rangesOfInlineDelimiter(delimiter, ranges: targetRanges) {
return ranges
@ -173,7 +172,7 @@ extension Commenting {
func canUncomment(partly: Bool) -> Bool {
guard
self.blockCommentDelimiters != nil || self.inlineCommentDelimiter != nil,
self.commentDelimiters.block != nil || self.commentDelimiters.inline != nil,
let targetRanges = self.rangesForUserTextChange?.map(\.rangeValue)
.map(self.string.lineContentsRange(for:))
.filter({ !$0.isEmpty })
@ -181,13 +180,13 @@ extension Commenting {
!targetRanges.isEmpty
else { return false }
if let delimiters = self.blockCommentDelimiters,
if let delimiters = self.commentDelimiters.block,
let ranges = self.string.rangesOfBlockDelimiters(delimiters, ranges: targetRanges)
{
return partly ? true : (ranges.count == (2 * targetRanges.count))
}
if let delimiter = self.inlineCommentDelimiter,
if let delimiter = self.commentDelimiters.inline,
let ranges = self.string.rangesOfInlineDelimiter(delimiter, ranges: targetRanges)
{
let lineRanges = targetRanges.flatMap { self.string.lineContentsRanges(for: $0) }.unique

View File

@ -67,8 +67,7 @@ class EditorTextView: NSTextView, Themable, CurrentLineHighlighting, MultiCursor
var isAutomaticCompletionEnabled = false
var isAutomaticIndentEnabled = false
var inlineCommentDelimiter: String?
var blockCommentDelimiters: Pair<String>?
var commentDelimiters: Syntax.Comment = Syntax.Comment()
var syntaxCompletionWords: [String] = []
var needsUpdateLineHighlight = true {
@ -1134,13 +1133,13 @@ class EditorTextView: NSTextView, Themable, CurrentLineHighlighting, MultiCursor
(item as? NSMenuItem)?.title = self.canUncomment(partly: false)
? String(localized: "Uncomment", table: "MainMenu")
: String(localized: "Comment Out", table: "MainMenu")
return (self.inlineCommentDelimiter != nil) || (self.blockCommentDelimiters != nil)
return (self.commentDelimiters.inline != nil) || (self.commentDelimiters.block != nil)
case #selector(inlineCommentOut):
return (self.inlineCommentDelimiter != nil)
return (self.commentDelimiters.inline != nil)
case #selector(blockCommentOut):
return (self.blockCommentDelimiters != nil)
return (self.commentDelimiters.block != nil)
case #selector(uncomment(_:)):
return self.canUncomment(partly: true)

View File

@ -166,8 +166,7 @@ final class EditorViewController: NSSplitViewController {
guard let textView = self.textView else { return assertionFailure() }
textView.inlineCommentDelimiter = syntax.commentDelimiters.inline
textView.blockCommentDelimiters = syntax.commentDelimiters.block
textView.commentDelimiters = syntax.commentDelimiters
textView.syntaxCompletionWords = syntax.completionWords
self.invalidateMode()

View File

@ -163,8 +163,7 @@ final class StringCommentingTests: XCTestCase {
private final class CommentingTextView: NSTextView, Commenting, MultiCursorEditing {
// Commenting
var inlineCommentDelimiter: String? = "//"
var blockCommentDelimiters: Pair<String>? = Pair("<-", "->")
var commentDelimiters = Syntax.Comment(inline: "//", blockBegin: "<-", blockEnd: "->")
// MultiCursorEditing
var insertionLocations: [Int] = []