mirror of
https://github.com/coteditor/CotEditor.git
synced 2024-09-19 07:07:18 +03:00
Use Syntax.Comment in EditorTextView
This commit is contained in:
parent
21b6520b4c
commit
f5e9650eca
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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()
|
||||
|
@ -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] = []
|
||||
|
Loading…
Reference in New Issue
Block a user