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