type_namespace.h revision 0a62067f35e957493bc37c4b42dfdcfc16353831
188423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling/* 288423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling * Copyright (C) 2015, The Android Open Source Project 388423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling * 488423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling * Licensed under the Apache License, Version 2.0 (the "License"); 588423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling * you may not use this file except in compliance with the License. 688423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling * You may obtain a copy of the License at 788423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling * 888423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling * http://www.apache.org/licenses/LICENSE-2.0 988423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling * 1088423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling * Unless required by applicable law or agreed to in writing, software 11ff34845f78ec5c20ccd8b5ec715d505eba9f66afEric Christopher * distributed under the License is distributed on an "AS IS" BASIS, 1288423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1388423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling * See the License for the specific language governing permissions and 140310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling * limitations under the License. 150310d768a1e267935729fdeee0d677ebf7095cb3Bill Wendling */ 1688423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling 1788423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling#ifndef AIDL_TYPE_NAMESPACE_H_ 1888423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling#define AIDL_TYPE_NAMESPACE_H_ 1988423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling 2088423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling#include <memory> 21b01acfae5bf66d82eda7c12c473e5a51831f9382Chris Lattner#include <string> 2288423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling 2388423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling#include <android-base/macros.h> 2488423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling 25858431d0bc81ddab11363cc0eb2889dbfdc8362bChris Lattner#include "aidl_language.h" 26b98b1bf43259052d1b06b90cc643a47bb239e2bbChris Lattner#include "logging.h" 2788423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling 2888423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendlingnamespace android { 2988423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendlingnamespace aidl { 3088423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling 31381afae68f3edd5cca65835003dacd73aca5da55Nick Lewyckyclass ValidatableType { 3288423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling public: 3388423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling enum { 34e697b4f486770dd640a47f39e8f0155b6d679b2dBenjamin Kramer KIND_BUILT_IN, 3588423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling KIND_PARCELABLE, 3688423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling KIND_INTERFACE, 3788423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling KIND_GENERATED, 38e697b4f486770dd640a47f39e8f0155b6d679b2dBenjamin Kramer }; 3988423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling 40e697b4f486770dd640a47f39e8f0155b6d679b2dBenjamin Kramer ValidatableType(int kind, 4188423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling const std::string& package, const std::string& type_name, 4288423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling const std::string& decl_file, int decl_line); 43e697b4f486770dd640a47f39e8f0155b6d679b2dBenjamin Kramer virtual ~ValidatableType() = default; 44e697b4f486770dd640a47f39e8f0155b6d679b2dBenjamin Kramer 4588423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling virtual bool CanBeArray() const = 0; 4688423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling virtual bool CanBeOutParameter() const = 0; 4788423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling virtual bool CanWriteToParcel() const = 0; 4888423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling 4988423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling // Name() returns the short name of an object (without package qualifiers). 5088423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling virtual std::string Name() const { return type_name_; } 5188423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling // QualifiedName() returns the canonical AIDL type, with packages. 5288423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling virtual std::string QualifiedName() const { return canonical_name_; } 5388423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling int Kind() const { return kind_; } 54381afae68f3edd5cca65835003dacd73aca5da55Nick Lewycky std::string HumanReadableKind() const; 5588423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling std::string DeclFile() const { return origin_file_; } 5688423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling int DeclLine() const { return origin_line_; } 57e697b4f486770dd640a47f39e8f0155b6d679b2dBenjamin Kramer 5888423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling private: 59e697b4f486770dd640a47f39e8f0155b6d679b2dBenjamin Kramer const int kind_; 6088423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling const std::string type_name_; 61e697b4f486770dd640a47f39e8f0155b6d679b2dBenjamin Kramer const std::string canonical_name_; 6288423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling const std::string origin_file_; 63e697b4f486770dd640a47f39e8f0155b6d679b2dBenjamin Kramer const int origin_line_; 6488423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling 65e697b4f486770dd640a47f39e8f0155b6d679b2dBenjamin Kramer DISALLOW_COPY_AND_ASSIGN(ValidatableType); 6688423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling}; 6788423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling 6888423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendlingclass TypeNamespace { 6988423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling public: 706404e4e7958aa71ff210008b0e5d1cef8d138ff2Devang Patel // Load the TypeNamespace with built in types. Don't do work in the 7188423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling // constructor because many of the useful methods are virtual. 72e697b4f486770dd640a47f39e8f0155b6d679b2dBenjamin Kramer virtual void Init() = 0; 7388423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling 7488423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling // Load this TypeNamespace with user defined types. 75e697b4f486770dd640a47f39e8f0155b6d679b2dBenjamin Kramer virtual bool AddParcelableType(const AidlParcelable& p, 7688423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling const std::string& filename) = 0; 77e697b4f486770dd640a47f39e8f0155b6d679b2dBenjamin Kramer virtual bool AddBinderType(const AidlInterface& b, 7888423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling const std::string& filename) = 0; 79e697b4f486770dd640a47f39e8f0155b6d679b2dBenjamin Kramer // We dynamically create container types as we discover them in the parse 80e697b4f486770dd640a47f39e8f0155b6d679b2dBenjamin Kramer // tree. Returns false if the contained types cannot be canonicalized. 8188423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling virtual bool AddListType(const std::string& contained_type_name) = 0; 8288423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling virtual bool AddMapType(const std::string& key_type_name, 8388423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling const std::string& value_type_name) = 0; 8488423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling 85e697b4f486770dd640a47f39e8f0155b6d679b2dBenjamin Kramer // Add a container type to this namespace. Returns false only 8688423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling // on error. Silently discards requests to add non-container types. 8788423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling virtual bool MaybeAddContainerType(const std::string& type_name); 8888423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling 8988423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling // Returns true iff this has a type for |type_name|. 9088423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling virtual bool HasType(const std::string& type_name) const; 91e697b4f486770dd640a47f39e8f0155b6d679b2dBenjamin Kramer 9288423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling // Returns true iff |package| is a valid package name. 9388423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling virtual bool IsValidPackage(const std::string& package) const; 9488423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling 9588423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling // Returns true iff |raw_type| is a valid return type. 9688423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling virtual bool IsValidReturnType(const AidlType& raw_type, 9788423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling const std::string& filename) const; 9888423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling 9988423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling // Returns true iff |arg_type| is a valid method argument. 10088423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling virtual bool IsValidArg(const AidlArgument& a, 101d38fee8ddc6597555904b82b6471a446cc5fe183Chris Lattner int arg_index, 10288423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling const std::string& filename) const; 10388423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling 104b01acfae5bf66d82eda7c12c473e5a51831f9382Chris Lattner // Returns true if this is a container type, rather than a normal type. 10588423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling virtual bool IsContainerType(const std::string& type_name) const; 10688423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling 10788423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling // Returns true iff the name can be canonicalized to a container type. 10888423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling virtual bool CanonicalizeContainerType( 10988423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling const std::string& raw_type_name, 11088423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling std::vector<std::string>* container_class, 11188423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling std::vector<std::string>* contained_type_names) const; 11288423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling 11388423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling protected: 1146f01d9c2f0a97b0dccde93a232c88f088877819fDevang Patel TypeNamespace() = default; 11588423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling virtual ~TypeNamespace() = default; 11688423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling 11788423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling // Get a pointer to an existing type. 11888423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling virtual const ValidatableType* GetValidatableType( 11988423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling const std::string& name) const = 0; 12088423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling 12188423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling private: 12288423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling DISALLOW_COPY_AND_ASSIGN(TypeNamespace); 12388423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling}; 124e697b4f486770dd640a47f39e8f0155b6d679b2dBenjamin Kramer 125e697b4f486770dd640a47f39e8f0155b6d679b2dBenjamin Kramertemplate<typename T> 126e697b4f486770dd640a47f39e8f0155b6d679b2dBenjamin Kramerclass LanguageTypeNamespace : public TypeNamespace { 127e697b4f486770dd640a47f39e8f0155b6d679b2dBenjamin Kramer public: 12888423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling LanguageTypeNamespace() = default; 12988423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling virtual ~LanguageTypeNamespace() = default; 13088423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling 13188423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling // Get a pointer to an existing type. Searches first by fully-qualified 1326404e4e7958aa71ff210008b0e5d1cef8d138ff2Devang Patel // name, and then class name (dropping package qualifiers). 1336404e4e7958aa71ff210008b0e5d1cef8d138ff2Devang Patel const T* Find(const std::string& name) const; 134034b94b17006f51722886b0f2283fb6fb19aca1fBill Wendling 13588423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling protected: 13688423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling bool Add(const T* type); 13788423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling const ValidatableType* GetValidatableType( 138d5509f2e027a4bc97b84a8ff5d706b4d6f4ba8a0Owen Anderson const std::string& name) const override { return Find(name); } 139d5509f2e027a4bc97b84a8ff5d706b4d6f4ba8a0Owen Anderson 14088423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling private: 14188423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling std::vector<std::unique_ptr<const T>> types_; 142e697b4f486770dd640a47f39e8f0155b6d679b2dBenjamin Kramer 143e697b4f486770dd640a47f39e8f0155b6d679b2dBenjamin Kramer DISALLOW_COPY_AND_ASSIGN(LanguageTypeNamespace); 14488423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling}; // class LanguageTypeNamespace 14588423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling 14688423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendlingtemplate<typename T> 14788423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendlingbool LanguageTypeNamespace<T>::Add(const T* type) { 14888423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling const T* existing = Find(type->QualifiedName()); 14988423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling if (!existing) { 15088423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling types_.emplace_back(type); 15188423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling return true; 15288423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling } 153638fe8dd62f0bd37a0ae7374eea280c224a84b6fJeffrey Yasskin 1546404e4e7958aa71ff210008b0e5d1cef8d138ff2Devang Patel if (existing->Kind() == ValidatableType::KIND_BUILT_IN) { 15588423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling LOG(ERROR) << type->DeclFile() << ":" << type->DeclLine() 15688423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling << " attempt to redefine built in class " 15788423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling << type->QualifiedName(); 158ff34845f78ec5c20ccd8b5ec715d505eba9f66afEric Christopher return false; 1592c4ceb177be718a7a3697ea63aa254719fc3528fDevang Patel } 16088423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling 1612c4ceb177be718a7a3697ea63aa254719fc3528fDevang Patel if (type->Kind() != existing->Kind()) { 16288423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling LOG(ERROR) << type->DeclFile() << ":" << type->DeclLine() 16388423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling << " attempt to redefine " << type->QualifiedName() 16488423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling << " as " << type->HumanReadableKind(); 16588423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling LOG(ERROR) << existing->DeclFile() << ":" << existing->DeclLine() 1662c4ceb177be718a7a3697ea63aa254719fc3528fDevang Patel << " previously defined here as " 16788423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling << existing->HumanReadableKind(); 1682c4ceb177be718a7a3697ea63aa254719fc3528fDevang Patel return false; 1696404e4e7958aa71ff210008b0e5d1cef8d138ff2Devang Patel } 1706404e4e7958aa71ff210008b0e5d1cef8d138ff2Devang Patel 1716404e4e7958aa71ff210008b0e5d1cef8d138ff2Devang Patel return true; 1726404e4e7958aa71ff210008b0e5d1cef8d138ff2Devang Patel} 17388423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling 17488423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendlingtemplate<typename T> 1755c213dc78cc717c30908212049e35cfdb950fa24Jeffrey Yasskinconst T* LanguageTypeNamespace<T>::Find(const std::string& raw_name) const { 17688423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling using std::string; 17788423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling using std::vector; 17888423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling using android::base::Join; 179b01acfae5bf66d82eda7c12c473e5a51831f9382Chris Lattner using android::base::Trim; 18088423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling 18188423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling string name = Trim(raw_name); 18288423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling if (IsContainerType(name)) { 18388423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling vector<string> container_class; 18488423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling vector<string> contained_type_names; 18588423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling if (!CanonicalizeContainerType(name, &container_class, 18688423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling &contained_type_names)) { 1876f01d9c2f0a97b0dccde93a232c88f088877819fDevang Patel return nullptr; 1882d24e2a396a1d211baaeedf32148a3b657240170David Blaikie } 18988423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling for (string& contained_type_name : contained_type_names) { 19088423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling const T* contained_type = Find(contained_type_name); 19188423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling if (!contained_type) { 19288423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling return nullptr; 19388423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling } 19488423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling contained_type_name = contained_type->QualifiedName(); 19588423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling } 19688423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling name = Join(container_class, '.') + 19788423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling "<" + Join(contained_type_names, ',') + ">"; 19888423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling } 19988423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling 20088423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling const T* ret = nullptr; 20188423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling for (const auto& type : types_) { 20288423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling // Always prefer a exact match if possible. 20388423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling // This works for primitives and class names qualified with a package. 20488423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling if (type->QualifiedName() == name) { 20588423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling ret = type.get(); 20688423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling break; 20788423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling } 20888423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling // We allow authors to drop packages when refering to a class name. 20988423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling if (type->Name() == name) { 21088423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling ret = type.get(); 211d38fee8ddc6597555904b82b6471a446cc5fe183Chris Lattner } 21288423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling } 21388423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling 21488423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling return ret; 215a37d5387a54aa9424f6f8c96e5cab1dcbbcd8623Chris Lattner} 21688423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling 21788423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling} // namespace aidl 218b01acfae5bf66d82eda7c12c473e5a51831f9382Chris Lattner} // namespace android 21988423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling 22088423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling#endif // AIDL_TYPE_NAMESPACE_H_ 22188423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling