1 /* 2 * Copyright (C) 2018, The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 #pragma once 17 18 #include <functional> 19 #include <map> 20 #include <memory> 21 #include <set> 22 #include <string> 23 #include <utility> 24 #include <vector> 25 26 using std::map; 27 using std::pair; 28 using std::set; 29 using std::string; 30 using std::unique_ptr; 31 using std::vector; 32 33 class AidlDefinedType; 34 class AidlEnumDeclaration; 35 class AidlInterface; 36 class AidlTypeSpecifier; 37 38 namespace android { 39 namespace aidl { 40 41 // AidlTypenames is a collection of AIDL types available to a compilation unit. 42 // 43 // Basic types (such as int, String, etc.) are added by default, while defined 44 // types (such as IFoo, MyParcelable, etc.) and types from preprocessed inputs 45 // are added as they are recognized by the parser. 46 // 47 // When AidlTypeSpecifier is encountered during parsing, parser defers the 48 // resolution of it until the end of the parsing, where it uses AidlTypenames 49 // to resolve type names in AidlTypeSpecifier. 50 // 51 // Note that nothing here is specific to either Java or C++. 52 class AidlTypenames final { 53 public: 54 AidlTypenames() = default; 55 void Reset(); 56 bool AddDefinedType(unique_ptr<AidlDefinedType> type); 57 bool AddPreprocessedType(unique_ptr<AidlDefinedType> type); 58 static bool IsBuiltinTypename(const string& type_name); 59 static bool IsPrimitiveTypename(const string& type_name); 60 const AidlDefinedType* TryGetDefinedType(const string& type_name) const; 61 pair<string, bool> ResolveTypename(const string& type_name) const; 62 bool CanBeOutParameter(const AidlTypeSpecifier& type) const; 63 bool IsIgnorableImport(const string& import) const; 64 // Returns the AidlEnumDeclaration of the given type, or nullptr if the type 65 // is not an AidlEnumDeclaration; 66 const AidlEnumDeclaration* GetEnumDeclaration(const AidlTypeSpecifier& type) const; 67 // Returns the AidlInterface of the given type, or nullptr if the type 68 // is not an AidlInterface; 69 const AidlInterface* GetInterface(const AidlTypeSpecifier& type) const; 70 // Iterates over all defined and then preprocessed types 71 void IterateTypes(const std::function<void(const AidlDefinedType&)>& body) const; 72 73 private: 74 struct DefinedImplResult { DefinedImplResultDefinedImplResult75 DefinedImplResult(const AidlDefinedType* type, const bool from_preprocessed) 76 : type(type), from_preprocessed(from_preprocessed) {} 77 const AidlDefinedType* type; 78 const bool from_preprocessed; 79 }; 80 DefinedImplResult TryGetDefinedTypeImpl(const string& type_name) const; 81 map<string, unique_ptr<AidlDefinedType>> defined_types_; 82 map<string, unique_ptr<AidlDefinedType>> preprocessed_types_; 83 }; 84 85 } // namespace aidl 86 } // namespace android 87