Skip to content

Commit dcc5591

Browse files
authored
Merge pull request #39451 from CodaFi/ear-nest-hemmingway
2 parents c7c7578 + 0a0f838 commit dcc5591

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
@@ -5203,6 +5203,7 @@ static void collectInterestingNestedDeclarations(
52035203
Serializer::ObjCMethodTable &objcMethods,
52045204
Serializer::NestedTypeDeclsTable &nestedTypeDecls,
52055205
Serializer::UniquedDerivativeFunctionConfigTable &derivativeConfigs,
5206+
Serializer::DeclFingerprintsTable &declFingerprints,
52065207
bool isLocal = false) {
52075208
const NominalTypeDecl *nominalParent = nullptr;
52085209

@@ -5270,10 +5271,15 @@ static void collectInterestingNestedDeclarations(
52705271

52715272
// Recurse into nested declarations.
52725273
if (auto iterable = dyn_cast<IterableDeclContext>(member)) {
5274+
if (auto bodyFP = iterable->getBodyFingerprint()) {
5275+
declFingerprints.insert({S.addDeclRef(member), *bodyFP});
5276+
}
5277+
52735278
collectInterestingNestedDeclarations(S, iterable->getAllMembers(),
52745279
operatorMethodDecls,
52755280
objcMethods, nestedTypeDecls,
52765281
derivativeConfigs,
5282+
declFingerprints,
52775283
isLocal);
52785284
}
52795285
}
@@ -5355,7 +5361,8 @@ void Serializer::writeAST(ModuleOrSourceFile DC) {
53555361
collectInterestingNestedDeclarations(*this, IDC->getAllMembers(),
53565362
operatorMethodDecls, objcMethods,
53575363
nestedTypeDecls,
5358-
uniquedDerivativeConfigs);
5364+
uniquedDerivativeConfigs,
5365+
declFingerprints);
53595366
}
53605367
}
53615368

@@ -5389,6 +5396,7 @@ void Serializer::writeAST(ModuleOrSourceFile DC) {
53895396
operatorMethodDecls, objcMethods,
53905397
nestedTypeDecls,
53915398
uniquedDerivativeConfigs,
5399+
declFingerprints,
53925400
/*isLocal=*/true);
53935401
}
53945402
}
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)