@@ -102,201 +102,6 @@ static Expr *extractKeyPathFromCurryThunkCall(Expr *E) {
102
102
return cast<CallExpr>(E)->getArgs ()->getUnlabeledUnaryExpr ();
103
103
}
104
104
105
- namespace {
106
-
107
- // / AST walker that "sanitizes" an expression for re-typechecking during
108
- // / code completion.
109
- // /
110
- // / FIXME: Remove this.
111
- class SanitizeExpr : public ASTWalker {
112
- ASTContext &C;
113
- llvm::SmallDenseMap<OpaqueValueExpr *, Expr *, 4 > OpenExistentials;
114
-
115
- public:
116
- SanitizeExpr (ASTContext &C)
117
- : C(C) { }
118
-
119
- MacroWalking getMacroWalkingBehavior () const override {
120
- return MacroWalking::Arguments;
121
- }
122
-
123
- PreWalkResult<ArgumentList *>
124
- walkToArgumentListPre (ArgumentList *argList) override {
125
- // Return the argument list to the state prior to being rewritten. This will
126
- // strip default arguments and expand variadic args.
127
- return Action::Continue (argList->getOriginalArgs ());
128
- }
129
-
130
- PreWalkResult<Expr *> walkToExprPre (Expr *expr) override {
131
- while (true ) {
132
- // OpenExistentialExpr contains OpaqueValueExpr in its sub expression.
133
- if (auto OOE = dyn_cast<OpenExistentialExpr>(expr)) {
134
- auto archetypeVal = OOE->getOpaqueValue ();
135
- auto base = OOE->getExistentialValue ();
136
-
137
- bool inserted = OpenExistentials.insert ({archetypeVal, base}).second ;
138
- assert (inserted && " OpaqueValue appears multiple times?" );
139
- (void )inserted;
140
- SWIFT_DEFER { OpenExistentials.erase (archetypeVal); };
141
-
142
- // Walk to and return the base expression to erase any existentials
143
- // within it.
144
- return Action::SkipChildren (OOE->getSubExpr ()->walk (*this ));
145
- }
146
-
147
- // Hacky, this behaves just like an OpenedExistential in that it changes
148
- // the expr tree.
149
- if (auto ISLE = dyn_cast<InterpolatedStringLiteralExpr>(expr)) {
150
- if (auto subExpr = ISLE->getAppendingExpr ()->getSubExpr ()) {
151
- if (auto opaqueValue = dyn_cast<OpaqueValueExpr>(subExpr)) {
152
- ISLE->getAppendingExpr ()->setSubExpr (nullptr );
153
- }
154
- }
155
- }
156
-
157
- // Substitute OpaqueValue with its representing existential.
158
- if (auto OVE = dyn_cast<OpaqueValueExpr>(expr)) {
159
- auto value = OpenExistentials.find (OVE);
160
-
161
- if (value != OpenExistentials.end ()) {
162
- expr = value->second ;
163
- continue ;
164
- } else {
165
- assert (OVE->isPlaceholder () &&
166
- " Didn't see this OVE in a containing OpenExistentialExpr?" );
167
- }
168
- }
169
-
170
- // Skip any implicit conversions applied to this expression.
171
- if (auto ICE = dyn_cast<ImplicitConversionExpr>(expr)) {
172
- expr = ICE->getSubExpr ();
173
- continue ;
174
- }
175
-
176
- // MakeTemporarilyEscapableExpr is typechecked expression.
177
- if (auto MTEE = dyn_cast<MakeTemporarilyEscapableExpr>(expr)) {
178
- expr = MTEE->getOriginalExpr ();
179
- continue ;
180
- }
181
-
182
- // Extract keypath from '{ `$kp$` in { $0[keyPath: $kp$] } }(keypath)'
183
- if (isKeyPathCurriedThunkCallExpr (expr)) {
184
- expr = extractKeyPathFromCurryThunkCall (expr);
185
- continue ;
186
- }
187
-
188
- if (auto ACE = dyn_cast<AutoClosureExpr>(expr)) {
189
- // Restore '@autoclosure'd value.
190
- // This is only valid if the closure doesn't have parameters.
191
- if (ACE->getParameters ()->size () == 0 ) {
192
- expr = ACE->getSingleExpressionBody ();
193
- continue ;
194
- }
195
- // Restore autoclosure'd function reference.
196
- if (auto *unwrapped = ACE->getUnwrappedCurryThunkExpr ()) {
197
- expr = unwrapped;
198
- continue ;
199
- }
200
-
201
- llvm_unreachable (" other AutoClosureExpr must be handled specially" );
202
- }
203
-
204
- // Remove any semantic expression injected by typechecking.
205
- if (auto EPE = dyn_cast<EditorPlaceholderExpr>(expr)) {
206
- EPE->setSemanticExpr (nullptr );
207
- }
208
-
209
- // If this is a closure, only walk into its children if they
210
- // are type-checked in the context of the enclosing expression.
211
- if (auto closure = dyn_cast<ClosureExpr>(expr)) {
212
- for (auto &Param : *closure->getParameters ()) {
213
- Param->setSpecifier (swift::ParamSpecifier::Default);
214
- }
215
- }
216
-
217
- // Now, we're ready to walk into sub expressions.
218
- return Action::Continue (expr);
219
- }
220
- }
221
-
222
- PostWalkResult<Expr *> walkToExprPost (Expr *expr) override {
223
- assert (!isa<ImplicitConversionExpr>(expr) &&
224
- " ImplicitConversionExpr should be eliminated in walkToExprPre" );
225
-
226
- auto buildMemberRef = [&](Type memberType, Expr *base, SourceLoc dotLoc,
227
- ConcreteDeclRef member, DeclNameLoc memberLoc,
228
- bool implicit) -> Expr * {
229
- auto *memberRef = new (C)
230
- MemberRefExpr (base, dotLoc, member, memberLoc, implicit);
231
-
232
- if (memberType) {
233
- memberRef->setType (memberType);
234
- return memberRef;
235
- }
236
-
237
- return memberRef;
238
- };
239
-
240
- // A DotSyntaxCallExpr is a member reference that has already been
241
- // type-checked down to a call; turn it back into an overloaded
242
- // member reference expression.
243
- if (auto dotCall = dyn_cast<DotSyntaxCallExpr>(expr)) {
244
- DeclNameLoc memberLoc;
245
- auto memberAndFunctionRef = findReferencedDecl (dotCall->getFn (),
246
- memberLoc);
247
- if (memberAndFunctionRef.first ) {
248
- assert (!isa<ImplicitConversionExpr>(dotCall->getBase ()));
249
- auto *ref = buildMemberRef (dotCall->getType (),
250
- dotCall->getBase (),
251
- dotCall->getDotLoc (),
252
- memberAndFunctionRef.first ,
253
- memberLoc, expr->isImplicit ());
254
- return Action::Continue (ref);
255
- }
256
- }
257
-
258
- if (auto *dynamicMember = dyn_cast<DynamicMemberRefExpr>(expr)) {
259
- if (auto memberRef = dynamicMember->getMember ()) {
260
- assert (!isa<ImplicitConversionExpr>(dynamicMember->getBase ()));
261
- auto *ref = buildMemberRef (dynamicMember->getType (),
262
- dynamicMember->getBase (),
263
- dynamicMember->getDotLoc (),
264
- memberRef,
265
- dynamicMember->getNameLoc (),
266
- expr->isImplicit ());
267
- return Action::Continue (ref);
268
- }
269
- }
270
-
271
- // A DotSyntaxBaseIgnoredExpr is a static member reference that has
272
- // already been type-checked down to a call where the argument doesn't
273
- // actually matter; turn it back into an overloaded member reference
274
- // expression.
275
- if (auto dotIgnored = dyn_cast<DotSyntaxBaseIgnoredExpr>(expr)) {
276
- DeclNameLoc memberLoc;
277
- auto memberAndFunctionRef = findReferencedDecl (dotIgnored->getRHS (),
278
- memberLoc);
279
- if (memberAndFunctionRef.first ) {
280
- assert (!isa<ImplicitConversionExpr>(dotIgnored->getLHS ()));
281
- auto *ref = buildMemberRef (dotIgnored->getType (),
282
- dotIgnored->getLHS (),
283
- dotIgnored->getDotLoc (),
284
- memberAndFunctionRef.first ,
285
- memberLoc, expr->isImplicit ());
286
- return Action::Continue (ref);
287
- }
288
- }
289
- return Action::Continue (expr);
290
- }
291
-
292
- // / Ignore declarations.
293
- PreWalkAction walkToDeclPre (Decl *decl) override {
294
- return Action::SkipChildren ();
295
- }
296
- };
297
-
298
- } // end namespace
299
-
300
105
static Type
301
106
getTypeOfExpressionWithoutApplying (Expr *&expr, DeclContext *dc,
302
107
ConcreteDeclRef &referencedDecl,
@@ -310,8 +115,6 @@ getTypeOfExpressionWithoutApplying(Expr *&expr, DeclContext *dc,
310
115
}
311
116
auto &Context = dc->getASTContext ();
312
117
313
- expr = expr->walk (SanitizeExpr (Context));
314
-
315
118
FrontendStatsTracer StatsTracer (Context.Stats ,
316
119
" typecheck-expr-no-apply" , expr);
317
120
PrettyStackTraceExpr stackTrace (Context, " type-checking" , expr);
@@ -453,11 +256,6 @@ bool TypeChecker::typeCheckForCodeCompletion(
453
256
return false ;
454
257
}
455
258
456
- if (getAsExpr (target.getAsASTNode ())) {
457
- SanitizeExpr sanitizer (Context);
458
- target = *target.walk (sanitizer);
459
- }
460
-
461
259
CompletionContextFinder contextAnalyzer (target, DC);
462
260
463
261
// If there was no completion expr (e.g. if the code completion location was
0 commit comments