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