Skip to content

Commit 2e290f9

Browse files
mobrien-ghostMichael O’Brien
andauthored
[BUG] Harden isOptional resolving (#67)
Co-authored-by: Michael O’Brien <obrien.michael1@police.qld.gov.au>
1 parent 9ae7f21 commit 2e290f9

File tree

2 files changed

+10
-24
lines changed

2 files changed

+10
-24
lines changed

Sources/SyntaxSparrow/Internal/Extensions/SyntaxProtocol+IsOptional.swift

Lines changed: 7 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -18,27 +18,13 @@ extension SyntaxProtocol {
1818
func resolveIsSyntaxOptional(viewMode: SyntaxTreeViewMode = .fixedUp) -> Bool {
1919
guard self.as(OptionalTypeSyntax.self) == nil else { return true }
2020
guard parent?.as(OptionalTypeSyntax.self) == nil else { return true }
21-
// Token assessment approach
22-
var result = false
23-
var nextToken = nextToken(viewMode: .fixedUp)
24-
var potentialOptional: Bool = nextToken?.text == "?"
25-
while nextToken != nil {
26-
if nextToken?.text == ")" {
27-
potentialOptional = true
28-
}
29-
if potentialOptional, nextToken?.text == ")" {
30-
break
31-
}
32-
if potentialOptional, nextToken?.text == "?" {
33-
result = true
34-
break
35-
}
36-
nextToken = nextToken?.nextToken(viewMode: .fixedUp)
21+
if let parent = parent?.as(TypeAnnotationSyntax.self) {
22+
return parent.type.as(OptionalTypeSyntax.self) != nil
23+
} else if let tupleElement = self.as(TupleTypeElementSyntax.self) {
24+
return tupleElement.type.as(OptionalTypeSyntax.self) != nil
25+
} else if let generic = self.as(GenericArgumentSyntax.self) {
26+
return generic.argument.as(OptionalTypeSyntax.self) != nil
3727
}
38-
// Fallback child approach
39-
if !result, children(viewMode: viewMode).contains(where: { $0.syntaxNodeType == OptionalTypeSyntax.self }) {
40-
return true
41-
}
42-
return result
28+
return false
4329
}
4430
}

Tests/SyntaxSparrowTests/Supporting Types/EntityTypeTests.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ final class EntityTypeTests: XCTestCase {
7878
func test_array_asVariable_willReturnExpectedTypes() throws {
7979
let source = """
8080
var arrayShorthand: [(name: String, age: Int?)]?
81-
var arrayIdentifier: Array<String>)
81+
var arrayIdentifier: Array<String>?
8282
"""
8383
instanceUnderTest.updateToSource(source)
8484
XCTAssertTrue(instanceUnderTest.isStale)
@@ -111,11 +111,11 @@ final class EntityTypeTests: XCTestCase {
111111
target = instanceUnderTest.variables[1]
112112
XCTAssertEqual(target.keyword, "var")
113113
XCTAssertEqual(target.name, "arrayIdentifier")
114-
XCTAssertFalse(target.isOptional)
114+
XCTAssertTrue(target.isOptional)
115115

116116
if case let EntityType.array(array) = target.type {
117117
XCTAssertEqual(array.declType, .generic)
118-
XCTAssertFalse(array.isOptional)
118+
XCTAssertTrue(array.isOptional)
119119
XCTAssertEqual(array.elementType, .simple("String"))
120120
} else {
121121
XCTFail("variable type should be Array")

0 commit comments

Comments
 (0)