diff options
| author | Ruben Beltran del Rio <git@r.bdr.sh> | 2025-07-11 09:27:49 +0200 |
|---|---|---|
| committer | Ruben Beltran del Rio <git@r.bdr.sh> | 2025-07-11 09:27:49 +0200 |
| commit | 8564439356f4bcc3e21b19738eb87b4c0722c623 (patch) | |
| tree | 1465f4e48be83d255e5c68de804ba940db238bea /Map/Business | |
| parent | ff3619fdf3fce82d95124654a18b66ca3ed380cd (diff) | |
Add missing vertex detection
Diffstat (limited to 'Map/Business')
| -rw-r--r-- | Map/Business/WmapParser/Parser.swift | 17 | ||||
| -rw-r--r-- | Map/Business/WmapSyntaxHighlighter/SyntaxHighlighter.swift | 25 |
2 files changed, 36 insertions, 6 deletions
diff --git a/Map/Business/WmapParser/Parser.swift b/Map/Business/WmapParser/Parser.swift index 9418263..86c36ef 100644 --- a/Map/Business/WmapParser/Parser.swift +++ b/Map/Business/WmapParser/Parser.swift @@ -15,6 +15,12 @@ import Foundation extension Wmap { + + struct ParsedMap { + let entities: [Entity] + let vertexLabels: Set<String> + } + class Parser { private let lexer: Lexer private var currentToken: Token @@ -25,8 +31,9 @@ extension Wmap { self.currentToken = lexer.nextToken() } - func parse() -> [Entity] { + func parse() -> ParsedMap { var entities: [Entity] = [] + var vertexLabels: Set<String> = Set() while currentToken.type != .eof { if currentToken.type == .newline { @@ -37,6 +44,12 @@ extension Wmap { do { let entity = try parseEntity() entities.append(entity) + switch entity { + case .vertex(let vertex): + vertexLabels.insert(vertex.label) + default: + break + } if currentToken.type == .newline { advance() @@ -48,7 +61,7 @@ extension Wmap { } } - return entities + return ParsedMap(entities: entities, vertexLabels: vertexLabels) } private func parseEntity() throws -> Entity { diff --git a/Map/Business/WmapSyntaxHighlighter/SyntaxHighlighter.swift b/Map/Business/WmapSyntaxHighlighter/SyntaxHighlighter.swift index e0aaee7..d51a80f 100644 --- a/Map/Business/WmapSyntaxHighlighter/SyntaxHighlighter.swift +++ b/Map/Business/WmapSyntaxHighlighter/SyntaxHighlighter.swift @@ -16,11 +16,13 @@ import AppKit extension Wmap { class SyntaxHighlighter { - private var cachedSyntaxElements: [SyntaxElement] = [] + var cachedSyntaxElements: [SyntaxElement] = [] private var lineToElementsMap: [Int: [SyntaxElement]] = [:] + private var cachedVertexLabels: Set<String> = Set() - func updateSyntaxElements(from parsedMap: [Entity]) { - cachedSyntaxElements = parsedMap.flatMap { $0.syntaxElements } + func updateSyntaxElements(from parsedMap: Wmap.ParsedMap) { + cachedSyntaxElements = parsedMap.entities.flatMap { $0.syntaxElements } + cachedVertexLabels = parsedMap.vertexLabels // Build line-to-elements mapping for fast lookup lineToElementsMap.removeAll() @@ -55,7 +57,22 @@ extension Wmap { } let color = colorForSyntaxType(element.type) - textStorage.addAttribute(.foregroundColor, value: color, range: nsRange) + var attributes: [NSAttributedString.Key: Any] = [ + .foregroundColor: color + ] + + if UserDefaults.standard.bool(forKey: "useSmartEditor") { + if element.type == .vertexLabel && !cachedVertexLabels.contains(element.value) { + if UserDefaults.standard.bool(forKey: "highlightMissingComponents") { + attributes[.underlineStyle] = + NSUnderlineStyle.thick.rawValue | NSUnderlineStyle.patternDot.rawValue + attributes[.underlineColor] = NSColor.Theme.Syntax.error + attributes[.init("MissingComponent")] = element.value + } + } + } + + textStorage.addAttributes(attributes, range: nsRange) } } |