1ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski#include "aidl_language.h"
2f690be5044a56fdf75bb0bcae640074ec97023cdChristopher Wiley
3f690be5044a56fdf75bb0bcae640074ec97023cdChristopher Wiley#include <iostream>
4ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski#include <stdio.h>
5ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski#include <stdlib.h>
64a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wiley#include <string.h>
7dd69181114098550f84186442ef453754570075dCasey Dahlin#include <string>
8f690be5044a56fdf75bb0bcae640074ec97023cdChristopher Wiley
99d7810ac16dc170e7b24974b0f7de6482c13911dRoshan Pius#include <android-base/parseint.h>
100a62067f35e957493bc37c4b42dfdcfc16353831Elliott Hughes#include <android-base/strings.h>
11d76067c52b6bc0587aa26ecae34a49e6cbdae404Christopher Wiley
123000e7576b23c0a64d47e1f88b444fa09f7a8a6dYing Wang#include "aidl_language_y.h"
134a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wiley#include "logging.h"
14ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski
1507b9dde78e002aab6682129ab597e357453a5f66Casey Dahlin#ifdef _WIN32
1607b9dde78e002aab6682129ab597e357453a5f66Casey Dahlinint isatty(int  fd)
1707b9dde78e002aab6682129ab597e357453a5f66Casey Dahlin{
1807b9dde78e002aab6682129ab597e357453a5f66Casey Dahlin    return (fd == 0);
1907b9dde78e002aab6682129ab597e357453a5f66Casey Dahlin}
2007b9dde78e002aab6682129ab597e357453a5f66Casey Dahlin#endif
2107b9dde78e002aab6682129ab597e357453a5f66Casey Dahlin
224a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wileyusing android::aidl::IoDelegate;
23d76067c52b6bc0587aa26ecae34a49e6cbdae404Christopher Wileyusing android::base::Join;
248aa4d9f32dcfb37011d41417814c01bd2d7a473bChristopher Wileyusing android::base::Split;
25dd69181114098550f84186442ef453754570075dCasey Dahlinusing std::cerr;
26dd69181114098550f84186442ef453754570075dCasey Dahlinusing std::endl;
274a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wileyusing std::string;
284a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wileyusing std::unique_ptr;
29dd69181114098550f84186442ef453754570075dCasey Dahlin
30dd69181114098550f84186442ef453754570075dCasey Dahlinvoid yylex_init(void **);
31dd69181114098550f84186442ef453754570075dCasey Dahlinvoid yylex_destroy(void *);
32dd69181114098550f84186442ef453754570075dCasey Dahlinvoid yyset_in(FILE *f, void *);
33e25074935064cf06d30568ca61f2aaa0f75f0b9aCasey Dahlinint yyparse(Parser*);
344a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher WileyYY_BUFFER_STATE yy_scan_buffer(char *, size_t, void *);
3589d4484c67b1866eefb63524f20b6009a96aac49Casey Dahlinvoid yy_delete_buffer(YY_BUFFER_STATE, void *);
36dd69181114098550f84186442ef453754570075dCasey Dahlin
37cdbbc8c88426c8bf370547b661e770af6d5e1baaCasey DahlinAidlToken::AidlToken(const std::string& text, const std::string& comments)
38cdbbc8c88426c8bf370547b661e770af6d5e1baaCasey Dahlin    : text_(text),
39cdbbc8c88426c8bf370547b661e770af6d5e1baaCasey Dahlin      comments_(comments) {}
4098a544b567e20f6c8492e1d4eb8869e759ae74d9Casey Dahlin
41f2d23f7f05252fa1a06a8f95bd9475fa9d414c0cCasey DahlinAidlType::AidlType(const std::string& name, unsigned line,
42f7a421c02d43c3289ca45f0d5ccdf8d27e605f5aCasey Dahlin                   const std::string& comments, bool is_array)
43f2d23f7f05252fa1a06a8f95bd9475fa9d414c0cCasey Dahlin    : name_(name),
44f2d23f7f05252fa1a06a8f95bd9475fa9d414c0cCasey Dahlin      line_(line),
45f7a421c02d43c3289ca45f0d5ccdf8d27e605f5aCasey Dahlin      is_array_(is_array),
46f2d23f7f05252fa1a06a8f95bd9475fa9d414c0cCasey Dahlin      comments_(comments) {}
47f2d23f7f05252fa1a06a8f95bd9475fa9d414c0cCasey Dahlin
4898a544b567e20f6c8492e1d4eb8869e759ae74d9Casey Dahlinstring AidlType::ToString() const {
4998a544b567e20f6c8492e1d4eb8869e759ae74d9Casey Dahlin  return name_ + (is_array_ ? "[]" : "");
5070078e6d2b1afd3d1a5f4370fd4e116e6d0510e1Casey Dahlin}
5170078e6d2b1afd3d1a5f4370fd4e116e6d0510e1Casey Dahlin
520ee3758e1f452a8bf99a5975b4f585035369d8fbCasey DahlinAidlArgument::AidlArgument(AidlArgument::Direction direction, AidlType* type,
53308f9d49bb797858296193578b261af01d808f53Casey Dahlin                           std::string name, unsigned line)
540ee3758e1f452a8bf99a5975b4f585035369d8fbCasey Dahlin    : type_(type),
55fd6fb483fbe3b48948ade670ee838c6622110020Casey Dahlin      direction_(direction),
56fd6fb483fbe3b48948ade670ee838c6622110020Casey Dahlin      direction_specified_(true),
57308f9d49bb797858296193578b261af01d808f53Casey Dahlin      name_(name),
58308f9d49bb797858296193578b261af01d808f53Casey Dahlin      line_(line) {}
59c378c9946ac42e225be4fe37d3b97e1b88a97304Casey Dahlin
60308f9d49bb797858296193578b261af01d808f53Casey DahlinAidlArgument::AidlArgument(AidlType* type, std::string name, unsigned line)
610ee3758e1f452a8bf99a5975b4f585035369d8fbCasey Dahlin    : type_(type),
62fd6fb483fbe3b48948ade670ee838c6622110020Casey Dahlin      direction_(AidlArgument::IN_DIR),
63fd6fb483fbe3b48948ade670ee838c6622110020Casey Dahlin      direction_specified_(false),
64308f9d49bb797858296193578b261af01d808f53Casey Dahlin      name_(name),
65308f9d49bb797858296193578b261af01d808f53Casey Dahlin      line_(line) {}
66c378c9946ac42e225be4fe37d3b97e1b88a97304Casey Dahlin
67c378c9946ac42e225be4fe37d3b97e1b88a97304Casey Dahlinstring AidlArgument::ToString() const {
68c378c9946ac42e225be4fe37d3b97e1b88a97304Casey Dahlin  string ret;
69c378c9946ac42e225be4fe37d3b97e1b88a97304Casey Dahlin
70c378c9946ac42e225be4fe37d3b97e1b88a97304Casey Dahlin  if (direction_specified_) {
71c378c9946ac42e225be4fe37d3b97e1b88a97304Casey Dahlin    switch(direction_) {
72c378c9946ac42e225be4fe37d3b97e1b88a97304Casey Dahlin    case AidlArgument::IN_DIR:
73c378c9946ac42e225be4fe37d3b97e1b88a97304Casey Dahlin      ret += "in ";
74c378c9946ac42e225be4fe37d3b97e1b88a97304Casey Dahlin      break;
75c378c9946ac42e225be4fe37d3b97e1b88a97304Casey Dahlin    case AidlArgument::OUT_DIR:
76c378c9946ac42e225be4fe37d3b97e1b88a97304Casey Dahlin      ret += "out ";
77c378c9946ac42e225be4fe37d3b97e1b88a97304Casey Dahlin      break;
78c378c9946ac42e225be4fe37d3b97e1b88a97304Casey Dahlin    case AidlArgument::INOUT_DIR:
79c378c9946ac42e225be4fe37d3b97e1b88a97304Casey Dahlin      ret += "inout ";
80c378c9946ac42e225be4fe37d3b97e1b88a97304Casey Dahlin      break;
81c378c9946ac42e225be4fe37d3b97e1b88a97304Casey Dahlin    }
82c378c9946ac42e225be4fe37d3b97e1b88a97304Casey Dahlin  }
83c378c9946ac42e225be4fe37d3b97e1b88a97304Casey Dahlin
8470078e6d2b1afd3d1a5f4370fd4e116e6d0510e1Casey Dahlin  ret += type_->ToString();
85c378c9946ac42e225be4fe37d3b97e1b88a97304Casey Dahlin  ret += " ";
86d127b50f07eed0cf78dfc956697031edea41043cCasey Dahlin  ret += name_;
87c378c9946ac42e225be4fe37d3b97e1b88a97304Casey Dahlin
88c378c9946ac42e225be4fe37d3b97e1b88a97304Casey Dahlin  return ret;
89c378c9946ac42e225be4fe37d3b97e1b88a97304Casey Dahlin}
90bc7a50a9bb4b97affc05f872d0cce02e54861e23Casey Dahlin
91d6bdd8d7cfb0a96ccc826cbb005128f0f7ca3446Christopher WileyAidlIntConstant::AidlIntConstant(std::string name, int32_t value)
92d40e2fed2c19850d53f1620322ac5cbca2c0e245Casey Dahlin    : name_(name),
933b2203ddadae8b44ebe14a882274707ba58bc9c3Roshan Pius      value_(value),
943b2203ddadae8b44ebe14a882274707ba58bc9c3Roshan Pius      is_valid_(true) {}
953b2203ddadae8b44ebe14a882274707ba58bc9c3Roshan Pius
963b2203ddadae8b44ebe14a882274707ba58bc9c3Roshan PiusAidlIntConstant::AidlIntConstant(std::string name,
973b2203ddadae8b44ebe14a882274707ba58bc9c3Roshan Pius                                 std::string value,
983b2203ddadae8b44ebe14a882274707ba58bc9c3Roshan Pius                                 unsigned line_number)
993b2203ddadae8b44ebe14a882274707ba58bc9c3Roshan Pius    : name_(name) {
1009d7810ac16dc170e7b24974b0f7de6482c13911dRoshan Pius  uint32_t unsigned_val;
1019d7810ac16dc170e7b24974b0f7de6482c13911dRoshan Pius  if (!android::base::ParseUint(value.c_str(), &unsigned_val)) {
1023b2203ddadae8b44ebe14a882274707ba58bc9c3Roshan Pius    is_valid_ = false;
1033b2203ddadae8b44ebe14a882274707ba58bc9c3Roshan Pius    LOG(ERROR) << "Found invalid int value '" << value
1043b2203ddadae8b44ebe14a882274707ba58bc9c3Roshan Pius               << "' on line " << line_number;
1053b2203ddadae8b44ebe14a882274707ba58bc9c3Roshan Pius  } else {
1069d7810ac16dc170e7b24974b0f7de6482c13911dRoshan Pius    // Converting from unsigned to signed integer.
1079d7810ac16dc170e7b24974b0f7de6482c13911dRoshan Pius    value_ = unsigned_val;
1083b2203ddadae8b44ebe14a882274707ba58bc9c3Roshan Pius    is_valid_ = true;
1093b2203ddadae8b44ebe14a882274707ba58bc9c3Roshan Pius  }
1103b2203ddadae8b44ebe14a882274707ba58bc9c3Roshan Pius}
111d40e2fed2c19850d53f1620322ac5cbca2c0e245Casey Dahlin
112d6bdd8d7cfb0a96ccc826cbb005128f0f7ca3446Christopher WileyAidlStringConstant::AidlStringConstant(std::string name,
113d6bdd8d7cfb0a96ccc826cbb005128f0f7ca3446Christopher Wiley                                       std::string value,
114d6bdd8d7cfb0a96ccc826cbb005128f0f7ca3446Christopher Wiley                                       unsigned line_number)
115d6bdd8d7cfb0a96ccc826cbb005128f0f7ca3446Christopher Wiley    : name_(name),
116d6bdd8d7cfb0a96ccc826cbb005128f0f7ca3446Christopher Wiley      value_(value) {
117d6bdd8d7cfb0a96ccc826cbb005128f0f7ca3446Christopher Wiley  is_valid_ = true;
118d6bdd8d7cfb0a96ccc826cbb005128f0f7ca3446Christopher Wiley  for (size_t i = 0; i < value_.length(); ++i) {
119d6bdd8d7cfb0a96ccc826cbb005128f0f7ca3446Christopher Wiley    const char& c = value_[i];
120d6bdd8d7cfb0a96ccc826cbb005128f0f7ca3446Christopher Wiley    if (c <= 0x1f || // control characters are < 0x20
121d6bdd8d7cfb0a96ccc826cbb005128f0f7ca3446Christopher Wiley        c >= 0x7f || // DEL is 0x7f
122d6bdd8d7cfb0a96ccc826cbb005128f0f7ca3446Christopher Wiley        c == '\\') { // Disallow backslashes for future proofing.
123d6bdd8d7cfb0a96ccc826cbb005128f0f7ca3446Christopher Wiley      LOG(ERROR) << "Found invalid character at index " << i
124d6bdd8d7cfb0a96ccc826cbb005128f0f7ca3446Christopher Wiley                 << " in string constant '" << value_
125d6bdd8d7cfb0a96ccc826cbb005128f0f7ca3446Christopher Wiley                 << "' beginning on line " << line_number;
126d6bdd8d7cfb0a96ccc826cbb005128f0f7ca3446Christopher Wiley      is_valid_ = false;
127d6bdd8d7cfb0a96ccc826cbb005128f0f7ca3446Christopher Wiley      break;
128d6bdd8d7cfb0a96ccc826cbb005128f0f7ca3446Christopher Wiley    }
129d6bdd8d7cfb0a96ccc826cbb005128f0f7ca3446Christopher Wiley  }
130d6bdd8d7cfb0a96ccc826cbb005128f0f7ca3446Christopher Wiley}
131d6bdd8d7cfb0a96ccc826cbb005128f0f7ca3446Christopher Wiley
132f4a9311fa018c78a7b30a73bd8ebbaa33c701ae4Casey DahlinAidlMethod::AidlMethod(bool oneway, AidlType* type, std::string name,
133f4a9311fa018c78a7b30a73bd8ebbaa33c701ae4Casey Dahlin                       std::vector<std::unique_ptr<AidlArgument>>* args,
134fb7da2e62fe66b0a57ffbb0304f5884024a68f1cCasey Dahlin                       unsigned line, const std::string& comments, int id)
135f4a9311fa018c78a7b30a73bd8ebbaa33c701ae4Casey Dahlin    : oneway_(oneway),
136f4a9311fa018c78a7b30a73bd8ebbaa33c701ae4Casey Dahlin      comments_(comments),
137f4a9311fa018c78a7b30a73bd8ebbaa33c701ae4Casey Dahlin      type_(type),
138f4a9311fa018c78a7b30a73bd8ebbaa33c701ae4Casey Dahlin      name_(name),
139f4a9311fa018c78a7b30a73bd8ebbaa33c701ae4Casey Dahlin      line_(line),
140f4a9311fa018c78a7b30a73bd8ebbaa33c701ae4Casey Dahlin      arguments_(std::move(*args)),
141f4a9311fa018c78a7b30a73bd8ebbaa33c701ae4Casey Dahlin      id_(id) {
142f4a9311fa018c78a7b30a73bd8ebbaa33c701ae4Casey Dahlin  has_id_ = true;
143f4a9311fa018c78a7b30a73bd8ebbaa33c701ae4Casey Dahlin  delete args;
144ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley  for (const unique_ptr<AidlArgument>& a : arguments_) {
145ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley    if (a->IsIn()) { in_arguments_.push_back(a.get()); }
146ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley    if (a->IsOut()) { out_arguments_.push_back(a.get()); }
147ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley  }
148f4a9311fa018c78a7b30a73bd8ebbaa33c701ae4Casey Dahlin}
149f4a9311fa018c78a7b30a73bd8ebbaa33c701ae4Casey Dahlin
150f4a9311fa018c78a7b30a73bd8ebbaa33c701ae4Casey DahlinAidlMethod::AidlMethod(bool oneway, AidlType* type, std::string name,
151f4a9311fa018c78a7b30a73bd8ebbaa33c701ae4Casey Dahlin                       std::vector<std::unique_ptr<AidlArgument>>* args,
152fb7da2e62fe66b0a57ffbb0304f5884024a68f1cCasey Dahlin                       unsigned line, const std::string& comments)
153f4a9311fa018c78a7b30a73bd8ebbaa33c701ae4Casey Dahlin    : AidlMethod(oneway, type, name, args, line, comments, 0) {
154f4a9311fa018c78a7b30a73bd8ebbaa33c701ae4Casey Dahlin  has_id_ = false;
155f4a9311fa018c78a7b30a73bd8ebbaa33c701ae4Casey Dahlin}
156f2d23f7f05252fa1a06a8f95bd9475fa9d414c0cCasey Dahlin
1574a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher WileyParser::Parser(const IoDelegate& io_delegate)
1584a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wiley    : io_delegate_(io_delegate) {
1594a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wiley  yylex_init(&scanner_);
160dd69181114098550f84186442ef453754570075dCasey Dahlin}
161dd69181114098550f84186442ef453754570075dCasey Dahlin
1622b2879b4cd04fe21853e8b18a6403c35778fb17dCasey DahlinAidlParcelable::AidlParcelable(AidlQualifiedName* name, unsigned line,
1638aa4d9f32dcfb37011d41417814c01bd2d7a473bChristopher Wiley                               const std::vector<std::string>& package,
1648aa4d9f32dcfb37011d41417814c01bd2d7a473bChristopher Wiley                               const std::string& cpp_header)
16559401da7787cbc224785c0a03c30f6392445c1ecCasey Dahlin    : name_(name),
16659401da7787cbc224785c0a03c30f6392445c1ecCasey Dahlin      line_(line),
1678aa4d9f32dcfb37011d41417814c01bd2d7a473bChristopher Wiley      package_(package),
1688aa4d9f32dcfb37011d41417814c01bd2d7a473bChristopher Wiley      cpp_header_(cpp_header) {
1698aa4d9f32dcfb37011d41417814c01bd2d7a473bChristopher Wiley  // Strip off quotation marks if we actually have a cpp header.
1708aa4d9f32dcfb37011d41417814c01bd2d7a473bChristopher Wiley  if (cpp_header_.length() >= 2) {
1718aa4d9f32dcfb37011d41417814c01bd2d7a473bChristopher Wiley    cpp_header_ = cpp_header_.substr(1, cpp_header_.length() - 2);
1728aa4d9f32dcfb37011d41417814c01bd2d7a473bChristopher Wiley  }
17359401da7787cbc224785c0a03c30f6392445c1ecCasey Dahlin}
17459401da7787cbc224785c0a03c30f6392445c1ecCasey Dahlin
175d76067c52b6bc0587aa26ecae34a49e6cbdae404Christopher Wileystd::string AidlParcelable::GetPackage() const {
176d76067c52b6bc0587aa26ecae34a49e6cbdae404Christopher Wiley  return Join(package_, '.');
177d76067c52b6bc0587aa26ecae34a49e6cbdae404Christopher Wiley}
178d76067c52b6bc0587aa26ecae34a49e6cbdae404Christopher Wiley
179c1f39b4ea30e7313eeb7f3d3fd5ec66ba00f2bb5Casey Dahlinstd::string AidlParcelable::GetCanonicalName() const {
180c1f39b4ea30e7313eeb7f3d3fd5ec66ba00f2bb5Casey Dahlin  if (package_.empty()) {
181c1f39b4ea30e7313eeb7f3d3fd5ec66ba00f2bb5Casey Dahlin    return GetName();
182c1f39b4ea30e7313eeb7f3d3fd5ec66ba00f2bb5Casey Dahlin  }
183c1f39b4ea30e7313eeb7f3d3fd5ec66ba00f2bb5Casey Dahlin  return GetPackage() + "." + GetName();
184c1f39b4ea30e7313eeb7f3d3fd5ec66ba00f2bb5Casey Dahlin}
185c1f39b4ea30e7313eeb7f3d3fd5ec66ba00f2bb5Casey Dahlin
186fb7da2e62fe66b0a57ffbb0304f5884024a68f1cCasey DahlinAidlInterface::AidlInterface(const std::string& name, unsigned line,
187fb7da2e62fe66b0a57ffbb0304f5884024a68f1cCasey Dahlin                             const std::string& comments, bool oneway,
188d40e2fed2c19850d53f1620322ac5cbca2c0e245Casey Dahlin                             std::vector<std::unique_ptr<AidlMember>>* members,
189d76067c52b6bc0587aa26ecae34a49e6cbdae404Christopher Wiley                             const std::vector<std::string>& package)
190fb7da2e62fe66b0a57ffbb0304f5884024a68f1cCasey Dahlin    : name_(name),
191fb7da2e62fe66b0a57ffbb0304f5884024a68f1cCasey Dahlin      comments_(comments),
192fb7da2e62fe66b0a57ffbb0304f5884024a68f1cCasey Dahlin      line_(line),
193fb7da2e62fe66b0a57ffbb0304f5884024a68f1cCasey Dahlin      oneway_(oneway),
194fb7da2e62fe66b0a57ffbb0304f5884024a68f1cCasey Dahlin      package_(package) {
195d40e2fed2c19850d53f1620322ac5cbca2c0e245Casey Dahlin  for (auto& member : *members) {
196d40e2fed2c19850d53f1620322ac5cbca2c0e245Casey Dahlin    AidlMember* local = member.release();
197d40e2fed2c19850d53f1620322ac5cbca2c0e245Casey Dahlin    AidlMethod* method = local->AsMethod();
198d6bdd8d7cfb0a96ccc826cbb005128f0f7ca3446Christopher Wiley    AidlIntConstant* int_constant = local->AsIntConstant();
199d6bdd8d7cfb0a96ccc826cbb005128f0f7ca3446Christopher Wiley    AidlStringConstant* string_constant = local->AsStringConstant();
200d40e2fed2c19850d53f1620322ac5cbca2c0e245Casey Dahlin
201d40e2fed2c19850d53f1620322ac5cbca2c0e245Casey Dahlin    if (method) {
202d40e2fed2c19850d53f1620322ac5cbca2c0e245Casey Dahlin      methods_.emplace_back(method);
203d6bdd8d7cfb0a96ccc826cbb005128f0f7ca3446Christopher Wiley    } else if (int_constant) {
204d6bdd8d7cfb0a96ccc826cbb005128f0f7ca3446Christopher Wiley      int_constants_.emplace_back(int_constant);
205d6bdd8d7cfb0a96ccc826cbb005128f0f7ca3446Christopher Wiley    } else if (string_constant) {
206d6bdd8d7cfb0a96ccc826cbb005128f0f7ca3446Christopher Wiley      string_constants_.emplace_back(string_constant);
207d40e2fed2c19850d53f1620322ac5cbca2c0e245Casey Dahlin    } else {
208d40e2fed2c19850d53f1620322ac5cbca2c0e245Casey Dahlin      LOG(FATAL) << "Member is neither method nor constant!";
209d40e2fed2c19850d53f1620322ac5cbca2c0e245Casey Dahlin    }
210d40e2fed2c19850d53f1620322ac5cbca2c0e245Casey Dahlin  }
211d40e2fed2c19850d53f1620322ac5cbca2c0e245Casey Dahlin
212d40e2fed2c19850d53f1620322ac5cbca2c0e245Casey Dahlin  delete members;
213fb7da2e62fe66b0a57ffbb0304f5884024a68f1cCasey Dahlin}
214fb7da2e62fe66b0a57ffbb0304f5884024a68f1cCasey Dahlin
215d76067c52b6bc0587aa26ecae34a49e6cbdae404Christopher Wileystd::string AidlInterface::GetPackage() const {
216d76067c52b6bc0587aa26ecae34a49e6cbdae404Christopher Wiley  return Join(package_, '.');
217d76067c52b6bc0587aa26ecae34a49e6cbdae404Christopher Wiley}
218d76067c52b6bc0587aa26ecae34a49e6cbdae404Christopher Wiley
219d76067c52b6bc0587aa26ecae34a49e6cbdae404Christopher Wileystd::string AidlInterface::GetCanonicalName() const {
220d76067c52b6bc0587aa26ecae34a49e6cbdae404Christopher Wiley  if (package_.empty()) {
221d76067c52b6bc0587aa26ecae34a49e6cbdae404Christopher Wiley    return GetName();
222d76067c52b6bc0587aa26ecae34a49e6cbdae404Christopher Wiley  }
223d76067c52b6bc0587aa26ecae34a49e6cbdae404Christopher Wiley  return GetPackage() + "." + GetName();
224d76067c52b6bc0587aa26ecae34a49e6cbdae404Christopher Wiley}
225d76067c52b6bc0587aa26ecae34a49e6cbdae404Christopher Wiley
226c1f39b4ea30e7313eeb7f3d3fd5ec66ba00f2bb5Casey DahlinAidlDocument::AidlDocument(AidlInterface* interface)
227c1f39b4ea30e7313eeb7f3d3fd5ec66ba00f2bb5Casey Dahlin    : interface_(interface) {}
228c1f39b4ea30e7313eeb7f3d3fd5ec66ba00f2bb5Casey Dahlin
2292b2879b4cd04fe21853e8b18a6403c35778fb17dCasey DahlinAidlQualifiedName::AidlQualifiedName(std::string term,
2302b2879b4cd04fe21853e8b18a6403c35778fb17dCasey Dahlin                                     std::string comments)
2312b2879b4cd04fe21853e8b18a6403c35778fb17dCasey Dahlin    : terms_({term}),
2322b2879b4cd04fe21853e8b18a6403c35778fb17dCasey Dahlin      comments_(comments) {
2338aa4d9f32dcfb37011d41417814c01bd2d7a473bChristopher Wiley  if (term.find('.') != string::npos) {
2348aa4d9f32dcfb37011d41417814c01bd2d7a473bChristopher Wiley    terms_ = Split(term, ".");
2358aa4d9f32dcfb37011d41417814c01bd2d7a473bChristopher Wiley    for (const auto& term: terms_) {
2368aa4d9f32dcfb37011d41417814c01bd2d7a473bChristopher Wiley      if (term.empty()) {
2378aa4d9f32dcfb37011d41417814c01bd2d7a473bChristopher Wiley        LOG(FATAL) << "Malformed qualified identifier: '" << term << "'";
2388aa4d9f32dcfb37011d41417814c01bd2d7a473bChristopher Wiley      }
2398aa4d9f32dcfb37011d41417814c01bd2d7a473bChristopher Wiley    }
2408aa4d9f32dcfb37011d41417814c01bd2d7a473bChristopher Wiley  }
2412b2879b4cd04fe21853e8b18a6403c35778fb17dCasey Dahlin}
2422b2879b4cd04fe21853e8b18a6403c35778fb17dCasey Dahlin
243f05cc26630828c848e46ea0e584dbdd2541ea723Chih-Hung Hsiehvoid AidlQualifiedName::AddTerm(const std::string& term) {
2442b2879b4cd04fe21853e8b18a6403c35778fb17dCasey Dahlin  terms_.push_back(term);
2452b2879b4cd04fe21853e8b18a6403c35778fb17dCasey Dahlin}
2462b2879b4cd04fe21853e8b18a6403c35778fb17dCasey Dahlin
2470edf34239909bbc16e884ea2517e5f3398185d0fCasey DahlinAidlImport::AidlImport(const std::string& from,
2480edf34239909bbc16e884ea2517e5f3398185d0fCasey Dahlin                       const std::string& needed_class, unsigned line)
2490edf34239909bbc16e884ea2517e5f3398185d0fCasey Dahlin    : from_(from),
2500edf34239909bbc16e884ea2517e5f3398185d0fCasey Dahlin      needed_class_(needed_class),
2510edf34239909bbc16e884ea2517e5f3398185d0fCasey Dahlin      line_(line) {}
2520edf34239909bbc16e884ea2517e5f3398185d0fCasey Dahlin
2534a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher WileyParser::~Parser() {
2544a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wiley  if (raw_buffer_) {
2554a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wiley    yy_delete_buffer(buffer_, scanner_);
2564a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wiley    raw_buffer_.reset();
2574a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wiley  }
2584a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wiley  yylex_destroy(scanner_);
2594a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wiley}
260dd69181114098550f84186442ef453754570075dCasey Dahlin
2614a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wileybool Parser::ParseFile(const string& filename) {
2624a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wiley  // Make sure we can read the file first, before trashing previous state.
2634a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wiley  unique_ptr<string> new_buffer = io_delegate_.GetFileContents(filename);
2644a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wiley  if (!new_buffer) {
2654a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wiley    LOG(ERROR) << "Error while opening file for parsing: '" << filename << "'";
266dd69181114098550f84186442ef453754570075dCasey Dahlin    return false;
2674a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wiley  }
268dd69181114098550f84186442ef453754570075dCasey Dahlin
2694a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wiley  // Throw away old parsing state if we have any.
2704a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wiley  if (raw_buffer_) {
27189d4484c67b1866eefb63524f20b6009a96aac49Casey Dahlin    yy_delete_buffer(buffer_, scanner_);
2724a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wiley    raw_buffer_.reset();
2734a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wiley  }
27489d4484c67b1866eefb63524f20b6009a96aac49Casey Dahlin
2754a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wiley  raw_buffer_ = std::move(new_buffer);
2764a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wiley  // We're going to scan this buffer in place, and yacc demands we put two
2774a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wiley  // nulls at the end.
2784a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wiley  raw_buffer_->append(2u, '\0');
2794a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wiley  filename_ = filename;
280d76067c52b6bc0587aa26ecae34a49e6cbdae404Christopher Wiley  package_.reset();
2814a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wiley  error_ = 0;
282c1f39b4ea30e7313eeb7f3d3fd5ec66ba00f2bb5Casey Dahlin  document_.reset();
2834a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wiley
2844a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wiley  buffer_ = yy_scan_buffer(&(*raw_buffer_)[0], raw_buffer_->length(), scanner_);
28589d4484c67b1866eefb63524f20b6009a96aac49Casey Dahlin
286c1f39b4ea30e7313eeb7f3d3fd5ec66ba00f2bb5Casey Dahlin  if (yy::parser(this).parse() != 0 || error_ != 0) {
287c1f39b4ea30e7313eeb7f3d3fd5ec66ba00f2bb5Casey Dahlin    return false;}
288c1f39b4ea30e7313eeb7f3d3fd5ec66ba00f2bb5Casey Dahlin
289c1f39b4ea30e7313eeb7f3d3fd5ec66ba00f2bb5Casey Dahlin  if (document_.get() != nullptr)
290c1f39b4ea30e7313eeb7f3d3fd5ec66ba00f2bb5Casey Dahlin    return true;
291dd69181114098550f84186442ef453754570075dCasey Dahlin
292c1f39b4ea30e7313eeb7f3d3fd5ec66ba00f2bb5Casey Dahlin  LOG(ERROR) << "Parser succeeded but yielded no document!";
293c1f39b4ea30e7313eeb7f3d3fd5ec66ba00f2bb5Casey Dahlin  return false;
294dd69181114098550f84186442ef453754570075dCasey Dahlin}
295e25074935064cf06d30568ca61f2aaa0f75f0b9aCasey Dahlin
29698a544b567e20f6c8492e1d4eb8869e759ae74d9Casey Dahlinvoid Parser::ReportError(const string& err, unsigned line) {
29798a544b567e20f6c8492e1d4eb8869e759ae74d9Casey Dahlin  cerr << filename_ << ":" << line << ": " << err << endl;
2984a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wiley  error_ = 1;
2994a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wiley}
3004a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wiley
30190be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wileystd::vector<std::string> Parser::Package() const {
30290be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley  if (!package_) {
30390be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley    return {};
30490be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley  }
30590be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley  return package_->GetTerms();
30690be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley}
30790be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley
3082b2879b4cd04fe21853e8b18a6403c35778fb17dCasey Dahlinvoid Parser::AddImport(AidlQualifiedName* name, unsigned line) {
3092b2879b4cd04fe21853e8b18a6403c35778fb17dCasey Dahlin  imports_.emplace_back(new AidlImport(this->FileName(),
3102b2879b4cd04fe21853e8b18a6403c35778fb17dCasey Dahlin                                       name->GetDotName(), line));
3112b2879b4cd04fe21853e8b18a6403c35778fb17dCasey Dahlin  delete name;
312e25074935064cf06d30568ca61f2aaa0f75f0b9aCasey Dahlin}
313