blob: 469de4b1c83ca833c27e1a837ecd40c9867d9990 [file] [log] [blame]
Jiyong Park1deecc32018-07-17 01:14:41 +09001/*
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 */
Steven Moreland9fccf582018-08-27 20:36:27 -070016#pragma once
Jiyong Park1deecc32018-07-17 01:14:41 +090017
Steven Moreland6cee3482018-07-18 14:39:58 -070018#include <functional>
Jiyong Park1deecc32018-07-17 01:14:41 +090019#include <map>
20#include <memory>
21#include <set>
22#include <string>
23#include <utility>
24#include <vector>
25
26using std::map;
27using std::pair;
28using std::set;
29using std::string;
30using std::unique_ptr;
31using std::vector;
32
33class AidlDefinedType;
Daniel Norman85aed542019-08-21 12:01:14 -070034class AidlEnumDeclaration;
35class AidlInterface;
Jiyong Park1deecc32018-07-17 01:14:41 +090036class AidlTypeSpecifier;
Jiyong Park8e79b7f2020-07-20 20:52:38 +090037class AidlDocument;
Jiyong Park1deecc32018-07-17 01:14:41 +090038
39namespace android {
40namespace aidl {
41
42// AidlTypenames is a collection of AIDL types available to a compilation unit.
43//
44// Basic types (such as int, String, etc.) are added by default, while defined
45// types (such as IFoo, MyParcelable, etc.) and types from preprocessed inputs
46// are added as they are recognized by the parser.
47//
48// When AidlTypeSpecifier is encountered during parsing, parser defers the
49// resolution of it until the end of the parsing, where it uses AidlTypenames
50// to resolve type names in AidlTypeSpecifier.
51//
52// Note that nothing here is specific to either Java or C++.
Jiyong Parkac896042018-07-23 21:23:05 +090053class AidlTypenames final {
Jiyong Park1deecc32018-07-17 01:14:41 +090054 public:
55 AidlTypenames() = default;
Jiyong Park8e79b7f2020-07-20 20:52:38 +090056 bool AddDocument(std::unique_ptr<AidlDocument> doc);
57 const std::vector<std::unique_ptr<AidlDocument>>& AllDocuments() const { return documents_; }
58 const AidlDocument& MainDocument() const;
Jiyong Park1deecc32018-07-17 01:14:41 +090059 bool AddPreprocessedType(unique_ptr<AidlDefinedType> type);
Jiyong Parkac896042018-07-23 21:23:05 +090060 static bool IsBuiltinTypename(const string& type_name);
Jeongik Chadb0f59e2018-11-01 18:11:21 +090061 static bool IsPrimitiveTypename(const string& type_name);
Jiyong Parkac896042018-07-23 21:23:05 +090062 const AidlDefinedType* TryGetDefinedType(const string& type_name) const;
Jiyong Park0cf03b12020-07-22 19:36:34 +090063 std::vector<AidlDefinedType*> AllDefinedTypes() const;
Steven Morelandcb1bcd72020-04-29 16:30:35 -070064
65 struct ResolvedTypename {
66 std::string canonical_name;
67 bool is_resolved;
68 };
69 ResolvedTypename ResolveTypename(const string& type_name) const;
Jiyong Park1d2df7d2018-07-23 15:22:50 +090070 bool CanBeOutParameter(const AidlTypeSpecifier& type) const;
Jeongik Chad0a10272020-08-06 16:33:36 +090071 bool CanBeJavaOnlyImmutable(const AidlTypeSpecifier& type) const;
Devin Moorec7e47a32020-08-07 10:55:25 -070072 bool CanBeFixedSize(const AidlTypeSpecifier& type) const;
Devin Moore693e6732020-08-28 11:07:38 -070073 static bool IsList(const AidlTypeSpecifier& type);
Jeongik Cha36f76c32020-07-28 00:25:52 +090074
Jeongik Cha047c5ee2019-08-07 23:16:49 +090075 bool IsIgnorableImport(const string& import) const;
Daniel Norman85aed542019-08-21 12:01:14 -070076 // Returns the AidlEnumDeclaration of the given type, or nullptr if the type
77 // is not an AidlEnumDeclaration;
78 const AidlEnumDeclaration* GetEnumDeclaration(const AidlTypeSpecifier& type) const;
79 // Returns the AidlInterface of the given type, or nullptr if the type
80 // is not an AidlInterface;
81 const AidlInterface* GetInterface(const AidlTypeSpecifier& type) const;
Steven Moreland6cee3482018-07-18 14:39:58 -070082 // Iterates over all defined and then preprocessed types
83 void IterateTypes(const std::function<void(const AidlDefinedType&)>& body) const;
84
Jiyong Park1deecc32018-07-17 01:14:41 +090085 private:
Jiyong Park8f6ec462020-01-19 20:52:47 +090086 struct DefinedImplResult {
87 DefinedImplResult(const AidlDefinedType* type, const bool from_preprocessed)
88 : type(type), from_preprocessed(from_preprocessed) {}
89 const AidlDefinedType* type;
90 const bool from_preprocessed;
91 };
92 DefinedImplResult TryGetDefinedTypeImpl(const string& type_name) const;
Jiyong Park8e79b7f2020-07-20 20:52:38 +090093 map<string, const AidlDefinedType*> defined_types_;
Jiyong Park1deecc32018-07-17 01:14:41 +090094 map<string, unique_ptr<AidlDefinedType>> preprocessed_types_;
Jiyong Park8e79b7f2020-07-20 20:52:38 +090095 std::vector<std::unique_ptr<AidlDocument>> documents_;
Jiyong Park1deecc32018-07-17 01:14:41 +090096};
97
98} // namespace aidl
99} // namespace android