Skip to content

Commit bde8224

Browse files
authored
Merge pull request #36230 from ahoppen/pr/ref-count-syntaxdata
[libSyntax] Reference count SyntaxData
2 parents 9a95c64 + 56a9234 commit bde8224

File tree

11 files changed

+85
-110
lines changed

11 files changed

+85
-110
lines changed

include/swift/Syntax/Syntax.h

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -54,10 +54,10 @@ const auto NoParent = llvm::None;
5454
/// convenience methods based on the node's kind.
5555
class Syntax {
5656
protected:
57-
SyntaxData Data;
57+
RC<const SyntaxData> Data;
5858

5959
public:
60-
explicit Syntax(const SyntaxData Data) : Data(Data) {}
60+
explicit Syntax(const RC<const SyntaxData> &Data) : Data(Data) {}
6161

6262
virtual ~Syntax() {}
6363

@@ -84,9 +84,7 @@ class Syntax {
8484
}
8585

8686
/// Get the Data for this Syntax node.
87-
const SyntaxData &getData() const {
88-
return Data;
89-
}
87+
const RC<const SyntaxData> &getData() const { return Data; }
9088

9189
/// Cast this Syntax node to a more specific type, asserting it's of the
9290
/// right kind.
@@ -111,7 +109,7 @@ class Syntax {
111109

112110
/// Returns the child index of this node in its parent,
113111
/// if it has one, otherwise 0.
114-
CursorIndex getIndexInParent() const { return getData().getIndexInParent(); }
112+
CursorIndex getIndexInParent() const { return getData()->getIndexInParent(); }
115113

116114
/// Return the number of bytes this node takes when spelled out in the source
117115
size_t getTextLength() const { return getRaw()->getTextLength(); }
@@ -155,8 +153,8 @@ class Syntax {
155153
SWIFT_DEBUG_DUMP;
156154

157155
bool hasSameIdentityAs(const Syntax &Other) const {
158-
return Data.getAbsoluteRaw().getNodeId() ==
159-
Other.Data.getAbsoluteRaw().getNodeId();
156+
return Data->getAbsoluteRaw().getNodeId() ==
157+
Other.Data->getAbsoluteRaw().getNodeId();
160158
}
161159

162160
static bool kindof(SyntaxKind Kind) {
@@ -178,23 +176,23 @@ class Syntax {
178176

179177
/// Get the offset at which the leading trivia of this node starts.
180178
AbsoluteOffsetPosition getAbsolutePositionBeforeLeadingTrivia() const {
181-
return Data.getAbsolutePositionBeforeLeadingTrivia();
179+
return Data->getAbsolutePositionBeforeLeadingTrivia();
182180
}
183181

184182
/// Get the offset at which the actual content (i.e. non-triva) of this node
185183
/// starts.
186184
AbsoluteOffsetPosition getAbsolutePositionAfterLeadingTrivia() const {
187-
return Data.getAbsolutePositionAfterLeadingTrivia();
185+
return Data->getAbsolutePositionAfterLeadingTrivia();
188186
}
189187

190188
/// Get the offset at which the trailing trivia of this node starts.
191189
AbsoluteOffsetPosition getAbsoluteEndPositionBeforeTrailingTrivia() const {
192-
return Data.getAbsoluteEndPositionBeforeTrailingTrivia();
190+
return Data->getAbsoluteEndPositionBeforeTrailingTrivia();
193191
}
194192

195193
/// Get the offset at which the trailing trivia of this node starts.
196194
AbsoluteOffsetPosition getAbsoluteEndPositionAfterTrailingTrivia() const {
197-
return Data.getAbsoluteEndPositionAfterTrailingTrivia();
195+
return Data->getAbsoluteEndPositionAfterTrailingTrivia();
198196
}
199197

200198
// TODO: hasSameStructureAs ?

include/swift/Syntax/SyntaxCollection.h

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,8 @@ class SyntaxCollection : public Syntax {
5656
friend class Syntax;
5757

5858
private:
59-
static SyntaxData makeData(std::initializer_list<Element> &Elements,
60-
const RC<SyntaxArena> &Arena) {
59+
static RC<const SyntaxData> makeData(std::initializer_list<Element> &Elements,
60+
const RC<SyntaxArena> &Arena) {
6161
std::vector<const RawSyntax *> List;
6262
List.reserve(Elements.size());
6363
for (auto &Elt : Elements)
@@ -68,7 +68,7 @@ class SyntaxCollection : public Syntax {
6868
}
6969

7070
public:
71-
SyntaxCollection(const SyntaxData Data) : Syntax(Data) {}
71+
SyntaxCollection(const RC<const SyntaxData> &Data) : Syntax(Data) {}
7272

7373
SyntaxCollection(std::initializer_list<Element> list):
7474
SyntaxCollection(SyntaxCollection::makeData(list)) {}
@@ -104,7 +104,7 @@ class SyntaxCollection : public Syntax {
104104
Element operator[](const size_t Index) const {
105105
assert(Index < size());
106106
assert(!empty());
107-
return Element(*Data.getChild(Index));
107+
return Element(Data->getChild(Index));
108108
}
109109

110110
/// Return a new collection with the given element added to the end.
@@ -118,7 +118,7 @@ class SyntaxCollection : public Syntax {
118118
auto Raw = RawSyntax::makeAndCalcLength(CollectionKind, NewLayout,
119119
getRaw()->getPresence(),
120120
getRaw()->getArena());
121-
return SyntaxCollection<CollectionKind, Element>(Data.replacingSelf(Raw));
121+
return SyntaxCollection<CollectionKind, Element>(Data->replacingSelf(Raw));
122122
}
123123

124124
/// Return a new collection with an element removed from the end.
@@ -130,7 +130,7 @@ class SyntaxCollection : public Syntax {
130130
auto Raw = RawSyntax::makeAndCalcLength(CollectionKind, NewLayout,
131131
getRaw()->getPresence(),
132132
getRaw()->getArena());
133-
return SyntaxCollection<CollectionKind, Element>(Data.replacingSelf(Raw));
133+
return SyntaxCollection<CollectionKind, Element>(Data->replacingSelf(Raw));
134134
}
135135

136136
/// Return a new collection with the given element appended to the front.
@@ -143,7 +143,7 @@ class SyntaxCollection : public Syntax {
143143
auto Raw = RawSyntax::makeAndCalcLength(CollectionKind, NewLayout,
144144
getRaw()->getPresence(),
145145
getRaw()->getArena());
146-
return SyntaxCollection<CollectionKind, Element>(Data.replacingSelf(Raw));
146+
return SyntaxCollection<CollectionKind, Element>(Data->replacingSelf(Raw));
147147
}
148148

149149
/// Return a new collection with an element removed from the end.
@@ -155,7 +155,7 @@ class SyntaxCollection : public Syntax {
155155
auto Raw = RawSyntax::makeAndCalcLength(CollectionKind, NewLayout,
156156
getRaw()->getPresence(),
157157
getRaw()->getArena());
158-
return SyntaxCollection<CollectionKind, Element>(Data.replacingSelf(Raw));
158+
return SyntaxCollection<CollectionKind, Element>(Data->replacingSelf(Raw));
159159
}
160160

161161
/// Return a new collection with the Element inserted at index i.
@@ -176,7 +176,7 @@ class SyntaxCollection : public Syntax {
176176
auto Raw = RawSyntax::makeAndCalcLength(CollectionKind, NewLayout,
177177
getRaw()->getPresence(),
178178
getRaw()->getArena());
179-
return SyntaxCollection<CollectionKind, Element>(Data.replacingSelf(Raw));
179+
return SyntaxCollection<CollectionKind, Element>(Data->replacingSelf(Raw));
180180
}
181181

182182
/// Return a new collection with the element removed at index i.
@@ -189,14 +189,14 @@ class SyntaxCollection : public Syntax {
189189
auto Raw = RawSyntax::makeAndCalcLength(CollectionKind, NewLayout,
190190
getRaw()->getPresence(),
191191
getRaw()->getArena());
192-
return SyntaxCollection<CollectionKind, Element>(Data.replacingSelf(Raw));
192+
return SyntaxCollection<CollectionKind, Element>(Data->replacingSelf(Raw));
193193
}
194194

195195
/// Return an empty syntax collection of this type.
196196
SyntaxCollection<CollectionKind, Element> cleared() const {
197197
auto Raw = RawSyntax::makeAndCalcLength(
198198
CollectionKind, {}, getRaw()->getPresence(), getRaw()->getArena());
199-
return SyntaxCollection<CollectionKind, Element>(Data.replacingSelf(Raw));
199+
return SyntaxCollection<CollectionKind, Element>(Data->replacingSelf(Raw));
200200
}
201201

202202
static bool kindof(SyntaxKind Kind) {

include/swift/Syntax/SyntaxData.h

Lines changed: 19 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -51,39 +51,24 @@
5151
namespace swift {
5252
namespace syntax {
5353

54-
/// A reference counted box that can contain any type.
55-
template <typename T>
56-
class RefCountedBox final
57-
: public llvm::ThreadSafeRefCountedBase<RefCountedBox<T>> {
58-
public:
59-
const T Data;
60-
61-
RefCountedBox(const T Data) : Data(Data) {}
62-
63-
static RC<RefCountedBox<T>> make(const T &Data) {
64-
return RC<RefCountedBox<T>>{new RefCountedBox(Data)};
65-
}
66-
};
67-
6854
/// The class for holding parented syntax.
6955
///
7056
/// This structure should not contain significant public
7157
/// API or internal modification API.
7258
///
7359
/// It is essentially a wrapper around \c AbsoluteRawSyntax that also keeps
7460
/// track of the parent.
75-
class SyntaxData {
61+
class SyntaxData : public llvm::ThreadSafeRefCountedBase<SyntaxData> {
7662
const AbsoluteRawSyntax AbsoluteRaw;
77-
RC<RefCountedBox<SyntaxData>> Parent;
63+
RC<const SyntaxData> Parent;
7864

7965
/// If this node is the root of a Syntax tree (i.e. \c Parent is \c nullptr ),
8066
/// the arena in which this node's \c RawSyntax node has been allocated.
8167
/// This keeps this \c RawSyntax nodes referenced by this tree alive.
8268
RC<SyntaxArena> Arena;
8369

8470
/// Create a intermediate node with a parent.
85-
SyntaxData(AbsoluteRawSyntax AbsoluteRaw,
86-
const RC<RefCountedBox<SyntaxData>> &Parent)
71+
SyntaxData(AbsoluteRawSyntax AbsoluteRaw, const RC<const SyntaxData> &Parent)
8772
: AbsoluteRaw(AbsoluteRaw), Parent(Parent), Arena(nullptr) {}
8873

8974
/// Create a new root node
@@ -94,36 +79,36 @@ class SyntaxData {
9479
public:
9580
/// With a new \c RawSyntax node, create a new node from this one and
9681
/// recursively rebuild the parental chain up to the root.
97-
SyntaxData replacingSelf(const RawSyntax *NewRaw) const;
82+
RC<const SyntaxData> replacingSelf(const RawSyntax *NewRaw) const;
9883

9984
/// Replace a child in the raw syntax and recursively rebuild the
10085
/// parental chain up to the root.
10186
template <typename CursorType>
102-
SyntaxData replacingChild(const RawSyntax *RawChild,
103-
CursorType ChildCursor) const {
87+
RC<const SyntaxData> replacingChild(const RawSyntax *RawChild,
88+
CursorType ChildCursor) const {
10489
auto NewRaw = AbsoluteRaw.getRaw()->replacingChild(ChildCursor, RawChild);
10590
return replacingSelf(NewRaw);
10691
}
10792

10893
/// Get the node immediately before this current node that does contain a
109-
/// non-missing token. Return \c None if we cannot find such node.
110-
Optional<SyntaxData> getPreviousNode() const;
94+
/// non-missing token. Return \c nullptr if we cannot find such node.
95+
RC<const SyntaxData> getPreviousNode() const;
11196

11297
/// Get the node immediately after this current node that does contain a
113-
/// non-missing token. Return \c None if we cannot find such node.
114-
Optional<SyntaxData> getNextNode() const;
98+
/// non-missing token. Return \c nullptr if we cannot find such node.
99+
RC<const SyntaxData> getNextNode() const;
115100

116-
/// Get the first non-missing token node in this tree. Return \c None if
101+
/// Get the first non-missing token node in this tree. Return \c nullptr if
117102
/// this node does not contain non-missing tokens.
118-
Optional<SyntaxData> getFirstToken() const;
103+
RC<const SyntaxData> getFirstToken() const;
119104

120-
/// Get the last non-missing token node in this tree. Return \c None if
105+
/// Get the last non-missing token node in this tree. Return \c nullptr if
121106
/// this node does not contain non-missing tokens.
122-
Optional<SyntaxData> getLastToken() const;
107+
RC<const SyntaxData> getLastToken() const;
123108

124109
/// Make a new \c SyntaxData node for the tree's root.
125-
static SyntaxData makeRoot(AbsoluteRawSyntax AbsoluteRaw) {
126-
return SyntaxData(AbsoluteRaw);
110+
static RC<const SyntaxData> makeRoot(AbsoluteRawSyntax AbsoluteRaw) {
111+
return RC<const SyntaxData>(new SyntaxData(AbsoluteRaw));
127112
}
128113

129114
const AbsoluteRawSyntax &getAbsoluteRaw() const { return AbsoluteRaw; }
@@ -135,13 +120,7 @@ class SyntaxData {
135120
SyntaxKind getKind() const { return AbsoluteRaw.getRaw()->getKind(); }
136121

137122
/// Return the parent syntax if there is one.
138-
Optional<SyntaxData> getParent() const {
139-
if (Parent) {
140-
return Parent->Data;
141-
} else {
142-
return None;
143-
}
144-
}
123+
RC<const SyntaxData> getParent() const { return Parent; }
145124

146125
/// Returns true if this syntax node has a parent.
147126
bool hasParent() const {
@@ -161,13 +140,13 @@ class SyntaxData {
161140

162141
/// Gets the child at the index specified by the provided cursor.
163142
template <typename CursorType>
164-
Optional<SyntaxData> getChild(CursorType Cursor) const {
143+
RC<const SyntaxData> getChild(CursorType Cursor) const {
165144
return getChild(
166145
(AbsoluteSyntaxPosition::IndexInParentType)cursorIndex(Cursor));
167146
}
168147

169148
/// Gets the child at the specified \p Index.
170-
Optional<SyntaxData>
149+
RC<const SyntaxData>
171150
getChild(AbsoluteSyntaxPosition::IndexInParentType Index) const;
172151

173152
/// Get the offset at which the leading trivia of this node starts.

include/swift/Syntax/SyntaxNodes.h.gyb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ public:
6969
};
7070
% end
7171

72-
${node.name}(const SyntaxData Data) : ${node.base_type}(Data) {
72+
${node.name}(const RC<const SyntaxData> &Data) : ${node.base_type}(Data) {
7373
% if node.requires_validation():
7474
this->validate();
7575
% end

include/swift/Syntax/TokenSyntax.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ class TokenSyntax final : public Syntax {
3333
assert(getRaw()->isToken());
3434
}
3535
public:
36-
TokenSyntax(const SyntaxData Data) : Syntax(Data) {}
36+
TokenSyntax(const RC<const SyntaxData> &Data) : Syntax(Data) {}
3737

3838
static TokenSyntax missingToken(const tok Kind, StringRef Text,
3939
const RC<SyntaxArena> &Arena) {
@@ -50,12 +50,12 @@ class TokenSyntax final : public Syntax {
5050

5151
TokenSyntax withLeadingTrivia(StringRef Trivia) const {
5252
auto NewRaw = getRaw()->withLeadingTrivia(Trivia);
53-
return TokenSyntax(getData().replacingSelf(NewRaw));
53+
return TokenSyntax(getData()->replacingSelf(NewRaw));
5454
}
5555

5656
TokenSyntax withTrailingTrivia(StringRef Trivia) const {
5757
auto NewRaw = getRaw()->withTrailingTrivia(Trivia);
58-
return TokenSyntax(getData().replacingSelf(NewRaw));
58+
return TokenSyntax(getData()->replacingSelf(NewRaw));
5959
}
6060

6161
/* TODO: If we really need them.

include/swift/Syntax/UnknownSyntax.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ namespace syntax {
2929
class UnknownSyntax : public Syntax {
3030
void validate() const;
3131
public:
32-
UnknownSyntax(const SyntaxData Data) : Syntax(Data) {}
32+
UnknownSyntax(const RC<const SyntaxData> &Data) : Syntax(Data) {}
3333

3434
static bool classof(const Syntax *S) {
3535
return S->isUnknown();

lib/Parse/SyntaxParsingCache.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ bool SyntaxParsingCache::nodeCanBeReused(const Syntax &Node, size_t NodeStart,
4141
// StructDecl inside and `private struc Foo {}` parses as two CodeBlockItems
4242
// one for `private` and one for `struc Foo {}`
4343
size_t NextLeafNodeLength = 0;
44-
if (auto NextNode = Node.getData().getNextNode()) {
44+
if (auto NextNode = Node.getData()->getNextNode()) {
4545
auto NextLeafNode = NextNode->getFirstToken();
4646
auto NextRawNode = NextLeafNode->getRaw();
4747
assert(NextRawNode->isPresent());

lib/Syntax/Syntax.cpp

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
using namespace swift;
1818
using namespace swift::syntax;
1919

20-
const RawSyntax *Syntax::getRaw() const { return Data.getRaw(); }
20+
const RawSyntax *Syntax::getRaw() const { return Data->getRaw(); }
2121

2222
SyntaxKind Syntax::getKind() const {
2323
return getRaw()->getKind();
@@ -36,21 +36,21 @@ void Syntax::dump(llvm::raw_ostream &OS, unsigned Indent) const {
3636
getRaw()->dump(OS, 0);
3737
}
3838

39-
bool Syntax::isType() const { return Data.isType(); }
39+
bool Syntax::isType() const { return Data->isType(); }
4040

41-
bool Syntax::isDecl() const { return Data.isDecl(); }
41+
bool Syntax::isDecl() const { return Data->isDecl(); }
4242

43-
bool Syntax::isStmt() const { return Data.isStmt(); }
43+
bool Syntax::isStmt() const { return Data->isStmt(); }
4444

45-
bool Syntax::isExpr() const { return Data.isExpr(); }
45+
bool Syntax::isExpr() const { return Data->isExpr(); }
4646

4747
bool Syntax::isToken() const {
4848
return getRaw()->isToken();
4949
}
5050

51-
bool Syntax::isPattern() const { return Data.isPattern(); }
51+
bool Syntax::isPattern() const { return Data->isPattern(); }
5252

53-
bool Syntax::isUnknown() const { return Data.isUnknown(); }
53+
bool Syntax::isUnknown() const { return Data->isUnknown(); }
5454

5555
bool Syntax::isPresent() const {
5656
return getRaw()->isPresent();
@@ -61,19 +61,19 @@ bool Syntax::isMissing() const {
6161
}
6262

6363
llvm::Optional<Syntax> Syntax::getParent() const {
64-
auto ParentData = getData().getParent();
64+
auto ParentData = getData()->getParent();
6565
if (!ParentData) {
6666
return None;
6767
}
68-
return Syntax(*ParentData);
68+
return Syntax(ParentData);
6969
}
7070

71-
size_t Syntax::getNumChildren() const { return Data.getNumChildren(); }
71+
size_t Syntax::getNumChildren() const { return Data->getNumChildren(); }
7272

7373
llvm::Optional<Syntax> Syntax::getChild(const size_t N) const {
74-
auto ChildData = Data.getChild(N);
74+
auto ChildData = Data->getChild(N);
7575
if (!ChildData) {
7676
return None;
7777
}
78-
return Syntax(*ChildData);
78+
return Syntax(ChildData);
7979
}

0 commit comments

Comments
 (0)