@@ -79,113 +79,59 @@ ASTScopeImpl::widenSourceRangeForChildren(const SourceRange range,
79
79
return r;
80
80
}
81
81
82
- bool ASTScopeImpl::checkSourceRangeAfterExpansion (const ASTContext &ctx) const {
83
- ASTScopeAssert (getSourceRangeOfThisASTNode ().isValid () ||
84
- !getChildren ().empty (),
85
- " need to be able to find source range" );
86
- ASTScopeAssert (verifyThatChildrenAreContainedWithin (getSourceRangeOfScope ()),
87
- " Search will fail" );
88
- ASTScopeAssert (
89
- checkLazySourceRange (ctx),
90
- " Lazy scopes must have compatible ranges before and after expansion" );
82
+ void ASTScopeImpl::checkSourceRangeBeforeAddingChild (ASTScopeImpl *child,
83
+ const ASTContext &ctx) const {
84
+ auto &sourceMgr = ctx.SourceMgr ;
91
85
92
- return true ;
93
- }
94
-
95
- #pragma mark validation & debugging
86
+ auto range = getCharSourceRangeOfScope (sourceMgr);
96
87
97
- bool ASTScopeImpl::hasValidSourceRange () const {
98
- const auto sourceRange = getSourceRangeOfScope ();
99
- return sourceRange.Start .isValid () && sourceRange.End .isValid () &&
100
- !getSourceManager ().isBeforeInBuffer (sourceRange.End ,
101
- sourceRange.Start );
102
- }
88
+ auto childCharRange = child->getCharSourceRangeOfScope (sourceMgr);
103
89
104
- bool ASTScopeImpl::hasValidSourceRangeOfIgnoredASTNodes () const {
105
- return sourceRangeOfIgnoredASTNodes.isValid ();
106
- }
90
+ bool childContainedInParent = [&]() {
91
+ // HACK: For code completion. Handle replaced range.
92
+ if (const auto &replacedRange = sourceMgr.getReplacedRange ()) {
93
+ auto originalRange = Lexer::getCharSourceRangeFromSourceRange (
94
+ sourceMgr, replacedRange.Original );
95
+ auto newRange = Lexer::getCharSourceRangeFromSourceRange (
96
+ sourceMgr, replacedRange.New );
107
97
108
- bool ASTScopeImpl::precedesInSource (const ASTScopeImpl *next) const {
109
- if (!hasValidSourceRange () || !next->hasValidSourceRange ())
110
- return false ;
111
- return !getSourceManager ().isBeforeInBuffer (
112
- next->getSourceRangeOfScope ().Start , getSourceRangeOfScope ().End );
113
- }
98
+ if (range.contains (originalRange) &&
99
+ newRange.contains (childCharRange))
100
+ return true ;
101
+ }
114
102
115
- bool ASTScopeImpl::verifyThatChildrenAreContainedWithin (
116
- const SourceRange range) const {
117
- // assumes children are already in order
118
- if (getChildren ().empty ())
119
- return true ;
120
- const SourceRange rangeOfChildren =
121
- SourceRange (getChildren ().front ()->getSourceRangeOfScope ().Start ,
122
- getChildren ().back ()->getSourceRangeOfScope ().End );
123
- if (getSourceManager ().rangeContains (range, rangeOfChildren))
124
- return true ;
103
+ return range.contains (childCharRange);
104
+ }();
125
105
126
- // HACK: For code completion. Handle replaced range.
127
- if (const auto &replacedRange = getSourceManager ().getReplacedRange ()) {
128
- if (getSourceManager ().rangeContains (replacedRange.Original , range) &&
129
- getSourceManager ().rangeContains (replacedRange.New , rangeOfChildren))
130
- return true ;
106
+ if (!childContainedInParent) {
107
+ auto &out = verificationError () << " child not contained in its parent:\n " ;
108
+ child->print (out);
109
+ out << " \n ***Parent node***\n " ;
110
+ this ->print (out);
111
+ abort ();
131
112
}
132
113
133
- auto &out = verificationError () << " children not contained in its parent\n " ;
134
- if (getChildren ().size () == 1 ) {
135
- out << " \n ***Only Child node***\n " ;
136
- getChildren ().front ()->print (out);
137
- } else {
138
- out << " \n ***First Child node***\n " ;
139
- getChildren ().front ()->print (out);
140
- out << " \n ***Last Child node***\n " ;
141
- getChildren ().back ()->print (out);
142
- }
143
- out << " \n ***Parent node***\n " ;
144
- this ->print (out);
145
- abort ();
146
- }
147
-
148
- bool ASTScopeImpl::verifyThatThisNodeComeAfterItsPriorSibling () const {
149
- auto priorSibling = getPriorSibling ();
150
- if (!priorSibling)
151
- return true ;
152
- if (priorSibling.get ()->precedesInSource (this ))
153
- return true ;
154
- auto &out = verificationError () << " unexpected out-of-order nodes\n " ;
155
- out << " \n ***Penultimate child node***\n " ;
156
- priorSibling.get ()->print (out);
157
- out << " \n ***Last Child node***\n " ;
158
- print (out);
159
- out << " \n ***Parent node***\n " ;
160
- getParent ().get ()->print (out);
161
- // llvm::errs() << "\n\nsource:\n"
162
- // << getSourceManager()
163
- // .getRangeForBuffer(
164
- // getSourceFile()->getBufferID().getValue())
165
- // .str();
166
- ASTScope_unreachable (" unexpected out-of-order nodes" );
167
- return false ;
168
- }
169
-
170
- NullablePtr<ASTScopeImpl> ASTScopeImpl::getPriorSibling () const {
171
- auto parent = getParent ();
172
- if (!parent)
173
- return nullptr ;
174
- auto const &siblingsAndMe = parent.get ()->getChildren ();
175
- // find myIndex, which is probably the last one
176
- int myIndex = -1 ;
177
- for (int i = siblingsAndMe.size () - 1 ; i >= 0 ; --i) {
178
- if (siblingsAndMe[i] == this ) {
179
- myIndex = i;
180
- break ;
114
+ if (!storedChildren.empty ()) {
115
+ auto previousChild = storedChildren.back ();
116
+ auto endOfPreviousChild = previousChild->getCharSourceRangeOfScope (
117
+ sourceMgr).getEnd ();
118
+
119
+ if (childCharRange.getStart () != endOfPreviousChild &&
120
+ !sourceMgr.isBeforeInBuffer (endOfPreviousChild,
121
+ childCharRange.getStart ())) {
122
+ auto &out = verificationError () << " child overlaps previous child:\n " ;
123
+ child->print (out);
124
+ out << " \n ***Previous child\n " ;
125
+ previousChild->print (out);
126
+ out << " \n ***Parent node***\n " ;
127
+ this ->print (out);
128
+ abort ();
181
129
}
182
130
}
183
- ASTScopeAssert (myIndex != -1 , " I have been disowned!" );
184
- if (myIndex == 0 )
185
- return nullptr ;
186
- return siblingsAndMe[myIndex - 1 ];
187
131
}
188
132
133
+ #pragma mark validation & debugging
134
+
189
135
bool ASTScopeImpl::doesRangeMatch (unsigned start, unsigned end, StringRef file,
190
136
StringRef className) {
191
137
if (!className.empty () && className != getClassName ())
@@ -509,34 +455,6 @@ void ASTScopeImpl::computeAndCacheSourceRangeOfScope(
509
455
cachedSourceRange = computeSourceRangeOfScope (omitAssertions);
510
456
}
511
457
512
- bool ASTScopeImpl::checkLazySourceRange (const ASTContext &ctx) const {
513
- const auto unexpandedRange = sourceRangeForDeferredExpansion ();
514
- const auto expandedRange = computeSourceRangeOfScopeWithChildASTNodes ();
515
- if (unexpandedRange.isInvalid () || expandedRange.isInvalid ())
516
- return true ;
517
- if (unexpandedRange == expandedRange)
518
- return true ;
519
-
520
- llvm::errs () << " *** Lazy range problem. Parent unexpanded: ***\n " ;
521
- unexpandedRange.print (llvm::errs (), getSourceManager (), false );
522
- llvm::errs () << " \n " ;
523
- if (!getChildren ().empty ()) {
524
- llvm::errs () << " *** vs last child: ***\n " ;
525
- auto b = getChildren ().back ()->computeSourceRangeOfScope ();
526
- b.print (llvm::errs (), getSourceManager (), false );
527
- llvm::errs () << " \n " ;
528
- }
529
- else if (hasValidSourceRangeOfIgnoredASTNodes ()) {
530
- llvm::errs () << " *** vs ignored AST nodes: ***\n " ;
531
- sourceRangeOfIgnoredASTNodes.print (llvm::errs (), getSourceManager (), false );
532
- llvm::errs () << " \n " ;
533
- }
534
- print (llvm::errs (), 0 , false );
535
- llvm::errs () << " \n " ;
536
-
537
- return false ;
538
- }
539
-
540
458
SourceRange
541
459
ASTScopeImpl::computeSourceRangeOfScope (const bool omitAssertions) const {
542
460
// If we don't need to consider children, it's cheaper
0 commit comments