Skip to content

Commit 3c551a7

Browse files
committed
[Compile perf] rdar://27397701 Typecheck synthetic accessors more lazily
1 parent e2a7a89 commit 3c551a7

File tree

3 files changed

+18
-4
lines changed

3 files changed

+18
-4
lines changed

lib/Sema/CodeSynthesis.cpp

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -763,17 +763,15 @@ void swift::addTrivialAccessorsToStorage(AbstractStorageDecl *storage,
763763

764764
// Synthesize and type-check the body of the getter.
765765
synthesizeTrivialGetter(getter, storage, TC);
766-
TC.typeCheckDecl(getter, true);
767-
TC.typeCheckDecl(getter, false);
766+
TC.validateDecl(getter);
768767

769768
if (setter) {
770769
if (isDynamic)
771770
setter->getAttrs().add(new (TC.Context) DynamicAttr(IsImplicit));
772771

773772
// Synthesize and type-check the body of the setter.
774773
synthesizeTrivialSetter(setter, storage, setterValueParam, TC);
775-
TC.typeCheckDecl(setter, true);
776-
TC.typeCheckDecl(setter, false);
774+
TC.validateDecl(setter);
777775
}
778776

779777
auto *DC = storage->getDeclContext();

lib/Sema/TypeCheckDecl.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3615,6 +3615,21 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
36153615
}
36163616
}
36173617

3618+
// Typecheck any accessors that were previously synthesized
3619+
// (that were previously only validated at point of synthesis)
3620+
if (auto getter = VD->getGetter()) {
3621+
if (getter->hasBody()) {
3622+
TC.typeCheckDecl(getter, true);
3623+
TC.typeCheckDecl(getter, false);
3624+
}
3625+
}
3626+
if (auto setter = VD->getSetter()) {
3627+
if (setter->hasBody()) {
3628+
TC.typeCheckDecl(setter, true);
3629+
TC.typeCheckDecl(setter, false);
3630+
}
3631+
}
3632+
36183633
TC.checkDeclAttributes(VD);
36193634
}
36203635

lib/Sema/TypeChecker.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -505,6 +505,7 @@ static void typeCheckFunctionsAndExternalDecls(TypeChecker &TC) {
505505

506506
} while (currentFunctionIdx < TC.definedFunctions.size() ||
507507
currentExternalDef < TC.Context.ExternalDefinitions.size() ||
508+
!TC.ValidatedTypes.empty() ||
508509
!TC.UsedConformances.empty());
509510

510511
// FIXME: Horrible hack. Store this somewhere more appropriate.

0 commit comments

Comments
 (0)