Swift Macros - SwiftSyntax 节点指南

355 阅读4分钟

版本:2025.04.27|维护者:Mccc|欢迎共同维护与补充!

在编写 Swift 宏时,你将频繁与 SwiftSyntax 打交道。SwiftSyntax 将源码拆解为结构化的语法节点(Syntax)树,这些节点覆盖了表达式、声明、语句、类型、模式、属性等各个层面。

本篇文章提供一个实用速查表,帮助你快速了解各类常见语法节点的用途与构造方法,便于高效构建宏所需的代码结构。

目录

1. 表达式(ExprSyntax)

用于表示各种计算表达式、函数调用、字面量等,是最常见的语法结构之一。

名称描述快速构造示例
ArrayExprSyntax数组表达式 [a, b, c]ArrayExprSyntax(elements: [...])
BooleanLiteralExprSyntax布尔字面量 true / falseBooleanLiteralExprSyntax(value: true)
IntegerLiteralExprSyntax整数字面量 123IntegerLiteralExprSyntax(literal: "123")
FloatLiteralExprSyntax浮点字面量 1.23FloatLiteralExprSyntax(floatingDigits: "1.23")
StringLiteralExprSyntax字符串 "abc"StringLiteralExprSyntax(content: "abc")
IdentifierExprSyntax标识符 fooIdentifierExprSyntax(identifier: .identifier("foo"))
FunctionCallExprSyntax函数调用 foo(a, b)FunctionCallExprSyntax(calledExpression: ..., arguments: [...])
MemberAccessExprSyntax成员访问 a.bMemberAccessExprSyntax(base: ..., name: .identifier("b"))
PrefixOperatorExprSyntax前缀操作 -aPrefixOperatorExprSyntax(operator: "-", expression: ...)
PostfixOperatorExprSyntax后缀操作 a!PostfixOperatorExprSyntax(expression: ...)
NilLiteralExprSyntax空值 nilNilLiteralExprSyntax()
ClosureExprSyntax闭包 { a in a + 1 }ClosureExprSyntax(parameters: ..., statements: [...])
TupleExprSyntax元组 (a, b)TupleExprSyntax(elements: [...])
TryExprSyntaxtry 表达式TryExprSyntax(expression: ...)
AwaitExprSyntaxawait 表达式AwaitExprSyntax(expression: ...)
AsExprSyntax类型转换 asAsExprSyntax(expression: ..., type: ...)
IsExprSyntax类型检查 isIsExprSyntax(expression: ..., type: ...)
TernaryExprSyntax三目表达式 a ? b : cTernaryExprSyntax(condition: ..., thenExpr: ..., elseExpr: ...)
SequenceExprSyntax表达式序列 1 + 2 * 3SequenceExprSyntax(elements: [...])

💡 技巧: 中缀表达式(如 +, -, *)统一由 SequenceExprSyntax 表示,不再有 BinaryExpr。

2. 声明(DeclSyntax)

表示变量、函数、类型、协议等的定义,是构建宏时生成结构代码的核心组成。

名称描述快速构造示例
VariableDeclSyntax变量 let/varVariableDeclSyntax(bindingSpecifier: "let", bindings: [...])
FunctionDeclSyntax函数FunctionDeclSyntax(name: "foo", signature: ..., body: ...)
StructDeclSyntax结构体StructDeclSyntax(identifier: "Foo", memberBlock: ...)
ClassDeclSyntaxClassDeclSyntax(identifier: "Foo", memberBlock: ...)
EnumDeclSyntax枚举EnumDeclSyntax(identifier: "Foo", memberBlock: ...)
ExtensionDeclSyntax扩展ExtensionDeclSyntax(extendedType: ..., memberBlock: ...)
ProtocolDeclSyntax协议ProtocolDeclSyntax(identifier: "Foo", memberBlock: ...)
ImportDeclSyntax导入模块ImportDeclSyntax(path: ["Foundation"])
TypeAliasDeclSyntax类型别名TypeAliasDeclSyntax(identifier: "Alias", type: ...)
AssociatedTypeDeclSyntax协议中关联类型AssociatedTypeDeclSyntax(identifier: "T")
MacroDeclSyntax宏声明MacroDeclSyntax(identifier: "MyMacro")
OperatorDeclSyntax自定义操作符声明OperatorDeclSyntax(operatorKeyword: "operator", name: "+")

3. 语句(StmtSyntax)

用于构建控制流程语句(if、guard、switch 等)和函数体内逻辑结构。

