aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--diagnostics.cpp14
-rw-r--r--diagnostics.inc1
-rw-r--r--diagnostics_unittest.cpp7
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