Skip to content

Commit c958cd6

Browse files
committed
[Syntax] Allow UnknownSyntax to have children
This will make it easier to incrementally implement syntax nodes, while allowing us to embed nodes that we do know about inside ones that we don't. https://bugs.swift.org/browse/SR-4062
1 parent 8cf9995 commit c958cd6

22 files changed

+444
-81
lines changed

include/swift/Syntax/DeclSyntax.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
#include "swift/Syntax/SyntaxData.h"
2626
#include "swift/Syntax/TokenSyntax.h"
2727
#include "swift/Syntax/TypeSyntax.h"
28+
#include "swift/Syntax/UnknownSyntax.h"
2829

2930
#include "llvm/ADT/BitVector.h"
3031

@@ -56,7 +57,7 @@ class DeclSyntax : public Syntax {
5657

5758
#pragma mark - unknown-declaration Data
5859

59-
class UnknownDeclSyntaxData : public DeclSyntaxData {
60+
class UnknownDeclSyntaxData : public UnknownSyntaxData {
6061
UnknownDeclSyntaxData(RC<RawSyntax> Raw, const SyntaxData *Parent = nullptr,
6162
CursorIndex IndexInParent = 0);
6263
public:
@@ -71,7 +72,7 @@ class UnknownDeclSyntaxData : public DeclSyntaxData {
7172

7273
#pragma mark - unknown-declaration API
7374

74-
class UnknownDeclSyntax : public DeclSyntax {
75+
class UnknownDeclSyntax : public UnknownSyntax {
7576
friend class SyntaxData;
7677
friend class UnknownStmtSyntaxData;
7778
friend class LegacyASTTransformer;

include/swift/Syntax/ExprSyntax.h

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
#include "swift/Syntax/Syntax.h"
2424
#include "swift/Syntax/SyntaxData.h"
2525
#include "swift/Syntax/TokenSyntax.h"
26+
#include "swift/Syntax/UnknownSyntax.h"
2627

2728
using llvm::Optional;
2829

@@ -61,7 +62,7 @@ class ExprSyntax : public Syntax {
6162

6263
#pragma mark - unknown-expression Data
6364

64-
class UnknownExprSyntaxData : public ExprSyntaxData {
65+
class UnknownExprSyntaxData : public UnknownSyntaxData {
6566
UnknownExprSyntaxData(RC<RawSyntax> Raw, const SyntaxData *Parent = nullptr,
6667
CursorIndex IndexInParent = 0);
6768
public:
@@ -76,17 +77,17 @@ class UnknownExprSyntaxData : public ExprSyntaxData {
7677

7778
#pragma mark - unknown-expression API
7879

79-
class UnknownExprSyntax : public ExprSyntax {
80+
class UnknownExprSyntax : public UnknownSyntax {
8081
friend class SyntaxData;
8182
friend class UnknownExprSyntaxData;
8283
friend class LegacyASTTransformer;
8384

8485
using DataType = UnknownExprSyntaxData;
8586

87+
public:
8688
UnknownExprSyntax(const RC<SyntaxData> Root,
8789
const UnknownExprSyntaxData *Data);
8890

89-
public:
9091
static bool classof(const Syntax *S) {
9192
return S->getKind() == SyntaxKind::UnknownExpr;
9293
}
@@ -333,13 +334,14 @@ class FunctionCallArgumentListSyntaxData : public SyntaxData {
333334
/// function-call-argument-list -> function-call-argument
334335
/// function-call-argument-list?
335336
class FunctionCallArgumentListSyntax : public Syntax {
336-
using DataType = FunctionCallArgumentListSyntaxData;
337337
friend struct SyntaxFactory;
338338
friend class FunctionCallArgumentListSyntaxData;
339339
friend class FunctionCallExprSyntax;
340340
friend class Syntax;
341341
friend class SyntaxData;
342342

343+
using DataType = FunctionCallArgumentListSyntaxData;
344+
343345
FunctionCallArgumentListSyntax(const RC<SyntaxData> Root,
344346
const DataType *Data);
345347

@@ -356,7 +358,7 @@ class FunctionCallArgumentListSyntax : public Syntax {
356358
withAdditionalArgument(FunctionCallArgumentSyntax AdditionalArgument) const;
357359

358360
static bool classof(const Syntax *S) {
359-
return S->getKind() == SyntaxKind::FunctionCallExpr;
361+
return S->getKind() == SyntaxKind::FunctionCallArgumentList;
360362
}
361363
};
362364

include/swift/Syntax/GenericSyntax.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -435,6 +435,7 @@ class GenericArgumentClauseSyntax : public Syntax {
435435
friend class GenericArgumentClauseBuilder;
436436
friend class SymbolicReferenceExprSyntax;
437437
friend class SyntaxData;
438+
friend class Syntax;
438439

439440
using DataType = GenericArgumentClauseSyntaxData;
440441

include/swift/Syntax/RawSyntax.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,18 @@ struct RawSyntax : public llvm::ThreadSafeRefCountedBase<RawSyntax> {
235235
return Kind >= SyntaxKind::First_Expr && Kind <= SyntaxKind::Last_Expr;
236236
}
237237

238+
/// Return true if this raw syntax node is a token.
239+
bool isToken() const {
240+
return Kind == SyntaxKind::Token;
241+
}
242+
243+
bool isUnknown() const {
244+
return Kind == SyntaxKind::Unknown ||
245+
Kind == SyntaxKind::UnknownDecl ||
246+
Kind == SyntaxKind::UnknownExpr ||
247+
Kind == SyntaxKind::UnknownStmt;
248+
}
249+
238250
/// Get the absolute position of this raw syntax: its offset, line,
239251
/// and column.
240252
AbsolutePosition getAbsolutePosition(RC<RawSyntax> Root) const;

include/swift/Syntax/Rewriter.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
#include "swift/Syntax/ExprSyntax.h"
2828
#include "swift/Syntax/StmtSyntax.h"
2929
#include "swift/Syntax/Syntax.h"
30+
#include "swift/Syntax/UnknownSyntax.h"
3031

3132
namespace swift {
3233
namespace syntax {

include/swift/Syntax/StmtSyntax.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#include "swift/Syntax/References.h"
2323
#include "swift/Syntax/Syntax.h"
2424
#include "swift/Syntax/SyntaxData.h"
25+
#include "swift/Syntax/UnknownSyntax.h"
2526

2627
using llvm::Optional;
2728

@@ -66,7 +67,7 @@ class StmtSyntax : public Syntax {
6667

6768
#pragma mark - unknown-statement Data
6869

69-
class UnknownStmtSyntaxData : public StmtSyntaxData {
70+
class UnknownStmtSyntaxData : public UnknownSyntaxData {
7071
UnknownStmtSyntaxData(RC<RawSyntax> Raw, const SyntaxData *Parent = nullptr,
7172
CursorIndex IndexInParent = 0);
7273
public:
@@ -81,12 +82,12 @@ class UnknownStmtSyntaxData : public StmtSyntaxData {
8182

8283
#pragma mark - unknown-statement API
8384

84-
class UnknownStmtSyntax : public StmtSyntax {
85+
class UnknownStmtSyntax : public UnknownSyntax {
8586
friend class SyntaxData;
8687
friend class UnknownStmtSyntaxData;
8788
friend class LegacyASTTransformer;
8889

89-
using DataType = UnknownExprSyntaxData;
90+
using DataType = UnknownStmtSyntaxData;
9091

9192
UnknownStmtSyntax(const RC<SyntaxData> Root,
9293
const UnknownStmtSyntaxData *Data);

include/swift/Syntax/Syntax.h

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@ namespace syntax {
3939
const auto NoParent = llvm::None;
4040

4141
class SyntaxData;
42-
class UnknownSyntaxData;
4342

4443
/// The main handle for syntax nodes - subclasses contain all public
4544
/// structured editing APIs.
@@ -138,6 +137,9 @@ class Syntax {
138137
/// Returns true if this syntax node represents a type.
139138
bool isType() const;
140139

140+
/// Returns true if this syntax is of some "unknown" kind.
141+
bool isUnknown() const;
142+
141143
/// Print the syntax node with full fidelity to the given output stream.
142144
void print(llvm::raw_ostream &OS) const;
143145

@@ -155,19 +157,6 @@ class Syntax {
155157
// TODO: hasSameStructureAs ?
156158
};
157159

158-
/// A chunk of "unknown" syntax - effectively a sequence of tokens.
159-
class UnknownSyntax final : public Syntax {
160-
friend struct SyntaxFactory;
161-
162-
UnknownSyntax(const RC<SyntaxData> Root, UnknownSyntaxData *Data);
163-
static UnknownSyntax make(RC<RawSyntax> Raw);
164-
165-
public:
166-
static bool classof(const Syntax *S) {
167-
return S->getKind() == SyntaxKind::Unknown;
168-
}
169-
};
170-
171160
} // end namespace syntax
172161
} // end namespace swift
173162

include/swift/Syntax/SyntaxData.h

Lines changed: 3 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -242,28 +242,14 @@ class SyntaxData : public llvm::ThreadSafeRefCountedBase<SyntaxData> {
242242
/// Returns true if the data node represents expression syntax.
243243
bool isExpr() const;
244244

245+
/// Returns true if this syntax is of some "unknown" kind.
246+
bool isUnknown() const;
247+
245248
/// Dump a debug description of the syntax data for debugging to
246249
/// standard error.
247250
void dump(llvm::raw_ostream &OS) const;
248251
};
249252

250-
class UnknownSyntaxData final : public SyntaxData {
251-
friend class SyntaxData;
252-
friend class UnknownSyntax;
253-
friend struct SyntaxFactory;
254-
friend class LegacyASTTransformer;
255-
256-
UnknownSyntaxData(RC<RawSyntax> Raw, const SyntaxData *Parent = nullptr,
257-
CursorIndex IndexInParent = 0)
258-
: SyntaxData(Raw, Parent, IndexInParent) {}
259-
260-
static RC<UnknownSyntaxData> make(RC<RawSyntax> Raw,
261-
const SyntaxData *Parent = nullptr,
262-
CursorIndex IndexInParent = 0);
263-
public:
264-
static bool classof(const SyntaxData *SD);
265-
};
266-
267253
} // end namespace syntax
268254
} // end namespace swift
269255

include/swift/Syntax/SyntaxFactory.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ struct SyntaxFactory {
152152
/// Make a function call argument list with the given arguments.
153153
static FunctionCallArgumentListSyntax
154154
makeFunctionCallArgumentList(
155-
std::vector<FunctionCallArgumentSyntax> &Arguments);
155+
std::vector<FunctionCallArgumentSyntax> Arguments);
156156

157157
/// Make a function call argument list with no arguments.
158158
static FunctionCallArgumentListSyntax makeBlankFunctionCallArgumentList();

include/swift/Syntax/SyntaxKinds.def

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,6 @@ SYNTAX(FunctionTypeArgument, Syntax)
9999
SYNTAX(FunctionCallArgumentList, Syntax)
100100
SYNTAX(FunctionCallArgument, Syntax)
101101

102-
103102
#undef ABSTRACT_SYNTAX
104103
#undef DECL
105104
#undef STMT

include/swift/Syntax/UnknownSyntax.h

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
//===--- UnknownSyntax.h - Swift Unknown Syntax Interface -----------------===//
2+
//
3+
// This source file is part of the Swift.org open source project
4+
//
5+
// Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors
6+
// Licensed under Apache License v2.0 with Runtime Library Exception
7+
//
8+
// See https://swift.org/LICENSE.txt for license information
9+
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
10+
//
11+
//===----------------------------------------------------------------------===//
12+
13+
#ifndef SWIFT_SYNTAX_UNKNOWNSYNTAX_H
14+
#define SWIFT_SYNTAX_UNKNOWNSYNTAX_H
15+
16+
#include "swift/Syntax/SyntaxData.h"
17+
#include "swift/Syntax/Syntax.h"
18+
19+
#include <vector>
20+
21+
namespace swift {
22+
namespace syntax {
23+
24+
#pragma mark unknown-syntax Data
25+
26+
class UnknownSyntaxData : public SyntaxData {
27+
friend class SyntaxData;
28+
friend class UnknownSyntax;
29+
friend struct SyntaxFactory;
30+
friend class LegacyASTTransformer;
31+
32+
protected:
33+
std::vector<RC<SyntaxData>> CachedChildren;
34+
35+
UnknownSyntaxData(const RC<RawSyntax> Raw,
36+
const SyntaxData *Parent = nullptr,
37+
const CursorIndex IndexInParent = 0);
38+
public:
39+
40+
static RC<UnknownSyntaxData> make(RC<RawSyntax> Raw,
41+
const SyntaxData *Parent = nullptr,
42+
CursorIndex IndexInParent = 0);
43+
44+
size_t getNumChildren() const {
45+
return CachedChildren.size();
46+
}
47+
48+
/// Get the child at the given Index.
49+
///
50+
/// Precondition: Index <= getNumChildren();
51+
Syntax getChild(size_t Index) const;
52+
53+
static bool classof(const SyntaxData *SD) {
54+
return SD->isUnknown();
55+
}
56+
};
57+
58+
#pragma mark unknown-syntax API
59+
60+
/// A chunk of "unknown" syntax.
61+
///
62+
/// Effectively wraps a tree of RawSyntax.
63+
///
64+
/// This should not be vended by SyntaxFactory.
65+
class UnknownSyntax : public Syntax {
66+
friend struct SyntaxFactory;
67+
friend class Syntax;
68+
69+
using DataType = UnknownSyntaxData;
70+
71+
public:
72+
UnknownSyntax(const RC<SyntaxData> Root, const UnknownSyntaxData *Data);
73+
74+
/// Get the number of child nodes in this piece of syntax, not including
75+
/// tokens.
76+
size_t getNumChildren() const;
77+
78+
/// Get the Nth child of this piece of syntax.
79+
Syntax getChild(const size_t N) const;
80+
81+
static bool classof(const Syntax *S) {
82+
return S->isUnknown();
83+
}
84+
};
85+
86+
} // end namespace syntax
87+
} // end namespace swift
88+
89+
#endif // SWIFT_SYNTAX_UNKNOWNSYNTAX_H

lib/Syntax/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,5 @@ add_swift_library(swiftSyntax STATIC
1212
SyntaxFactory.cpp
1313
SyntaxData.cpp
1414
TypeSyntax.cpp
15+
UnknownSyntax.cpp
1516
)

lib/Syntax/DeclSyntax.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,14 +36,16 @@ DeclSyntax::DeclSyntax(const RC<SyntaxData> Root, const DeclSyntaxData *Data)
3636
UnknownDeclSyntaxData::UnknownDeclSyntaxData(RC<RawSyntax> Raw,
3737
const SyntaxData *Parent,
3838
CursorIndex IndexInParent)
39-
: DeclSyntaxData(Raw, Parent, IndexInParent) {
40-
assert(Raw->Kind == SyntaxKind::UnknownStmt);
39+
: UnknownSyntaxData(Raw, Parent, IndexInParent) {
40+
assert(Raw->Kind == SyntaxKind::UnknownDecl);
4141
}
4242

4343
RC<UnknownDeclSyntaxData>
4444
UnknownDeclSyntaxData::make(RC<RawSyntax> Raw,
4545
const SyntaxData *Parent,
4646
CursorIndex IndexInParent) {
47+
auto UnknownRaw = RawSyntax::make(SyntaxKind::UnknownDecl, Raw->Layout,
48+
Raw->Presence);
4749
return RC<UnknownDeclSyntaxData> {
4850
new UnknownDeclSyntaxData {
4951
Raw, Parent, IndexInParent
@@ -55,7 +57,7 @@ UnknownDeclSyntaxData::make(RC<RawSyntax> Raw,
5557

5658
UnknownDeclSyntax::UnknownDeclSyntax(const RC<SyntaxData> Root,
5759
const UnknownDeclSyntaxData *Data)
58-
: DeclSyntax(Root, Data) {}
60+
: UnknownSyntax(Root, Data) {}
5961

6062
#pragma mark - declaration-members Data
6163

lib/Syntax/ExprSyntax.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,17 +42,19 @@ ExprSyntax::ExprSyntax(const RC<SyntaxData> Root, const ExprSyntaxData *Data)
4242
UnknownExprSyntaxData::UnknownExprSyntaxData(RC<RawSyntax> Raw,
4343
const SyntaxData *Parent,
4444
CursorIndex IndexInParent)
45-
: ExprSyntaxData(Raw, Parent, IndexInParent) {
45+
: UnknownSyntaxData(Raw, Parent, IndexInParent) {
4646
assert(Raw->Kind == SyntaxKind::UnknownExpr);
4747
}
4848

4949
RC<UnknownExprSyntaxData>
5050
UnknownExprSyntaxData::make(RC<RawSyntax> Raw,
5151
const SyntaxData *Parent,
5252
CursorIndex IndexInParent) {
53+
auto UnknownRaw = RawSyntax::make(SyntaxKind::UnknownExpr, Raw->Layout,
54+
Raw->Presence);
5355
return RC<UnknownExprSyntaxData> {
5456
new UnknownExprSyntaxData {
55-
Raw, Parent, IndexInParent
57+
UnknownRaw, Parent, IndexInParent
5658
}
5759
};
5860
}
@@ -61,7 +63,7 @@ UnknownExprSyntaxData::make(RC<RawSyntax> Raw,
6163

6264
UnknownExprSyntax::UnknownExprSyntax(const RC<SyntaxData> Root,
6365
const UnknownExprSyntaxData *Data)
64-
: ExprSyntax(Root, Data) {}
66+
: UnknownSyntax(Root, Data) {}
6567

6668
#pragma mark - integer-literal-expression Data
6769

0 commit comments

Comments
 (0)