@@ -28,65 +28,100 @@ using namespace swift;
2828using namespace swift ::syntax;
2929using namespace llvm ;
3030
31+ OpaqueSyntaxNode
32+ HiddenLibSyntaxAction::makeHiddenNode (OpaqueSyntaxNode explicitActionNode,
33+ OpaqueSyntaxNode libSyntaxNode) {
34+ auto dat = NodeAllocator.Allocate ();
35+ return new (dat) Node (explicitActionNode, libSyntaxNode);
36+ }
37+
3138OpaqueSyntaxNode HiddenLibSyntaxAction::recordToken (
3239 tok tokenKind, ArrayRef<ParsedTriviaPiece> leadingTrivia,
3340 ArrayRef<ParsedTriviaPiece> trailingTrivia, CharSourceRange range) {
3441 OpaqueSyntaxNode primaryNode = ExplicitAction->recordToken (
3542 tokenKind, leadingTrivia, trailingTrivia, range);
43+ OpaqueSyntaxNode secondaryNode = nullptr ;
3644
37- if (!areBothLibSyntax ()) {
38- OpaqueSyntaxNode secondaryNode = LibSyntaxAction->recordToken (
39- tokenKind, leadingTrivia, trailingTrivia, range);
40- OpaqueNodeMap[primaryNode] = secondaryNode;
45+ if (areBothLibSyntax ()) {
46+ secondaryNode = primaryNode;
47+ } else {
48+ secondaryNode = LibSyntaxAction->recordToken (tokenKind, leadingTrivia,
49+ trailingTrivia, range);
4150 }
4251
43- return primaryNode;
52+ return makeHiddenNode ( primaryNode, secondaryNode) ;
4453}
4554
4655OpaqueSyntaxNode HiddenLibSyntaxAction::recordMissingToken (tok tokenKind,
4756 SourceLoc loc) {
4857 OpaqueSyntaxNode primaryNode =
4958 ExplicitAction->recordMissingToken (tokenKind, loc);
59+ OpaqueSyntaxNode secondaryNode = nullptr ;
5060
51- if (! areBothLibSyntax ()) {
52- OpaqueSyntaxNode secondaryNode =
53- LibSyntaxAction-> recordMissingToken (tokenKind, loc);
54- OpaqueNodeMap[primaryNode] = secondaryNode ;
61+ if (areBothLibSyntax ()) {
62+ secondaryNode = primaryNode;
63+ } else {
64+ secondaryNode = LibSyntaxAction-> recordMissingToken (tokenKind, loc) ;
5565 }
5666
57- return primaryNode;
67+ return makeHiddenNode ( primaryNode, secondaryNode) ;
5868}
5969
6070OpaqueSyntaxNode
6171HiddenLibSyntaxAction::recordRawSyntax (syntax::SyntaxKind kind,
6272 ArrayRef<OpaqueSyntaxNode> elements,
6373 CharSourceRange range) {
64- OpaqueSyntaxNode primaryNode =
65- ExplicitAction->recordRawSyntax (kind, elements, range);
74+ OpaqueSyntaxNode primaryNode = nullptr ;
75+ OpaqueSyntaxNode secondaryNode = nullptr ;
76+
77+ {
78+ SmallVector<OpaqueSyntaxNode, 4 > primaryElements;
79+ primaryElements.reserve (elements.size ());
80+ for (auto element : elements) {
81+ OpaqueSyntaxNode primaryElement = nullptr ;
82+ if (element)
83+ primaryElement = ((Node *)element)->ExplicitActionNode ;
84+ primaryElements.push_back (primaryElement);
85+ }
6686
67- if (!areBothLibSyntax ()) {
87+ primaryNode = ExplicitAction->recordRawSyntax (kind, primaryElements, range);
88+ }
89+
90+ if (areBothLibSyntax ()) {
91+ secondaryNode = primaryNode;
92+ } else {
6893 SmallVector<OpaqueSyntaxNode, 4 > secondaryElements;
6994 secondaryElements.reserve (elements.size ());
70- for (auto &&element : elements) {
71- secondaryElements.push_back (OpaqueNodeMap[element]);
95+ for (auto element : elements) {
96+ OpaqueSyntaxNode secondaryElement = nullptr ;
97+ if (element)
98+ secondaryElement = ((Node *)element)->LibSyntaxNode ;
99+ secondaryElements.push_back (secondaryElement);
72100 }
73- OpaqueSyntaxNode secondaryNode =
101+ secondaryNode =
74102 LibSyntaxAction->recordRawSyntax (kind, secondaryElements, range);
75- OpaqueNodeMap[primaryNode] = secondaryNode;
76103 }
77104
78- return primaryNode;
105+ return makeHiddenNode ( primaryNode, secondaryNode) ;
79106}
80107
81108std::pair<size_t , OpaqueSyntaxNode>
82109HiddenLibSyntaxAction::lookupNode (size_t lexerOffset, syntax::SyntaxKind kind) {
83- return ExplicitAction->lookupNode (lexerOffset, kind);
110+ size_t length;
111+ OpaqueSyntaxNode n;
112+ std::tie (length, n) = ExplicitAction->lookupNode (lexerOffset, kind);
113+ if (length == 0 )
114+ return {0 , nullptr };
115+ return {length, makeHiddenNode (n, nullptr )};
84116}
85117
86- OpaqueSyntaxNode
87- HiddenLibSyntaxAction::getLibSyntaxNodeFor (OpaqueSyntaxNode explicitNode) {
88- if (! areBothLibSyntax ())
89- return OpaqueNodeMap[explicitNode];
118+ RawSyntax * HiddenLibSyntaxAction::getLibSyntaxNodeFor ( OpaqueSyntaxNode node) {
119+ auto hiddenNode = (Node *)node;
120+ return (RawSyntax *)hiddenNode-> LibSyntaxNode ;
121+ }
90122
91- return explicitNode;
123+ OpaqueSyntaxNode
124+ HiddenLibSyntaxAction::getExplicitNodeFor (OpaqueSyntaxNode node) {
125+ auto hiddenNode = (Node *)node;
126+ return hiddenNode->ExplicitActionNode ;
92127}
0 commit comments