Skip to content

Commit e41072e

Browse files
authored
Merge pull request #1439 from DougGregor/no-value-like-macros
Simplify MacroDecl syntax to match the accepted proposals
2 parents 39b3336 + baa087e commit e41072e

File tree

7 files changed

+19
-110
lines changed

7 files changed

+19
-110
lines changed

CodeGeneration/Sources/SyntaxSupport/DeclNodes.swift

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1026,18 +1026,7 @@ public let DECL_NODES: [Node] = [
10261026
),
10271027
Child(
10281028
name: "Signature",
1029-
kind: .nodeChoices(choices: [
1030-
Child(
1031-
name: "FunctionLike",
1032-
kind: .node(kind: "FunctionSignature"),
1033-
nameForDiagnostics: "macro signature"
1034-
),
1035-
Child(
1036-
name: "ValueLike",
1037-
kind: .node(kind: "TypeAnnotation"),
1038-
nameForDiagnostics: "macro signature"
1039-
),
1040-
]),
1029+
kind: .node(kind: "FunctionSignature"),
10411030
nameForDiagnostics: "macro signature"
10421031
),
10431032
Child(

Sources/SwiftParser/Declarations.swift

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2164,15 +2164,7 @@ extension Parser {
21642164
}
21652165

21662166
// Macro signature, which is either value-like or function-like.
2167-
let signature: RawMacroDeclSyntax.Signature
2168-
if let colon = self.consume(if: .colon) {
2169-
let type = self.parseType()
2170-
signature = .valueLike(
2171-
RawTypeAnnotationSyntax(colon: colon, type: type, arena: self.arena)
2172-
)
2173-
} else {
2174-
signature = .functionLike(self.parseFunctionSignature())
2175-
}
2167+
let signature = self.parseFunctionSignature()
21762168

21772169
// Initializer, if any.
21782170
let definition: RawInitializerClauseSyntax?

Sources/SwiftSyntax/generated/raw/RawSyntaxNodes.swift

Lines changed: 3 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -12346,37 +12346,6 @@ public struct RawLayoutRequirementSyntax: RawSyntaxNodeProtocol {
1234612346

1234712347
@_spi(RawSyntax)
1234812348
public struct RawMacroDeclSyntax: RawDeclSyntaxNodeProtocol {
12349-
@frozen // FIXME: Not actually stable, works around a miscompile
12350-
public enum Signature: RawSyntaxNodeProtocol {
12351-
case `functionLike`(RawFunctionSignatureSyntax)
12352-
case `valueLike`(RawTypeAnnotationSyntax)
12353-
12354-
public static func isKindOf(_ raw: RawSyntax) -> Bool {
12355-
return RawFunctionSignatureSyntax.isKindOf(raw) || RawTypeAnnotationSyntax.isKindOf(raw)
12356-
}
12357-
12358-
public var raw: RawSyntax {
12359-
switch self {
12360-
case .functionLike(let node):
12361-
return node.raw
12362-
case .valueLike(let node):
12363-
return node.raw
12364-
}
12365-
}
12366-
12367-
public init?<T>(_ other: T) where T : RawSyntaxNodeProtocol {
12368-
if let node = RawFunctionSignatureSyntax(other) {
12369-
self = .functionLike(node)
12370-
return
12371-
}
12372-
if let node = RawTypeAnnotationSyntax(other) {
12373-
self = .valueLike(node)
12374-
return
12375-
}
12376-
return nil
12377-
}
12378-
}
12379-
1238012349
@_spi(RawSyntax)
1238112350
public var layoutView: RawSyntaxLayoutView {
1238212351
return raw.layoutView!
@@ -12416,7 +12385,7 @@ public struct RawMacroDeclSyntax: RawDeclSyntaxNodeProtocol {
1241612385
_ unexpectedBetweenIdentifierAndGenericParameterClause: RawUnexpectedNodesSyntax? = nil,
1241712386
genericParameterClause: RawGenericParameterClauseSyntax?,
1241812387
_ unexpectedBetweenGenericParameterClauseAndSignature: RawUnexpectedNodesSyntax? = nil,
12419-
signature: Signature,
12388+
signature: RawFunctionSignatureSyntax,
1242012389
_ unexpectedBetweenSignatureAndDefinition: RawUnexpectedNodesSyntax? = nil,
1242112390
definition: RawInitializerClauseSyntax?,
1242212391
_ unexpectedBetweenDefinitionAndGenericWhereClause: RawUnexpectedNodesSyntax? = nil,
@@ -12492,8 +12461,8 @@ public struct RawMacroDeclSyntax: RawDeclSyntaxNodeProtocol {
1249212461
layoutView.children[10].map(RawUnexpectedNodesSyntax.init(raw:))
1249312462
}
1249412463

12495-
public var signature: RawSyntax {
12496-
layoutView.children[11]!
12464+
public var signature: RawFunctionSignatureSyntax {
12465+
layoutView.children[11].map(RawFunctionSignatureSyntax.init(raw:))!
1249712466
}
1249812467

1249912468
public var unexpectedBetweenSignatureAndDefinition: RawUnexpectedNodesSyntax? {

Sources/SwiftSyntax/generated/raw/RawSyntaxValidation.swift

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1618,8 +1618,7 @@ func validateLayout(layout: RawSyntaxBuffer, as kind: SyntaxKind) {
16181618
assertNoError(kind, 8, verify(layout[8], as: RawUnexpectedNodesSyntax?.self))
16191619
assertNoError(kind, 9, verify(layout[9], as: RawGenericParameterClauseSyntax?.self))
16201620
assertNoError(kind, 10, verify(layout[10], as: RawUnexpectedNodesSyntax?.self))
1621-
assertAnyHasNoError(kind, 11, [
1622-
verify(layout[11], as: RawSyntax.self)])
1621+
assertNoError(kind, 11, verify(layout[11], as: RawFunctionSignatureSyntax.self))
16231622
assertNoError(kind, 12, verify(layout[12], as: RawUnexpectedNodesSyntax?.self))
16241623
assertNoError(kind, 13, verify(layout[13], as: RawInitializerClauseSyntax?.self))
16251624
assertNoError(kind, 14, verify(layout[14], as: RawUnexpectedNodesSyntax?.self))

Sources/SwiftSyntax/generated/syntaxNodes/SyntaxDeclNodes.swift

Lines changed: 3 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -3943,48 +3943,6 @@ extension InitializerDeclSyntax: CustomReflectable {
39433943

39443944

39453945
public struct MacroDeclSyntax: DeclSyntaxProtocol, SyntaxHashable {
3946-
public enum Signature: SyntaxChildChoices {
3947-
case `functionLike`(FunctionSignatureSyntax)
3948-
case `valueLike`(TypeAnnotationSyntax)
3949-
3950-
public var _syntaxNode: Syntax {
3951-
switch self {
3952-
case .functionLike(let node):
3953-
return node._syntaxNode
3954-
case .valueLike(let node):
3955-
return node._syntaxNode
3956-
}
3957-
}
3958-
3959-
init(_ data: SyntaxData) {
3960-
self.init(Syntax(data))!
3961-
}
3962-
3963-
public init(_ node: FunctionSignatureSyntax) {
3964-
self = .functionLike(node)
3965-
}
3966-
3967-
public init(_ node: TypeAnnotationSyntax) {
3968-
self = .valueLike(node)
3969-
}
3970-
3971-
public init?<S: SyntaxProtocol>(_ node: S) {
3972-
if let node = node.as(FunctionSignatureSyntax.self) {
3973-
self = .functionLike(node)
3974-
return
3975-
}
3976-
if let node = node.as(TypeAnnotationSyntax.self) {
3977-
self = .valueLike(node)
3978-
return
3979-
}
3980-
return nil
3981-
}
3982-
3983-
public static var structure: SyntaxNodeStructure {
3984-
return .choices([.node(FunctionSignatureSyntax.self), .node(TypeAnnotationSyntax.self)])
3985-
}
3986-
}
3987-
39883946
public let _syntaxNode: Syntax
39893947

39903948
public init?<S: SyntaxProtocol>(_ node: S) {
@@ -4015,7 +3973,7 @@ public struct MacroDeclSyntax: DeclSyntaxProtocol, SyntaxHashable {
40153973
_ unexpectedBetweenIdentifierAndGenericParameterClause: UnexpectedNodesSyntax? = nil,
40163974
genericParameterClause: GenericParameterClauseSyntax? = nil,
40173975
_ unexpectedBetweenGenericParameterClauseAndSignature: UnexpectedNodesSyntax? = nil,
4018-
signature: Signature,
3976+
signature: FunctionSignatureSyntax,
40193977
_ unexpectedBetweenSignatureAndDefinition: UnexpectedNodesSyntax? = nil,
40203978
definition: InitializerClauseSyntax? = nil,
40213979
_ unexpectedBetweenDefinitionAndGenericWhereClause: UnexpectedNodesSyntax? = nil,
@@ -4213,9 +4171,9 @@ public struct MacroDeclSyntax: DeclSyntaxProtocol, SyntaxHashable {
42134171
}
42144172
}
42154173

4216-
public var signature: Signature {
4174+
public var signature: FunctionSignatureSyntax {
42174175
get {
4218-
return Signature(data.child(at: 11, parent: Syntax(self))!)
4176+
return FunctionSignatureSyntax(data.child(at: 11, parent: Syntax(self))!)
42194177
}
42204178
set(value) {
42214179
self = MacroDeclSyntax(data.replacingChild(at: 11, with: value.raw, arena: SyntaxArena()))

Sources/SwiftSyntaxMacros/MacroReplacement.swift

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -114,11 +114,7 @@ fileprivate class ParameterReplacementVisitor: SyntaxAnyVisitor {
114114
// of a macro.
115115
override func visit(_ node: IdentifierExprSyntax) -> SyntaxVisitorContinueKind {
116116
let identifier = node.identifier
117-
118-
// FIXME: This will go away.
119-
guard case let .functionLike(signature) = macro.signature else {
120-
return .visitChildren
121-
}
117+
let signature = macro.signature
122118

123119
let matchedParameter = signature.input.parameterList.enumerated().first { (index, parameter) in
124120
if identifier.text == "_" {

Tests/SwiftParserTest/DeclarationTests.swift

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1334,12 +1334,18 @@ final class DeclarationTests: XCTestCase {
13341334
func testMacroDecl() {
13351335
assertParse(
13361336
"""
1337-
macro m1: Int = A.M1
1337+
macro m11️⃣: Int = A.M1
13381338
macro m2(_: Int) = A.M2
13391339
macro m3(a b: Int) -> Int = A.M3
1340-
macro m4<T>: T = A.M4 where T.Assoc: P
1340+
macro m4<T>2️⃣: T = A.M4 where T.Assoc: P
13411341
macro m5<T: P>(_: T)
1342-
"""
1342+
""",
1343+
diagnostics: [
1344+
DiagnosticSpec(locationMarker: "1️⃣", message: "expected parameter clause in function signature"),
1345+
DiagnosticSpec(locationMarker: "1️⃣", message: "unexpected code ': Int = A.M1' before macro"),
1346+
DiagnosticSpec(locationMarker: "2️⃣", message: "expected parameter clause in function signature"),
1347+
DiagnosticSpec(locationMarker: "2️⃣", message: "unexpected code ': T = A.M4 where T.Assoc: P' before macro"),
1348+
]
13431349
)
13441350

13451351
assertParse(

0 commit comments

Comments
 (0)