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
90a62067f35e957493bc37c4b42dfdcfc16353831Elliott Hughes#include <android-base/strings.h>
10d76067c52b6bc0587aa26ecae34a49e6cbdae404Christopher Wiley
11f1471bd167215dad54d6a686a7e81d7d63c4ac83Ying Wang#include "aidl_language_y.h"
124a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wiley#include "logging.h"
13ffa1686a7a8964d1f6e08ee2ab3e5eb42eb5f0b3Adam Lesinski
1407b9dde78e002aab6682129ab597e357453a5f66Casey Dahlin#ifdef _WIN32
1507b9dde78e002aab6682129ab597e357453a5f66Casey Dahlinint isatty(int  fd)
1607b9dde78e002aab6682129ab597e357453a5f66Casey Dahlin{
1707b9dde78e002aab6682129ab597e357453a5f66Casey Dahlin    return (fd == 0);
1807b9dde78e002aab6682129ab597e357453a5f66Casey Dahlin}
1907b9dde78e002aab6682129ab597e357453a5f66Casey Dahlin#endif
2007b9dde78e002aab6682129ab597e357453a5f66Casey Dahlin
214a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wileyusing android::aidl::IoDelegate;
22d76067c52b6bc0587aa26ecae34a49e6cbdae404Christopher Wileyusing android::base::Join;
238aa4d9f32dcfb37011d41417814c01bd2d7a473bChristopher Wileyusing android::base::Split;
24dd69181114098550f84186442ef453754570075dCasey Dahlinusing std::cerr;
25dd69181114098550f84186442ef453754570075dCasey Dahlinusing std::endl;
264a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wileyusing std::string;
274a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wileyusing std::unique_ptr;
28dd69181114098550f84186442ef453754570075dCasey Dahlin
29dd69181114098550f84186442ef453754570075dCasey Dahlinvoid yylex_init(void **);
30dd69181114098550f84186442ef453754570075dCasey Dahlinvoid yylex_destroy(void *);
31dd69181114098550f84186442ef453754570075dCasey Dahlinvoid yyset_in(FILE *f, void *);
32e25074935064cf06d30568ca61f2aaa0f75f0b9aCasey Dahlinint yyparse(Parser*);
334a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher WileyYY_BUFFER_STATE yy_scan_buffer(char *, size_t, void *);
3489d4484c67b1866eefb63524f20b6009a96aac49Casey Dahlinvoid yy_delete_buffer(YY_BUFFER_STATE, void *);
35dd69181114098550f84186442ef453754570075dCasey Dahlin
36cdbbc8c88426c8bf370547b661e770af6d5e1baaCasey DahlinAidlToken::AidlToken(const std::string& text, const std::string& comments)
37cdbbc8c88426c8bf370547b661e770af6d5e1baaCasey Dahlin    : text_(text),
38cdbbc8c88426c8bf370547b661e770af6d5e1baaCasey Dahlin      comments_(comments) {}
3998a544b567e20f6c8492e1d4eb8869e759ae74d9Casey Dahlin
40f2d23f7f05252fa1a06a8f95bd9475fa9d414c0cCasey DahlinAidlType::AidlType(const std::string& name, unsigned line,
41f7a421c02d43c3289ca45f0d5ccdf8d27e605f5aCasey Dahlin                   const std::string& comments, bool is_array)
42f2d23f7f05252fa1a06a8f95bd9475fa9d414c0cCasey Dahlin    : name_(name),
43f2d23f7f05252fa1a06a8f95bd9475fa9d414c0cCasey Dahlin      line_(line),
44f7a421c02d43c3289ca45f0d5ccdf8d27e605f5aCasey Dahlin      is_array_(is_array),
45f2d23f7f05252fa1a06a8f95bd9475fa9d414c0cCasey Dahlin      comments_(comments) {}
46f2d23f7f05252fa1a06a8f95bd9475fa9d414c0cCasey Dahlin
4798a544b567e20f6c8492e1d4eb8869e759ae74d9Casey Dahlinstring AidlType::ToString() const {
4898a544b567e20f6c8492e1d4eb8869e759ae74d9Casey Dahlin  return name_ + (is_array_ ? "[]" : "");
4970078e6d2b1afd3d1a5f4370fd4e116e6d0510e1Casey Dahlin}
5070078e6d2b1afd3d1a5f4370fd4e116e6d0510e1Casey Dahlin
510ee3758e1f452a8bf99a5975b4f585035369d8fbCasey DahlinAidlArgument::AidlArgument(AidlArgument::Direction direction, AidlType* type,
52308f9d49bb797858296193578b261af01d808f53Casey Dahlin                           std::string name, unsigned line)
530ee3758e1f452a8bf99a5975b4f585035369d8fbCasey Dahlin    : type_(type),
54fd6fb483fbe3b48948ade670ee838c6622110020Casey Dahlin      direction_(direction),
55fd6fb483fbe3b48948ade670ee838c6622110020Casey Dahlin      direction_specified_(true),
56308f9d49bb797858296193578b261af01d808f53Casey Dahlin      name_(name),
57308f9d49bb797858296193578b261af01d808f53Casey Dahlin      line_(line) {}
58c378c9946ac42e225be4fe37d3b97e1b88a97304Casey Dahlin
59308f9d49bb797858296193578b261af01d808f53Casey DahlinAidlArgument::AidlArgument(AidlType* type, std::string name, unsigned line)
600ee3758e1f452a8bf99a5975b4f585035369d8fbCasey Dahlin    : type_(type),
61fd6fb483fbe3b48948ade670ee838c6622110020Casey Dahlin      direction_(AidlArgument::IN_DIR),
62fd6fb483fbe3b48948ade670ee838c6622110020Casey Dahlin      direction_specified_(false),
63308f9d49bb797858296193578b261af01d808f53Casey Dahlin      name_(name),
64308f9d49bb797858296193578b261af01d808f53Casey Dahlin      line_(line) {}
65c378c9946ac42e225be4fe37d3b97e1b88a97304Casey Dahlin
66c378c9946ac42e225be4fe37d3b97e1b88a97304Casey Dahlinstring AidlArgument::ToString() const {
67c378c9946ac42e225be4fe37d3b97e1b88a97304Casey Dahlin  string ret;
68c378c9946ac42e225be4fe37d3b97e1b88a97304Casey Dahlin
69c378c9946ac42e225be4fe37d3b97e1b88a97304Casey Dahlin  if (direction_specified_) {
70c378c9946ac42e225be4fe37d3b97e1b88a97304Casey Dahlin    switch(direction_) {
71c378c9946ac42e225be4fe37d3b97e1b88a97304Casey Dahlin    case AidlArgument::IN_DIR:
72c378c9946ac42e225be4fe37d3b97e1b88a97304Casey Dahlin      ret += "in ";
73c378c9946ac42e225be4fe37d3b97e1b88a97304Casey Dahlin      break;
74c378c9946ac42e225be4fe37d3b97e1b88a97304Casey Dahlin    case AidlArgument::OUT_DIR:
75c378c9946ac42e225be4fe37d3b97e1b88a97304Casey Dahlin      ret += "out ";
76c378c9946ac42e225be4fe37d3b97e1b88a97304Casey Dahlin      break;
77c378c9946ac42e225be4fe37d3b97e1b88a97304Casey Dahlin    case AidlArgument::INOUT_DIR:
78c378c9946ac42e225be4fe37d3b97e1b88a97304Casey Dahlin      ret += "inout ";
79c378c9946ac42e225be4fe37d3b97e1b88a97304Casey Dahlin      break;
80c378c9946ac42e225be4fe37d3b97e1b88a97304Casey Dahlin    }
81c378c9946ac42e225be4fe37d3b97e1b88a97304Casey Dahlin  }
82c378c9946ac42e225be4fe37d3b97e1b88a97304Casey Dahlin
8370078e6d2b1afd3d1a5f4370fd4e116e6d0510e1Casey Dahlin  ret += type_->ToString();
84c378c9946ac42e225be4fe37d3b97e1b88a97304Casey Dahlin  ret += " ";
85d127b50f07eed0cf78dfc956697031edea41043cCasey Dahlin  ret += name_;
86c378c9946ac42e225be4fe37d3b97e1b88a97304Casey Dahlin
87c378c9946ac42e225be4fe37d3b97e1b88a97304Casey Dahlin  return ret;
88c378c9946ac42e225be4fe37d3b97e1b88a97304Casey Dahlin}
89bc7a50a9bb4b97affc05f872d0cce02e54861e23Casey Dahlin
90d40e2fed2c19850d53f1620322ac5cbca2c0e245Casey DahlinAidlConstant::AidlConstant(std::string name, int32_t value)
91d40e2fed2c19850d53f1620322ac5cbca2c0e245Casey Dahlin    : name_(name),
92d40e2fed2c19850d53f1620322ac5cbca2c0e245Casey Dahlin      value_(value) {}
93d40e2fed2c19850d53f1620322ac5cbca2c0e245Casey Dahlin
94f4a9311fa018c78a7b30a73bd8ebbaa33c701ae4Casey DahlinAidlMethod::AidlMethod(bool oneway, AidlType* type, std::string name,
95f4a9311fa018c78a7b30a73bd8ebbaa33c701ae4Casey Dahlin                       std::vector<std::unique_ptr<AidlArgument>>* args,
96fb7da2e62fe66b0a57ffbb0304f5884024a68f1cCasey Dahlin                       unsigned line, const std::string& comments, int id)
97f4a9311fa018c78a7b30a73bd8ebbaa33c701ae4Casey Dahlin    : oneway_(oneway),
98f4a9311fa018c78a7b30a73bd8ebbaa33c701ae4Casey Dahlin      comments_(comments),
99f4a9311fa018c78a7b30a73bd8ebbaa33c701ae4Casey Dahlin      type_(type),
100f4a9311fa018c78a7b30a73bd8ebbaa33c701ae4Casey Dahlin      name_(name),
101f4a9311fa018c78a7b30a73bd8ebbaa33c701ae4Casey Dahlin      line_(line),
102f4a9311fa018c78a7b30a73bd8ebbaa33c701ae4Casey Dahlin      arguments_(std::move(*args)),
103f4a9311fa018c78a7b30a73bd8ebbaa33c701ae4Casey Dahlin      id_(id) {
104f4a9311fa018c78a7b30a73bd8ebbaa33c701ae4Casey Dahlin  has_id_ = true;
105f4a9311fa018c78a7b30a73bd8ebbaa33c701ae4Casey Dahlin  delete args;
106ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley  for (const unique_ptr<AidlArgument>& a : arguments_) {
107ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley    if (a->IsIn()) { in_arguments_.push_back(a.get()); }
108ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley    if (a->IsOut()) { out_arguments_.push_back(a.get()); }
109ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley  }
110f4a9311fa018c78a7b30a73bd8ebbaa33c701ae4Casey Dahlin}
111f4a9311fa018c78a7b30a73bd8ebbaa33c701ae4Casey Dahlin
112f4a9311fa018c78a7b30a73bd8ebbaa33c701ae4Casey DahlinAidlMethod::AidlMethod(bool oneway, AidlType* type, std::string name,
113f4a9311fa018c78a7b30a73bd8ebbaa33c701ae4Casey Dahlin                       std::vector<std::unique_ptr<AidlArgument>>* args,
114fb7da2e62fe66b0a57ffbb0304f5884024a68f1cCasey Dahlin                       unsigned line, const std::string& comments)
115f4a9311fa018c78a7b30a73bd8ebbaa33c701ae4Casey Dahlin    : AidlMethod(oneway, type, name, args, line, comments, 0) {
116f4a9311fa018c78a7b30a73bd8ebbaa33c701ae4Casey Dahlin  has_id_ = false;
117f4a9311fa018c78a7b30a73bd8ebbaa33c701ae4Casey Dahlin}
118f2d23f7f05252fa1a06a8f95bd9475fa9d414c0cCasey Dahlin
1194a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher WileyParser::Parser(const IoDelegate& io_delegate)
1204a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wiley    : io_delegate_(io_delegate) {
1214a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wiley  yylex_init(&scanner_);
122dd69181114098550f84186442ef453754570075dCasey Dahlin}
123dd69181114098550f84186442ef453754570075dCasey Dahlin
1242b2879b4cd04fe21853e8b18a6403c35778fb17dCasey DahlinAidlParcelable::AidlParcelable(AidlQualifiedName* name, unsigned line,
1258aa4d9f32dcfb37011d41417814c01bd2d7a473bChristopher Wiley                               const std::vector<std::string>& package,
1268aa4d9f32dcfb37011d41417814c01bd2d7a473bChristopher Wiley                               const std::string& cpp_header)
12759401da7787cbc224785c0a03c30f6392445c1ecCasey Dahlin    : name_(name),
12859401da7787cbc224785c0a03c30f6392445c1ecCasey Dahlin      line_(line),
1298aa4d9f32dcfb37011d41417814c01bd2d7a473bChristopher Wiley      package_(package),
1308aa4d9f32dcfb37011d41417814c01bd2d7a473bChristopher Wiley      cpp_header_(cpp_header) {
1318aa4d9f32dcfb37011d41417814c01bd2d7a473bChristopher Wiley  // Strip off quotation marks if we actually have a cpp header.
1328aa4d9f32dcfb37011d41417814c01bd2d7a473bChristopher Wiley  if (cpp_header_.length() >= 2) {
1338aa4d9f32dcfb37011d41417814c01bd2d7a473bChristopher Wiley    cpp_header_ = cpp_header_.substr(1, cpp_header_.length() - 2);
1348aa4d9f32dcfb37011d41417814c01bd2d7a473bChristopher Wiley  }
13559401da7787cbc224785c0a03c30f6392445c1ecCasey Dahlin}
13659401da7787cbc224785c0a03c30f6392445c1ecCasey Dahlin
137d76067c52b6bc0587aa26ecae34a49e6cbdae404Christopher Wileystd::string AidlParcelable::GetPackage() const {
138d76067c52b6bc0587aa26ecae34a49e6cbdae404Christopher Wiley  return Join(package_, '.');
139d76067c52b6bc0587aa26ecae34a49e6cbdae404Christopher Wiley}
140d76067c52b6bc0587aa26ecae34a49e6cbdae404Christopher Wiley
141c1f39b4ea30e7313eeb7f3d3fd5ec66ba00f2bb5Casey Dahlinstd::string AidlParcelable::GetCanonicalName() const {
142c1f39b4ea30e7313eeb7f3d3fd5ec66ba00f2bb5Casey Dahlin  if (package_.empty()) {
143c1f39b4ea30e7313eeb7f3d3fd5ec66ba00f2bb5Casey Dahlin    return GetName();
144c1f39b4ea30e7313eeb7f3d3fd5ec66ba00f2bb5Casey Dahlin  }
145c1f39b4ea30e7313eeb7f3d3fd5ec66ba00f2bb5Casey Dahlin  return GetPackage() + "." + GetName();
146c1f39b4ea30e7313eeb7f3d3fd5ec66ba00f2bb5Casey Dahlin}
147c1f39b4ea30e7313eeb7f3d3fd5ec66ba00f2bb5Casey Dahlin
148fb7da2e62fe66b0a57ffbb0304f5884024a68f1cCasey DahlinAidlInterface::AidlInterface(const std::string& name, unsigned line,
149fb7da2e62fe66b0a57ffbb0304f5884024a68f1cCasey Dahlin                             const std::string& comments, bool oneway,
150d40e2fed2c19850d53f1620322ac5cbca2c0e245Casey Dahlin                             std::vector<std::unique_ptr<AidlMember>>* members,
151d76067c52b6bc0587aa26ecae34a49e6cbdae404Christopher Wiley                             const std::vector<std::string>& package)
152fb7da2e62fe66b0a57ffbb0304f5884024a68f1cCasey Dahlin    : name_(name),
153fb7da2e62fe66b0a57ffbb0304f5884024a68f1cCasey Dahlin      comments_(comments),
154fb7da2e62fe66b0a57ffbb0304f5884024a68f1cCasey Dahlin      line_(line),
155fb7da2e62fe66b0a57ffbb0304f5884024a68f1cCasey Dahlin      oneway_(oneway),
156fb7da2e62fe66b0a57ffbb0304f5884024a68f1cCasey Dahlin      package_(package) {
157d40e2fed2c19850d53f1620322ac5cbca2c0e245Casey Dahlin  for (auto& member : *members) {
158d40e2fed2c19850d53f1620322ac5cbca2c0e245Casey Dahlin    AidlMember* local = member.release();
159d40e2fed2c19850d53f1620322ac5cbca2c0e245Casey Dahlin    AidlMethod* method = local->AsMethod();
160d40e2fed2c19850d53f1620322ac5cbca2c0e245Casey Dahlin    AidlConstant* constant = local->AsConstant();
161d40e2fed2c19850d53f1620322ac5cbca2c0e245Casey Dahlin
162d40e2fed2c19850d53f1620322ac5cbca2c0e245Casey Dahlin    if (method) {
163d40e2fed2c19850d53f1620322ac5cbca2c0e245Casey Dahlin      methods_.emplace_back(method);
164d40e2fed2c19850d53f1620322ac5cbca2c0e245Casey Dahlin    } else if (constant) {
165d40e2fed2c19850d53f1620322ac5cbca2c0e245Casey Dahlin      constants_.emplace_back(constant);
166d40e2fed2c19850d53f1620322ac5cbca2c0e245Casey Dahlin    } else {
167d40e2fed2c19850d53f1620322ac5cbca2c0e245Casey Dahlin      LOG(FATAL) << "Member is neither method nor constant!";
168d40e2fed2c19850d53f1620322ac5cbca2c0e245Casey Dahlin    }
169d40e2fed2c19850d53f1620322ac5cbca2c0e245Casey Dahlin  }
170d40e2fed2c19850d53f1620322ac5cbca2c0e245Casey Dahlin
171d40e2fed2c19850d53f1620322ac5cbca2c0e245Casey Dahlin  delete members;
172fb7da2e62fe66b0a57ffbb0304f5884024a68f1cCasey Dahlin}
173fb7da2e62fe66b0a57ffbb0304f5884024a68f1cCasey Dahlin
174d76067c52b6bc0587aa26ecae34a49e6cbdae404Christopher Wileystd::string AidlInterface::GetPackage() const {
175d76067c52b6bc0587aa26ecae34a49e6cbdae404Christopher Wiley  return Join(package_, '.');
176d76067c52b6bc0587aa26ecae34a49e6cbdae404Christopher Wiley}
177d76067c52b6bc0587aa26ecae34a49e6cbdae404Christopher Wiley
178d76067c52b6bc0587aa26ecae34a49e6cbdae404Christopher Wileystd::string AidlInterface::GetCanonicalName() const {
179d76067c52b6bc0587aa26ecae34a49e6cbdae404Christopher Wiley  if (package_.empty()) {
180d76067c52b6bc0587aa26ecae34a49e6cbdae404Christopher Wiley    return GetName();
181d76067c52b6bc0587aa26ecae34a49e6cbdae404Christopher Wiley  }
182d76067c52b6bc0587aa26ecae34a49e6cbdae404Christopher Wiley  return GetPackage() + "." + GetName();
183d76067c52b6bc0587aa26ecae34a49e6cbdae404Christopher Wiley}
184d76067c52b6bc0587aa26ecae34a49e6cbdae404Christopher Wiley
185c1f39b4ea30e7313eeb7f3d3fd5ec66ba00f2bb5Casey DahlinAidlDocument::AidlDocument(AidlInterface* interface)
186c1f39b4ea30e7313eeb7f3d3fd5ec66ba00f2bb5Casey Dahlin    : interface_(interface) {}
187c1f39b4ea30e7313eeb7f3d3fd5ec66ba00f2bb5Casey Dahlin
1882b2879b4cd04fe21853e8b18a6403c35778fb17dCasey DahlinAidlQualifiedName::AidlQualifiedName(std::string term,
1892b2879b4cd04fe21853e8b18a6403c35778fb17dCasey Dahlin                                     std::string comments)
1902b2879b4cd04fe21853e8b18a6403c35778fb17dCasey Dahlin    : terms_({term}),
1912b2879b4cd04fe21853e8b18a6403c35778fb17dCasey Dahlin      comments_(comments) {
1928aa4d9f32dcfb37011d41417814c01bd2d7a473bChristopher Wiley  if (term.find('.') != string::npos) {
1938aa4d9f32dcfb37011d41417814c01bd2d7a473bChristopher Wiley    terms_ = Split(term, ".");
1948aa4d9f32dcfb37011d41417814c01bd2d7a473bChristopher Wiley    for (const auto& term: terms_) {
1958aa4d9f32dcfb37011d41417814c01bd2d7a473bChristopher Wiley      if (term.empty()) {
1968aa4d9f32dcfb37011d41417814c01bd2d7a473bChristopher Wiley        LOG(FATAL) << "Malformed qualified identifier: '" << term << "'";
1978aa4d9f32dcfb37011d41417814c01bd2d7a473bChristopher Wiley      }
1988aa4d9f32dcfb37011d41417814c01bd2d7a473bChristopher Wiley    }
1998aa4d9f32dcfb37011d41417814c01bd2d7a473bChristopher Wiley  }
2002b2879b4cd04fe21853e8b18a6403c35778fb17dCasey Dahlin}
2012b2879b4cd04fe21853e8b18a6403c35778fb17dCasey Dahlin
2022b2879b4cd04fe21853e8b18a6403c35778fb17dCasey Dahlinvoid AidlQualifiedName::AddTerm(std::string term) {
2032b2879b4cd04fe21853e8b18a6403c35778fb17dCasey Dahlin  terms_.push_back(term);
2042b2879b4cd04fe21853e8b18a6403c35778fb17dCasey Dahlin}
2052b2879b4cd04fe21853e8b18a6403c35778fb17dCasey Dahlin
2060edf34239909bbc16e884ea2517e5f3398185d0fCasey DahlinAidlImport::AidlImport(const std::string& from,
2070edf34239909bbc16e884ea2517e5f3398185d0fCasey Dahlin                       const std::string& needed_class, unsigned line)
2080edf34239909bbc16e884ea2517e5f3398185d0fCasey Dahlin    : from_(from),
2090edf34239909bbc16e884ea2517e5f3398185d0fCasey Dahlin      needed_class_(needed_class),
2100edf34239909bbc16e884ea2517e5f3398185d0fCasey Dahlin      line_(line) {}
2110edf34239909bbc16e884ea2517e5f3398185d0fCasey Dahlin
2124a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher WileyParser::~Parser() {
2134a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wiley  if (raw_buffer_) {
2144a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wiley    yy_delete_buffer(buffer_, scanner_);
2154a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wiley    raw_buffer_.reset();
2164a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wiley  }
2174a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wiley  yylex_destroy(scanner_);
2184a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wiley}
219dd69181114098550f84186442ef453754570075dCasey Dahlin
2204a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wileybool Parser::ParseFile(const string& filename) {
2214a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wiley  // Make sure we can read the file first, before trashing previous state.
2224a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wiley  unique_ptr<string> new_buffer = io_delegate_.GetFileContents(filename);
2234a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wiley  if (!new_buffer) {
2244a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wiley    LOG(ERROR) << "Error while opening file for parsing: '" << filename << "'";
225dd69181114098550f84186442ef453754570075dCasey Dahlin    return false;
2264a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wiley  }
227dd69181114098550f84186442ef453754570075dCasey Dahlin
2284a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wiley  // Throw away old parsing state if we have any.
2294a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wiley  if (raw_buffer_) {
23089d4484c67b1866eefb63524f20b6009a96aac49Casey Dahlin    yy_delete_buffer(buffer_, scanner_);
2314a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wiley    raw_buffer_.reset();
2324a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wiley  }
23389d4484c67b1866eefb63524f20b6009a96aac49Casey Dahlin
2344a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wiley  raw_buffer_ = std::move(new_buffer);
2354a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wiley  // We're going to scan this buffer in place, and yacc demands we put two
2364a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wiley  // nulls at the end.
2374a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wiley  raw_buffer_->append(2u, '\0');
2384a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wiley  filename_ = filename;
239d76067c52b6bc0587aa26ecae34a49e6cbdae404Christopher Wiley  package_.reset();
2404a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wiley  error_ = 0;
241c1f39b4ea30e7313eeb7f3d3fd5ec66ba00f2bb5Casey Dahlin  document_.reset();
2424a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wiley
2434a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wiley  buffer_ = yy_scan_buffer(&(*raw_buffer_)[0], raw_buffer_->length(), scanner_);
24489d4484c67b1866eefb63524f20b6009a96aac49Casey Dahlin
245c1f39b4ea30e7313eeb7f3d3fd5ec66ba00f2bb5Casey Dahlin  if (yy::parser(this).parse() != 0 || error_ != 0) {
246c1f39b4ea30e7313eeb7f3d3fd5ec66ba00f2bb5Casey Dahlin    return false;}
247c1f39b4ea30e7313eeb7f3d3fd5ec66ba00f2bb5Casey Dahlin
248c1f39b4ea30e7313eeb7f3d3fd5ec66ba00f2bb5Casey Dahlin  if (document_.get() != nullptr)
249c1f39b4ea30e7313eeb7f3d3fd5ec66ba00f2bb5Casey Dahlin    return true;
250dd69181114098550f84186442ef453754570075dCasey Dahlin
251c1f39b4ea30e7313eeb7f3d3fd5ec66ba00f2bb5Casey Dahlin  LOG(ERROR) << "Parser succeeded but yielded no document!";
252c1f39b4ea30e7313eeb7f3d3fd5ec66ba00f2bb5Casey Dahlin  return false;
253dd69181114098550f84186442ef453754570075dCasey Dahlin}
254e25074935064cf06d30568ca61f2aaa0f75f0b9aCasey Dahlin
25598a544b567e20f6c8492e1d4eb8869e759ae74d9Casey Dahlinvoid Parser::ReportError(const string& err, unsigned line) {
25698a544b567e20f6c8492e1d4eb8869e759ae74d9Casey Dahlin  cerr << filename_ << ":" << line << ": " << err << endl;
2574a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wiley  error_ = 1;
2584a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wiley}
2594a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wiley
26090be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wileystd::vector<std::string> Parser::Package() const {
26190be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley  if (!package_) {
26290be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley    return {};
26390be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley  }
26490be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley  return package_->GetTerms();
26590be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley}
26690be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley
2672b2879b4cd04fe21853e8b18a6403c35778fb17dCasey Dahlinvoid Parser::AddImport(AidlQualifiedName* name, unsigned line) {
2682b2879b4cd04fe21853e8b18a6403c35778fb17dCasey Dahlin  imports_.emplace_back(new AidlImport(this->FileName(),
2692b2879b4cd04fe21853e8b18a6403c35778fb17dCasey Dahlin                                       name->GetDotName(), line));
2702b2879b4cd04fe21853e8b18a6403c35778fb17dCasey Dahlin  delete name;
271e25074935064cf06d30568ca61f2aaa0f75f0b9aCasey Dahlin}
272