Skip to content

Commit a63ade8

Browse files
committed
Make Identifier initializer failable
When trying to create an Identifier from a non-identifier token, the initializer should fail, returning nil Additionally the identifier property of the TokenSyntax should also return nil
1 parent 336b4b3 commit a63ade8

File tree

3 files changed

+14
-6
lines changed

3 files changed

+14
-6
lines changed

Sources/SwiftSyntax/Identifier.swift

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,10 @@ public struct Identifier: Equatable, Hashable, Sendable {
1515
/// The sanitized `text` of a token.
1616
public let name: String
1717

18-
public init(_ token: TokenSyntax) {
19-
let text = token.text
18+
public init?(_ token: TokenSyntax) {
19+
guard case .identifier(let text) = token.tokenKind else {
20+
return nil
21+
}
2022

2123
self.name =
2224
if text.contains("`") {

Sources/SwiftSyntax/TokenSyntax.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ public struct TokenSyntax: SyntaxProtocol, SyntaxHashable {
154154
}
155155

156156
/// An identifier created from `self`.
157-
public var identifier: Identifier {
157+
public var identifier: Identifier? {
158158
Identifier(self)
159159
}
160160

Tests/SwiftSyntaxTest/IdentifierTests.swift

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,23 @@ import XCTest
1616
class IdentifierTests: XCTestCase {
1717
public func testInit() {
1818
let basicToken = TokenSyntax(stringLiteral: "sometoken")
19-
XCTAssertEqual(Identifier(basicToken).name, "sometoken")
19+
XCTAssertEqual(Identifier(basicToken)?.name, "sometoken")
2020

2121
let backtickedToken = TokenSyntax(stringLiteral: "`backtickedtoken`")
22-
XCTAssertEqual(Identifier(backtickedToken).name, "backtickedtoken")
22+
XCTAssertEqual(Identifier(backtickedToken)?.name, "backtickedtoken")
2323

2424
let multiBacktickedToken = TokenSyntax(stringLiteral: "```backtickedtoken```")
25-
XCTAssertEqual(Identifier(multiBacktickedToken).name, "backtickedtoken")
25+
XCTAssertEqual(Identifier(multiBacktickedToken)?.name, "backtickedtoken")
26+
27+
let nonIdentifierToken = DeclSyntax("let a = 1").firstToken(viewMode: .all)!
28+
XCTAssertNil(Identifier(nonIdentifierToken))
2629
}
2730

2831
public func testTokenSyntaxIdentifier() {
2932
let tokenSyntax = TokenSyntax(stringLiteral: "sometoken")
3033
XCTAssertEqual(tokenSyntax.identifier, Identifier(tokenSyntax))
34+
35+
let nonIdentifierToken = DeclSyntax("let a = 1").firstToken(viewMode: .all)!
36+
XCTAssertNil(nonIdentifierToken.identifier)
3137
}
3238
}

0 commit comments

Comments
 (0)