diff options
-rw-r--r-- | diagnostics.cpp | 14 | ||||
-rw-r--r-- | diagnostics.inc | 1 | ||||
-rw-r--r-- | diagnostics_unittest.cpp | 7 |
3 files changed, 22 insertions, 0 deletions
diff --git a/diagnostics.cpp b/diagnostics.cpp index bf50cc2e..4af90331 100644 --- a/diagnostics.cpp +++ b/diagnostics.cpp @@ -211,6 +211,19 @@ struct DiagnoseExplicitDefault : DiagnosticsVisitor { } }; +struct DiagnoseMixedOneway : DiagnosticsVisitor { + DiagnoseMixedOneway(DiagnosticsContext& diag) : DiagnosticsVisitor(diag) {} + void Visit(const AidlInterface& i) override { + const auto& methods = i.GetMethods(); + if (std::adjacent_find(begin(methods), end(methods), [](const auto& a, const auto& b) { + return a->IsOneway() != b->IsOneway(); + }) != end(methods)) { + diag.Report(i.GetLocation(), DiagnosticID::mixed_oneway) + << "The interface '" << i.GetName() << "' has both one-way and two-way methods."; + } + } +}; + bool Diagnose(const AidlDocument& doc, const DiagnosticMapping& mapping) { DiagnosticsContext diag(mapping); @@ -219,6 +232,7 @@ bool Diagnose(const AidlDocument& doc, const DiagnosticMapping& mapping) { DiagnoseInoutParameter{diag}.Check(doc); DiagnoseConstName{diag}.Check(doc); DiagnoseExplicitDefault{diag}.Check(doc); + DiagnoseMixedOneway{diag}.Check(doc); return diag.ErrorCount() == 0; } diff --git a/diagnostics.inc b/diagnostics.inc index 031b8409..71389414 100644 --- a/diagnostics.inc +++ b/diagnostics.inc @@ -4,4 +4,5 @@ DIAG(enum_zero, "enum-zero", false) DIAG(explicit_default, "explicit-default", false) DIAG(inout_parameter, "inout-parameter", false) DIAG(interface_name, "interface-name", false) +DIAG(mixed_oneway, "mixed-oneway", false) DIAG(unknown_warning, "unknown-warning", false) diff --git a/diagnostics_unittest.cpp b/diagnostics_unittest.cpp index 446cd5b3..be81618b 100644 --- a/diagnostics_unittest.cpp +++ b/diagnostics_unittest.cpp @@ -144,3 +144,10 @@ TEST_F(DiagnosticsTest, CantSuppressUnknownWarning) { "interface IFoo { @SuppressWarnings(value={\"blah-blah\"}) void foo(); }"}, }); } + +TEST_F(DiagnosticsTest, DontMixOnewayWithTwowayMethods) { + expect_diagnostics = {DiagnosticID::mixed_oneway}; + ParseFiles({ + {"IFoo.aidl", "interface IFoo { void foo(); oneway void bar(); }"}, + }); +}
\ No newline at end of file |