Skip to content

Commit 63896c1

Browse files
committed
Make more high-level type checking endpoints utility
1 parent 1c38ec6 commit 63896c1

12 files changed

+100
-124
lines changed

lib/Sema/CSApply.cpp

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3124,7 +3124,7 @@ namespace {
31243124
auto castContextKind =
31253125
SuppressDiagnostics ? CheckedCastContextKind::None
31263126
: CheckedCastContextKind::IsExpr;
3127-
auto castKind = cs.getTypeChecker().typeCheckCheckedCast(
3127+
auto castKind = TypeChecker::typeCheckCheckedCast(
31283128
fromType, toType, castContextKind, cs.DC, expr->getLoc(), sub,
31293129
expr->getCastTypeLoc().getSourceRange());
31303130

@@ -3576,7 +3576,7 @@ namespace {
35763576
: CheckedCastContextKind::ForcedCast;
35773577

35783578
auto fromType = cs.getType(sub);
3579-
auto castKind = cs.getTypeChecker().typeCheckCheckedCast(
3579+
auto castKind = TypeChecker::typeCheckCheckedCast(
35803580
fromType, toType, castContextKind, cs.DC, expr->getLoc(), sub,
35813581
expr->getCastTypeLoc().getSourceRange());
35823582
switch (castKind) {
@@ -3657,7 +3657,7 @@ namespace {
36573657
: CheckedCastContextKind::ConditionalCast;
36583658

36593659
auto fromType = cs.getType(sub);
3660-
auto castKind = cs.getTypeChecker().typeCheckCheckedCast(
3660+
auto castKind = TypeChecker::typeCheckCheckedCast(
36613661
fromType, toType, castContextKind, cs.DC, expr->getLoc(), sub,
36623662
expr->getCastTypeLoc().getSourceRange());
36633663
switch (castKind) {
@@ -5676,12 +5676,10 @@ static Expr *buildElementConversion(ExprRewriter &rewriter,
56765676
ConstraintLocatorBuilder locator,
56775677
Expr *element) {
56785678
auto &cs = rewriter.getConstraintSystem();
5679-
5680-
auto &tc = rewriter.getConstraintSystem().getTypeChecker();
56815679
if (bridged &&
5682-
tc.typeCheckCheckedCast(srcType, destType,
5683-
CheckedCastContextKind::None, cs.DC,
5684-
SourceLoc(), nullptr, SourceRange())
5680+
TypeChecker::typeCheckCheckedCast(srcType, destType,
5681+
CheckedCastContextKind::None, cs.DC,
5682+
SourceLoc(), nullptr, SourceRange())
56855683
!= CheckedCastKind::Coercion) {
56865684
if (auto conversion =
56875685
rewriter.buildObjCBridgeExpr(element, destType, locator))

lib/Sema/CSDiagnostics.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2682,10 +2682,10 @@ bool ContextualFailure::tryTypeCoercionFixIt(
26822682
if (!toType->hasTypeRepr())
26832683
return false;
26842684

2685-
auto &TC = getTypeChecker();
26862685
CheckedCastKind Kind =
2687-
TC.typeCheckCheckedCast(fromType, toType, CheckedCastContextKind::None,
2688-
getDC(), SourceLoc(), nullptr, SourceRange());
2686+
TypeChecker::typeCheckCheckedCast(fromType, toType,
2687+
CheckedCastContextKind::None, getDC(),
2688+
SourceLoc(), nullptr, SourceRange());
26892689

26902690
if (Kind != CheckedCastKind::Unresolved) {
26912691
auto *anchor = getAnchor();

lib/Sema/CSFix.cpp

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -138,8 +138,6 @@ CoerceToCheckedCast *CoerceToCheckedCast::attempt(ConstraintSystem &cs,
138138
if (fromType->hasTypeVariable() || toType->hasTypeVariable())
139139
return nullptr;
140140

141-
auto &TC = cs.getTypeChecker();
142-
143141
auto *expr = locator->getAnchor();
144142
if (auto *assignExpr = dyn_cast<AssignExpr>(expr))
145143
expr = assignExpr->getSrc();
@@ -149,9 +147,10 @@ CoerceToCheckedCast *CoerceToCheckedCast::attempt(ConstraintSystem &cs,
149147

150148
auto subExpr = coerceExpr->getSubExpr();
151149
auto castKind =
152-
TC.typeCheckCheckedCast(fromType, toType, CheckedCastContextKind::None,
153-
cs.DC, coerceExpr->getLoc(), subExpr,
154-
coerceExpr->getCastTypeLoc().getSourceRange());
150+
TypeChecker::typeCheckCheckedCast(fromType, toType,
151+
CheckedCastContextKind::None, cs.DC,
152+
coerceExpr->getLoc(), subExpr,
153+
coerceExpr->getCastTypeLoc().getSourceRange());
155154

156155
// Invalid cast.
157156
if (castKind == CheckedCastKind::Unresolved)

lib/Sema/CSGen.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2332,7 +2332,7 @@ namespace {
23322332
Type exnType = CS.getASTContext().getErrorDecl()->getDeclaredType();
23332333
if (!exnType)
23342334
return false;
2335-
if (CS.TC.coercePatternToType(pattern,
2335+
if (TypeChecker::coercePatternToType(pattern,
23362336
TypeResolution::forContextual(CS.DC),
23372337
exnType,
23382338
TypeResolverContext::InExpression)) {

lib/Sema/TypeCheckConstraints.cpp

Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2758,6 +2758,7 @@ bool TypeChecker::typeCheckBinding(Pattern *&pattern, Expr *&initializer,
27582758
}
27592759
};
27602760

2761+
auto &Context = DC->getASTContext();
27612762
BindingListener listener(Context, pattern, initializer);
27622763
if (!initializer)
27632764
return true;
@@ -2858,7 +2859,7 @@ bool TypeChecker::typeCheckPatternBinding(PatternBindingDecl *PBD,
28582859
DC = initContext;
28592860
}
28602861

2861-
bool hadError = typeCheckBinding(pattern, init, DC);
2862+
bool hadError = TypeChecker::typeCheckBinding(pattern, init, DC);
28622863
if (!init) {
28632864
PBD->setInvalid();
28642865
return true;
@@ -2967,7 +2968,6 @@ bool TypeChecker::typeCheckForEachBinding(DeclContext *dc, ForEachStmt *stmt) {
29672968
Expr *appliedSolution(Solution &solution, Expr *expr) override {
29682969
// Figure out what types the constraints decided on.
29692970
auto &cs = solution.getConstraintSystem();
2970-
auto &tc = cs.getTypeChecker();
29712971
InitType = solution.simplifyType(InitType);
29722972
SequenceType = solution.simplifyType(SequenceType);
29732973

@@ -2982,8 +2982,9 @@ bool TypeChecker::typeCheckForEachBinding(DeclContext *dc, ForEachStmt *stmt) {
29822982
Pattern *pattern = Stmt->getPattern();
29832983
TypeResolutionOptions options(TypeResolverContext::ForEachStmt);
29842984
options |= TypeResolutionFlags::OverrideType;
2985-
if (tc.coercePatternToType(pattern, TypeResolution::forContextual(cs.DC),
2986-
InitType, options)) {
2985+
if (TypeChecker::coercePatternToType(pattern,
2986+
TypeResolution::forContextual(cs.DC),
2987+
InitType, options)) {
29872988
return nullptr;
29882989
}
29892990

@@ -3000,30 +3001,31 @@ bool TypeChecker::typeCheckForEachBinding(DeclContext *dc, ForEachStmt *stmt) {
30003001
assert(seq && "type-checking an uninitialized for-each statement?");
30013002

30023003
// Type-check the for-each loop sequence and element pattern.
3003-
auto resultTy = typeCheckExpression(seq, dc, &listener);
3004+
auto resultTy = TypeChecker::typeCheckExpression(seq, dc, &listener);
30043005
return !resultTy;
30053006
}
30063007

30073008
bool TypeChecker::typeCheckCondition(Expr *&expr, DeclContext *dc) {
30083009
// If this expression is already typechecked and has type Bool, then just
30093010
// re-typecheck it.
30103011
if (expr->getType() && expr->getType()->isBool()) {
3011-
auto resultTy = typeCheckExpression(expr, dc);
3012+
auto resultTy = TypeChecker::typeCheckExpression(expr, dc);
30123013
return !resultTy;
30133014
}
30143015

3015-
auto *boolDecl = Context.getBoolDecl();
3016+
auto *boolDecl = dc->getASTContext().getBoolDecl();
30163017
if (!boolDecl)
30173018
return true;
30183019

3019-
auto resultTy = typeCheckExpression(
3020+
auto resultTy = TypeChecker::typeCheckExpression(
30203021
expr, dc, TypeLoc::withoutLoc(boolDecl->getDeclaredType()),
30213022
CTP_Condition);
30223023
return !resultTy;
30233024
}
30243025

30253026
bool TypeChecker::typeCheckStmtCondition(StmtCondition &cond, DeclContext *dc,
30263027
Diag<> diagnosticForAlwaysTrue) {
3028+
auto &Context = dc->getASTContext();
30273029
bool hadError = false;
30283030
bool hadAnyFalsable = false;
30293031
for (auto &elt : cond) {
@@ -3069,15 +3071,15 @@ bool TypeChecker::typeCheckStmtCondition(StmtCondition &cond, DeclContext *dc,
30693071
TypeResolutionOptions options(TypeResolverContext::InExpression);
30703072
options |= TypeResolutionFlags::AllowUnspecifiedTypes;
30713073
options |= TypeResolutionFlags::AllowUnboundGenerics;
3072-
if (typeCheckPattern(pattern, dc, options)) {
3074+
if (TypeChecker::typeCheckPattern(pattern, dc, options)) {
30733075
typeCheckPatternFailed();
30743076
continue;
30753077
}
30763078

30773079
// If the pattern didn't get a type, it's because we ran into some
30783080
// unknown types along the way. We'll need to check the initializer.
30793081
auto init = elt.getInitializer();
3080-
hadError |= typeCheckBinding(pattern, init, dc);
3082+
hadError |= TypeChecker::typeCheckBinding(pattern, init, dc);
30813083
elt.setPattern(pattern);
30823084
elt.setInitializer(init);
30833085
hadAnyFalsable |= pattern->isRefutablePattern();
@@ -3097,6 +3099,7 @@ bool TypeChecker::typeCheckStmtCondition(StmtCondition &cond, DeclContext *dc,
30973099
/// value of a given type.
30983100
bool TypeChecker::typeCheckExprPattern(ExprPattern *EP, DeclContext *DC,
30993101
Type rhsType) {
3102+
auto &Context = DC->getASTContext();
31003103
FrontendStatsTracer StatsTracer(Context.Stats, "typecheck-expr-pattern", EP);
31013104
PrettyStackTracePattern stackTrace(Context, "type-checking", EP);
31023105

@@ -3295,7 +3298,8 @@ bool TypeChecker::isObjCBridgedTo(Type type1, Type type2, DeclContext *dc,
32953298
}
32963299

32973300
bool TypeChecker::checkedCastMaySucceed(Type t1, Type t2, DeclContext *dc) {
3298-
auto kind = typeCheckCheckedCast(t1, t2, CheckedCastContextKind::None, dc,
3301+
auto kind = TypeChecker::typeCheckCheckedCast(t1, t2,
3302+
CheckedCastContextKind::None, dc,
32993303
SourceLoc(), nullptr, SourceRange());
33003304
return (kind != CheckedCastKind::Unresolved);
33013305
}
@@ -3842,12 +3846,12 @@ void ConstraintSystem::print(raw_ostream &out) const {
38423846

38433847
/// Determine the semantics of a checked cast operation.
38443848
CheckedCastKind TypeChecker::typeCheckCheckedCast(Type fromType,
3845-
Type toType,
3846-
CheckedCastContextKind contextKind,
3847-
DeclContext *dc,
3848-
SourceLoc diagLoc,
3849-
Expr *fromExpr,
3850-
SourceRange diagToRange) {
3849+
Type toType,
3850+
CheckedCastContextKind contextKind,
3851+
DeclContext *dc,
3852+
SourceLoc diagLoc,
3853+
Expr *fromExpr,
3854+
SourceRange diagToRange) {
38513855
SourceRange diagFromRange;
38523856
if (fromExpr)
38533857
diagFromRange = fromExpr->getSourceRange();
@@ -3928,6 +3932,7 @@ CheckedCastKind TypeChecker::typeCheckCheckedCast(Type fromType,
39283932

39293933
// If the unwrapped from/to types are equivalent or bridged, this isn't a real
39303934
// downcast. Complain.
3935+
auto &Context = dc->getASTContext();
39313936
if (extraFromOptionals > 0) {
39323937
switch (typeCheckCheckedCast(fromType, toType,
39333938
CheckedCastContextKind::None, dc,

lib/Sema/TypeCheckDecl.cpp

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2585,16 +2585,13 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
25852585

25862586
checkAccessControl(PBD);
25872587

2588-
// FIXME: Remove TypeChecker dependency.
2589-
auto &TC = *Ctx.getLegacyGlobalTypeChecker();
2590-
25912588
// If the initializers in the PBD aren't checked yet, do so now.
25922589
for (auto i : range(PBD->getNumPatternEntries())) {
25932590
if (!PBD->isInitialized(i))
25942591
continue;
25952592

25962593
if (!PBD->isInitializerChecked(i)) {
2597-
TC.typeCheckPatternBinding(PBD, i);
2594+
TypeChecker::typeCheckPatternBinding(PBD, i);
25982595
}
25992596

26002597
if (!PBD->isInvalid()) {

lib/Sema/TypeCheckPattern.cpp

Lines changed: 22 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -711,7 +711,7 @@ static bool validateTypedPattern(TypeResolution resolution,
711711

712712
bool TypeChecker::typeCheckPattern(Pattern *P, DeclContext *dc,
713713
TypeResolutionOptions options) {
714-
auto &diags = dc->getASTContext().Diags;
714+
auto &Context = dc->getASTContext();
715715
switch (P->getKind()) {
716716
// Type-check paren patterns by checking the sub-pattern and
717717
// propagating that type out.
@@ -722,7 +722,7 @@ bool TypeChecker::typeCheckPattern(Pattern *P, DeclContext *dc,
722722
SP = PP->getSubPattern();
723723
else
724724
SP = cast<VarPattern>(P)->getSubPattern();
725-
if (typeCheckPattern(SP, dc, options)) {
725+
if (TypeChecker::typeCheckPattern(SP, dc, options)) {
726726
P->setType(ErrorType::get(Context));
727727
return true;
728728
}
@@ -748,9 +748,9 @@ bool TypeChecker::typeCheckPattern(Pattern *P, DeclContext *dc,
748748
return hadError;
749749

750750
Pattern *subPattern = TP->getSubPattern();
751-
if (coercePatternToType(subPattern, resolution, P->getType(),
752-
options|TypeResolutionFlags::FromNonInferredPattern,
753-
TP->getTypeLoc()))
751+
if (TypeChecker::coercePatternToType(subPattern, resolution, P->getType(),
752+
options|TypeResolutionFlags::FromNonInferredPattern,
753+
TP->getTypeLoc()))
754754
hadError = true;
755755
else {
756756
TP->setSubPattern(subPattern);
@@ -768,7 +768,7 @@ bool TypeChecker::typeCheckPattern(Pattern *P, DeclContext *dc,
768768
if (options & TypeResolutionFlags::AllowUnspecifiedTypes)
769769
return false;
770770

771-
diags.diagnose(P->getLoc(), diag::cannot_infer_type_for_pattern);
771+
Context.Diags.diagnose(P->getLoc(), diag::cannot_infer_type_for_pattern);
772772
P->setType(ErrorType::get(Context));
773773
if (auto named = dyn_cast<NamedPattern>(P)) {
774774
if (auto var = named->getDecl()) {
@@ -788,7 +788,7 @@ bool TypeChecker::typeCheckPattern(Pattern *P, DeclContext *dc,
788788
for (unsigned i = 0, e = tuplePat->getNumElements(); i != e; ++i) {
789789
TuplePatternElt &elt = tuplePat->getElement(i);
790790
Pattern *pattern = elt.getPattern();
791-
if (typeCheckPattern(pattern, dc, elementOptions)) {
791+
if (TypeChecker::typeCheckPattern(pattern, dc, elementOptions)) {
792792
hadError = true;
793793
continue;
794794
}
@@ -822,7 +822,8 @@ bool TypeChecker::typeCheckPattern(Pattern *P, DeclContext *dc,
822822
case PatternKind::Expr:
823823
// In a let/else, these always require an initial value to match against.
824824
if (!(options & TypeResolutionFlags::AllowUnspecifiedTypes)) {
825-
diags.diagnose(P->getLoc(), diag::refutable_pattern_requires_initializer);
825+
Context.Diags.diagnose(P->getLoc(),
826+
diag::refutable_pattern_requires_initializer);
826827
P->setType(ErrorType::get(Context));
827828
return true;
828829
}
@@ -883,7 +884,8 @@ bool TypeChecker::coercePatternToType(Pattern *&P, TypeResolution resolution,
883884
}
884885

885886
auto dc = resolution.getDeclContext();
886-
auto &diags = dc->getASTContext().Diags;
887+
auto &Context = dc->getASTContext();
888+
auto &diags = Context.Diags;
887889
auto subOptions = options;
888890
subOptions.setContext(None);
889891
switch (P->getKind()) {
@@ -1041,7 +1043,7 @@ bool TypeChecker::coercePatternToType(Pattern *&P, TypeResolution resolution,
10411043
auto decayToParen = [&]() -> bool {
10421044
assert(canDecayToParen);
10431045
Pattern *sub = TP->getElement(0).getPattern();
1044-
if (this->coercePatternToType(sub, resolution, type, subOptions))
1046+
if (TypeChecker::coercePatternToType(sub, resolution, type, subOptions))
10451047
return true;
10461048

10471049
if (TP->getLParenLoc().isValid()) {
@@ -1132,10 +1134,10 @@ bool TypeChecker::coercePatternToType(Pattern *&P, TypeResolution resolution,
11321134
NLE->getLoc(), NLE->getLoc(),
11331135
NoneEnumElement->getName(),
11341136
NoneEnumElement, nullptr, false);
1135-
return coercePatternToType(P, resolution, type, options);
1137+
return TypeChecker::coercePatternToType(P, resolution, type, options);
11361138
}
11371139
}
1138-
return typeCheckExprPattern(cast<ExprPattern>(P), dc, type);
1140+
return TypeChecker::typeCheckExprPattern(cast<ExprPattern>(P), dc, type);
11391141
}
11401142

11411143
// Coerce an 'is' pattern by determining the cast kind.
@@ -1176,14 +1178,14 @@ bool TypeChecker::coercePatternToType(Pattern *&P, TypeResolution resolution,
11761178

11771179

11781180
CheckedCastKind castKind
1179-
= typeCheckCheckedCast(type, IP->getCastTypeLoc().getType(),
1180-
type->hasError()
1181-
? CheckedCastContextKind::None
1182-
: CheckedCastContextKind::IsPattern,
1183-
dc,
1184-
IP->getLoc(),
1185-
nullptr,
1186-
IP->getCastTypeLoc().getSourceRange());
1181+
= TypeChecker::typeCheckCheckedCast(type, IP->getCastTypeLoc().getType(),
1182+
type->hasError()
1183+
? CheckedCastContextKind::None
1184+
: CheckedCastContextKind::IsPattern,
1185+
dc,
1186+
IP->getLoc(),
1187+
nullptr,
1188+
IP->getCastTypeLoc().getSourceRange());
11871189
switch (castKind) {
11881190
case CheckedCastKind::Unresolved:
11891191
return true;

lib/Sema/TypeCheckPropertyWrapper.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -538,7 +538,7 @@ PropertyWrapperBackingPropertyTypeRequest::evaluate(
538538
// FIXME(InterfaceTypeRequest): Remove this.
539539
(void)var->getInterfaceType();
540540
if (!binding->isInitializerChecked(index))
541-
tc.typeCheckPatternBinding(binding, index);
541+
TypeChecker::typeCheckPatternBinding(binding, index);
542542

543543
Type type = ctx.getSideCachedPropertyWrapperBackingPropertyType(var);
544544
assert(type || ctx.Diags.hadAnyError());

0 commit comments

Comments
 (0)