Skip to content

Commit e101576

Browse files
committed
[NFC] Reduce usage of TypedPattern::getTypeLoc
1 parent 2371e5c commit e101576

File tree

5 files changed

+44
-43
lines changed

5 files changed

+44
-43
lines changed

lib/AST/ASTDumper.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -479,9 +479,9 @@ namespace {
479479
void visitTypedPattern(TypedPattern *P) {
480480
printCommon(P, "pattern_typed") << '\n';
481481
printRec(P->getSubPattern());
482-
if (P->getTypeLoc().getTypeRepr()) {
482+
if (auto *repr = P->getTypeRepr()) {
483483
OS << '\n';
484-
printRec(P->getTypeLoc().getTypeRepr());
484+
printRec(repr);
485485
}
486486
PrintWithColorRAII(OS, ParenthesisColor) << ')';
487487
}

lib/AST/Decl.cpp

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1860,7 +1860,7 @@ bool PatternBindingDecl::isDefaultInitializable(unsigned i) const {
18601860
// If the pattern is typed as optional (or tuples thereof), it is
18611861
// default initializable.
18621862
if (const auto typedPattern = dyn_cast<TypedPattern>(entry.getPattern())) {
1863-
if (const auto typeRepr = typedPattern->getTypeLoc().getTypeRepr()) {
1863+
if (const auto typeRepr = typedPattern->getTypeRepr()) {
18641864
if (::isDefaultInitializable(typeRepr, ctx))
18651865
return true;
18661866
} else if (typedPattern->isImplicit()) {
@@ -1870,11 +1870,15 @@ bool PatternBindingDecl::isDefaultInitializable(unsigned i) const {
18701870
//
18711871
// All lazy storage is implicitly default initializable, though, because
18721872
// lazy backing storage is optional.
1873-
if (const auto *varDecl = typedPattern->getSingleVar())
1873+
if (const auto *varDecl = typedPattern->getSingleVar()) {
18741874
// Lazy storage is never user accessible.
1875-
if (!varDecl->isUserAccessible())
1876-
if (typedPattern->getTypeLoc().getType()->getOptionalObjectType())
1875+
if (!varDecl->isUserAccessible()) {
1876+
if (typedPattern->hasType() &&
1877+
typedPattern->getType()->getOptionalObjectType()) {
18771878
return true;
1879+
}
1880+
}
1881+
}
18781882
}
18791883
}
18801884

@@ -2841,7 +2845,7 @@ OpaqueReturnTypeRepr *ValueDecl::getOpaqueResultTypeRepr() const {
28412845
assert(NP->getDecl() == VD);
28422846
(void) NP;
28432847

2844-
returnRepr = TP->getTypeLoc().getTypeRepr();
2848+
returnRepr = TP->getTypeRepr();
28452849
}
28462850
}
28472851
} else {
@@ -5586,7 +5590,7 @@ SourceRange VarDecl::getTypeSourceRangeForDiagnostics() const {
55865590
if (auto *VP = dyn_cast<VarPattern>(Pat))
55875591
Pat = VP->getSubPattern();
55885592
if (auto *TP = dyn_cast<TypedPattern>(Pat))
5589-
if (auto typeRepr = TP->getTypeLoc().getTypeRepr())
5593+
if (auto typeRepr = TP->getTypeRepr())
55905594
return typeRepr->getSourceRange();
55915595

55925596
return SourceRange();

lib/Parse/ParseDecl.cpp

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5694,12 +5694,7 @@ Parser::parseDeclVarGetSet(Pattern *pattern, ParseDeclOptions Flags,
56945694
if (!PrimaryVar)
56955695
return nullptr;
56965696

5697-
TypeLoc TyLoc;
5698-
if (auto *TP = dyn_cast<TypedPattern>(pattern)) {
5699-
TyLoc = TP->getTypeLoc();
5700-
}
5701-
5702-
if (!TyLoc.hasLocation()) {
5697+
if (!isa<TypedPattern>(pattern)) {
57035698
if (accessors.Get || accessors.Set || accessors.Address ||
57045699
accessors.MutableAddress) {
57055700
SourceLoc locAfterPattern = pattern->getLoc().getAdvancedLoc(

lib/Sema/MiscDiagnostics.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3759,7 +3759,7 @@ checkImplicitPromotionsInCondition(const StmtConditionElement &cond,
37593759
diag::optional_check_promotion,
37603760
subExpr->getType())
37613761
.highlight(subExpr->getSourceRange())
3762-
.fixItReplace(TP->getTypeLoc().getSourceRange(),
3762+
.fixItReplace(TP->getTypeRepr()->getSourceRange(),
37633763
ooType->getString());
37643764
return;
37653765
}

lib/Sema/TypeCheckPattern.cpp

Lines changed: 30 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -671,44 +671,47 @@ Pattern *TypeChecker::resolvePattern(Pattern *P, DeclContext *DC,
671671
return P;
672672
}
673673

674-
static Type validateTypedPattern(TypeResolution resolution,
675-
TypedPattern *TP,
676-
TypeResolutionOptions options) {
677-
TypeLoc TL = TP->getTypeLoc();
678-
679-
bool hadError;
680-
674+
static Type validateTypedPattern(TypedPattern *TP, TypeResolution resolution) {
675+
if (TP->hasType()) {
676+
return TP->getType();
677+
}
678+
681679
// If the pattern declares an opaque type, and applies to a single
682680
// variable binding, then we can bind the opaque return type from the
683681
// property definition.
684682
auto &Context = resolution.getASTContext();
685-
auto *Repr = TL.getTypeRepr();
683+
auto *Repr = TP->getTypeRepr();
686684
if (Repr && isa<OpaqueReturnTypeRepr>(Repr)) {
687685
auto named = dyn_cast<NamedPattern>(
688686
TP->getSubPattern()->getSemanticsProvidingPattern());
689-
if (named) {
690-
auto *var = named->getDecl();
691-
auto opaqueDecl = var->getOpaqueResultTypeDecl();
692-
auto opaqueTy = (opaqueDecl
693-
? opaqueDecl->getDeclaredInterfaceType()
694-
: ErrorType::get(Context));
695-
TL.setType(named->getDecl()->getDeclContext()
696-
->mapTypeIntoContext(opaqueTy));
697-
hadError = opaqueTy->hasError();
698-
} else {
699-
Context.Diags.diagnose(TP->getLoc(), diag::opaque_type_unsupported_pattern);
700-
hadError = true;
687+
if (!named) {
688+
Context.Diags.diagnose(TP->getLoc(),
689+
diag::opaque_type_unsupported_pattern);
690+
return ErrorType::get(Context);
701691
}
702-
} else {
703-
hadError = TypeChecker::validateType(TL, resolution);
692+
693+
auto *var = named->getDecl();
694+
auto opaqueDecl = var->getOpaqueResultTypeDecl();
695+
if (!opaqueDecl) {
696+
return ErrorType::get(Context);
697+
}
698+
699+
auto opaqueTy = opaqueDecl->getDeclaredInterfaceType();
700+
if (opaqueTy->hasError()) {
701+
return ErrorType::get(Context);
702+
}
703+
704+
return named->getDecl()->getDeclContext()->mapTypeIntoContext(opaqueTy);
704705
}
705706

706-
if (hadError) {
707+
auto ty = resolution.resolveType(Repr);
708+
if (!ty || ty->hasError()) {
707709
return ErrorType::get(Context);
708710
}
709711

710-
assert(!dyn_cast_or_null<SpecifierTypeRepr>(Repr));
711-
return TL.getType();
712+
assert(!dyn_cast_or_null<SpecifierTypeRepr>(Repr) &&
713+
"Didn't resolve invalid type to error type!");
714+
return ty;
712715
}
713716

714717
Type TypeChecker::typeCheckPattern(ContextualPattern pattern) {
@@ -768,8 +771,7 @@ Type PatternTypeRequest::evaluate(Evaluator &evaluator,
768771
// that type.
769772
case PatternKind::Typed: {
770773
auto resolution = TypeResolution::forContextual(dc, options);
771-
TypedPattern *TP = cast<TypedPattern>(P);
772-
return validateTypedPattern(resolution, TP, options);
774+
return validateTypedPattern(cast<TypedPattern>(P), resolution);
773775
}
774776

775777
// A wildcard or name pattern cannot appear by itself in a context
@@ -824,7 +826,7 @@ Type PatternTypeRequest::evaluate(Evaluator &evaluator,
824826
if (somePat->isImplicit() && isa<TypedPattern>(somePat->getSubPattern())) {
825827
auto resolution = TypeResolution::forContextual(dc, options);
826828
TypedPattern *TP = cast<TypedPattern>(somePat->getSubPattern());
827-
auto type = validateTypedPattern(resolution, TP, options);
829+
auto type = validateTypedPattern(TP, resolution);
828830
if (type && !type->hasError()) {
829831
return OptionalType::get(type);
830832
}

0 commit comments

Comments
 (0)