mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Adapted tests due to more precise Yul source locations.
Also added support for -1 source index, referencing original scanner's source location.
This commit is contained in:
parent
132fa46faa
commit
5e4868d5d6
@ -131,11 +131,13 @@ void Parser::fetchSourceLocationFromComment()
|
||||
m_locationOverride = SourceLocation{};
|
||||
if (!sourceIndex || !start || !end)
|
||||
m_errorReporter.syntaxError(6367_error, commentLocation, "Invalid value in source location mapping. Could not parse location specification.");
|
||||
else if (!((start < 0 && end < 0) || (start >= 0 && *start <= *end)))
|
||||
else if (!((*start < 0 && *end < 0) || (*start >= 0 && *start <= *end)))
|
||||
m_errorReporter.syntaxError(5798_error, commentLocation, "Invalid value in source location mapping. Start offset larger than end offset.");
|
||||
else if (sourceIndex == -1 && (0 <= *start && *start <= *end)) // Use source index -1 to indicate original source.
|
||||
m_locationOverride = SourceLocation{*start, *end, ParserBase::currentLocation().source};
|
||||
else if (!(sourceIndex >= 0 && m_charStreamMap->count(static_cast<unsigned>(*sourceIndex))))
|
||||
m_errorReporter.syntaxError(2674_error, commentLocation, "Invalid source mapping. Source index not defined via @use-src.");
|
||||
else if (sourceIndex >= 0)
|
||||
else
|
||||
{
|
||||
shared_ptr<CharStream> charStream = m_charStreamMap->at(static_cast<unsigned>(*sourceIndex));
|
||||
solAssert(charStream, "");
|
||||
|
@ -556,6 +556,28 @@ BOOST_AUTO_TEST_CASE(customSourceLocations_ensure_last_match)
|
||||
CHECK_LOCATION(varDecl.debugData->location, sourceText, 30, 40);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(customSourceLocations_reference_original_sloc)
|
||||
{
|
||||
ErrorList errorList;
|
||||
ErrorReporter reporter(errorList);
|
||||
auto const sourceText = R"(
|
||||
/// @src 1:2:3
|
||||
{
|
||||
/// @src -1:10:20
|
||||
let x:bool := true
|
||||
}
|
||||
)";
|
||||
EVMDialectTyped const& dialect = EVMDialectTyped::instance(EVMVersion{});
|
||||
shared_ptr<Block> result = parse(sourceText, dialect, reporter);
|
||||
BOOST_REQUIRE(!!result);
|
||||
BOOST_REQUIRE(holds_alternative<VariableDeclaration>(result->statements.at(0)));
|
||||
VariableDeclaration const& varDecl = get<VariableDeclaration>(result->statements.at(0));
|
||||
|
||||
// -1 points to original source code, which in this case is `sourceText` (which is also
|
||||
// available via `0`, that's why the first @src is set to `1` instead.)
|
||||
CHECK_LOCATION(varDecl.debugData->location, sourceText, 10, 20);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_SUITE_END()
|
||||
|
||||
} // end namespaces
|
||||
|
Loading…
Reference in New Issue
Block a user