23
23
#include " swift/Basic/StringExtras.h"
24
24
#include " swift/Parse/Lexer.h"
25
25
#include " llvm/ADT/MapVector.h"
26
+ #include " llvm/Support/SaveAndRestore.h"
26
27
using namespace swift ;
27
28
28
29
// ===----------------------------------------------------------------------===//
@@ -915,14 +916,12 @@ class AvailabilityWalker : public ASTWalker {
915
916
916
917
TypeChecker &TC;
917
918
DeclContext *DC;
918
- const MemberAccessContext AccessContext;
919
+ MemberAccessContext AccessContext = MemberAccessContext::Getter ;
919
920
SmallVector<const Expr *, 16 > ExprStack;
920
921
921
922
public:
922
923
AvailabilityWalker (
923
- TypeChecker &TC, DeclContext *DC,
924
- MemberAccessContext AccessContext = MemberAccessContext::Getter)
925
- : TC(TC), DC(DC), AccessContext(AccessContext) {}
924
+ TypeChecker &TC, DeclContext *DC) : TC(TC), DC(DC) {}
926
925
927
926
virtual std::pair<bool , Expr *> walkToExprPre (Expr *E) override {
928
927
ExprStack.push_back (E);
@@ -976,7 +975,7 @@ class AvailabilityWalker : public ASTWalker {
976
975
const AvailableAttr *Attr);
977
976
978
977
// / Walk an assignment expression, checking for availability.
979
- void walkAssignExpr (AssignExpr *E) const {
978
+ void walkAssignExpr (AssignExpr *E) {
980
979
// We take over recursive walking of assignment expressions in order to
981
980
// walk the destination and source expressions in different member
982
981
// access contexts.
@@ -990,20 +989,20 @@ class AvailabilityWalker : public ASTWalker {
990
989
// encountered walking (pre-order) is the Dest is the destination of the
991
990
// write. For the moment this is fine -- but future syntax might violate
992
991
// this assumption.
993
- walkInContext (Dest, MemberAccessContext::Setter);
992
+ walkInContext (E, Dest, MemberAccessContext::Setter);
994
993
995
994
// Check RHS in getter context
996
995
Expr *Source = E->getSrc ();
997
996
if (!Source) {
998
997
return ;
999
998
}
1000
- walkInContext (Source, MemberAccessContext::Getter);
999
+ walkInContext (E, Source, MemberAccessContext::Getter);
1001
1000
}
1002
1001
1003
1002
// / Walk a member reference expression, checking for availability.
1004
1003
void walkMemberRef (MemberRefExpr *E) {
1005
1004
// Walk the base in a getter context.
1006
- walkInContext (E->getBase (), MemberAccessContext::Getter);
1005
+ walkInContext (E, E ->getBase (), MemberAccessContext::Getter);
1007
1006
1008
1007
ValueDecl *D = E->getMember ().getDecl ();
1009
1008
// Diagnose for the member declaration itself.
@@ -1021,12 +1020,15 @@ class AvailabilityWalker : public ASTWalker {
1021
1020
1022
1021
// / Walk an inout expression, checking for availability.
1023
1022
void walkInOutExpr (InOutExpr *E) {
1024
- walkInContext (E->getSubExpr (), MemberAccessContext::InOut);
1023
+ walkInContext (E, E ->getSubExpr (), MemberAccessContext::InOut);
1025
1024
}
1026
1025
1027
1026
// / Walk the given expression in the member access context.
1028
- void walkInContext (Expr *E, MemberAccessContext AccessContext) const {
1029
- E->walk (AvailabilityWalker (TC, DC, AccessContext));
1027
+ void walkInContext (Expr *baseExpr, Expr *E,
1028
+ MemberAccessContext AccessContext) {
1029
+ llvm::SaveAndRestore<MemberAccessContext>
1030
+ C (this ->AccessContext , AccessContext);
1031
+ E->walk (*this );
1030
1032
}
1031
1033
1032
1034
// / Emit diagnostics, if necessary, for accesses to storage where
0 commit comments