Skip to content

Commit 0b93c99

Browse files
authored
Merge pull request #39450 from CodaFi/nest-egg
2 parents 93e6186 + 7c2bd12 commit 0b93c99

File tree

8 files changed

+89
-1
lines changed

8 files changed

+89
-1
lines changed

lib/Serialization/Serialization.cpp

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5280,6 +5280,7 @@ static void collectInterestingNestedDeclarations(
52805280
Serializer::ObjCMethodTable &objcMethods,
52815281
Serializer::NestedTypeDeclsTable &nestedTypeDecls,
52825282
Serializer::UniquedDerivativeFunctionConfigTable &derivativeConfigs,
5283+
Serializer::DeclFingerprintsTable &declFingerprints,
52835284
bool isLocal = false) {
52845285
const NominalTypeDecl *nominalParent = nullptr;
52855286

@@ -5347,10 +5348,15 @@ static void collectInterestingNestedDeclarations(
53475348

53485349
// Recurse into nested declarations.
53495350
if (auto iterable = dyn_cast<IterableDeclContext>(member)) {
5351+
if (auto bodyFP = iterable->getBodyFingerprint()) {
5352+
declFingerprints.insert({S.addDeclRef(member), *bodyFP});
5353+
}
5354+
53505355
collectInterestingNestedDeclarations(S, iterable->getAllMembers(),
53515356
operatorMethodDecls,
53525357
objcMethods, nestedTypeDecls,
53535358
derivativeConfigs,
5359+
declFingerprints,
53545360
isLocal);
53555361
}
53565362
}
@@ -5432,7 +5438,8 @@ void Serializer::writeAST(ModuleOrSourceFile DC) {
54325438
collectInterestingNestedDeclarations(*this, IDC->getAllMembers(),
54335439
operatorMethodDecls, objcMethods,
54345440
nestedTypeDecls,
5435-
uniquedDerivativeConfigs);
5441+
uniquedDerivativeConfigs,
5442+
declFingerprints);
54365443
}
54375444
}
54385445

@@ -5466,6 +5473,7 @@ void Serializer::writeAST(ModuleOrSourceFile DC) {
54665473
operatorMethodDecls, objcMethods,
54675474
nestedTypeDecls,
54685475
uniquedDerivativeConfigs,
5476+
declFingerprints,
54695477
/*isLocal=*/true);
54705478
}
54715479
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
struct S {}
2+
3+
extension S {
4+
enum A {
5+
case a1
6+
var pi: Int {3}
7+
}
8+
enum B {
9+
case a1
10+
}
11+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
struct S {}
2+
3+
extension S {
4+
enum A {
5+
case a1
6+
}
7+
enum B {
8+
case a1
9+
}
10+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
{
2+
"main.swift": {
3+
"object": "./main.o",
4+
"swift-dependencies": "./main.swiftdeps"
5+
},
6+
"definesAB.swift": {
7+
"object": "./definesAB.o",
8+
"swift-dependencies": "./definesAB.swiftdeps"
9+
},
10+
"usesA.swift": {
11+
"object": "./usesA.o",
12+
"swift-dependencies": "./usesA.swiftdeps"
13+
},
14+
"usesB.swift": {
15+
"object": "./usesB.o",
16+
"swift-dependencies": "./usesB.swiftdeps"
17+
},
18+
"": {
19+
"swift-dependencies": "./main~buildrecord.swiftdeps"
20+
}
21+
}
22+
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
let a = S.A.a1
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
let b = S.B.a1
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
// Test per-type-body fingerprints for enums nested in extensions
2+
//
3+
4+
// Establish status quo
5+
6+
// RUN: %empty-directory(%t)
7+
// RUN: cp %S/Inputs/nested-enum-fingerprint/* %t
8+
// RUN: cp %t/definesAB{-before,}.swift
9+
10+
// Seeing weird failure on CI, so set the mod times
11+
// RUN: touch -t 200101010101 %t/*.swift
12+
13+
// RUN: cd %t && %target-swiftc_driver -enable-batch-mode -j2 -incremental -driver-show-incremental main.swift definesAB.swift usesA.swift usesB.swift -module-name main -output-file-map ofm.json >&output3
14+
15+
// only-run-for-debugging: cp %t/usesB.swiftdeps %t/usesB3.swiftdeps
16+
17+
18+
// Change one type, only uses of that type get recompiled
19+
20+
// RUN: cp %t/definesAB{-after,}.swift
21+
22+
// Seeing weird failure on CI, so ensure that definesAB.swift is newer
23+
// RUN: touch -t 200201010101 %t/*
24+
// RUN: touch -t 200101010101 %t/*.swift
25+
// RUN: touch -t 200301010101 %t/definesAB.swift
26+
27+
// RUN: cd %t && %target-swiftc_driver -enable-batch-mode -j2 -incremental -driver-show-incremental main.swift definesAB.swift usesA.swift usesB.swift -module-name main -output-file-map ofm.json >&output4
28+
29+
// only-run-for-debugging: cp %t/usesB.swiftdeps %t/usesB4.swiftdeps
30+
31+
// RUN: %FileCheck -check-prefix=CHECK-MAINAB-RECOMPILED %s < %t/output4
32+
33+
// CHECK-MAINAB-RECOMPILED: Queuing (initial): {compile: definesAB.o <= definesAB.swift}
34+
// CHECK-MAINAB-RECOMPILED: Queuing because of dependencies discovered later: {compile: usesA.o <= usesA.swift}

0 commit comments

Comments
 (0)