mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
[Syntax] Implement return-statement and integer-literal-expr
A return statement needs something to return, so implement
integer-literal-expression too. This necessarily also forced
UnknownExprSyntax, UnknownStmtSyntax, and UnknownDeclSyntax,
which are stand-in token buckets for when we don't know
how to transform/migrate an AST.
This commit also contains the core function for caching
SyntaxData children. This is highly tricky code, with some
detailed comments in SyntaxData.{h,cpp}. The gist is that
we have to atomically swap in a SyntaxData pointer into the
child field, so we can maintain pointer identity of SyntaxData
nodes, while still being able to cache them internally.
To prove that this works, there is a multithreaded test that
checks that two threads can ask for a child that hasn't been
cached yet without crashing or violating pointer identity.
https://bugs.swift.org/browse/SR-4010
This commit is contained in:
@@ -31,6 +31,32 @@ DeclSyntaxData::DeclSyntaxData(RC<RawSyntax> Raw,
|
||||
DeclSyntax::DeclSyntax(const RC<SyntaxData> Root, const DeclSyntaxData *Data)
|
||||
: Syntax(Root, Data) {}
|
||||
|
||||
#pragma mark - unknown-statement Data
|
||||
|
||||
UnknownDeclSyntaxData::UnknownDeclSyntaxData(RC<RawSyntax> Raw,
|
||||
const SyntaxData *Parent,
|
||||
CursorIndex IndexInParent)
|
||||
: DeclSyntaxData(Raw, Parent, IndexInParent) {
|
||||
assert(Raw->Kind == SyntaxKind::UnknownStmt);
|
||||
}
|
||||
|
||||
RC<UnknownDeclSyntaxData>
|
||||
UnknownDeclSyntaxData::make(RC<RawSyntax> Raw,
|
||||
const SyntaxData *Parent,
|
||||
CursorIndex IndexInParent) {
|
||||
return RC<UnknownDeclSyntaxData> {
|
||||
new UnknownDeclSyntaxData {
|
||||
Raw, Parent, IndexInParent
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
#pragma mark - unknown-statement API
|
||||
|
||||
UnknownDeclSyntax::UnknownDeclSyntax(const RC<SyntaxData> Root,
|
||||
const UnknownDeclSyntaxData *Data)
|
||||
: DeclSyntax(Root, Data) {}
|
||||
|
||||
#pragma mark - declaration-members Data
|
||||
|
||||
DeclMembersSyntaxData::DeclMembersSyntaxData(RC<RawSyntax> Raw,
|
||||
|
||||
Reference in New Issue
Block a user