@@ -31,6 +31,7 @@ using namespace langutil;
31
31
using namespace solidity ;
32
32
using namespace dev ::solidity::test;
33
33
using namespace std ;
34
+ using namespace solt ;
34
35
35
36
namespace
36
37
{
@@ -47,14 +48,14 @@ namespace
47
48
vector<dev::solidity::test::FunctionCall> TestFileParser::parseFunctionCalls ()
48
49
{
49
50
vector<FunctionCall> calls;
50
- if (!accept (SoltToken ::EOS))
51
+ if (!accept (Token ::EOS))
51
52
{
52
- assert (m_scanner.currentToken () == SoltToken ::Unknown);
53
+ assert (m_scanner.currentToken () == Token ::Unknown);
53
54
m_scanner.scanNextToken ();
54
55
55
- while (!accept (SoltToken ::EOS))
56
+ while (!accept (Token ::EOS))
56
57
{
57
- if (!accept (SoltToken ::Whitespace))
58
+ if (!accept (Token ::Whitespace))
58
59
{
59
60
FunctionCall call;
60
61
@@ -64,63 +65,47 @@ vector<dev::solidity::test::FunctionCall> TestFileParser::parseFunctionCalls()
64
65
// / token lookahead that checks parseParameter
65
66
// / if the next token is an identifier.
66
67
if (calls.empty ())
67
- expect (SoltToken ::Newline);
68
+ expect (Token ::Newline);
68
69
else
69
- accept (SoltToken ::Newline, true );
70
+ accept (Token ::Newline, true );
70
71
71
72
call.signature = parseFunctionSignature ();
72
- if (accept (SoltToken ::Comma, true ))
73
+ if (accept (Token ::Comma, true ))
73
74
call.value = parseFunctionCallValue ();
74
- if (accept (SoltToken ::Colon, true ))
75
+ if (accept (Token ::Colon, true ))
75
76
call.arguments = parseFunctionCallArguments ();
76
77
77
- if (accept (SoltToken ::Newline, true ))
78
+ if (accept (Token ::Newline, true ))
78
79
call.displayMode = FunctionCall::DisplayMode::MultiLine;
79
80
80
81
call.arguments .comment = parseComment ();
81
82
82
- if (accept (SoltToken ::Newline, true ))
83
+ if (accept (Token ::Newline, true ))
83
84
call.displayMode = FunctionCall::DisplayMode::MultiLine;
84
85
85
- expect (SoltToken ::Arrow);
86
+ expect (Token ::Arrow);
86
87
call.expectations = parseFunctionCallExpectations ();
87
88
call.expectations .comment = parseComment ();
88
89
89
90
calls.emplace_back (std::move (call));
90
91
}
91
- else
92
- m_scanner.scanNextToken ();
93
92
}
94
93
}
95
94
return calls;
96
95
}
97
96
98
- string TestFileParser::formatToken (SoltToken _token)
99
- {
100
- switch (_token)
101
- {
102
- #define T (name, string, precedence ) case SoltToken::name: return string;
103
- SOLT_TOKEN_LIST (T, T)
104
- #undef T
105
- default : // Token::NUM_TOKENS:
106
- return " " ;
107
- }
108
- }
109
-
110
- bool TestFileParser::accept (SoltToken _token, bool const _expect)
97
+ bool TestFileParser::accept (solt::Token _token, bool const _expect)
111
98
{
112
- if (m_scanner.currentToken () == _token)
113
- {
114
- if (_expect)
115
- expect (_token);
116
- return true ;
117
- }
118
- return false ;
99
+ if (m_scanner.currentToken () != _token)
100
+ return false ;
101
+ if (_expect)
102
+ return expect (_token);
103
+ return true ;
119
104
}
120
105
121
- bool TestFileParser::expect (SoltToken _token, bool const _advance)
106
+ bool TestFileParser::expect (solt::Token _token, bool const _advance)
122
107
{
123
- if (m_scanner.currentToken () != _token)
108
+ if (m_scanner.currentToken () != _token || m_scanner. currentToken () == Token::Invalid )
124
109
throw Error (
125
110
Error::Type::ParserError,
126
111
" Unexpected " + formatToken (m_scanner.currentToken ()) + " : \" " +
@@ -135,35 +120,35 @@ bool TestFileParser::expect(SoltToken _token, bool const _advance)
135
120
string TestFileParser::parseFunctionSignature ()
136
121
{
137
122
string signature = m_scanner.currentLiteral ();
138
- expect (SoltToken ::Identifier);
123
+ expect (Token ::Identifier);
139
124
140
- signature += formatToken (SoltToken ::LParen);
141
- expect (SoltToken ::LParen);
125
+ signature += formatToken (Token ::LParen);
126
+ expect (Token ::LParen);
142
127
143
128
string parameters;
144
- if (!accept (SoltToken ::RParen, false ))
129
+ if (!accept (Token ::RParen, false ))
145
130
parameters = parseIdentifierOrTuple ();
146
131
147
- while (accept (SoltToken ::Comma))
132
+ while (accept (Token ::Comma))
148
133
{
149
- parameters += formatToken (SoltToken ::Comma);
150
- expect (SoltToken ::Comma);
134
+ parameters += formatToken (Token ::Comma);
135
+ expect (Token ::Comma);
151
136
parameters += parseIdentifierOrTuple ();
152
137
}
153
- if (accept (SoltToken ::Arrow, true ))
138
+ if (accept (Token ::Arrow, true ))
154
139
throw Error (Error::Type::ParserError, " Invalid signature detected: " + signature);
155
140
156
141
signature += parameters;
157
142
158
- expect (SoltToken ::RParen);
159
- signature += formatToken (SoltToken ::RParen);
143
+ expect (Token ::RParen);
144
+ signature += formatToken (Token ::RParen);
160
145
return signature;
161
146
}
162
147
163
148
u256 TestFileParser::parseFunctionCallValue ()
164
149
{
165
150
u256 value = convertNumber (parseNumber ());
166
- expect (SoltToken ::Ether);
151
+ expect (Token ::Ether);
167
152
return value;
168
153
}
169
154
@@ -176,7 +161,7 @@ FunctionCallArgs TestFileParser::parseFunctionCallArguments()
176
161
throw Error (Error::Type::ParserError, " No argument provided." );
177
162
arguments.parameters .emplace_back (param);
178
163
179
- while (accept (SoltToken ::Comma, true ))
164
+ while (accept (Token ::Comma, true ))
180
165
arguments.parameters .emplace_back (parseParameter ());
181
166
return arguments;
182
167
}
@@ -193,7 +178,7 @@ FunctionCallExpectations TestFileParser::parseFunctionCallExpectations()
193
178
}
194
179
expectations.result .emplace_back (param);
195
180
196
- while (accept (SoltToken ::Comma, true ))
181
+ while (accept (Token ::Comma, true ))
197
182
expectations.result .emplace_back (parseParameter ());
198
183
199
184
// / We have always one virtual parameter in the parameter list.
@@ -206,7 +191,7 @@ FunctionCallExpectations TestFileParser::parseFunctionCallExpectations()
206
191
Parameter TestFileParser::parseParameter ()
207
192
{
208
193
Parameter parameter;
209
- if (accept (SoltToken ::Newline, true ))
194
+ if (accept (Token ::Newline, true ))
210
195
parameter.format .newline = true ;
211
196
auto literal = parseABITypeLiteral ();
212
197
parameter.rawBytes = literal.first ;
@@ -221,20 +206,20 @@ pair<bytes, ABIType> TestFileParser::parseABITypeLiteral()
221
206
u256 number{0 };
222
207
ABIType abiType{ABIType::None, 0 };
223
208
224
- if (accept (SoltToken ::Sub))
209
+ if (accept (Token ::Sub))
225
210
{
226
211
abiType = ABIType{ABIType::SignedDec, 32 };
227
- expect (SoltToken ::Sub);
212
+ expect (Token ::Sub);
228
213
number = convertNumber (parseNumber ()) * -1 ;
229
214
}
230
215
else
231
216
{
232
- if (accept (SoltToken ::Number))
217
+ if (accept (Token ::Number))
233
218
{
234
219
abiType = ABIType{ABIType::UnsignedDec, 32 };
235
220
number = convertNumber (parseNumber ());
236
221
}
237
- else if (accept (SoltToken ::Failure, true ))
222
+ else if (accept (Token ::Failure, true ))
238
223
{
239
224
abiType = ABIType{ABIType::Failure, 0 };
240
225
return make_pair (bytes{}, abiType);
@@ -252,42 +237,39 @@ string TestFileParser::parseIdentifierOrTuple()
252
237
{
253
238
string identOrTuple;
254
239
255
- if (accept (SoltToken ::Identifier))
240
+ if (accept (Token ::Identifier))
256
241
{
257
242
identOrTuple = m_scanner.currentLiteral ();
258
- expect (SoltToken ::Identifier);
243
+ expect (Token ::Identifier);
259
244
return identOrTuple;
260
245
}
261
- expect (SoltToken ::LParen);
262
- identOrTuple += formatToken (SoltToken ::LParen);
246
+ expect (Token ::LParen);
247
+ identOrTuple += formatToken (Token ::LParen);
263
248
identOrTuple += parseIdentifierOrTuple ();
264
249
265
- if (identOrTuple == " ()" )
266
- throw Error (Error::Type::ParserError, " Empty tuples are not supported." );
267
-
268
- while (accept (SoltToken::Comma))
250
+ while (accept (Token::Comma))
269
251
{
270
- identOrTuple += formatToken (SoltToken ::Comma);
271
- expect (SoltToken ::Comma);
252
+ identOrTuple += formatToken (Token ::Comma);
253
+ expect (Token ::Comma);
272
254
identOrTuple += parseIdentifierOrTuple ();
273
255
}
274
- expect (SoltToken ::RParen);
275
- identOrTuple += formatToken (SoltToken ::RParen);
256
+ expect (Token ::RParen);
257
+ identOrTuple += formatToken (Token ::RParen);
276
258
return identOrTuple;
277
259
}
278
260
279
261
string TestFileParser::parseComment ()
280
262
{
281
263
string comment = m_scanner.currentLiteral ();
282
- if (accept (SoltToken ::Comment, true ))
264
+ if (accept (Token ::Comment, true ))
283
265
return comment;
284
266
return string{};
285
267
}
286
268
287
269
string TestFileParser::parseNumber ()
288
270
{
289
271
string literal = m_scanner.currentLiteral ();
290
- expect (SoltToken ::Number);
272
+ expect (Token ::Number);
291
273
return literal;
292
274
}
293
275
@@ -312,69 +294,72 @@ void TestFileParser::Scanner::readStream(istream& _stream)
312
294
313
295
void TestFileParser::Scanner::scanNextToken ()
314
296
{
315
- auto detectToken = [](std::string const & _literal = " " ) -> TokenDesc {
316
- if (_literal == " ether" ) return TokenDesc{SoltToken::Ether, _literal};
317
- if (_literal == " FAILURE" ) return TokenDesc{SoltToken::Failure, _literal};
318
- return TokenDesc{SoltToken::Identifier, _literal};
297
+ // Make code coverage happy.
298
+ assert (formatToken (Token::NUM_TOKENS) == " " );
299
+
300
+ auto detectKeyword = [](std::string const & _literal = " " ) -> TokenDesc {
301
+ if (_literal == " ether" ) return TokenDesc{Token::Ether, _literal};
302
+ if (_literal == " FAILURE" ) return TokenDesc{Token::Failure, _literal};
303
+ return TokenDesc{Token::Identifier, _literal};
319
304
};
320
305
321
- auto selectToken = [this ](SoltToken _token, std::string const & _literal = " " ) -> TokenDesc {
306
+ auto selectToken = [this ](Token _token, std::string const & _literal = " " ) -> TokenDesc {
322
307
advance ();
323
308
return make_pair (_token, !_literal.empty () ? _literal : formatToken (_token));
324
309
};
325
310
326
- TokenDesc token = make_pair (SoltToken ::Unknown, " " );
311
+ TokenDesc token = make_pair (Token ::Unknown, " " );
327
312
do
328
313
{
329
314
switch (current ())
330
315
{
331
316
case ' /' :
332
317
advance ();
333
318
if (current () == ' /' )
334
- token = selectToken (SoltToken::Newline);
319
+ token = selectToken (Token::Newline);
320
+ else
321
+ token = selectToken (Token::Invalid);
335
322
break ;
336
323
case ' -' :
337
324
if (peek () == ' >' )
338
325
{
339
326
advance ();
340
- token = selectToken (SoltToken ::Arrow);
327
+ token = selectToken (Token ::Arrow);
341
328
}
342
329
else
343
- token = selectToken (SoltToken ::Sub);
330
+ token = selectToken (Token ::Sub);
344
331
break ;
345
332
case ' :' :
346
- token = selectToken (SoltToken ::Colon);
333
+ token = selectToken (Token ::Colon);
347
334
break ;
348
335
case ' #' :
349
- token = selectToken (SoltToken ::Comment, scanComment ());
336
+ token = selectToken (Token ::Comment, scanComment ());
350
337
break ;
351
338
case ' ,' :
352
- token = selectToken (SoltToken ::Comma);
339
+ token = selectToken (Token ::Comma);
353
340
break ;
354
341
case ' (' :
355
- token = selectToken (SoltToken ::LParen);
342
+ token = selectToken (Token ::LParen);
356
343
break ;
357
344
case ' )' :
358
- token = selectToken (SoltToken ::RParen);
345
+ token = selectToken (Token ::RParen);
359
346
break ;
360
347
default :
361
348
if (isIdentifierStart (current ()))
362
349
{
363
- TokenDesc detectedToken = detectToken (scanIdentifierOrKeyword ());
350
+ TokenDesc detectedToken = detectKeyword (scanIdentifierOrKeyword ());
364
351
token = selectToken (detectedToken.first , detectedToken.second );
365
352
}
366
353
else if (isdigit (current ()))
367
- token = selectToken (SoltToken ::Number, scanNumber ());
354
+ token = selectToken (Token ::Number, scanNumber ());
368
355
else if (isspace (current ()))
369
- token = selectToken (SoltToken ::Whitespace);
356
+ token = selectToken (Token ::Whitespace);
370
357
else if (isEndOfLine ())
371
- token = selectToken (SoltToken::EOS);
372
- else
373
- token = selectToken (SoltToken::Invalid);
358
+ token = selectToken (Token::EOS);
374
359
break ;
375
360
}
376
361
}
377
- while (token.first == SoltToken ::Whitespace);
362
+ while (token.first == Token ::Whitespace);
378
363
m_currentToken = token;
379
364
}
380
365
0 commit comments