Skip to content

Commit 095226f

Browse files
authored
Merge pull request #60834 from nkcsgexi/98624267
ABI checker: we should also print ABI breakages when diagnostics are serialized
2 parents c838945 + 9ea8683 commit 095226f

File tree

4 files changed

+39
-17
lines changed

4 files changed

+39
-17
lines changed

include/swift/APIDigester/ModuleDiagsConsumer.h

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -44,23 +44,20 @@ class ModuleDifferDiagsConsumer: public PrintingDiagnosticConsumer {
4444

4545
class FilteringDiagnosticConsumer: public DiagnosticConsumer {
4646
bool HasError = false;
47-
std::unique_ptr<DiagnosticConsumer> subConsumer;
47+
std::vector<std::unique_ptr<DiagnosticConsumer>> subConsumers;
4848
std::unique_ptr<llvm::StringSet<>> allowedBreakages;
4949
bool shouldProceed(const DiagnosticInfo &Info);
5050
public:
51-
FilteringDiagnosticConsumer(std::unique_ptr<DiagnosticConsumer> subConsumer,
51+
FilteringDiagnosticConsumer(std::vector<std::unique_ptr<DiagnosticConsumer>> subConsumers,
5252
std::unique_ptr<llvm::StringSet<>> allowedBreakages):
53-
subConsumer(std::move(subConsumer)),
53+
subConsumers(std::move(subConsumers)),
5454
allowedBreakages(std::move(allowedBreakages)) {}
5555
~FilteringDiagnosticConsumer() = default;
5656

57-
bool finishProcessing() override { return subConsumer->finishProcessing(); }
57+
void flush() override;
58+
void informDriverOfIncompleteBatchModeCompilation() override;
59+
bool finishProcessing() override;
5860
bool hasError() const { return HasError; }
59-
void flush() override { subConsumer->flush(); }
60-
61-
void informDriverOfIncompleteBatchModeCompilation() override {
62-
subConsumer->informDriverOfIncompleteBatchModeCompilation();
63-
}
6461

6562
void handleDiagnostic(SourceManager &SM,
6663
const DiagnosticInfo &Info) override;

lib/APIDigester/ModuleDiagsConsumer.cpp

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -124,8 +124,27 @@ swift::ide::api::ModuleDifferDiagsConsumer::~ModuleDifferDiagsConsumer() {
124124
}
125125
}
126126

127-
bool swift::ide::api::
128-
FilteringDiagnosticConsumer::shouldProceed(const DiagnosticInfo &Info) {
127+
void swift::ide::api::FilteringDiagnosticConsumer::flush() {
128+
for (auto &consumer: subConsumers) {
129+
consumer->flush();
130+
}
131+
}
132+
133+
void swift::ide::api::
134+
FilteringDiagnosticConsumer::informDriverOfIncompleteBatchModeCompilation() {
135+
for (auto &consumer: subConsumers) {
136+
consumer->informDriverOfIncompleteBatchModeCompilation();
137+
}
138+
}
139+
140+
bool swift::ide::api::FilteringDiagnosticConsumer::finishProcessing() {
141+
for (auto &consumer: subConsumers) {
142+
consumer->finishProcessing();
143+
}
144+
return false;
145+
}
146+
147+
bool swift::ide::api::FilteringDiagnosticConsumer::shouldProceed(const DiagnosticInfo &Info) {
129148
if (allowedBreakages->empty()) {
130149
return true;
131150
}
@@ -145,6 +164,8 @@ FilteringDiagnosticConsumer::handleDiagnostic(SourceManager &SM,
145164
if (Info.Kind == DiagnosticKind::Error) {
146165
HasError = true;
147166
}
148-
subConsumer->handleDiagnostic(SM, Info);
167+
for (auto &consumer: subConsumers) {
168+
consumer->handleDiagnostic(SM, Info);
169+
}
149170
}
150171
}

lib/DriverTool/swift_api_digester_main.cpp

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1827,19 +1827,22 @@ static void findTypeMemberDiffs(NodePtr leftSDKRoot, NodePtr rightSDKRoot,
18271827
}
18281828
}
18291829

1830-
static std::unique_ptr<DiagnosticConsumer>
1830+
static std::vector<std::unique_ptr<DiagnosticConsumer>>
18311831
createDiagConsumer(llvm::raw_ostream &OS, bool &FailOnError, bool DisableFailOnError,
18321832
bool CompilerStyleDiags, StringRef SerializedDiagPath) {
1833+
std::vector<std::unique_ptr<DiagnosticConsumer>> results;
18331834
if (!SerializedDiagPath.empty()) {
18341835
FailOnError = !DisableFailOnError;
1835-
return serialized_diagnostics::createConsumer(SerializedDiagPath);
1836+
results.emplace_back(std::make_unique<PrintingDiagnosticConsumer>());
1837+
results.emplace_back(serialized_diagnostics::createConsumer(SerializedDiagPath));
18361838
} else if (CompilerStyleDiags) {
18371839
FailOnError = !DisableFailOnError;
1838-
return std::make_unique<PrintingDiagnosticConsumer>();
1840+
results.emplace_back(std::make_unique<PrintingDiagnosticConsumer>());
18391841
} else {
18401842
FailOnError = false;
1841-
return std::make_unique<ModuleDifferDiagsConsumer>(true, OS);
1843+
results.emplace_back(std::make_unique<ModuleDifferDiagsConsumer>(true, OS));
18421844
}
1845+
return results;
18431846
}
18441847

18451848
static int readFileLineByLine(StringRef Path, llvm::StringSet<> &Lines) {

test/api-digester/serialized-diagnostics.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,11 @@
33
// RUN: %empty-directory(%t)
44

55
// RUN: %target-swift-frontend -disable-objc-attr-requires-foundation-module -emit-module -o %t/color.swiftmodule %S/Inputs/cake_baseline/color.swift -parse-as-library -enable-library-evolution %clang-importer-sdk-nosource -module-name color
6-
// RUN: %api-digester -diagnose-sdk -serialize-diagnostics-path %t/result.dia -empty-baseline -I %t %clang-importer-sdk-nosource -module color -abi
6+
// RUN: %api-digester -diagnose-sdk -serialize-diagnostics-path %t/result.dia -empty-baseline -I %t %clang-importer-sdk-nosource -module color -abi 2>&1 | %FileCheck %s -check-prefix CHECK-STDERR
77
// RUN: c-index-test -read-diagnostics %t/result.dia 2>&1 | %FileCheck %s -check-prefix CHECK-DIA
88
// RUN: %api-digester -diagnose-sdk -serialize-diagnostics-path %t/result.dia -empty-baseline -I %t %clang-importer-sdk-nosource -module color -abi -disable-fail-on-error
99
// RUN: c-index-test -read-diagnostics %t/result.dia 2>&1 | %FileCheck %s -check-prefix CHECK-DIA
1010

1111
// Ensure the 'api-digester-breaking-change' category is included in the serialized diagnostics file.
1212
// CHECK-DIA: warning: ABI breakage: enum Color is a new API without @available attribute [] [api-digester-breaking-change]
13+
// CHECK-STDERR: warning: ABI breakage: enum Color is a new API without @available attribute

0 commit comments

Comments
 (0)