blob: 0eaf0c9c089c3ac74df1429103bcd0759ae30f4e [file] [log] [blame]
Adam Lesinskiffa16862014-01-23 18:17:42 -08001#include "aidl_language.h"
Christopher Wileyf690be52015-09-14 15:19:10 -07002
3#include <iostream>
Adam Lesinskiffa16862014-01-23 18:17:42 -08004#include <stdio.h>
Adam Lesinskiffa16862014-01-23 18:17:42 -08005#include <stdlib.h>
Christopher Wiley4a2884b2015-10-07 11:27:45 -07006#include <string.h>
Casey Dahlindd691812015-09-09 17:59:06 -07007#include <string>
Christopher Wileyf690be52015-09-14 15:19:10 -07008
9#include "aidl_language_y.hpp"
Christopher Wiley4a2884b2015-10-07 11:27:45 -070010#include "logging.h"
Christopher Wileyf690be52015-09-14 15:19:10 -070011#include "parse_helpers.h"
Adam Lesinskiffa16862014-01-23 18:17:42 -080012
Casey Dahlin07b9dde2015-09-10 19:13:49 -070013#ifdef _WIN32
14int isatty(int fd)
15{
16 return (fd == 0);
17}
18#endif
19
Christopher Wiley4a2884b2015-10-07 11:27:45 -070020using android::aidl::IoDelegate;
21using android::aidl::cpp_strdup;
Casey Dahlindd691812015-09-09 17:59:06 -070022using std::cerr;
23using std::endl;
Christopher Wiley4a2884b2015-10-07 11:27:45 -070024using std::string;
25using std::unique_ptr;
Adam Lesinskiffa16862014-01-23 18:17:42 -080026
Casey Dahlindd691812015-09-09 17:59:06 -070027void yylex_init(void **);
28void yylex_destroy(void *);
29void yyset_in(FILE *f, void *);
Casey Dahline2507492015-09-14 17:11:20 -070030int yyparse(Parser*);
Christopher Wiley4a2884b2015-10-07 11:27:45 -070031YY_BUFFER_STATE yy_scan_buffer(char *, size_t, void *);
Casey Dahlin89d44842015-09-24 18:45:54 -070032void yy_delete_buffer(YY_BUFFER_STATE, void *);
Casey Dahlindd691812015-09-09 17:59:06 -070033
Casey Dahlinf2d23f72015-10-02 16:19:19 -070034AidlType::AidlType(const std::string& name, unsigned line,
Casey Dahlinf7a421c2015-10-05 17:24:28 -070035 const std::string& comments, bool is_array)
Casey Dahlinf2d23f72015-10-02 16:19:19 -070036 : name_(name),
37 line_(line),
Casey Dahlinf7a421c2015-10-05 17:24:28 -070038 is_array_(is_array),
Casey Dahlinf2d23f72015-10-02 16:19:19 -070039 comments_(comments) {}
40
Christopher Wiley4a2884b2015-10-07 11:27:45 -070041string AidlType::ToString() const { return name_ + (is_array_ ? "[]" : "");
Casey Dahlin70078e62015-09-30 17:01:30 -070042}
43
Casey Dahlin0ee37582015-09-30 16:31:55 -070044AidlArgument::AidlArgument(AidlArgument::Direction direction, AidlType* type,
Casey Dahlin308f9d42015-10-05 18:48:42 -070045 std::string name, unsigned line)
Casey Dahlin0ee37582015-09-30 16:31:55 -070046 : type_(type),
Casey Dahlinfd6fb482015-09-30 14:48:18 -070047 direction_(direction),
48 direction_specified_(true),
Casey Dahlin308f9d42015-10-05 18:48:42 -070049 name_(name),
50 line_(line) {}
Casey Dahlinc378c992015-09-29 16:50:40 -070051
Casey Dahlin308f9d42015-10-05 18:48:42 -070052AidlArgument::AidlArgument(AidlType* type, std::string name, unsigned line)
Casey Dahlin0ee37582015-09-30 16:31:55 -070053 : type_(type),
Casey Dahlinfd6fb482015-09-30 14:48:18 -070054 direction_(AidlArgument::IN_DIR),
55 direction_specified_(false),
Casey Dahlin308f9d42015-10-05 18:48:42 -070056 name_(name),
57 line_(line) {}
Casey Dahlinc378c992015-09-29 16:50:40 -070058
59string AidlArgument::ToString() const {
60 string ret;
61
62 if (direction_specified_) {
63 switch(direction_) {
64 case AidlArgument::IN_DIR:
65 ret += "in ";
66 break;
67 case AidlArgument::OUT_DIR:
68 ret += "out ";
69 break;
70 case AidlArgument::INOUT_DIR:
71 ret += "inout ";
72 break;
73 }
74 }
75
Casey Dahlin70078e62015-09-30 17:01:30 -070076 ret += type_->ToString();
Casey Dahlinc378c992015-09-29 16:50:40 -070077 ret += " ";
Casey Dahlind127b502015-09-30 12:51:08 -070078 ret += name_;
Casey Dahlinc378c992015-09-29 16:50:40 -070079
80 return ret;
81}
Casey Dahlinbc7a50a2015-09-28 19:20:50 -070082
Casey Dahlinf4a93112015-10-05 16:58:09 -070083AidlMethod::AidlMethod(bool oneway, AidlType* type, std::string name,
84 std::vector<std::unique_ptr<AidlArgument>>* args,
Casey Dahlinfb7da2e2015-10-08 17:26:09 -070085 unsigned line, const std::string& comments, int id)
Casey Dahlinf4a93112015-10-05 16:58:09 -070086 : oneway_(oneway),
87 comments_(comments),
88 type_(type),
89 name_(name),
90 line_(line),
91 arguments_(std::move(*args)),
92 id_(id) {
93 has_id_ = true;
94 delete args;
Christopher Wileyad339272015-10-05 19:11:58 -070095 for (const unique_ptr<AidlArgument>& a : arguments_) {
96 if (a->IsIn()) { in_arguments_.push_back(a.get()); }
97 if (a->IsOut()) { out_arguments_.push_back(a.get()); }
98 }
Casey Dahlinf4a93112015-10-05 16:58:09 -070099}
100
101AidlMethod::AidlMethod(bool oneway, AidlType* type, std::string name,
102 std::vector<std::unique_ptr<AidlArgument>>* args,
Casey Dahlinfb7da2e2015-10-08 17:26:09 -0700103 unsigned line, const std::string& comments)
Casey Dahlinf4a93112015-10-05 16:58:09 -0700104 : AidlMethod(oneway, type, name, args, line, comments, 0) {
105 has_id_ = false;
106}
Casey Dahlinf2d23f72015-10-02 16:19:19 -0700107
Christopher Wiley4a2884b2015-10-07 11:27:45 -0700108Parser::Parser(const IoDelegate& io_delegate)
109 : io_delegate_(io_delegate) {
110 yylex_init(&scanner_);
111}
112
Casey Dahlin2b2879b2015-10-13 16:59:44 -0700113AidlParcelable::AidlParcelable(AidlQualifiedName* name, unsigned line,
114 const std::string& package)
115 : AidlParcelable(name->GetDotName(), line, package) {
116 delete name;
117}
118
Casey Dahlin59401da2015-10-09 18:16:45 -0700119AidlParcelable::AidlParcelable(const std::string& name, unsigned line,
120 const std::string& package)
121 : name_(name),
122 line_(line),
123 package_(package) {
124 item_type = USER_DATA_TYPE;
125}
126
Casey Dahlinfb7da2e2015-10-08 17:26:09 -0700127AidlInterface::AidlInterface(const std::string& name, unsigned line,
128 const std::string& comments, bool oneway,
129 std::vector<std::unique_ptr<AidlMethod>>* methods,
130 const std::string& package)
131 : name_(name),
132 comments_(comments),
133 line_(line),
134 oneway_(oneway),
135 methods_(std::move(*methods)),
136 package_(package) {
137 item_type = INTERFACE_TYPE_BINDER;
138 delete methods;
139}
140
Casey Dahlin2b2879b2015-10-13 16:59:44 -0700141AidlQualifiedName::AidlQualifiedName(std::string term,
142 std::string comments)
143 : terms_({term}),
144 comments_(comments) {
145}
146
147void AidlQualifiedName::AddTerm(std::string term) {
148 terms_.push_back(term);
149}
150
Casey Dahlin0edf3422015-10-07 12:34:59 -0700151AidlImport::AidlImport(const std::string& from,
152 const std::string& needed_class, unsigned line)
153 : from_(from),
154 needed_class_(needed_class),
155 line_(line) {}
156
Christopher Wiley4a2884b2015-10-07 11:27:45 -0700157Parser::~Parser() {
158 if (raw_buffer_) {
159 yy_delete_buffer(buffer_, scanner_);
160 raw_buffer_.reset();
161 }
162 yylex_destroy(scanner_);
163}
164
165bool Parser::ParseFile(const string& filename) {
166 // Make sure we can read the file first, before trashing previous state.
167 unique_ptr<string> new_buffer = io_delegate_.GetFileContents(filename);
168 if (!new_buffer) {
169 LOG(ERROR) << "Error while opening file for parsing: '" << filename << "'";
170 return false;
171 }
172
173 // Throw away old parsing state if we have any.
174 if (raw_buffer_) {
175 yy_delete_buffer(buffer_, scanner_);
176 raw_buffer_.reset();
177 }
178
179 raw_buffer_ = std::move(new_buffer);
180 // We're going to scan this buffer in place, and yacc demands we put two
181 // nulls at the end.
182 raw_buffer_->append(2u, '\0');
183 filename_ = filename;
184 package_.clear();
185 error_ = 0;
186 document_ = nullptr;
Christopher Wiley4a2884b2015-10-07 11:27:45 -0700187
188 buffer_ = yy_scan_buffer(&(*raw_buffer_)[0], raw_buffer_->length(), scanner_);
189
190 int ret = yy::parser(this).parse();
191
192 return ret == 0 && error_ == 0;
193}
194
Casey Dahline2507492015-09-14 17:11:20 -0700195void Parser::ReportError(const string& err) {
Casey Dahlindd691812015-09-09 17:59:06 -0700196 /* FIXME: We're printing out the line number as -1. We used to use yylineno
197 * (which was NEVER correct even before reentrant parsing). Now we'll need
198 * another way.
199 */
200 cerr << filename_ << ":" << -1 << ": " << err << endl;
201 error_ = 1;
202}
203
Casey Dahlin2b2879b2015-10-13 16:59:44 -0700204void Parser::AddImport(AidlQualifiedName* name, unsigned line) {
205 imports_.emplace_back(new AidlImport(this->FileName(),
206 name->GetDotName(), line));
207 delete name;
Casey Dahline2507492015-09-14 17:11:20 -0700208}