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