The swift-syntax package is a set of libraries that work on a source-accurate tree representation of Swift source code, called the SwiftSyntax tree. The SwiftSyntax tree forms the backbone of Swift’s macro system – the macro expansion nodes are represented as SwiftSyntax nodes and a macro generates a SwiftSyntax tree to be inserted into the source file.
You can read SwiftSyntax’s documentation on swiftpackageindex.com.
A great way to interactively explore the SwiftSyntax tree of a source file is https://swift-ast-explorer.com, developed by @kishikawakatsumi.
A set of example usages of swift-syntax can be found in Examples.
Releases of SwiftSyntax are aligned with corresponding language and tooling releases, for example the major version 509 of swift-syntax is aligned with Swift 5.9.
To depend on swift-syntax in a SwiftPM package, add the following to your Package.swift
.
dependencies: [
.package(url: "https://github.com/apple/swift-syntax.git", from: "<#latest swift-syntax tag#>"),
],
To add swift-syntax as a dependency of your Xcode project, go to the Package Dependencies tab of your Xcode project, click the plus button and search for https://github.com/apple/swift-syntax.git.
If you should hit any issues while using SwiftSyntax, we appreciate bug reports on GitHub Issue.
Start contributing to SwiftSyntax see this guide for more information.
SwiftSyntax provides an experimental Bazel build configuration, maintained by Keith Smiley.
To use it you can pull the source archive from the relevant release tag
into your WORKSPACE
and depend on the libraries you need from the
BUILD.bazel
file. Each library also has an associated
Library_opt
target (such as SwiftSyntax_opt
) which forces
SwiftSyntax to always build with optimizations enabled. This may help
local runtime performance at the cost of debuggability, and initial
build time. Please tag any issues related to the Bazel configuration with the label "Bazel".
Please see LICENSE for more information.
link |
Stars: 3014 |
Last commit: 6 hours ago |
Compared to 510.0.0 this fixes a possible misaligned memory access.
It also contains the following changes from 510.0.0.
SyntaxStringInterpolation.appendInterpolation(_: (some SyntaxProtocol)?)
nil
, nothing will get added to the string interpolation.SyntaxCollection.index(at:)
SyntaxCollection
. This computation is in O(n) and SyntaxCollection
is not subscriptable by an integer.Convenience initializer ClosureCaptureSyntax.init()
ClosureCaptureSyntax
that takes a concrete name
argument and automatically adds equal = TokenSyntax.equalToken()
to it.Convenience initializer EnumCaseParameterSyntax.init()
EnumCaseParameterSyntax
that takes a concrete firstName
value and adds colon = TokenSyntax.colonToken()
automatically to it.DiagnosticSeverity
and PluginMessage.Diagnostic.Severity
now have new case named remark
Leaf Node Casts
Same-Type Casts
is
, as
, and cast
overloads on SyntaxProtocol
with same-type conversions are marked as deprecated. The deprecated methods emit a warning indicating the cast will always succeed.Base Node Casts
is
, as
, and cast
methods on base node protocols with base-type conversions are marked as deprecated. The deprecated methods emit a warning that informs the developer that the cast will always succeed and should be done using the base node's initializer.WildcardPatternSyntax.typeAnnotation
typeAnnotation
on WildcardPatternSyntax
was a mistake. Use typeAnnotation
properties on the outer constructs instead. E.g. PatternBindingListSyntax.typeAnnotation
NoteMessage.fixItID
renamed to noteID
fixItID
and should have been named noteID
instead. Accesses to fixItID
are deprecated and forward to noteID
. Any types that conform NoteMessage
it will need to be updated to provide a noteID
instead of a fixItID
.DiagnosticSpec.highlight
replaced by highlights
highlight
prevented users from asserting that a macro highlighted exactly the expected set of syntax nodes. Use of DiagnosticSpec.init(...highlight:...)
is deprecated and forwards to DiagnosticSpec.init(...highlights:...)
. Migrating from highlight
to highlights
is straightforward; any uses of DiagnosticSpec.init
which do not specify a highlight
do not need to change, otherwise:
highlight
string should be replaced with a single element array containing the same string without any trailing trivia, e.g., highlight: "let "
-> highlights: ["let"]
.highlight
string should be replaced with an array containing an element for each highlighted node, e.g., highlight: "struct {}"
-> highlights: ["struct", "{}"]
.Swiftpack is being maintained by Petr Pavlik | @ptrpavlik | @swiftpackco | API | Analytics