名称描述快速构造示例
IfStmtSyntaxif 语句IfStmtSyntax(conditions: [...], body: ...)
GuardStmtSyntaxguard 语句GuardStmtSyntax(conditions: [...], body: ...)
WhileStmtSyntaxwhile 循环WhileStmtSyntax(conditions: [...], body: ...)
RepeatWhileStmtSyntaxrepeat-while 循环RepeatWhileStmtSyntax(body: ..., condition: ...)
ForStmtSyntaxfor-in 循环ForStmtSyntax(pattern: ..., inExpr: ..., body: ...)
SwitchStmtSyntaxswitch 分支SwitchStmtSyntax(expression: ..., cases: [...])
ReturnStmtSyntaxreturn 返回ReturnStmtSyntax(expression: ...)
ThrowStmtSyntax抛出异常ThrowStmtSyntax(expression: ...)
BreakStmtSyntaxbreak 跳出BreakStmtSyntax()
ContinueStmtSyntaxcontinue 继续ContinueStmtSyntax()
DeferStmtSyntaxdefer 延后执行DeferStmtSyntax(body: ...)

4. 类型(TypeSyntax)

用于表示类型声明,包括简单类型、数组、可选、元组、函数类型等。

名称描述快速构造示例
SimpleTypeIdentifierSyntax基本类型 Int, StringSimpleTypeIdentifierSyntax(name: "Int")
OptionalTypeSyntax可选类型 Int?OptionalTypeSyntax(wrappedType: ...)
ArrayTypeSyntax数组类型 [Int]ArrayTypeSyntax(elementType: ...)
DictionaryTypeSyntax字典类型 [K: V]DictionaryTypeSyntax(keyType: ..., valueType: ...)
TupleTypeSyntax元组类型 (Int, String)TupleTypeSyntax(elements: [...])
FunctionTypeSyntax函数类型 (Int) -> BoolFunctionTypeSyntax(parameters: [...], returnType: ...)
AttributedTypeSyntax带属性类型 @SendableAttributedTypeSyntax(attributes: [...], baseType: ...)
SomeTypeSyntaxsome 类型SomeTypeSyntax(baseType: ...)
MetatypeTypeSyntax.Type .ProtocolMetatypeTypeSyntax(baseType: ..., typeOrProtocol: ...)
ExistentialTypeSyntaxany 协议类型ExistentialTypeSyntax(type: ...)

5. 模式(PatternSyntax)

用于 let/var 绑定、模式匹配等结构。

名称描述快速构造示例
IdentifierPatternSyntax标识符模式IdentifierPatternSyntax(identifier: .identifier("name"))
TuplePatternSyntax元组模式TuplePatternSyntax(elements: [...])
WildcardPatternSyntax通配符 _WildcardPatternSyntax()
ValueBindingPatternSyntaxlet/var 模式ValueBindingPatternSyntax(bindingSpecifier: "let", pattern: ...)
ExpressionPatternSyntax表达式匹配ExpressionPatternSyntax(expression: ...)

6. 属性(AttributeSyntax)

用于修饰声明,包括标准属性和自定义属性包装器。

名称描述快速构造示例
AttributeSyntax标准属性AttributeSyntax(attributeName: "available")
CustomAttributeSyntax自定义属性CustomAttributeSyntax(attributeName: "MyWrapper")

7. 宏(MacroExpansionSyntax)

专门用于表示宏的使用与展开。

名称描述快速构造示例
FreestandingMacroExpansionSyntax表达式独立宏 #stringify(x)FreestandingMacroExpansionSyntax(macroName: "stringify", arguments: [...])
AttributeMacroExpansionSyntax属性宏 @MyMacroAttributeMacroExpansionSyntax(macroName: "MyMacro", arguments: [...])
AccessorMacroExpansionSyntaxAccessor 宏(getter/setter)AccessorMacroExpansionSyntax(macroName: "MyAccessor")

8. 其他常用节点

名称描述快速构造示例
CodeBlockSyntax一组语句块 { ... }CodeBlockSyntax(statements: [...])
MemberDeclListSyntax成员声明列表MemberDeclListSyntax(members: [...])
ParameterClauseSyntax参数签名 (x: Int)ParameterClauseSyntax(parameters: [...])
TupleExprElementListSyntax元组表达式元素列表TupleExprElementListSyntax(elements: [...])
TokenSyntax基础 Token,如标识符/关键字等.identifier("foo"), .keyword(.func)
SourceFileSyntax整个 Swift 源文件语法结构SourceFileSyntax(statements: [...])

来源

为了确保内容的准确性和时效性,欢迎您定期参考官方文档和资源:

swift-syntax源码

SwiftSyntax文档

如有更新,提交MR,一起维护它。