12
12
13
13
#include " swift/AST/ASTPrinter.h"
14
14
#include " swift/AST/Decl.h"
15
+ #include " swift/AST/Effects.h"
15
16
#include " swift/AST/NameLookup.h"
16
17
#include " swift/AST/ASTDemangler.h"
17
18
#include " swift/Basic/SourceManager.h"
@@ -377,45 +378,45 @@ class RangeResolver : public SourceEntityWalker {
377
378
ResolvedRangeInfo resolve ();
378
379
};
379
380
380
- static bool hasUnhandledError (ArrayRef<ASTNode> Nodes) {
381
- class ThrowingEntityAnalyzer : public SourceEntityWalker {
382
- bool Throwing ;
381
+ static PossibleEffects getUnhandledEffects (ArrayRef<ASTNode> Nodes) {
382
+ class EffectsAnalyzer : public SourceEntityWalker {
383
+ PossibleEffects Effects ;
383
384
public:
384
- ThrowingEntityAnalyzer (): Throwing(false ) {}
385
385
bool walkToStmtPre (Stmt *S) override {
386
386
if (auto DCS = dyn_cast<DoCatchStmt>(S)) {
387
387
if (DCS->isSyntacticallyExhaustive ())
388
388
return false ;
389
- Throwing = true ;
389
+ Effects |= EffectKind::Throws ;
390
390
} else if (isa<ThrowStmt>(S)) {
391
- Throwing = true ;
391
+ Effects |= EffectKind::Throws ;
392
392
}
393
- return !Throwing ;
393
+ return true ;
394
394
}
395
395
bool walkToExprPre (Expr *E) override {
396
396
// Don't walk into closures, they only produce effects when called.
397
397
if (isa<ClosureExpr>(E))
398
398
return false ;
399
-
400
- if (isa<TryExpr>(E)) {
401
- Throwing = true ;
402
- }
403
- return !Throwing;
399
+
400
+ if (isa<TryExpr>(E))
401
+ Effects |= EffectKind::Throws;
402
+ if (isa<AwaitExpr>(E))
403
+ Effects |= EffectKind::Async;
404
+
405
+ return true ;
404
406
}
405
407
bool walkToDeclPre (Decl *D, CharSourceRange Range) override {
406
408
return false ;
407
409
}
408
- bool walkToDeclPost (Decl *D) override { return !Throwing; }
409
- bool walkToStmtPost (Stmt *S) override { return !Throwing; }
410
- bool walkToExprPost (Expr *E) override { return !Throwing; }
411
- bool isThrowing () { return Throwing; }
410
+ PossibleEffects getEffects () const { return Effects; }
412
411
};
413
412
414
- return Nodes.end () != std::find_if (Nodes.begin (), Nodes.end (), [](ASTNode N) {
415
- ThrowingEntityAnalyzer Analyzer;
413
+ PossibleEffects Effects;
414
+ for (auto N : Nodes) {
415
+ EffectsAnalyzer Analyzer;
416
416
Analyzer.walk (N);
417
- return Analyzer.isThrowing ();
418
- });
417
+ Effects |= Analyzer.getEffects ();
418
+ }
419
+ return Effects;
419
420
}
420
421
421
422
struct RangeResolver ::Implementation {
@@ -553,7 +554,7 @@ struct RangeResolver::Implementation {
553
554
assert (ContainedASTNodes.size () == 1 );
554
555
// Single node implies single entry point, or is it?
555
556
bool SingleEntry = true ;
556
- bool UnhandledError = hasUnhandledError ({Node});
557
+ auto UnhandledEffects = getUnhandledEffects ({Node});
557
558
OrphanKind Kind = getOrphanKind (ContainedASTNodes);
558
559
if (Node.is <Expr*>())
559
560
return ResolvedRangeInfo (RangeKind::SingleExpression,
@@ -562,7 +563,7 @@ struct RangeResolver::Implementation {
562
563
getImmediateContext (),
563
564
/* Common Parent Expr*/ nullptr ,
564
565
SingleEntry,
565
- UnhandledError , Kind,
566
+ UnhandledEffects , Kind,
566
567
llvm::makeArrayRef (ContainedASTNodes),
567
568
llvm::makeArrayRef (DeclaredDecls),
568
569
llvm::makeArrayRef (ReferencedDecls));
@@ -573,7 +574,7 @@ struct RangeResolver::Implementation {
573
574
getImmediateContext (),
574
575
/* Common Parent Expr*/ nullptr ,
575
576
SingleEntry,
576
- UnhandledError , Kind,
577
+ UnhandledEffects , Kind,
577
578
llvm::makeArrayRef (ContainedASTNodes),
578
579
llvm::makeArrayRef (DeclaredDecls),
579
580
llvm::makeArrayRef (ReferencedDecls));
@@ -585,7 +586,7 @@ struct RangeResolver::Implementation {
585
586
getImmediateContext (),
586
587
/* Common Parent Expr*/ nullptr ,
587
588
SingleEntry,
588
- UnhandledError , Kind,
589
+ UnhandledEffects , Kind,
589
590
llvm::makeArrayRef (ContainedASTNodes),
590
591
llvm::makeArrayRef (DeclaredDecls),
591
592
llvm::makeArrayRef (ReferencedDecls));
@@ -646,7 +647,7 @@ struct RangeResolver::Implementation {
646
647
getImmediateContext (),
647
648
Parent,
648
649
hasSingleEntryPoint (ContainedASTNodes),
649
- hasUnhandledError (ContainedASTNodes),
650
+ getUnhandledEffects (ContainedASTNodes),
650
651
getOrphanKind (ContainedASTNodes),
651
652
llvm::makeArrayRef (ContainedASTNodes),
652
653
llvm::makeArrayRef (DeclaredDecls),
@@ -893,7 +894,7 @@ struct RangeResolver::Implementation {
893
894
TokensInRange,
894
895
getImmediateContext (), nullptr ,
895
896
hasSingleEntryPoint (ContainedASTNodes),
896
- hasUnhandledError (ContainedASTNodes),
897
+ getUnhandledEffects (ContainedASTNodes),
897
898
getOrphanKind (ContainedASTNodes),
898
899
llvm::makeArrayRef (ContainedASTNodes),
899
900
llvm::makeArrayRef (DeclaredDecls),
@@ -908,7 +909,7 @@ struct RangeResolver::Implementation {
908
909
getImmediateContext (),
909
910
/* Common Parent Expr*/ nullptr ,
910
911
/* SinleEntry*/ true ,
911
- hasUnhandledError (ContainedASTNodes),
912
+ getUnhandledEffects (ContainedASTNodes),
912
913
getOrphanKind (ContainedASTNodes),
913
914
llvm::makeArrayRef (ContainedASTNodes),
914
915
llvm::makeArrayRef (DeclaredDecls),
0 commit comments