• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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