版本:2025.04.27|维护者:Mccc|欢迎共同维护与补充!
在编写 Swift 宏时,你将频繁与 SwiftSyntax 打交道。SwiftSyntax 将源码拆解为结构化的语法节点(Syntax)树,这些节点覆盖了表达式、声明、语句、类型、模式、属性等各个层面。
本篇文章提供一个实用速查表,帮助你快速了解各类常见语法节点的用途与构造方法,便于高效构建宏所需的代码结构。
目录
- 1. 表达式(ExprSyntax)
- 2. 声明(DeclSyntax)
- 3. 语句(StmtSyntax)
- 4. 类型(TypeSyntax)
- 5. 模式(PatternSyntax)
- 6. 属性(AttributeSyntax)
- 7. 宏(MacroExpansionSyntax)
- 8. 其他常用节点
1. 表达式(ExprSyntax)
用于表示各种计算表达式、函数调用、字面量等,是最常见的语法结构之一。
| 名称 | 描述 | 快速构造示例 |
|---|---|---|
| ArrayExprSyntax | 数组表达式 [a, b, c] | ArrayExprSyntax(elements: [...]) |
| BooleanLiteralExprSyntax | 布尔字面量 true / false | BooleanLiteralExprSyntax(value: true) |
| IntegerLiteralExprSyntax | 整数字面量 123 | IntegerLiteralExprSyntax(literal: "123") |
| FloatLiteralExprSyntax | 浮点字面量 1.23 | FloatLiteralExprSyntax(floatingDigits: "1.23") |
| StringLiteralExprSyntax | 字符串 "abc" | StringLiteralExprSyntax(content: "abc") |
| IdentifierExprSyntax | 标识符 foo | IdentifierExprSyntax(identifier: .identifier("foo")) |
| FunctionCallExprSyntax | 函数调用 foo(a, b) | FunctionCallExprSyntax(calledExpression: ..., arguments: [...]) |
| MemberAccessExprSyntax | 成员访问 a.b | MemberAccessExprSyntax(base: ..., name: .identifier("b")) |
| PrefixOperatorExprSyntax | 前缀操作 -a | PrefixOperatorExprSyntax(operator: "-", expression: ...) |
| PostfixOperatorExprSyntax | 后缀操作 a! | PostfixOperatorExprSyntax(expression: ...) |
| NilLiteralExprSyntax | 空值 nil | NilLiteralExprSyntax() |
| ClosureExprSyntax | 闭包 { a in a + 1 } | ClosureExprSyntax(parameters: ..., statements: [...]) |
| TupleExprSyntax | 元组 (a, b) | TupleExprSyntax(elements: [...]) |
| TryExprSyntax | try 表达式 | TryExprSyntax(expression: ...) |
| AwaitExprSyntax | await 表达式 | AwaitExprSyntax(expression: ...) |
| AsExprSyntax | 类型转换 as | AsExprSyntax(expression: ..., type: ...) |
| IsExprSyntax | 类型检查 is | IsExprSyntax(expression: ..., type: ...) |
| TernaryExprSyntax | 三目表达式 a ? b : c | TernaryExprSyntax(condition: ..., thenExpr: ..., elseExpr: ...) |
| SequenceExprSyntax | 表达式序列 1 + 2 * 3 | SequenceExprSyntax(elements: [...]) |
💡 技巧: 中缀表达式(如
+,-,*)统一由SequenceExprSyntax表示,不再有 BinaryExpr。
2. 声明(DeclSyntax)
表示变量、函数、类型、协议等的定义,是构建宏时生成结构代码的核心组成。
| 名称 | 描述 | 快速构造示例 |
|---|---|---|
| VariableDeclSyntax | 变量 let/var | VariableDeclSyntax(bindingSpecifier: "let", bindings: [...]) |
| FunctionDeclSyntax | 函数 | FunctionDeclSyntax(name: "foo", signature: ..., body: ...) |
| StructDeclSyntax | 结构体 | StructDeclSyntax(identifier: "Foo", memberBlock: ...) |
| ClassDeclSyntax | 类 | ClassDeclSyntax(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 等)和函数体内逻辑结构。
| 名称 | 描述 | 快速构造示例 |
|---|---|---|
| IfStmtSyntax | if 语句 | IfStmtSyntax(conditions: [...], body: ...) |
| GuardStmtSyntax | guard 语句 | GuardStmtSyntax(conditions: [...], body: ...) |
| WhileStmtSyntax | while 循环 | WhileStmtSyntax(conditions: [...], body: ...) |
| RepeatWhileStmtSyntax | repeat-while 循环 | RepeatWhileStmtSyntax(body: ..., condition: ...) |
| ForStmtSyntax | for-in 循环 | ForStmtSyntax(pattern: ..., inExpr: ..., body: ...) |
| SwitchStmtSyntax | switch 分支 | SwitchStmtSyntax(expression: ..., cases: [...]) |
| ReturnStmtSyntax | return 返回 | ReturnStmtSyntax(expression: ...) |
| ThrowStmtSyntax | 抛出异常 | ThrowStmtSyntax(expression: ...) |
| BreakStmtSyntax | break 跳出 | BreakStmtSyntax() |
| ContinueStmtSyntax | continue 继续 | ContinueStmtSyntax() |
| DeferStmtSyntax | defer 延后执行 | DeferStmtSyntax(body: ...) |
4. 类型(TypeSyntax)
用于表示类型声明,包括简单类型、数组、可选、元组、函数类型等。
| 名称 | 描述 | 快速构造示例 |
|---|---|---|
| SimpleTypeIdentifierSyntax | 基本类型 Int, String | SimpleTypeIdentifierSyntax(name: "Int") |
| OptionalTypeSyntax | 可选类型 Int? | OptionalTypeSyntax(wrappedType: ...) |
| ArrayTypeSyntax | 数组类型 [Int] | ArrayTypeSyntax(elementType: ...) |
| DictionaryTypeSyntax | 字典类型 [K: V] | DictionaryTypeSyntax(keyType: ..., valueType: ...) |
| TupleTypeSyntax | 元组类型 (Int, String) | TupleTypeSyntax(elements: [...]) |
| FunctionTypeSyntax | 函数类型 (Int) -> Bool | FunctionTypeSyntax(parameters: [...], returnType: ...) |
| AttributedTypeSyntax | 带属性类型 @Sendable | AttributedTypeSyntax(attributes: [...], baseType: ...) |
| SomeTypeSyntax | some 类型 | SomeTypeSyntax(baseType: ...) |
| MetatypeTypeSyntax | .Type .Protocol | MetatypeTypeSyntax(baseType: ..., typeOrProtocol: ...) |
| ExistentialTypeSyntax | any 协议类型 | ExistentialTypeSyntax(type: ...) |
5. 模式(PatternSyntax)
用于 let/var 绑定、模式匹配等结构。
| 名称 | 描述 | 快速构造示例 |
|---|---|---|
| IdentifierPatternSyntax | 标识符模式 | IdentifierPatternSyntax(identifier: .identifier("name")) |
| TuplePatternSyntax | 元组模式 | TuplePatternSyntax(elements: [...]) |
| WildcardPatternSyntax | 通配符 _ | WildcardPatternSyntax() |
| ValueBindingPatternSyntax | let/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 | 属性宏 @MyMacro | AttributeMacroExpansionSyntax(macroName: "MyMacro", arguments: [...]) |
| AccessorMacroExpansionSyntax | Accessor 宏(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: [...]) |
来源
为了确保内容的准确性和时效性,欢迎您定期参考官方文档和资源:
如有更新,提交MR,一起维护它。