@@ -79,113 +79,59 @@ ASTScopeImpl::widenSourceRangeForChildren(const SourceRange range,
7979 return r;
8080}
8181
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 ;
9185
92- return true ;
93- }
94-
95- #pragma mark validation & debugging
86+ auto range = getCharSourceRangeOfScope (sourceMgr);
9687
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);
10389
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 );
10797
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+ }
114102
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+ }();
125105
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 ();
131112 }
132113
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 ();
181129 }
182130 }
183- ASTScopeAssert (myIndex != -1 , " I have been disowned!" );
184- if (myIndex == 0 )
185- return nullptr ;
186- return siblingsAndMe[myIndex - 1 ];
187131}
188132
133+ #pragma mark validation & debugging
134+
189135bool ASTScopeImpl::doesRangeMatch (unsigned start, unsigned end, StringRef file,
190136 StringRef className) {
191137 if (!className.empty () && className != getClassName ())
@@ -509,34 +455,6 @@ void ASTScopeImpl::computeAndCacheSourceRangeOfScope(
509455 cachedSourceRange = computeSourceRangeOfScope (omitAssertions);
510456}
511457
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-
540458SourceRange
541459ASTScopeImpl::computeSourceRangeOfScope (const bool omitAssertions) const {
542460 // If we don't need to consider children, it's cheaper
0 commit comments