Preprocessed uses the same syntax of AIDL
Preprocessed file has been using a similar but different syntax. Now,
it is using the same syntax with AIDL files with a couple of small
changes.
- Type decl can have qualified name.
(interestinly, I only changed this for interface/enum)
- Interface can omit body(members) blocks.
interface IFoo; // is simply an empty interface
Bug: 25479378
Test: aidl_unittests
Test: m
Change-Id: Icf5e4c321c469af00506c5ff14782251018d9d57
diff --git a/parser.cpp b/parser.cpp
index abe1dbf..d2fe362 100644
--- a/parser.cpp
+++ b/parser.cpp
@@ -27,7 +27,7 @@
const AidlDocument* Parser::Parse(const std::string& filename,
const android::aidl::IoDelegate& io_delegate,
- AidlTypenames& typenames) {
+ AidlTypenames& typenames, bool is_preprocessed) {
auto clean_path = android::aidl::IoDelegate::CleanPath(filename);
// reuse pre-parsed document from typenames
for (auto& doc : typenames.AllDocuments()) {
@@ -46,13 +46,18 @@
// nulls at the end.
raw_buffer->append(2u, '\0');
- Parser parser(clean_path, *raw_buffer, typenames);
+ Parser parser(clean_path, *raw_buffer, is_preprocessed);
if (yy::parser(&parser).parse() != 0 || parser.HasError()) {
return nullptr;
}
- return parser.document_;
+ // transfer ownership to AidlTypenames and return the raw pointer
+ const AidlDocument* result = parser.document_.get();
+ if (!typenames.AddDocument(std::move(parser.document_), is_preprocessed)) {
+ return nullptr;
+ }
+ return result;
}
void Parser::SetTypeParameters(AidlTypeSpecifier* type,
@@ -68,6 +73,21 @@
}
}
+void Parser::CheckValidTypeName(const AidlToken& token, const AidlLocation& loc) {
+ if (!is_preprocessed_ && token.GetText().find('.') != std::string::npos) {
+ AIDL_ERROR(loc) << "Type name can't be qualified. Use `package`.";
+ AddError();
+ }
+}
+
+void Parser::SetPackage(const AidlPackage& package) {
+ if (is_preprocessed_) {
+ AIDL_ERROR(package) << "Preprocessed file can't declare package.";
+ AddError();
+ }
+ package_ = package.GetName();
+}
+
class ReferenceResolver : public AidlVisitor {
public:
ReferenceResolver(const AidlDefinedType* scope, TypeResolver& resolver, bool* success)
@@ -162,9 +182,8 @@
return success;
}
-Parser::Parser(const std::string& filename, std::string& raw_buffer,
- android::aidl::AidlTypenames& typenames)
- : filename_(filename), typenames_(typenames) {
+Parser::Parser(const std::string& filename, std::string& raw_buffer, bool is_preprocessed)
+ : filename_(filename), is_preprocessed_(is_preprocessed) {
yylex_init(&scanner_);
buffer_ = yy_scan_buffer(&raw_buffer[0], raw_buffer.length(), scanner_);
}