Skip to content

Commit d21424b

Browse files
committed
Make typeCheckExpression a utility
1 parent f5f214d commit d21424b

8 files changed

+39
-48
lines changed

lib/Sema/CSApply.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -458,7 +458,7 @@ namespace {
458458
refExpr = declRefExpr;
459459
}
460460

461-
auto resultTy = cs.getTypeChecker().typeCheckExpression(
461+
auto resultTy = TypeChecker::typeCheckExpression(
462462
refExpr, cs.DC, TypeLoc::withoutLoc(expectedFnType),
463463
CTP_CannotFail);
464464
if (!resultTy)
@@ -3875,7 +3875,7 @@ namespace {
38753875
Expr *callExpr = CallExpr::createImplicit(ctx, fnRef, { argExpr },
38763876
{ Identifier() });
38773877

3878-
auto resultTy = cs.getTypeChecker().typeCheckExpression(
3878+
auto resultTy = TypeChecker::typeCheckExpression(
38793879
callExpr, cs.DC, TypeLoc::withoutLoc(valueType), CTP_CannotFail);
38803880
assert(resultTy && "Conversion cannot fail!");
38813881
(void)resultTy;

lib/Sema/CSDiag.cpp

+4-2
Original file line numberDiff line numberDiff line change
@@ -1081,8 +1081,10 @@ Expr *FailureDiagnosis::typeCheckChildIndependently(
10811081
// if there is a closure in the subexpression, we can violate invariants.
10821082
auto *DC = findDeclContext(subExpr);
10831083
auto resultTy =
1084-
CS.TC.typeCheckExpression(subExpr, DC, TypeLoc::withoutLoc(convertType),
1085-
convertTypePurpose, TCEOptions, listener, &CS);
1084+
TypeChecker::typeCheckExpression(subExpr, DC,
1085+
TypeLoc::withoutLoc(convertType),
1086+
convertTypePurpose, TCEOptions,
1087+
listener, &CS);
10861088

10871089
CS.cacheExprTypes(subExpr);
10881090

lib/Sema/DebuggerTestingTransform.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -237,8 +237,8 @@ class DebuggerTestingTransform : public ASTWalker {
237237
// TODO: typeCheckExpression() seems to assign types to everything here,
238238
// but may not be sufficient in some cases.
239239
Expr *FinalExpr = ClosureCall;
240-
auto &TC = swift::createTypeChecker(Ctx);
241-
if (!TC.typeCheckExpression(FinalExpr, getCurrentDeclContext()))
240+
(void)swift::createTypeChecker(Ctx);
241+
if (!TypeChecker::typeCheckExpression(FinalExpr, getCurrentDeclContext()))
242242
llvm::report_fatal_error("Could not type-check instrumentation");
243243

244244
// Captures have to be computed after the closure is type-checked. This

lib/Sema/TypeCheckConstraints.cpp

+4-2
Original file line numberDiff line numberDiff line change
@@ -2159,9 +2159,11 @@ Type TypeChecker::typeCheckExpression(Expr *&expr, DeclContext *dc,
21592159
TypeCheckExprOptions options,
21602160
ExprTypeCheckListener *listener,
21612161
ConstraintSystem *baseCS) {
2162+
auto &Context = dc->getASTContext();
21622163
FallbackDiagnosticListener diagListener(Context, options, listener);
2163-
return typeCheckExpressionImpl(expr, dc, convertType, convertTypePurpose,
2164-
options, diagListener, baseCS);
2164+
auto *TC = Context.getLegacyGlobalTypeChecker();
2165+
return TC->typeCheckExpressionImpl(expr, dc, convertType, convertTypePurpose,
2166+
options, diagListener, baseCS);
21652167
}
21662168

21672169
Type TypeChecker::typeCheckExpressionImpl(Expr *&expr, DeclContext *dc,

lib/Sema/TypeCheckStmt.cpp

+17-26
Original file line numberDiff line numberDiff line change
@@ -544,11 +544,9 @@ class StmtChecker : public StmtVisitor<StmtChecker, Stmt*> {
544544
}
545545
}
546546

547-
// FIXME: Remove TypeChecker dependency.
548-
auto &TC = *Ctx.getLegacyGlobalTypeChecker();
549-
auto exprTy = TC.typeCheckExpression(E, DC, TypeLoc::withoutLoc(ResultTy),
550-
ctp,
551-
options);
547+
auto exprTy = TypeChecker::typeCheckExpression(E, DC,
548+
TypeLoc::withoutLoc(ResultTy),
549+
ctp, options);
552550
RS->setResult(E);
553551

554552
if (!exprTy) {
@@ -607,11 +605,9 @@ class StmtChecker : public StmtVisitor<StmtChecker, Stmt*> {
607605
contextTypePurpose = CTP_YieldByValue;
608606
}
609607

610-
// FIXME: Remove TypeChecker dependency.
611-
auto &TC = *Ctx.getLegacyGlobalTypeChecker();
612-
TC.typeCheckExpression(exprToCheck, DC,
613-
TypeLoc::withoutLoc(contextType),
614-
contextTypePurpose);
608+
TypeChecker::typeCheckExpression(exprToCheck, DC,
609+
TypeLoc::withoutLoc(contextType),
610+
contextTypePurpose);
615611

616612
// Propagate the change into the inout expression we stripped before.
617613
if (inout) {
@@ -641,8 +637,8 @@ class StmtChecker : public StmtVisitor<StmtChecker, Stmt*> {
641637
if (!exnType) return TS;
642638

643639
// FIXME: Remove TypeChecker dependency.
644-
auto &TC = *Ctx.getLegacyGlobalTypeChecker();
645-
TC.typeCheckExpression(E, DC, TypeLoc::withoutLoc(exnType), CTP_ThrowStmt);
640+
TypeChecker::typeCheckExpression(E, DC, TypeLoc::withoutLoc(exnType),
641+
CTP_ThrowStmt);
646642
TS->setSubExpr(E);
647643

648644
return TS;
@@ -659,13 +655,10 @@ class StmtChecker : public StmtVisitor<StmtChecker, Stmt*> {
659655
}
660656

661657
Stmt *visitDeferStmt(DeferStmt *DS) {
662-
// FIXME: Remove TypeChecker dependency.
663-
auto &TC = *Ctx.getLegacyGlobalTypeChecker();
664-
665-
TC.typeCheckDecl(DS->getTempDecl());
658+
TypeChecker::typeCheckDecl(DS->getTempDecl());
666659

667660
Expr *theCall = DS->getCallExpr();
668-
TC.typeCheckExpression(theCall, DC);
661+
TypeChecker::typeCheckExpression(theCall, DC);
669662
DS->setCallExpr(theCall);
670663

671664
return DS;
@@ -1314,7 +1307,7 @@ class StmtChecker : public StmtVisitor<StmtChecker, Stmt*> {
13141307

13151308
// Type-check the subject expression.
13161309
Expr *subjectExpr = switchStmt->getSubjectExpr();
1317-
auto resultTy = TC.typeCheckExpression(subjectExpr, DC);
1310+
auto resultTy = TypeChecker::typeCheckExpression(subjectExpr, DC);
13181311
auto limitExhaustivityChecks = !resultTy;
13191312
if (Expr *newSubjectExpr =
13201313
TypeChecker::coerceToRValue(getASTContext(), subjectExpr))
@@ -1331,7 +1324,7 @@ class StmtChecker : public StmtVisitor<StmtChecker, Stmt*> {
13311324
for (auto &node : switchStmt->getRawCases()) {
13321325
if (!node.is<Decl *>())
13331326
continue;
1334-
TC.typeCheckDecl(node.get<Decl *>());
1327+
TypeChecker::typeCheckDecl(node.get<Decl *>());
13351328
}
13361329

13371330
SmallVector<VarDecl *, 8> scratchMemory1;
@@ -1838,8 +1831,6 @@ Stmt *StmtChecker::visitBraceStmt(BraceStmt *BS) {
18381831
}
18391832
}
18401833

1841-
// FIXME: Remove TypeChecker dependencies below.
1842-
auto &TC = *Ctx.getLegacyGlobalTypeChecker();
18431834
for (auto &elem : BS->getElements()) {
18441835
if (auto *SubExpr = elem.dyn_cast<Expr*>()) {
18451836
SourceLoc Loc = SubExpr->getStartLoc();
@@ -1862,7 +1853,8 @@ Stmt *StmtChecker::visitBraceStmt(BraceStmt *BS) {
18621853
}
18631854

18641855
auto resultTy =
1865-
TC.typeCheckExpression(SubExpr, DC, TypeLoc(), CTP_Unused, options);
1856+
TypeChecker::typeCheckExpression(SubExpr, DC, TypeLoc(),
1857+
CTP_Unused, options);
18661858

18671859
// If a closure expression is unused, the user might have intended
18681860
// to write "do { ... }".
@@ -1901,7 +1893,7 @@ Stmt *StmtChecker::visitBraceStmt(BraceStmt *BS) {
19011893
(Loc == EndTypeCheckLoc || SM.isBeforeInBuffer(EndTypeCheckLoc, Loc)))
19021894
break;
19031895

1904-
TC.typeCheckDecl(SubDecl);
1896+
TypeChecker::typeCheckDecl(SubDecl);
19051897
}
19061898

19071899
return BS;
@@ -1941,11 +1933,10 @@ static Expr* constructCallToSuperInit(ConstructorDecl *ctor,
19411933
if (ctor->hasThrows())
19421934
r = new (Context) TryExpr(SourceLoc(), r, Type(), /*implicit=*/true);
19431935

1944-
TypeChecker &tc = *Context.getLegacyGlobalTypeChecker();
19451936
DiagnosticSuppression suppression(ctor->getASTContext().Diags);
19461937
auto resultTy =
1947-
tc.typeCheckExpression(r, ctor, TypeLoc(), CTP_Unused,
1948-
TypeCheckExprFlags::IsDiscarded);
1938+
TypeChecker::typeCheckExpression(r, ctor, TypeLoc(), CTP_Unused,
1939+
TypeCheckExprFlags::IsDiscarded);
19491940
if (!resultTy)
19501941
return nullptr;
19511942

lib/Sema/TypeCheckStorage.cpp

+2-5
Original file line numberDiff line numberDiff line change
@@ -823,12 +823,11 @@ static Expr *buildStorageReference(AccessorDecl *accessor,
823823
};
824824

825825
SubscriptDecl *subscriptDecl = enclosingSelfAccess->subscript;
826-
auto &tc = *ctx.getLegacyGlobalTypeChecker();
827826
lookupExpr = SubscriptExpr::create(
828827
ctx, wrapperMetatype, SourceLoc(), args,
829828
subscriptDecl->getFullName().getArgumentNames(), { }, SourceLoc(),
830829
nullptr, subscriptDecl, /*Implicit=*/true);
831-
tc.typeCheckExpression(lookupExpr, accessor);
830+
TypeChecker::typeCheckExpression(lookupExpr, accessor);
832831

833832
// Make sure we produce an lvalue only when desired.
834833
if (isMemberLValue != lookupExpr->getType()->is<LValueType>()) {
@@ -2210,9 +2209,7 @@ static void typeCheckSynthesizedWrapperInitializer(
22102209
}
22112210

22122211
// Type-check the initialization.
2213-
ASTContext &ctx = pbd->getASTContext();
2214-
auto &tc = *ctx.getLegacyGlobalTypeChecker();
2215-
tc.typeCheckExpression(initializer, originalDC);
2212+
TypeChecker::typeCheckExpression(initializer, originalDC);
22162213
const auto i = pbd->getPatternEntryIndexForVarDecl(backingVar);
22172214
if (auto initializerContext =
22182215
dyn_cast_or_null<Initializer>(pbd->getInitContext(i))) {

lib/Sema/TypeChecker.cpp

+3-4
Original file line numberDiff line numberDiff line change
@@ -694,10 +694,9 @@ swift::getTypeOfCompletionOperator(DeclContext *DC, Expr *LHS,
694694
bool swift::typeCheckExpression(DeclContext *DC, Expr *&parsedExpr) {
695695
auto &ctx = DC->getASTContext();
696696
DiagnosticSuppression suppression(ctx.Diags);
697-
TypeChecker &TC = createTypeChecker(ctx);
698-
699-
auto resultTy = TC.typeCheckExpression(parsedExpr, DC, TypeLoc(),
700-
ContextualTypePurpose::CTP_Unused);
697+
(void)createTypeChecker(ctx);
698+
auto resultTy = TypeChecker::typeCheckExpression(parsedExpr, DC, TypeLoc(),
699+
CTP_Unused);
701700
return !resultTy;
702701
}
703702

lib/Sema/TypeChecker.h

+5-5
Original file line numberDiff line numberDiff line change
@@ -1135,18 +1135,18 @@ class TypeChecker final {
11351135
///
11361136
/// \returns The type of the top-level expression, or Type() if an
11371137
/// error occurred.
1138-
Type
1138+
static Type
11391139
typeCheckExpression(Expr *&expr, DeclContext *dc,
11401140
TypeLoc convertType = TypeLoc(),
11411141
ContextualTypePurpose convertTypePurpose = CTP_Unused,
11421142
TypeCheckExprOptions options = TypeCheckExprOptions(),
11431143
ExprTypeCheckListener *listener = nullptr,
11441144
constraints::ConstraintSystem *baseCS = nullptr);
11451145

1146-
Type typeCheckExpression(Expr *&expr, DeclContext *dc,
1147-
ExprTypeCheckListener *listener) {
1148-
return typeCheckExpression(expr, dc, TypeLoc(), CTP_Unused,
1149-
TypeCheckExprOptions(), listener);
1146+
static Type typeCheckExpression(Expr *&expr, DeclContext *dc,
1147+
ExprTypeCheckListener *listener) {
1148+
return TypeChecker::typeCheckExpression(expr, dc, TypeLoc(), CTP_Unused,
1149+
TypeCheckExprOptions(), listener);
11501150
}
11511151

11521152
private:

0 commit comments

Comments
 (0)