@@ -52,42 +52,6 @@ namespace
52
52
}
53
53
}
54
54
55
- string TestFileParser::formatToken (SoltToken _token)
56
- {
57
- switch (_token)
58
- {
59
- #define T (name, string, precedence ) case SoltToken::name: return string;
60
- SOLT_TOKEN_LIST (T, T)
61
- #undef T
62
- default : // Token::NUM_TOKENS:
63
- return " " ;
64
- }
65
- }
66
-
67
- bool TestFileParser::accept (SoltToken _token, bool const _expect)
68
- {
69
- if (m_scanner.currentToken () == _token)
70
- {
71
- if (_expect)
72
- expect (_token);
73
- return true ;
74
- }
75
- return false ;
76
- }
77
-
78
- bool TestFileParser::expect (SoltToken _token, bool const _advance)
79
- {
80
- if (m_scanner.currentToken () != _token)
81
- throw Error (Error::Type::ParserError,
82
- " Unexpected " + formatToken (m_scanner.currentToken ()) + " : \" " +
83
- m_scanner.currentLiteral () + " \" . " +
84
- " Expected \" " + formatToken (_token) + " \" ."
85
- );
86
- if (_advance)
87
- m_scanner.scanNextToken ();
88
- return true ;
89
- }
90
-
91
55
vector<dev::solidity::test::FunctionCall> TestFileParser::parseFunctionCalls ()
92
56
{
93
57
vector<FunctionCall> calls;
@@ -116,12 +80,19 @@ vector<dev::solidity::test::FunctionCall> TestFileParser::parseFunctionCalls()
116
80
if (accept (SoltToken::Colon, true ))
117
81
call.arguments = parseFunctionCallArguments ();
118
82
83
+ if (accept (SoltToken::Newline, true ))
84
+ call.displayMode = FunctionCall::DisplayMode::MultiLine;
85
+
119
86
string comment = m_scanner.currentLiteral ();
120
87
if (accept (SoltToken::Comment, true ))
121
88
call.arguments .comment = comment;
122
89
123
- // -> 1
124
- expect (SoltToken::Newline);
90
+ // f() -> 1
91
+ // f(uint256): 3
92
+ // -> 2
93
+ if (accept (SoltToken::Newline, true ))
94
+ call.displayMode = FunctionCall::DisplayMode::MultiLine;
95
+
125
96
expect (SoltToken::Arrow);
126
97
127
98
if (accept (SoltToken::Newline, true ))
@@ -143,9 +114,43 @@ vector<dev::solidity::test::FunctionCall> TestFileParser::parseFunctionCalls()
143
114
m_scanner.scanNextToken ();
144
115
}
145
116
}
146
- signature += formatToken (SoltToken::RParen);
147
- expect (SoltToken::RParen);
148
- return signature;
117
+ return calls;
118
+ }
119
+
120
+ string TestFileParser::formatToken (SoltToken _token)
121
+ {
122
+ switch (_token)
123
+ {
124
+ #define T (name, string, precedence ) case SoltToken::name: return string;
125
+ SOLT_TOKEN_LIST (T, T)
126
+ #undef T
127
+ default : // Token::NUM_TOKENS:
128
+ return " " ;
129
+ }
130
+ }
131
+
132
+ bool TestFileParser::accept (SoltToken _token, bool const _expect)
133
+ {
134
+ if (m_scanner.currentToken () == _token)
135
+ {
136
+ if (_expect)
137
+ expect (_token);
138
+ return true ;
139
+ }
140
+ return false ;
141
+ }
142
+
143
+ bool TestFileParser::expect (SoltToken _token, bool const _advance)
144
+ {
145
+ if (m_scanner.currentToken () != _token)
146
+ throw Error (Error::Type::ParserError,
147
+ " Unexpected " + formatToken (m_scanner.currentToken ()) + " : \" " +
148
+ m_scanner.currentLiteral () + " \" . " +
149
+ " Expected \" " + formatToken (_token) + " \" ."
150
+ );
151
+ if (_advance)
152
+ m_scanner.scanNextToken ();
153
+ return true ;
149
154
}
150
155
151
156
string TestFileParser::parseFunctionSignature ()
@@ -175,94 +180,67 @@ string TestFileParser::parseFunctionSignature()
175
180
176
181
u256 TestFileParser::parseFunctionCallValue ()
177
182
{
178
- u256 value;
179
- string literal = m_scanner.currentLiteral ();
180
- expect (SoltToken::Number);
181
- value = convertNumber (literal);
183
+ u256 value = convertNumber (parseNumber ());
182
184
expect (SoltToken::Ether);
183
185
return value;
184
186
}
185
187
186
188
FunctionCallArgs TestFileParser::parseFunctionCallArguments ()
187
189
{
188
190
FunctionCallArgs arguments;
191
+ std::pair<bytes, ABIType> newline{};
189
192
190
- auto formattedBytes = parseNumberLiteral ();
191
- arguments.rawBytes += formattedBytes. first ;
192
- arguments.formats . emplace_back ( std::move (formattedBytes. second ));
193
+ if ( accept (SoltToken::Newline, true ))
194
+ arguments.appendParameter (newline, true ) ;
195
+ arguments.appendParameter ( parseABITypeLiteral ( ));
193
196
while (accept (SoltToken::Comma, true ))
194
197
{
195
- auto formattedBytes = parseNumberLiteral ();
196
- arguments.rawBytes += formattedBytes. first ;
197
- arguments.formats . emplace_back ( std::move (formattedBytes. second ));
198
+ if ( accept (SoltToken::Newline, true ))
199
+ arguments.appendParameter (newline, true ) ;
200
+ arguments.appendParameter ( parseABITypeLiteral ( ));
198
201
}
199
- return expectations ;
202
+ return arguments ;
200
203
}
201
204
202
- pair<bytes, ABIType> TestFileParser::parseABITypeLiteral ()
205
+ FunctionCallExpectations TestFileParser::parseFunctionCallExpectations ()
203
206
{
204
207
FunctionCallExpectations expectations;
205
- string token = m_scanner. currentLiteral () ;
208
+ std::pair<bytes, ABIType> newline{} ;
206
209
207
210
if (accept (SoltToken::Failure, true ))
208
211
expectations.status = false ;
209
212
else
210
213
{
211
- auto formattedBytes = parseNumberLiteral ();
212
- expectations.rawBytes += formattedBytes.first ;
213
- expectations.formats .emplace_back (std::move (formattedBytes.second ));
214
-
214
+ if (accept (SoltToken::Newline, true ))
215
+ expectations.appendExpected (newline, true );
216
+ expectations.appendExpected (parseABITypeLiteral ());
215
217
while (accept (SoltToken::Comma, true ))
216
218
{
217
- auto formattedBytes = parseNumberLiteral ();
218
- expectations.rawBytes += formattedBytes. first ;
219
- expectations.formats . emplace_back ( std::move (formattedBytes. second ));
219
+ if ( accept (SoltToken::Newline, true ))
220
+ expectations.appendExpected (newline, true ) ;
221
+ expectations.appendExpected ( parseABITypeLiteral ( ));
220
222
}
221
- else
222
- if (accept (SoltToken::Number))
223
- {
224
- abiType = ABIType{ABIType::UnsignedDec, 32 };
225
- number = convertNumber (parseNumber ());
226
- }
227
- return make_pair (toBigEndian (number), abiType);
228
223
}
229
224
return expectations;
230
225
}
231
226
232
- u256 TestFileParser::convertNumber (string const & _literal)
233
- {
234
- try {
235
- return u256{_literal};
236
- }
237
- catch (std::exception const &)
238
- {
239
- throw Error (Error::Type::ParserError, " Number encoding invalid." );
240
- }
241
- }
242
-
243
- pair<bytes, ABIType> TestFileParser::parseNumberLiteral ()
227
+ pair<bytes, ABIType> TestFileParser::parseABITypeLiteral ()
244
228
{
245
- u256 number;
246
- ABIType abiType;
247
229
try
248
230
{
231
+ u256 number;
232
+ ABIType abiType;
249
233
if (accept (SoltToken::Sub))
250
234
{
251
- abiType. type = ABIType::Type:: SignedDec;
235
+ abiType = ABIType{ABIType:: SignedDec, 32 } ;
252
236
expect (SoltToken::Sub);
253
-
254
- string literal = m_scanner.currentLiteral ();
255
- expect (SoltToken::Number);
256
- number = convertNumber (literal) * -1 ;
237
+ number = convertNumber (parseNumber ()) * -1 ;
257
238
}
258
239
else
259
240
if (accept (SoltToken::Number))
260
241
{
261
- abiType.type = ABIType::Type::UnsignedDec;
262
-
263
- string literal = m_scanner.currentLiteral ();
264
- expect (SoltToken::Number);
265
- number = convertNumber (literal);
242
+ abiType = ABIType{ABIType::UnsignedDec, 32 };
243
+ number = convertNumber (parseNumber ());
266
244
}
267
245
return make_pair (toBigEndian (number), abiType);
268
246
}
@@ -272,6 +250,24 @@ pair<bytes, ABIType> TestFileParser::parseNumberLiteral()
272
250
}
273
251
}
274
252
253
+ string TestFileParser::parseNumber ()
254
+ {
255
+ string literal = m_scanner.currentLiteral ();
256
+ expect (SoltToken::Number);
257
+ return literal;
258
+ }
259
+
260
+ u256 TestFileParser::convertNumber (string const & _literal)
261
+ {
262
+ try {
263
+ return u256{_literal};
264
+ }
265
+ catch (std::exception const &)
266
+ {
267
+ throw Error (Error::Type::ParserError, " Number encoding invalid." );
268
+ }
269
+ }
270
+
275
271
void TestFileParser::Scanner::readStream (istream& _stream)
276
272
{
277
273
std::string line;
0 commit comments