Skip to content

Commit fbe945b

Browse files
authored
Merge pull request #7824 from bitjammer/sr-4062-unknown-syntax-children
[Syntax] Allow UnknownSyntax to have children
2 parents 8cf9995 + c958cd6 commit fbe945b

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)