• 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 AidlTypeSpecifier;
35 
36 namespace android {
37 namespace aidl {
38 
39 // AidlTypenames is a collection of AIDL types available to a compilation unit.
40 //
41 // Basic types (such as int, String, etc.) are added by default, while defined
42 // types (such as IFoo, MyParcelable, etc.) and types from preprocessed inputs
43 // are added as they are recognized by the parser.
44 //
45 // When AidlTypeSpecifier is encountered during parsing, parser defers the
46 // resolution of it until the end of the parsing, where it uses AidlTypenames
47 // to resolve type names in AidlTypeSpecifier.
48 //
49 // Note that nothing here is specific to either Java or C++.
50 class AidlTypenames final {
51  public:
52   AidlTypenames() = default;
53   void Reset();
54   bool AddDefinedType(unique_ptr<AidlDefinedType> type);
55   bool AddPreprocessedType(unique_ptr<AidlDefinedType> type);
56   static bool IsBuiltinTypename(const string& type_name);
57   static bool IsPrimitiveTypename(const string& type_name);
58   const AidlDefinedType* TryGetDefinedType(const string& type_name) const;
59   pair<string, bool> ResolveTypename(const string& type_name) const;
60   bool CanBeOutParameter(const AidlTypeSpecifier& type) const;
61 
62   // Iterates over all defined and then preprocessed types
63   void IterateTypes(const std::function<void(const AidlDefinedType&)>& body) const;
64 
65  private:
66   map<string, unique_ptr<AidlDefinedType>> defined_types_;
67   map<string, unique_ptr<AidlDefinedType>> preprocessed_types_;
68 };
69 
70 }  // namespace aidl
71 }  // namespace android
72