diff options
author | Adam Lesinski <adamlesinski@google.com> | 2016-04-05 12:41:07 -0700 |
---|---|---|
committer | Adam Lesinski <adamlesinski@google.com> | 2016-04-06 11:37:05 -0700 |
commit | cc5609d8e484ec82ef1dced793af7f674f059b1c (patch) | |
tree | 0a0197eeecb0f1d8cf6106b38c8043f4356b960e /tools/aapt2/Diagnostics.h | |
parent | 9d8ec0f12ee67129afb4020aa1d91599073cfeab (diff) |
AAPT2: Implement XmlActionExecutor to verify manifest
Defines a set of actions to perform on XML elements defined by their
hierarchy, eg: manifest -> application -> activity.
This can be used to easily add rules to check more tags in AndroidManifest.xml
Change-Id: I76c6916a98b6403075a7e56e16230979dc6cbee1
Diffstat (limited to 'tools/aapt2/Diagnostics.h')
-rw-r--r-- | tools/aapt2/Diagnostics.h | 93 |
1 files changed, 72 insertions, 21 deletions
diff --git a/tools/aapt2/Diagnostics.h b/tools/aapt2/Diagnostics.h index ab4d284516e1..e86f2a8830e8 100644 --- a/tools/aapt2/Diagnostics.h +++ b/tools/aapt2/Diagnostics.h @@ -21,6 +21,7 @@ #include "util/StringPiece.h" #include "util/Util.h" +#include <android-base/macros.h> #include <iostream> #include <sstream> #include <string> @@ -46,7 +47,11 @@ public: DiagMessage(const Source& src) : mSource(src) { } - template <typename T> DiagMessage& operator<<(const T& value) { + DiagMessage(size_t line) : mSource(Source().withLine(line)) { + } + + template <typename T> + DiagMessage& operator<<(const T& value) { mMessage << value; return *this; } @@ -59,36 +64,82 @@ public: struct IDiagnostics { virtual ~IDiagnostics() = default; - virtual void error(const DiagMessage& message) = 0; - virtual void warn(const DiagMessage& message) = 0; - virtual void note(const DiagMessage& message) = 0; -}; + enum class Level { + Note, + Warn, + Error + }; -struct StdErrDiagnostics : public IDiagnostics { - size_t mNumErrors = 0; + virtual void log(Level level, DiagMessageActual& actualMsg) = 0; - void emit(const DiagMessage& msg, const char* tag) { - DiagMessageActual actual = msg.build(); - if (!actual.source.path.empty()) { - std::cerr << actual.source << ": "; - } - std::cerr << tag << actual.message << "." << std::endl; + virtual void error(const DiagMessage& message) { + DiagMessageActual actual = message.build(); + log(Level::Error, actual); + } + + virtual void warn(const DiagMessage& message) { + DiagMessageActual actual = message.build(); + log(Level::Warn, actual); + } + + virtual void note(const DiagMessage& message) { + DiagMessageActual actual = message.build(); + log(Level::Note, actual); } +}; - void error(const DiagMessage& msg) override { - if (mNumErrors < 20) { - emit(msg, "error: "); +class StdErrDiagnostics : public IDiagnostics { +public: + StdErrDiagnostics() = default; + + void log(Level level, DiagMessageActual& actualMsg) override { + const char* tag; + + switch (level) { + case Level::Error: + mNumErrors++; + if (mNumErrors > 20) { + return; + } + tag = "error"; + break; + + case Level::Warn: + tag = "warn"; + break; + + case Level::Note: + tag = "note"; + break; } - mNumErrors++; + + if (!actualMsg.source.path.empty()) { + std::cerr << actualMsg.source << ": "; + } + std::cerr << tag << ": " << actualMsg.message << "." << std::endl; } - void warn(const DiagMessage& msg) override { - emit(msg, "warn: "); +private: + size_t mNumErrors = 0; + + DISALLOW_COPY_AND_ASSIGN(StdErrDiagnostics); +}; + +class SourcePathDiagnostics : public IDiagnostics { +public: + SourcePathDiagnostics(const Source& src, IDiagnostics* diag) : mSource(src), mDiag(diag) { } - void note(const DiagMessage& msg) override { - emit(msg, "note: "); + void log(Level level, DiagMessageActual& actualMsg) override { + actualMsg.source.path = mSource.path; + mDiag->log(level, actualMsg); } + +private: + Source mSource; + IDiagnostics* mDiag; + + DISALLOW_COPY_AND_ASSIGN(SourcePathDiagnostics); }; } // namespace aapt |