/*
This file is part of solidity.
solidity is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
solidity is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with solidity. If not, see .
*/
// SPDX-License-Identifier: GPL-3.0
/**
* @author julius
* @date 2019
* Converts the AST from JSON format to ASTNode
*/
#pragma once
#include
#include
#include
#include
#include
#include
#include
namespace solidity::frontend
{
/**
* Component that imports an AST from json format to the internal format
*/
class ASTJsonImporter
{
public:
ASTJsonImporter(langutil::EVMVersion _evmVersion)
:m_evmVersion(_evmVersion)
{}
/// Converts the AST from JSON-format to ASTPointer
/// @a _sourceList used to provide source names for the ASTs
/// @returns map of sourcenames to their respective ASTs
std::map> jsonToSourceUnit(std::map const& _sourceList);
private:
// =========== general creation functions ==============
/// Sets the source location and nodeID
/// @returns the ASTNode Object class of the respective JSON node,
template
ASTPointer createASTNode(Json::Value const& _node, Args&&... _args);
/// @returns the sourceLocation-object created from the string in the JSON node
langutil::SourceLocation const createSourceLocation(Json::Value const& _node);
std::optional> createSourceLocations(Json::Value const& _node) const;
/// Creates an ASTNode for a given JSON-ast of unknown type
/// @returns Pointer to a new created ASTNode
ASTPointer convertJsonToASTNode(Json::Value const& _ast);
/// @returns a pointer to the more specific subclass of ASTNode
/// as indicated by the nodeType field of the json
template
ASTPointer convertJsonToASTNode(Json::Value const& _node);
langutil::SourceLocation createNameSourceLocation(Json::Value const& _node);
/// @returns source location of a mapping key name
langutil::SourceLocation createKeyNameSourceLocation(Json::Value const& _node);
/// @returns source location of a mapping value name
langutil::SourceLocation createValueNameSourceLocation(Json::Value const& _node);
/// \defgroup nodeCreators JSON to AST-Nodes
///@{
ASTPointer createSourceUnit(Json::Value const& _node, std::string const& _srcName);
ASTPointer createPragmaDirective(Json::Value const& _node);
ASTPointer createImportDirective(Json::Value const& _node);
ASTPointer createContractDefinition(Json::Value const& _node);
ASTPointer createIdentifierPath(Json::Value const& _node);
ASTPointer createInheritanceSpecifier(Json::Value const& _node);
ASTPointer createUsingForDirective(Json::Value const& _node);
ASTPointer createStructDefinition(Json::Value const& _node);
ASTPointer createEnumDefinition(Json::Value const& _node);
ASTPointer createEnumValue(Json::Value const& _node);
ASTPointer createUserDefinedValueTypeDefinition(Json::Value const& _node);
ASTPointer createParameterList(Json::Value const& _node);
ASTPointer createOverrideSpecifier(Json::Value const& _node);
ASTPointer createFunctionDefinition(Json::Value const& _node);
ASTPointer createVariableDeclaration(Json::Value const& _node);
ASTPointer createModifierDefinition(Json::Value const& _node);
ASTPointer createModifierInvocation(Json::Value const& _node);
ASTPointer createEventDefinition(Json::Value const& _node);
ASTPointer createErrorDefinition(Json::Value const& _node);
ASTPointer createElementaryTypeName(Json::Value const& _node);
ASTPointer createUserDefinedTypeName(Json::Value const& _node);
ASTPointer createFunctionTypeName(Json::Value const& _node);
ASTPointer createMapping(Json::Value const& _node);
ASTPointer createArrayTypeName(Json::Value const& _node);
ASTPointer createInlineAssembly(Json::Value const& _node);
ASTPointer createBlock(Json::Value const& _node, bool _unchecked);
ASTPointer createPlaceholderStatement(Json::Value const& _node);
ASTPointer createIfStatement(Json::Value const& _node);
ASTPointer createTryCatchClause(Json::Value const& _node);
ASTPointer createTryStatement(Json::Value const& _node);
ASTPointer createWhileStatement(Json::Value const& _node, bool _isDoWhile);
ASTPointer createForStatement(Json::Value const& _node);
ASTPointer createContinue(Json::Value const& _node);
ASTPointer createBreak(Json::Value const& _node);
ASTPointer createReturn(Json::Value const& _node);
ASTPointer createThrow(Json::Value const& _node);
ASTPointer createEmitStatement(Json::Value const& _node);
ASTPointer createRevertStatement(Json::Value const& _node);
ASTPointer createVariableDeclarationStatement(Json::Value const& _node);
ASTPointer createExpressionStatement(Json::Value const& _node);
ASTPointer createConditional(Json::Value const& _node);
ASTPointer createAssignment(Json::Value const& _node);
ASTPointer createTupleExpression(Json::Value const& _node);
ASTPointer createUnaryOperation(Json::Value const& _node);
ASTPointer createBinaryOperation(Json::Value const& _node);
ASTPointer createFunctionCall(Json::Value const& _node);
ASTPointer createFunctionCallOptions(Json::Value const& _node);
ASTPointer createNewExpression(Json::Value const& _node);
ASTPointer createMemberAccess(Json::Value const& _node);
ASTPointer createIndexAccess(Json::Value const& _node);
ASTPointer createIndexRangeAccess(Json::Value const& _node);
ASTPointer createIdentifier(Json::Value const& _node);
ASTPointer createElementaryTypeNameExpression(Json::Value const& _node);
ASTPointer createLiteral(Json::Value const& _node);
ASTPointer createDocumentation(Json::Value const& _node);
///@}
// =============== general helper functions ===================
/// @returns the member of a given JSON object, throws if member does not exist
Json::Value member(Json::Value const& _node, std::string const& _name);
/// @returns the appropriate TokenObject used in parsed Strings (pragma directive or operator)
Token scanSingleToken(Json::Value const& _node);
template
///@returns nullptr or an ASTPointer cast to a specific Class
ASTPointer nullOrCast(Json::Value const& _json);
/// @returns nullptr or ASTString, given an JSON string or an empty field
ASTPointer nullOrASTString(Json::Value const& _json, std::string const& _name);
// ============== JSON to definition helpers ===============
/// \defgroup typeHelpers Json to ast-datatype helpers
/// {@
ASTPointer memberAsASTString(Json::Value const& _node, std::string const& _name);
bool memberAsBool(Json::Value const& _node, std::string const& _name);
Visibility visibility(Json::Value const& _node);
StateMutability stateMutability(Json::Value const& _node);
VariableDeclaration::Location location(Json::Value const& _node);
ContractKind contractKind(Json::Value const& _node);
Token literalTokenKind(Json::Value const& _node);
Literal::SubDenomination subdenomination(Json::Value const& _node);
///@}
// =========== member variables ===============
/// list of source names, order by source index
std::vector> m_sourceNames;
/// filepath to AST
std::map> m_sourceUnits;
/// IDs already used by the nodes
std::set m_usedIDs;
/// Configured EVM version
langutil::EVMVersion m_evmVersion;
};
}