/* * Copyright (C) 2018, The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #pragma once #include #include #include #include #include #include #include #include using std::map; using std::optional; using std::pair; using std::set; using std::string; using std::unique_ptr; using std::vector; class AidlDefinedType; class AidlEnumDeclaration; class AidlInterface; class AidlParcelable; class AidlTypeSpecifier; class AidlDocument; struct ArgumentAspect; namespace android { namespace aidl { // AidlTypenames is a collection of AIDL types available to a compilation unit. // // Basic types (such as int, String, etc.) are added by default, while defined // types (such as IFoo, MyParcelable, etc.) and types from preprocessed inputs // are added as they are recognized by the parser. // // When AidlTypeSpecifier is encountered during parsing, parser defers the // resolution of it until the end of the parsing, where it uses AidlTypenames // to resolve type names in AidlTypeSpecifier. // // Note that nothing here is specific to either Java or C++. class AidlTypenames final { public: AidlTypenames() = default; bool AddDocument(std::unique_ptr doc); const AidlDocument* GetDocumentFor(const AidlDefinedType* type) const; const std::vector>& AllDocuments() const { return documents_; } const AidlDocument& MainDocument() const; bool AddPreprocessedType(unique_ptr type); static bool IsBuiltinTypename(const string& type_name); static bool IsPrimitiveTypename(const string& type_name); bool IsParcelable(const string& type_name) const; const AidlDefinedType* TryGetDefinedType(const string& type_name) const; std::vector AllDefinedTypes() const; struct ResolvedTypename { std::string canonical_name; bool is_resolved; const AidlDefinedType* defined_type; }; ResolvedTypename ResolveTypename(const string& type_name) const; ArgumentAspect GetArgumentAspect(const AidlTypeSpecifier& type) const; bool CanBeJavaOnlyImmutable(const AidlTypeSpecifier& type) const; bool CanBeFixedSize(const AidlTypeSpecifier& type) const; static bool IsList(const AidlTypeSpecifier& type); bool IsIgnorableImport(const string& import) const; // Returns the AidlEnumDeclaration of the given type, or nullptr if the type // is not an AidlEnumDeclaration; const AidlEnumDeclaration* GetEnumDeclaration(const AidlTypeSpecifier& type) const; // Returns the AidlInterface of the given type, or nullptr if the type // is not an AidlInterface; const AidlInterface* GetInterface(const AidlTypeSpecifier& type) const; // Returns the AidlParcelable of the given type, or nullptr if the type // is not an AidlParcelable; const AidlParcelable* GetParcelable(const AidlTypeSpecifier& type) const; // Iterates over all defined and then preprocessed types void IterateTypes(const std::function& body) const; // Fixes AST after type/ref resolution before validation bool Autofill() const; private: struct DefinedImplResult { DefinedImplResult(const AidlDefinedType* type, const bool from_preprocessed) : type(type), from_preprocessed(from_preprocessed) {} const AidlDefinedType* type; const bool from_preprocessed; }; DefinedImplResult TryGetDefinedTypeImpl(const string& type_name) const; map defined_types_; map> preprocessed_types_; std::vector> documents_; }; } // namespace aidl } // namespace android