Skip to content

Commit 3ee2efe

Browse files
committed
Adds multi-line support for test file parser.
1 parent cee2af4 commit 3ee2efe

File tree

3 files changed

+300
-105
lines changed

3 files changed

+300
-105
lines changed

test/libsolidity/util/TestFileParser.cpp

+68-53
Original file line numberDiff line numberDiff line change
@@ -65,33 +65,27 @@ vector<dev::solidity::test::FunctionCall> TestFileParser::parseFunctionCalls()
6565
{
6666
FunctionCall call;
6767

68-
// f()
6968
expect(SoltToken::Newline);
7069
call.signature = parseFunctionSignature();
7170

72-
// f(), 314 ether
7371
if (accept(SoltToken::Comma, true))
7472
call.value = parseFunctionCallValue();
75-
76-
// f(), 314 ether: 1, 1
7773
if (accept(SoltToken::Colon, true))
7874
call.arguments = parseFunctionCallArguments();
7975

80-
string comment = m_scanner.currentLiteral();
81-
if (accept(SoltToken::Comment, true))
82-
call.arguments.comment = comment;
76+
call.displayMode = parseNewline();
77+
call.arguments.comment = parseComment();
8378

84-
// -> 1
85-
expect(SoltToken::Newline);
79+
if (accept(SoltToken::Newline, true))
80+
call.displayMode = FunctionCall::DisplayMode::MultiLine;
8681
expect(SoltToken::Arrow);
87-
if (m_scanner.peekToken() != SoltToken::Newline)
88-
{
89-
call.expectations = parseFunctionCallExpectations();
90-
91-
string comment = m_scanner.currentLiteral();
92-
if (accept(SoltToken::Comment, true))
93-
call.expectations.comment = comment;
94-
}
82+
83+
call.expectations = parseFunctionCallExpectations();
84+
85+
if (accept(SoltToken::Newline, false))
86+
call.displayMode = parseNewline();
87+
call.expectations.comment = parseComment();
88+
9589
calls.emplace_back(std::move(call));
9690
}
9791
else
@@ -127,7 +121,8 @@ bool TestFileParser::accept(SoltToken _token, bool const _expect)
127121
bool TestFileParser::expect(SoltToken _token, bool const _advance)
128122
{
129123
if (m_scanner.currentToken() != _token)
130-
throw Error(Error::Type::ParserError,
124+
throw Error
125+
(Error::Type::ParserError,
131126
"Unexpected " + formatToken(m_scanner.currentToken()) + ": \"" +
132127
m_scanner.currentLiteral() + "\". " +
133128
"Expected \"" + formatToken(_token) + "\"."
@@ -164,10 +159,7 @@ string TestFileParser::parseFunctionSignature()
164159

165160
u256 TestFileParser::parseFunctionCallValue()
166161
{
167-
u256 value;
168-
string literal = m_scanner.currentLiteral();
169-
expect(SoltToken::Number);
170-
value = convertNumber(literal);
162+
u256 value = convertNumber(parseNumber());
171163
expect(SoltToken::Ether);
172164
return value;
173165
}
@@ -176,41 +168,46 @@ FunctionCallArgs TestFileParser::parseFunctionCallArguments()
176168
{
177169
FunctionCallArgs arguments;
178170

179-
auto formattedBytes = parseABITypeLiteral();
180-
arguments.rawBytes += formattedBytes.first;
181-
arguments.formats.emplace_back(std::move(formattedBytes.second));
171+
auto param = parseParameter();
172+
if (param.abiType.type == ABIType::None)
173+
throw Error(Error::Type::ParserError, "No argument provided.");
174+
arguments.parameters.emplace_back(param);
175+
182176
while (accept(SoltToken::Comma, true))
183-
{
184-
auto formattedBytes = parseABITypeLiteral();
185-
arguments.rawBytes += formattedBytes.first;
186-
arguments.formats.emplace_back(std::move(formattedBytes.second));
187-
}
177+
arguments.parameters.emplace_back(parseParameter());
188178
return arguments;
189179
}
190180

191181
FunctionCallExpectations TestFileParser::parseFunctionCallExpectations()
192182
{
193183
FunctionCallExpectations expectations;
194-
string token = m_scanner.currentLiteral();
195184

196-
if (accept(SoltToken::Failure, true))
197-
expectations.status = false;
198-
else
199-
{
200-
auto formattedBytes = parseABITypeLiteral();
201-
expectations.rawBytes += formattedBytes.first;
202-
expectations.formats.emplace_back(std::move(formattedBytes.second));
185+
auto param = parseParameter();
186+
if (param.abiType.type == ABIType::None)
187+
return expectations;
188+
expectations.parameters.emplace_back(param);
203189

204-
while (accept(SoltToken::Comma, true))
205-
{
206-
auto formattedBytes = parseABITypeLiteral();
207-
expectations.rawBytes += formattedBytes.first;
208-
expectations.formats.emplace_back(std::move(formattedBytes.second));
209-
}
210-
}
190+
while (accept(SoltToken::Comma, true))
191+
expectations.parameters.emplace_back(parseParameter());
192+
193+
/// We have always one virtual parameter in the parameter list.
194+
/// If its type is FAILURE, the expected result is also a REVERT etc.
195+
if (expectations.parameters.at(0).abiType.type != ABIType::Failure)
196+
expectations.failure = false;
211197
return expectations;
212198
}
213199

200+
Parameter TestFileParser::parseParameter()
201+
{
202+
Parameter parameter;
203+
if (accept(SoltToken::Newline, true))
204+
parameter.format.newline = true;
205+
auto literal = parseABITypeLiteral();
206+
parameter.rawBytes = literal.first;
207+
parameter.abiType = literal.second;
208+
return parameter;
209+
}
210+
214211
pair<bytes, ABIType> TestFileParser::parseABITypeLiteral()
215212
{
216213
try
@@ -219,21 +216,23 @@ pair<bytes, ABIType> TestFileParser::parseABITypeLiteral()
219216
ABIType abiType;
220217
if (accept(SoltToken::Sub))
221218
{
222-
abiType.type = ABIType::Type::SignedDec;
223-
abiType.size = 32;
224-
219+
abiType = ABIType{ABIType::SignedDec, 32};
225220
expect(SoltToken::Sub);
226221
number = convertNumber(parseNumber()) * -1;
227222
}
228223
else
224+
{
229225
if (accept(SoltToken::Number))
230226
{
231-
abiType.type = ABIType::Type::UnsignedDec;
232-
abiType.size = 32;
233-
227+
abiType = ABIType{ABIType::UnsignedDec, 32};
234228
number = convertNumber(parseNumber());
235229
}
236-
230+
if (accept(SoltToken::Failure, true))
231+
{
232+
abiType = ABIType{ABIType::Failure, 0};
233+
return make_pair(bytes{}, abiType);
234+
}
235+
}
237236
return make_pair(toBigEndian(number), abiType);
238237
}
239238
catch (std::exception const&)
@@ -242,6 +241,21 @@ pair<bytes, ABIType> TestFileParser::parseABITypeLiteral()
242241
}
243242
}
244243

244+
solidity::test::FunctionCall::DisplayMode TestFileParser::parseNewline()
245+
{
246+
if (accept(SoltToken::Newline, true))
247+
return FunctionCall::DisplayMode::MultiLine;
248+
return FunctionCall::DisplayMode::SingleLine;
249+
}
250+
251+
string TestFileParser::parseComment()
252+
{
253+
string comment = m_scanner.currentLiteral();
254+
if (accept(SoltToken::Comment, true))
255+
return comment;
256+
return string{};
257+
}
258+
245259
string TestFileParser::parseNumber()
246260
{
247261
string literal = m_scanner.currentLiteral();
@@ -283,7 +297,8 @@ void TestFileParser::Scanner::scanNextToken()
283297
};
284298

285299
TokenDesc token = make_pair(SoltToken::Unknown, "");
286-
do {
300+
do
301+
{
287302
switch(current())
288303
{
289304
case '/':

0 commit comments

Comments
 (0)