diff options
-rw-r--r-- | aidl_language.h | 54 | ||||
-rw-r--r-- | diagnostics.cpp | 32 |
2 files changed, 39 insertions, 47 deletions
diff --git a/aidl_language.h b/aidl_language.h index 1492aa3d..5a248ada 100644 --- a/aidl_language.h +++ b/aidl_language.h @@ -87,23 +87,21 @@ class AidlEnumerator; class AidlMethod; class AidlArgument; -// Interface for visitors that can traverse AidlTraversable nodes. The contract is that Visit() -// method returns a bool which controls whether or not the traversal should be continued down to its -// children. +// Interface for visitors that can traverse AidlTraversable nodes. class AidlVisitor { public: virtual ~AidlVisitor() = default; - virtual bool Visit(const AidlDocument&) { return true; } - virtual bool Visit(const AidlInterface&) { return true; } - virtual bool Visit(const AidlParcelable&) { return true; } - virtual bool Visit(const AidlStructuredParcelable&) { return true; } - virtual bool Visit(const AidlUnionDecl&) { return true; } - virtual bool Visit(const AidlEnumDeclaration&) { return true; } - virtual bool Visit(const AidlEnumerator&) { return true; } - virtual bool Visit(const AidlMethod&) { return true; } - virtual bool Visit(const AidlVariableDeclaration&) { return true; } - virtual bool Visit(const AidlConstantDeclaration&) { return true; } - virtual bool Visit(const AidlArgument&) { return true; } + virtual void Visit(const AidlDocument&) {} + virtual void Visit(const AidlInterface&) {} + virtual void Visit(const AidlParcelable&) {} + virtual void Visit(const AidlStructuredParcelable&) {} + virtual void Visit(const AidlUnionDecl&) {} + virtual void Visit(const AidlEnumDeclaration&) {} + virtual void Visit(const AidlEnumerator&) {} + virtual void Visit(const AidlMethod&) {} + virtual void Visit(const AidlVariableDeclaration&) {} + virtual void Visit(const AidlConstantDeclaration&) {} + virtual void Visit(const AidlArgument&) {} }; // Anything that is locatable in a .aidl file. @@ -136,7 +134,7 @@ class AidlTraversable { virtual ~AidlTraversable() = default; virtual void TraverseChildren(std::function<void(const AidlTraversable&)> traverse) const = 0; - virtual bool DispatchVisit(AidlVisitor&) const = 0; + virtual void DispatchVisit(AidlVisitor&) const = 0; }; // unique_ptr<AidlTypeSpecifier> for type arugment, @@ -417,7 +415,7 @@ class AidlMember : public AidlNode, public AidlTraversable { } void TraverseChildren(std::function<void(const AidlTraversable&)> traverse) const = 0; - bool DispatchVisit(AidlVisitor& v) const = 0; + void DispatchVisit(AidlVisitor& v) const = 0; }; // TODO: This class is used for method arguments and also parcelable fields, @@ -470,7 +468,7 @@ class AidlVariableDeclaration : public AidlMember { void TraverseChildren(std::function<void(const AidlTraversable&)>) const override { // no children to visit } - bool DispatchVisit(AidlVisitor& v) const override { return v.Visit(*this); } + void DispatchVisit(AidlVisitor& v) const override { v.Visit(*this); } private: std::unique_ptr<AidlTypeSpecifier> type_; @@ -509,7 +507,7 @@ class AidlArgument : public AidlVariableDeclaration { void TraverseChildren(std::function<void(const AidlTraversable&)>) const override { // no children to visit } - bool DispatchVisit(AidlVisitor& v) const override { return v.Visit(*this); } + void DispatchVisit(AidlVisitor& v) const override { v.Visit(*this); } private: Direction direction_; @@ -766,7 +764,7 @@ class AidlConstantDeclaration : public AidlMember { void TraverseChildren(std::function<void(const AidlTraversable&)>) const override { // no children to traverse } - bool DispatchVisit(AidlVisitor& v) const override { return v.Visit(*this); } + void DispatchVisit(AidlVisitor& v) const override { v.Visit(*this); } private: const unique_ptr<AidlTypeSpecifier> type_; @@ -835,7 +833,7 @@ class AidlMethod : public AidlMember { traverse(*a); } } - bool DispatchVisit(AidlVisitor& v) const override { return v.Visit(*this); } + void DispatchVisit(AidlVisitor& v) const override { v.Visit(*this); } private: bool oneway_; @@ -941,7 +939,7 @@ class AidlDefinedType : public AidlAnnotatable, public AidlTraversable { const std::vector<const AidlMember*>& GetMembers() const { return members_; } void TraverseChildren(std::function<void(const AidlTraversable&)>) const = 0; - bool DispatchVisit(AidlVisitor& v) const = 0; + void DispatchVisit(AidlVisitor& v) const = 0; protected: // utility for subclasses with getter names @@ -992,7 +990,7 @@ class AidlParcelable : public AidlDefinedType, public AidlParameterizable<std::s traverse(*c); } } - bool DispatchVisit(AidlVisitor& v) const override { return v.Visit(*this); } + void DispatchVisit(AidlVisitor& v) const override { v.Visit(*this); } private: std::string cpp_header_; @@ -1027,7 +1025,7 @@ class AidlStructuredParcelable : public AidlParcelable { traverse(*c); } } - bool DispatchVisit(AidlVisitor& v) const override { return v.Visit(*this); } + void DispatchVisit(AidlVisitor& v) const override { v.Visit(*this); } }; class AidlEnumerator : public AidlNode, public AidlTraversable { @@ -1056,7 +1054,7 @@ class AidlEnumerator : public AidlNode, public AidlTraversable { void TraverseChildren(std::function<void(const AidlTraversable&)>) const override { // no children to traverse } - bool DispatchVisit(AidlVisitor& v) const override { return v.Visit(*this); } + void DispatchVisit(AidlVisitor& v) const override { v.Visit(*this); } private: const std::string name_; @@ -1099,7 +1097,7 @@ class AidlEnumDeclaration : public AidlDefinedType { traverse(*c); } } - bool DispatchVisit(AidlVisitor& v) const override { return v.Visit(*this); } + void DispatchVisit(AidlVisitor& v) const override { v.Visit(*this); } private: @@ -1137,7 +1135,7 @@ class AidlUnionDecl : public AidlParcelable { traverse(*c); } } - bool DispatchVisit(AidlVisitor& v) const override { return v.Visit(*this); } + void DispatchVisit(AidlVisitor& v) const override { v.Visit(*this); } }; class AidlInterface final : public AidlDefinedType { @@ -1170,7 +1168,7 @@ class AidlInterface final : public AidlDefinedType { traverse(*c); } } - bool DispatchVisit(AidlVisitor& v) const override { return v.Visit(*this); } + void DispatchVisit(AidlVisitor& v) const override { v.Visit(*this); } }; class AidlImport : public AidlNode { @@ -1217,7 +1215,7 @@ class AidlDocument : public AidlNode, public AidlTraversable { traverse(*t); } } - bool DispatchVisit(AidlVisitor& v) const override { return v.Visit(*this); } + void DispatchVisit(AidlVisitor& v) const override { v.Visit(*this); } private: const std::vector<std::unique_ptr<AidlImport>> imports_; diff --git a/diagnostics.cpp b/diagnostics.cpp index 5656f920..5579b70a 100644 --- a/diagnostics.cpp +++ b/diagnostics.cpp @@ -99,21 +99,20 @@ class DiagnosticsVisitor : public AidlVisitor { struct Hook : public AidlVisitor { Fun fun; Hook(Fun fun) : fun(fun) {} - bool Visit(const AidlInterface& a) override { fun(a); return true; } - bool Visit(const AidlEnumDeclaration& a) override { fun(a); return true; } - bool Visit(const AidlStructuredParcelable& a) override { fun(a); return true; } - bool Visit(const AidlUnionDecl& a) override { fun(a); return true; } - bool Visit(const AidlParcelable& a) override { fun(a); return true; } - bool Visit(const AidlMethod& a) override { fun(a.GetType()); return true; } + void Visit(const AidlInterface& a) override { fun(a); } + void Visit(const AidlEnumDeclaration& a) override { fun(a); } + void Visit(const AidlStructuredParcelable& a) override { fun(a); } + void Visit(const AidlUnionDecl& a) override { fun(a); } + void Visit(const AidlParcelable& a) override { fun(a); } + void Visit(const AidlMethod& a) override { fun(a.GetType()); } }; Hook suppress{std::bind(&DiagnosticsContext::Suppress, &diag, _1)}; Hook restore{std::bind(&DiagnosticsContext::Restore, &diag, _1)}; std::function<void(const AidlTraversable&)> topDown = [&topDown, &suppress, &restore, visitor](const AidlTraversable& a) { a.DispatchVisit(suppress); - if (a.DispatchVisit(*visitor)) { - a.TraverseChildren(topDown); - } + a.DispatchVisit(*visitor); + a.TraverseChildren(topDown); a.DispatchVisit(restore); }; topDown(doc); @@ -124,18 +123,17 @@ class DiagnosticsVisitor : public AidlVisitor { struct DiagnoseInterfaceName : DiagnosticsVisitor { DiagnoseInterfaceName(DiagnosticsContext& diag) : DiagnosticsVisitor(diag) {} - bool Visit(const AidlInterface& i) override { + void Visit(const AidlInterface& i) override { if (auto name = i.GetName(); name.size() < 1 || name[0] != 'I') { diag.Report(i.GetLocation(), DiagnosticID::interface_name) << "Interface names should start with I."; } - return true; } }; struct DiagnoseEnumZero : DiagnosticsVisitor { DiagnoseEnumZero(DiagnosticsContext& diag) : DiagnosticsVisitor(diag) {} - bool Visit(const AidlEnumDeclaration& e) override { + void Visit(const AidlEnumDeclaration& e) override { AIDL_FATAL_IF(e.GetEnumerators().empty(), e) << "The enum '" << e.GetName() << "' has no enumerators."; const auto& first = e.GetEnumerators()[0]; @@ -145,38 +143,34 @@ struct DiagnoseEnumZero : DiagnosticsVisitor { << "The first enumerator '" << first->GetName() << "' should be 0, but it is " << first_value << "."; } - return true; } }; struct DiagnoseInoutParameter : DiagnosticsVisitor { DiagnoseInoutParameter(DiagnosticsContext& diag) : DiagnosticsVisitor(diag) {} - bool Visit(const AidlArgument& a) override { + void Visit(const AidlArgument& a) override { if (a.GetDirection() == AidlArgument::INOUT_DIR) { diag.Report(a.GetLocation(), DiagnosticID::inout_parameter) << a.GetName() << " is 'inout'. Avoid inout parameters. This is somewhat confusing for clients " "because although the parameters are 'in', they look out 'out' parameters."; } - return true; } }; struct DiagnoseConstName : DiagnosticsVisitor { DiagnoseConstName(DiagnosticsContext& diag) : DiagnosticsVisitor(diag) {} - bool Visit(const AidlEnumerator& e) override { + void Visit(const AidlEnumerator& e) override { if (ToUpper(e.GetName()) != e.GetName()) { diag.Report(e.GetLocation(), DiagnosticID::const_name) << "Enum values should be named in upper cases: " << ToUpper(e.GetName()); } - return true; } - bool Visit(const AidlConstantDeclaration& c) override { + void Visit(const AidlConstantDeclaration& c) override { if (ToUpper(c.GetName()) != c.GetName()) { diag.Report(c.GetLocation(), DiagnosticID::const_name) << "Constants should be named in upper cases: " << ToUpper(c.GetName()); } - return true; } static std::string ToUpper(std::string name) { for (auto& c : name) c = std::toupper(c); |