this repo has no description www.jonmsterling.com/01HC/
dependent-types proof-assistant swift
13
fork

Configure Feed

Select the types of activity you want to include in your feed.

Use *nontrivial* node span rather than visible node span for provenance

+33 -22
+1 -1
Sources/PterodactylElaborator/Elaborator.swift
··· 236 236 } 237 237 238 238 extension SyntaxTreeCursor: HasProvenance { 239 - public var provenance: Range<Int>? { visibleUtf16Range } 239 + public var provenance: Range<Int>? { nontrivialUtf16Range } 240 240 } 241 241 242 242 extension SyntaxTreeCursor: ElabType {
+32 -21
Sources/PterodactylSyntax/VisibleNodeSearching.swift
··· 18 18 } 19 19 } 20 20 21 - public protocol VisibleNodeSearching { 22 - func firstVisibleNode(under symmetry: ArraySymmetry) -> SyntaxTreeCursor.Child? 21 + public protocol NodeSearching { 22 + func firstToken(under symmetry: ArraySymmetry, satisfying predicate: (Token) -> Bool) -> SyntaxTokenCursor? 23 23 } 24 24 25 - extension VisibleNodeSearching { 26 - public var visibleUtf16Range: Range<Int>? { 25 + extension NodeSearching { 26 + public func utf16RangeClamped(to predicate: (Token) -> Bool) -> Range<Int>? { 27 27 guard 28 - let firstNode = firstVisibleNode(under: .identity), 29 - let lastNode = firstVisibleNode(under: .reverse) 28 + let first = firstToken(under: .identity, satisfying: predicate), 29 + let last = firstToken(under: .reverse, satisfying: predicate) 30 30 else { return nil } 31 - return firstNode.utf16Range.lowerBound..<lastNode.utf16Range.upperBound 31 + return first.utf16Range.lowerBound..<last.utf16Range.upperBound 32 + } 33 + 34 + public var visibleUtf16Range: Range<Int>? { 35 + utf16RangeClamped(to: \.kind.isVisible) 32 36 } 33 - } 34 37 35 - extension SyntaxTreeCursor: VisibleNodeSearching { 36 - public func firstVisibleNode(under symmetry: ArraySymmetry) -> SyntaxTreeCursor.Child? { 37 - for child in children.apply(symmetry: symmetry) { 38 - if let visibleChild = child.firstVisibleNode(under: symmetry) { return visibleChild } 38 + public var nontrivialUtf16Range: Range<Int>? { 39 + utf16RangeClamped { token in 40 + !token.kind.isTrivia 39 41 } 42 + } 43 + } 40 44 41 - return nil 45 + extension SyntaxTokenCursor: NodeSearching { 46 + public func firstToken(under symmetry: ArraySymmetry, satisfying predicate: (Token) -> Bool) -> SyntaxTokenCursor? { 47 + if predicate(token) { self } else { nil } 42 48 } 43 49 } 44 50 45 - extension SyntaxTokenCursor: VisibleNodeSearching { 46 - public func firstVisibleNode(under symmetry: ArraySymmetry) -> SyntaxTreeCursor.Child? { 47 - token.kind.isVisible ? .token(self) : nil 51 + extension SyntaxTreeCursor.Child: NodeSearching { 52 + public func firstToken(under symmetry: ArraySymmetry, satisfying predicate: (Token) -> Bool) -> SyntaxTokenCursor? { 53 + switch self { 54 + case .token(let syntaxTokenCursor): syntaxTokenCursor.firstToken(under: symmetry, satisfying: predicate) 55 + case .tree(let syntaxTreeCursor): syntaxTreeCursor.firstToken(under: symmetry, satisfying: predicate) 56 + } 48 57 } 49 58 } 50 59 51 - extension SyntaxTreeCursor.Child { 52 - public func firstVisibleNode(under symmetry: ArraySymmetry) -> SyntaxTreeCursor.Child? { 53 - switch self { 54 - case .token(let syntaxTokenCursor): syntaxTokenCursor.firstVisibleNode(under: symmetry) 55 - case .tree(let syntaxTreeCursor): syntaxTreeCursor.firstVisibleNode(under: symmetry) 60 + extension SyntaxTreeCursor: NodeSearching { 61 + public func firstToken(under symmetry: ArraySymmetry, satisfying predicate: (Token) -> Bool) -> SyntaxTokenCursor? { 62 + for child in children.apply(symmetry: symmetry) { 63 + if let first = child.firstToken(under: symmetry, satisfying: predicate) { return first } 56 64 } 65 + 66 + return nil 57 67 } 58 68 } 69 +