@@ -221,6 +221,7 @@ void ResolvedRangeInfo::print(llvm::raw_ostream &OS) {
221
221
case RangeKind::SingleExpression: OS << " SingleExpression" ; break ;
222
222
case RangeKind::SingleDecl: OS << " SingleDecl" ; break ;
223
223
case RangeKind::MultiStatement: OS << " MultiStatement" ; break ;
224
+ case RangeKind::PartOfExpression: OS << " PartOfExpression" ; break ;
224
225
case RangeKind::SingleStatement: OS << " SingleStatement" ; break ;
225
226
case RangeKind::Invalid: OS << " Invalid" ; break ;
226
227
}
@@ -244,6 +245,12 @@ void ResolvedRangeInfo::print(llvm::raw_ostream &OS) {
244
245
OS << " </Context>\n " ;
245
246
}
246
247
248
+ if (CommonExprParent) {
249
+ OS << " <Parent>" ;
250
+ OS << Expr::getKindName (CommonExprParent->getKind ());
251
+ OS << " </Parent>\n " ;
252
+ }
253
+
247
254
if (!HasSingleEntry) {
248
255
OS << " <Entry>Multi</Entry>\n " ;
249
256
}
@@ -394,6 +401,7 @@ struct RangeResolver::Implementation {
394
401
switch (Kind) {
395
402
case RangeKind::Invalid:
396
403
case RangeKind::SingleDecl:
404
+ case RangeKind::PartOfExpression:
397
405
llvm_unreachable (" cannot get type." );
398
406
399
407
// For a single expression, its type is apparent.
@@ -453,23 +461,29 @@ struct RangeResolver::Implementation {
453
461
return ResolvedRangeInfo (RangeKind::SingleExpression,
454
462
resolveNodeType (Node, RangeKind::SingleExpression),
455
463
Content,
456
- getImmediateContext (), SingleEntry,
464
+ getImmediateContext (),
465
+ /* Common Parent Expr*/ nullptr ,
466
+ SingleEntry,
457
467
UnhandledError, Kind,
458
468
llvm::makeArrayRef (ContainedASTNodes),
459
469
llvm::makeArrayRef (DeclaredDecls),
460
470
llvm::makeArrayRef (ReferencedDecls));
461
471
else if (Node.is <Stmt*>())
462
472
return ResolvedRangeInfo (RangeKind::SingleStatement,
463
473
resolveNodeType (Node, RangeKind::SingleStatement),
464
- Content, getImmediateContext (), SingleEntry,
474
+ Content, getImmediateContext (),
475
+ /* Common Parent Expr*/ nullptr ,
476
+ SingleEntry,
465
477
UnhandledError, Kind,
466
478
llvm::makeArrayRef (ContainedASTNodes),
467
479
llvm::makeArrayRef (DeclaredDecls),
468
480
llvm::makeArrayRef (ReferencedDecls));
469
481
else {
470
482
assert (Node.is <Decl*>());
471
483
return ResolvedRangeInfo (RangeKind::SingleDecl, {nullptr , false }, Content,
472
- getImmediateContext (), SingleEntry,
484
+ getImmediateContext (),
485
+ /* Common Parent Expr*/ nullptr ,
486
+ SingleEntry,
473
487
UnhandledError, Kind,
474
488
llvm::makeArrayRef (ContainedASTNodes),
475
489
llvm::makeArrayRef (DeclaredDecls),
@@ -523,6 +537,22 @@ struct RangeResolver::Implementation {
523
537
}
524
538
525
539
void leave (ASTNode Node) {
540
+ if (!hasResult () && !Node.isImplicit () && nodeContainSelection (Node)) {
541
+ if (auto Parent = Node.is <Expr*>() ? Node.get <Expr*>() : nullptr ) {
542
+ Result = {
543
+ RangeKind::PartOfExpression, {nullptr , false }, Content,
544
+ getImmediateContext (),
545
+ Parent,
546
+ hasSingleEntryPoint (ContainedASTNodes),
547
+ hasUnhandledError (ContainedASTNodes),
548
+ getOrphanKind (ContainedASTNodes),
549
+ llvm::makeArrayRef (ContainedASTNodes),
550
+ llvm::makeArrayRef (DeclaredDecls),
551
+ llvm::makeArrayRef (ReferencedDecls)
552
+ };
553
+ }
554
+ }
555
+
526
556
assert (ContextStack.back ().Parent .getOpaqueValue () == Node.getOpaqueValue ());
527
557
ContextStack.pop_back ();
528
558
}
@@ -690,12 +720,13 @@ struct RangeResolver::Implementation {
690
720
analyzeDecl (D);
691
721
auto &DCInfo = getCurrentDC ();
692
722
switch (getRangeMatchKind (Node.getSourceRange ())) {
693
- case RangeMatchKind::NoneMatch:
723
+ case RangeMatchKind::NoneMatch: {
694
724
// PatternBindingDecl is not visited; we need to explicitly analyze here.
695
725
if (auto *VA = dyn_cast_or_null<VarDecl>(D))
696
726
if (auto PBD = VA->getParentPatternBinding ())
697
727
analyze (PBD);
698
728
break ;
729
+ }
699
730
case RangeMatchKind::RangeMatch: {
700
731
postAnalysis (Node);
701
732
@@ -726,13 +757,13 @@ struct RangeResolver::Implementation {
726
757
/* Last node has the type */
727
758
resolveNodeType (DCInfo.EndMatches .back (),
728
759
RangeKind::MultiStatement), Content,
729
- getImmediateContext (), hasSingleEntryPoint (ContainedASTNodes),
760
+ getImmediateContext (), nullptr ,
761
+ hasSingleEntryPoint (ContainedASTNodes),
730
762
hasUnhandledError (ContainedASTNodes),
731
763
getOrphanKind (ContainedASTNodes),
732
764
llvm::makeArrayRef (ContainedASTNodes),
733
765
llvm::makeArrayRef (DeclaredDecls),
734
766
llvm::makeArrayRef (ReferencedDecls)};
735
- return ;
736
767
}
737
768
}
738
769
@@ -746,6 +777,17 @@ struct RangeResolver::Implementation {
746
777
return true ;
747
778
}
748
779
780
+ bool nodeContainSelection (ASTNode Node) {
781
+ // If the selection starts before the node, return false.
782
+ if (SM.isBeforeInBuffer (Start, Node.getStartLoc ()))
783
+ return false ;
784
+ // If the node ends before the selection, return false.
785
+ if (SM.isBeforeInBuffer (Lexer::getLocForEndOfToken (SM, Node.getEndLoc ()), End))
786
+ return false ;
787
+ // Contained.
788
+ return true ;
789
+ }
790
+
749
791
bool shouldAnalyze (ASTNode Node) {
750
792
// Avoid analyzing implicit nodes.
751
793
if (Node.isImplicit ())
0 commit comments