mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Remove the legacy AST JSON output
This commit is contained in:
parent
38f143c597
commit
3bce2a2294
@ -4,7 +4,9 @@ Breaking Changes:
|
|||||||
* Assembler: The artificial ASSIGNIMMUTABLE opcode and the corresponding builtin in the "EVM with object access" dialect of Yul take the base offset of the code to modify as additional argument.
|
* Assembler: The artificial ASSIGNIMMUTABLE opcode and the corresponding builtin in the "EVM with object access" dialect of Yul take the base offset of the code to modify as additional argument.
|
||||||
* Code Generator: All arithmetic is checked by default. These checks can be disabled using ``unchecked { ... }``.
|
* Code Generator: All arithmetic is checked by default. These checks can be disabled using ``unchecked { ... }``.
|
||||||
* Code Generator: Cause a panic if a byte array in storage is accessed whose length is encoded incorrectly.
|
* Code Generator: Cause a panic if a byte array in storage is accessed whose length is encoded incorrectly.
|
||||||
|
* Command Line Interface: Remove the legacy ``--ast-json`` option. Only the ``--ast-compact-json`` option is supported now.
|
||||||
* General: Remove global functions ``log0``, ``log1``, ``log2``, ``log3`` and ``log4``.
|
* General: Remove global functions ``log0``, ``log1``, ``log2``, ``log3`` and ``log4``.
|
||||||
|
* Standard JSON: Remove the ``legacyAST`` option.
|
||||||
* Type Checker: Function call options can only be given once.
|
* Type Checker: Function call options can only be given once.
|
||||||
* Type System: Unary negation can only be used on signed integers, not on unsigned integers.
|
* Type System: Unary negation can only be used on signed integers, not on unsigned integers.
|
||||||
* Type System: Disallow explicit conversions from negative literals and literals larger than ``type(uint160).max`` to ``address`` type.
|
* Type System: Disallow explicit conversions from negative literals and literals larger than ``type(uint160).max`` to ``address`` type.
|
||||||
|
@ -327,7 +327,6 @@ Input Description
|
|||||||
//
|
//
|
||||||
// File level (needs empty string as contract name):
|
// File level (needs empty string as contract name):
|
||||||
// ast - AST of all source files
|
// ast - AST of all source files
|
||||||
// legacyAST - legacy AST of all source files
|
|
||||||
//
|
//
|
||||||
// Contract level (needs the contract name or "*"):
|
// Contract level (needs the contract name or "*"):
|
||||||
// abi - ABI
|
// abi - ABI
|
||||||
@ -430,8 +429,6 @@ Output Description
|
|||||||
"id": 1,
|
"id": 1,
|
||||||
// The AST object
|
// The AST object
|
||||||
"ast": {},
|
"ast": {},
|
||||||
// The legacy AST object
|
|
||||||
"legacyAST": {}
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
// This contains the contract-level outputs.
|
// This contains the contract-level outputs.
|
||||||
|
@ -70,8 +70,7 @@ void addIfSet(std::vector<pair<string, Json::Value>>& _attributes, string const&
|
|||||||
namespace solidity::frontend
|
namespace solidity::frontend
|
||||||
{
|
{
|
||||||
|
|
||||||
ASTJsonConverter::ASTJsonConverter(bool _legacy, CompilerStack::State _stackState, map<string, unsigned> _sourceIndices):
|
ASTJsonConverter::ASTJsonConverter(CompilerStack::State _stackState, map<string, unsigned> _sourceIndices):
|
||||||
m_legacy(_legacy),
|
|
||||||
m_stackState(_stackState),
|
m_stackState(_stackState),
|
||||||
m_sourceIndices(std::move(_sourceIndices))
|
m_sourceIndices(std::move(_sourceIndices))
|
||||||
{
|
{
|
||||||
@ -100,60 +99,9 @@ void ASTJsonConverter::setJsonNode(
|
|||||||
m_currentValue = Json::objectValue;
|
m_currentValue = Json::objectValue;
|
||||||
m_currentValue["id"] = nodeId(_node);
|
m_currentValue["id"] = nodeId(_node);
|
||||||
m_currentValue["src"] = sourceLocationToString(_node.location());
|
m_currentValue["src"] = sourceLocationToString(_node.location());
|
||||||
if (!m_legacy)
|
m_currentValue["nodeType"] = _nodeType;
|
||||||
{
|
for (auto& e: _attributes)
|
||||||
m_currentValue["nodeType"] = _nodeType;
|
m_currentValue[e.first] = std::move(e.second);
|
||||||
for (auto& e: _attributes)
|
|
||||||
m_currentValue[e.first] = std::move(e.second);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
m_currentValue["name"] = _nodeType;
|
|
||||||
Json::Value attrs(Json::objectValue);
|
|
||||||
if (
|
|
||||||
//these nodeTypes need to have a children-node even if it is empty
|
|
||||||
(_nodeType == "VariableDeclaration") ||
|
|
||||||
(_nodeType == "ParameterList") ||
|
|
||||||
(_nodeType == "Block") ||
|
|
||||||
(_nodeType == "InlineAssembly") ||
|
|
||||||
(_nodeType == "Throw")
|
|
||||||
)
|
|
||||||
m_currentValue["children"] = Json::arrayValue;
|
|
||||||
|
|
||||||
for (auto& e: _attributes)
|
|
||||||
{
|
|
||||||
if ((!e.second.isNull()) && (
|
|
||||||
(e.second.isObject() && e.second.isMember("name")) ||
|
|
||||||
(e.second.isArray() && e.second[0].isObject() && e.second[0].isMember("name")) ||
|
|
||||||
(e.first == "declarations") // (in the case (_,x)= ... there's a nullpointer at [0]
|
|
||||||
))
|
|
||||||
{
|
|
||||||
if (e.second.isObject())
|
|
||||||
{
|
|
||||||
if (!m_currentValue["children"].isArray())
|
|
||||||
m_currentValue["children"] = Json::arrayValue;
|
|
||||||
appendMove(m_currentValue["children"], std::move(e.second));
|
|
||||||
}
|
|
||||||
if (e.second.isArray())
|
|
||||||
for (auto& child: e.second)
|
|
||||||
if (!child.isNull())
|
|
||||||
{
|
|
||||||
if (!m_currentValue["children"].isArray())
|
|
||||||
m_currentValue["children"] = Json::arrayValue;
|
|
||||||
appendMove(m_currentValue["children"], std::move(child));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (e.first == "typeDescriptions")
|
|
||||||
attrs["type"] = Json::Value(e.second["typeString"]);
|
|
||||||
else
|
|
||||||
attrs[e.first] = std::move(e.second);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!attrs.empty())
|
|
||||||
m_currentValue["attributes"] = std::move(attrs);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t ASTJsonConverter::sourceIndexFromLocation(SourceLocation const& _location) const
|
size_t ASTJsonConverter::sourceIndexFromLocation(SourceLocation const& _location) const
|
||||||
@ -285,7 +233,7 @@ bool ASTJsonConverter::visit(ImportDirective const& _node)
|
|||||||
{
|
{
|
||||||
std::vector<pair<string, Json::Value>> attributes = {
|
std::vector<pair<string, Json::Value>> attributes = {
|
||||||
make_pair("file", _node.path()),
|
make_pair("file", _node.path()),
|
||||||
make_pair(m_legacy ? "SourceUnit" : "sourceUnit", idOrNull(_node.annotation().sourceUnit)),
|
make_pair("sourceUnit", idOrNull(_node.annotation().sourceUnit)),
|
||||||
make_pair("scope", idOrNull(_node.scope()))
|
make_pair("scope", idOrNull(_node.scope()))
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -442,8 +390,6 @@ bool ASTJsonConverter::visit(FunctionDefinition const& _node)
|
|||||||
attributes.emplace_back("functionSelector", _node.externalIdentifierHex());
|
attributes.emplace_back("functionSelector", _node.externalIdentifierHex());
|
||||||
if (!_node.annotation().baseFunctions.empty())
|
if (!_node.annotation().baseFunctions.empty())
|
||||||
attributes.emplace_back(make_pair("baseFunctions", getContainerIds(_node.annotation().baseFunctions, true)));
|
attributes.emplace_back(make_pair("baseFunctions", getContainerIds(_node.annotation().baseFunctions, true)));
|
||||||
if (m_legacy)
|
|
||||||
attributes.emplace_back("isConstructor", _node.isConstructor());
|
|
||||||
setJsonNode(_node, "FunctionDefinition", std::move(attributes));
|
setJsonNode(_node, "FunctionDefinition", std::move(attributes));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -586,9 +532,7 @@ bool ASTJsonConverter::visit(InlineAssembly const& _node)
|
|||||||
externalReferencesJson.append(std::move(it.second));
|
externalReferencesJson.append(std::move(it.second));
|
||||||
|
|
||||||
setJsonNode(_node, "InlineAssembly", {
|
setJsonNode(_node, "InlineAssembly", {
|
||||||
m_legacy ?
|
make_pair("AST", Json::Value(yul::AsmJsonConverter(sourceIndexFromLocation(_node.location()))(_node.operations()))),
|
||||||
make_pair("operations", Json::Value(yul::AsmPrinter()(_node.operations()))) :
|
|
||||||
make_pair("AST", Json::Value(yul::AsmJsonConverter(sourceIndexFromLocation(_node.location()))(_node.operations()))),
|
|
||||||
make_pair("externalReferences", std::move(externalReferencesJson)),
|
make_pair("externalReferences", std::move(externalReferencesJson)),
|
||||||
make_pair("evmVersion", dynamic_cast<solidity::yul::EVMDialect const&>(_node.dialect()).evmVersion().name())
|
make_pair("evmVersion", dynamic_cast<solidity::yul::EVMDialect const&>(_node.dialect()).evmVersion().name())
|
||||||
});
|
});
|
||||||
@ -794,14 +738,7 @@ bool ASTJsonConverter::visit(FunctionCall const& _node)
|
|||||||
if (_node.annotation().kind.set())
|
if (_node.annotation().kind.set())
|
||||||
{
|
{
|
||||||
FunctionCallKind nodeKind = *_node.annotation().kind;
|
FunctionCallKind nodeKind = *_node.annotation().kind;
|
||||||
|
attributes.emplace_back("kind", functionCallKind(nodeKind));
|
||||||
if (m_legacy)
|
|
||||||
{
|
|
||||||
attributes.emplace_back("isStructConstructorCall", nodeKind == FunctionCallKind::StructConstructorCall);
|
|
||||||
attributes.emplace_back("type_conversion", nodeKind == FunctionCallKind::TypeConversion);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
attributes.emplace_back("kind", functionCallKind(nodeKind));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
appendExpressionAttributes(attributes, _node.annotation());
|
appendExpressionAttributes(attributes, _node.annotation());
|
||||||
@ -839,7 +776,7 @@ bool ASTJsonConverter::visit(NewExpression const& _node)
|
|||||||
bool ASTJsonConverter::visit(MemberAccess const& _node)
|
bool ASTJsonConverter::visit(MemberAccess const& _node)
|
||||||
{
|
{
|
||||||
std::vector<pair<string, Json::Value>> attributes = {
|
std::vector<pair<string, Json::Value>> attributes = {
|
||||||
make_pair(m_legacy ? "member_name" : "memberName", _node.memberName()),
|
make_pair("memberName", _node.memberName()),
|
||||||
make_pair("expression", toJson(_node.expression())),
|
make_pair("expression", toJson(_node.expression())),
|
||||||
make_pair("referencedDeclaration", idOrNull(_node.annotation().referencedDeclaration)),
|
make_pair("referencedDeclaration", idOrNull(_node.annotation().referencedDeclaration)),
|
||||||
};
|
};
|
||||||
@ -877,7 +814,7 @@ bool ASTJsonConverter::visit(Identifier const& _node)
|
|||||||
for (auto const& dec: _node.annotation().overloadedDeclarations)
|
for (auto const& dec: _node.annotation().overloadedDeclarations)
|
||||||
overloads.append(nodeId(*dec));
|
overloads.append(nodeId(*dec));
|
||||||
setJsonNode(_node, "Identifier", {
|
setJsonNode(_node, "Identifier", {
|
||||||
make_pair(m_legacy ? "value" : "name", _node.name()),
|
make_pair("name", _node.name()),
|
||||||
make_pair("referencedDeclaration", idOrNull(_node.annotation().referencedDeclaration)),
|
make_pair("referencedDeclaration", idOrNull(_node.annotation().referencedDeclaration)),
|
||||||
make_pair("overloadedDeclarations", overloads),
|
make_pair("overloadedDeclarations", overloads),
|
||||||
make_pair("typeDescriptions", typePointerToJson(_node.annotation().type)),
|
make_pair("typeDescriptions", typePointerToJson(_node.annotation().type)),
|
||||||
@ -889,7 +826,7 @@ bool ASTJsonConverter::visit(Identifier const& _node)
|
|||||||
bool ASTJsonConverter::visit(ElementaryTypeNameExpression const& _node)
|
bool ASTJsonConverter::visit(ElementaryTypeNameExpression const& _node)
|
||||||
{
|
{
|
||||||
std::vector<pair<string, Json::Value>> attributes = {
|
std::vector<pair<string, Json::Value>> attributes = {
|
||||||
make_pair(m_legacy ? "value" : "typeName", toJson(_node.type()))
|
make_pair("typeName", toJson(_node.type()))
|
||||||
};
|
};
|
||||||
appendExpressionAttributes(attributes, _node.annotation());
|
appendExpressionAttributes(attributes, _node.annotation());
|
||||||
setJsonNode(_node, "ElementaryTypeNameExpression", std::move(attributes));
|
setJsonNode(_node, "ElementaryTypeNameExpression", std::move(attributes));
|
||||||
@ -903,9 +840,9 @@ bool ASTJsonConverter::visit(Literal const& _node)
|
|||||||
value = Json::nullValue;
|
value = Json::nullValue;
|
||||||
Token subdenomination = Token(_node.subDenomination());
|
Token subdenomination = Token(_node.subDenomination());
|
||||||
std::vector<pair<string, Json::Value>> attributes = {
|
std::vector<pair<string, Json::Value>> attributes = {
|
||||||
make_pair(m_legacy ? "token" : "kind", literalTokenKind(_node.token())),
|
make_pair("kind", literalTokenKind(_node.token())),
|
||||||
make_pair("value", value),
|
make_pair("value", value),
|
||||||
make_pair(m_legacy ? "hexvalue" : "hexValue", util::toHex(util::asBytes(_node.value()))),
|
make_pair("hexValue", util::toHex(util::asBytes(_node.value()))),
|
||||||
make_pair(
|
make_pair(
|
||||||
"subdenomination",
|
"subdenomination",
|
||||||
subdenomination == Token::Illegal ?
|
subdenomination == Token::Illegal ?
|
||||||
|
@ -51,11 +51,9 @@ class ASTJsonConverter: public ASTConstVisitor
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
/// Create a converter to JSON for the given abstract syntax tree.
|
/// Create a converter to JSON for the given abstract syntax tree.
|
||||||
/// @a _legacy if true, use legacy format
|
|
||||||
/// @a _stackState state of the compiler stack to avoid outputting incomplete data
|
/// @a _stackState state of the compiler stack to avoid outputting incomplete data
|
||||||
/// @a _sourceIndices is used to abbreviate source names in source locations.
|
/// @a _sourceIndices is used to abbreviate source names in source locations.
|
||||||
explicit ASTJsonConverter(
|
explicit ASTJsonConverter(
|
||||||
bool _legacy,
|
|
||||||
CompilerStack::State _stackState,
|
CompilerStack::State _stackState,
|
||||||
std::map<std::string, unsigned> _sourceIndices = std::map<std::string, unsigned>()
|
std::map<std::string, unsigned> _sourceIndices = std::map<std::string, unsigned>()
|
||||||
);
|
);
|
||||||
@ -192,7 +190,6 @@ private:
|
|||||||
_array.append(std::move(_value));
|
_array.append(std::move(_value));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool m_legacy = false; ///< if true, use legacy format
|
|
||||||
CompilerStack::State m_stackState = CompilerStack::State::Empty; ///< Used to only access information that already exists
|
CompilerStack::State m_stackState = CompilerStack::State::Empty; ///< Used to only access information that already exists
|
||||||
bool m_inEvent = false; ///< whether we are currently inside an event or not
|
bool m_inEvent = false; ///< whether we are currently inside an event or not
|
||||||
Json::Value m_currentValue;
|
Json::Value m_currentValue;
|
||||||
|
@ -1086,9 +1086,7 @@ Json::Value StandardCompiler::compileSolidity(StandardCompiler::InputsAndSetting
|
|||||||
Json::Value sourceResult = Json::objectValue;
|
Json::Value sourceResult = Json::objectValue;
|
||||||
sourceResult["id"] = sourceIndex++;
|
sourceResult["id"] = sourceIndex++;
|
||||||
if (isArtifactRequested(_inputsAndSettings.outputSelection, sourceName, "", "ast", wildcardMatchesExperimental))
|
if (isArtifactRequested(_inputsAndSettings.outputSelection, sourceName, "", "ast", wildcardMatchesExperimental))
|
||||||
sourceResult["ast"] = ASTJsonConverter(false, compilerStack.state(), compilerStack.sourceIndices()).toJson(compilerStack.ast(sourceName));
|
sourceResult["ast"] = ASTJsonConverter(compilerStack.state(), compilerStack.sourceIndices()).toJson(compilerStack.ast(sourceName));
|
||||||
if (isArtifactRequested(_inputsAndSettings.outputSelection, sourceName, "", "legacyAST", wildcardMatchesExperimental))
|
|
||||||
sourceResult["legacyAST"] = ASTJsonConverter(true, compilerStack.state(), compilerStack.sourceIndices()).toJson(compilerStack.ast(sourceName));
|
|
||||||
output["sources"][sourceName] = sourceResult;
|
output["sources"][sourceName] = sourceResult;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1679,11 +1679,10 @@ void CommandLineInterface::handleCombinedJSON()
|
|||||||
|
|
||||||
if (requests.count(g_strAst))
|
if (requests.count(g_strAst))
|
||||||
{
|
{
|
||||||
bool legacyFormat = !requests.count(g_strCompactJSON);
|
|
||||||
output[g_strSources] = Json::Value(Json::objectValue);
|
output[g_strSources] = Json::Value(Json::objectValue);
|
||||||
for (auto const& sourceCode: m_sourceCodes)
|
for (auto const& sourceCode: m_sourceCodes)
|
||||||
{
|
{
|
||||||
ASTJsonConverter converter(legacyFormat, m_compiler->state(), m_compiler->sourceIndices());
|
ASTJsonConverter converter(m_compiler->state(), m_compiler->sourceIndices());
|
||||||
output[g_strSources][sourceCode.first] = Json::Value(Json::objectValue);
|
output[g_strSources][sourceCode.first] = Json::Value(Json::objectValue);
|
||||||
output[g_strSources][sourceCode.first]["AST"] = converter.toJson(m_compiler->ast(sourceCode.first));
|
output[g_strSources][sourceCode.first]["AST"] = converter.toJson(m_compiler->ast(sourceCode.first));
|
||||||
}
|
}
|
||||||
@ -1698,45 +1697,34 @@ void CommandLineInterface::handleCombinedJSON()
|
|||||||
sout() << json << endl;
|
sout() << json << endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CommandLineInterface::handleAst(string const& _argStr)
|
void CommandLineInterface::handleAst()
|
||||||
{
|
{
|
||||||
string title;
|
if (!m_args.count(g_argAstCompactJson))
|
||||||
|
return;
|
||||||
|
|
||||||
if (_argStr == g_argAstJson)
|
vector<ASTNode const*> asts;
|
||||||
title = "JSON AST:";
|
for (auto const& sourceCode: m_sourceCodes)
|
||||||
else if (_argStr == g_argAstCompactJson)
|
asts.push_back(&m_compiler->ast(sourceCode.first));
|
||||||
title = "JSON AST (compact format):";
|
|
||||||
else
|
|
||||||
BOOST_THROW_EXCEPTION(InternalCompilerError() << errinfo_comment("Illegal argStr for AST"));
|
|
||||||
|
|
||||||
// do we need AST output?
|
if (m_args.count(g_argOutputDir))
|
||||||
if (m_args.count(_argStr))
|
|
||||||
{
|
{
|
||||||
vector<ASTNode const*> asts;
|
|
||||||
for (auto const& sourceCode: m_sourceCodes)
|
for (auto const& sourceCode: m_sourceCodes)
|
||||||
asts.push_back(&m_compiler->ast(sourceCode.first));
|
|
||||||
|
|
||||||
bool legacyFormat = !m_args.count(g_argAstCompactJson);
|
|
||||||
if (m_args.count(g_argOutputDir))
|
|
||||||
{
|
{
|
||||||
for (auto const& sourceCode: m_sourceCodes)
|
stringstream data;
|
||||||
{
|
string postfix = "";
|
||||||
stringstream data;
|
ASTJsonConverter(m_compiler->state(), m_compiler->sourceIndices()).print(data, m_compiler->ast(sourceCode.first));
|
||||||
string postfix = "";
|
postfix += "_json";
|
||||||
ASTJsonConverter(legacyFormat, m_compiler->state(), m_compiler->sourceIndices()).print(data, m_compiler->ast(sourceCode.first));
|
boost::filesystem::path path(sourceCode.first);
|
||||||
postfix += "_json";
|
createFile(path.filename().string() + postfix + ".ast", data.str());
|
||||||
boost::filesystem::path path(sourceCode.first);
|
|
||||||
createFile(path.filename().string() + postfix + ".ast", data.str());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
sout() << "JSON AST (compact format):" << endl << endl;
|
||||||
|
for (auto const& sourceCode: m_sourceCodes)
|
||||||
{
|
{
|
||||||
sout() << title << endl << endl;
|
sout() << endl << "======= " << sourceCode.first << " =======" << endl;
|
||||||
for (auto const& sourceCode: m_sourceCodes)
|
ASTJsonConverter(m_compiler->state(), m_compiler->sourceIndices()).print(sout(), m_compiler->ast(sourceCode.first));
|
||||||
{
|
|
||||||
sout() << endl << "======= " << sourceCode.first << " =======" << endl;
|
|
||||||
ASTJsonConverter(legacyFormat, m_compiler->state(), m_compiler->sourceIndices()).print(sout(), m_compiler->ast(sourceCode.first));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2002,8 +1990,7 @@ void CommandLineInterface::outputCompilationResults()
|
|||||||
handleCombinedJSON();
|
handleCombinedJSON();
|
||||||
|
|
||||||
// do we need AST output?
|
// do we need AST output?
|
||||||
handleAst(g_argAstJson);
|
handleAst();
|
||||||
handleAst(g_argAstCompactJson);
|
|
||||||
|
|
||||||
if (
|
if (
|
||||||
!m_compiler->compilationSuccessful() &&
|
!m_compiler->compilationSuccessful() &&
|
||||||
|
@ -67,7 +67,7 @@ private:
|
|||||||
void outputCompilationResults();
|
void outputCompilationResults();
|
||||||
|
|
||||||
void handleCombinedJSON();
|
void handleCombinedJSON();
|
||||||
void handleAst(std::string const& _argStr);
|
void handleAst();
|
||||||
void handleBinary(std::string const& _contract);
|
void handleBinary(std::string const& _contract);
|
||||||
void handleOpcode(std::string const& _contract);
|
void handleOpcode(std::string const& _contract);
|
||||||
void handleIR(std::string const& _contract);
|
void handleIR(std::string const& _contract);
|
||||||
|
@ -68,7 +68,6 @@ private:
|
|||||||
std::string m_expectationParseOnly;
|
std::string m_expectationParseOnly;
|
||||||
std::string m_astFilename;
|
std::string m_astFilename;
|
||||||
std::string m_astParseOnlyFilename;
|
std::string m_astParseOnlyFilename;
|
||||||
std::string m_legacyAstFilename;
|
|
||||||
std::string m_result;
|
std::string m_result;
|
||||||
std::string m_resultLegacy;
|
std::string m_resultLegacy;
|
||||||
std::string m_resultParseOnly;
|
std::string m_resultParseOnly;
|
||||||
|
Loading…
Reference in New Issue
Block a user