mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
b7adb2aa42
Fixes: #9220
165 lines
8.0 KiB
C++
165 lines
8.0 KiB
C++
/*
|
|
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 <http://www.gnu.org/licenses/>.
|
|
*/
|
|
// SPDX-License-Identifier: GPL-3.0
|
|
/**
|
|
* @author julius <djudju@protonmail.com>
|
|
* @date 2019
|
|
* Converts the AST from JSON format to ASTNode
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <vector>
|
|
#include <libsolidity/ast/AST.h>
|
|
#include <json/json.h>
|
|
#include <libsolidity/ast/ASTAnnotations.h>
|
|
#include <liblangutil/EVMVersion.h>
|
|
#include <liblangutil/Exceptions.h>
|
|
#include <liblangutil/SourceLocation.h>
|
|
|
|
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<std::string, ASTPointer<SourceUnit>> jsonToSourceUnit(std::map<std::string, Json::Value> const& _sourceList);
|
|
|
|
private:
|
|
|
|
// =========== general creation functions ==============
|
|
|
|
/// Sets the source location and nodeID
|
|
/// @returns the ASTNode Object class of the respective JSON node,
|
|
template <typename T, typename... Args>
|
|
ASTPointer<T> 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);
|
|
/// Creates an ASTNode for a given JSON-ast of unknown type
|
|
/// @returns Pointer to a new created ASTNode
|
|
ASTPointer<ASTNode> 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<class T>
|
|
ASTPointer<T> convertJsonToASTNode(Json::Value const& _node);
|
|
|
|
|
|
/// \defgroup nodeCreators JSON to AST-Nodes
|
|
///@{
|
|
ASTPointer<SourceUnit> createSourceUnit(Json::Value const& _node, std::string const& _srcName);
|
|
ASTPointer<PragmaDirective> createPragmaDirective(Json::Value const& _node);
|
|
ASTPointer<ImportDirective> createImportDirective(Json::Value const& _node);
|
|
ASTPointer<ContractDefinition> createContractDefinition(Json::Value const& _node);
|
|
ASTPointer<InheritanceSpecifier> createInheritanceSpecifier(Json::Value const& _node);
|
|
ASTPointer<UsingForDirective> createUsingForDirective(Json::Value const& _node);
|
|
ASTPointer<ASTNode> createStructDefinition(Json::Value const& _node);
|
|
ASTPointer<EnumDefinition> createEnumDefinition(Json::Value const& _node);
|
|
ASTPointer<EnumValue> createEnumValue(Json::Value const& _node);
|
|
ASTPointer<ParameterList> createParameterList(Json::Value const& _node);
|
|
ASTPointer<OverrideSpecifier> createOverrideSpecifier(Json::Value const& _node);
|
|
ASTPointer<FunctionDefinition> createFunctionDefinition(Json::Value const& _node);
|
|
ASTPointer<VariableDeclaration> createVariableDeclaration(Json::Value const& _node);
|
|
ASTPointer<ModifierDefinition> createModifierDefinition(Json::Value const& _node);
|
|
ASTPointer<ModifierInvocation> createModifierInvocation(Json::Value const& _node);
|
|
ASTPointer<EventDefinition> createEventDefinition(Json::Value const& _node);
|
|
ASTPointer<ElementaryTypeName> createElementaryTypeName(Json::Value const& _node);
|
|
ASTPointer<UserDefinedTypeName> createUserDefinedTypeName(Json::Value const& _node);
|
|
ASTPointer<FunctionTypeName> createFunctionTypeName(Json::Value const& _node);
|
|
ASTPointer<Mapping> createMapping(Json::Value const& _node);
|
|
ASTPointer<ArrayTypeName> createArrayTypeName(Json::Value const& _node);
|
|
ASTPointer<InlineAssembly> createInlineAssembly(Json::Value const& _node);
|
|
ASTPointer<Block> createBlock(Json::Value const& _node);
|
|
ASTPointer<PlaceholderStatement> createPlaceholderStatement(Json::Value const& _node);
|
|
ASTPointer<IfStatement> createIfStatement(Json::Value const& _node);
|
|
ASTPointer<TryCatchClause> createTryCatchClause(Json::Value const& _node);
|
|
ASTPointer<TryStatement> createTryStatement(Json::Value const& _node);
|
|
ASTPointer<WhileStatement> createWhileStatement(Json::Value const& _node, bool _isDoWhile);
|
|
ASTPointer<ForStatement> createForStatement(Json::Value const& _node);
|
|
ASTPointer<Continue> createContinue(Json::Value const& _node);
|
|
ASTPointer<Break> createBreak(Json::Value const& _node);
|
|
ASTPointer<Return> createReturn(Json::Value const& _node);
|
|
ASTPointer<Throw> createThrow(Json::Value const& _node);
|
|
ASTPointer<EmitStatement> createEmitStatement(Json::Value const& _node);
|
|
ASTPointer<VariableDeclarationStatement> createVariableDeclarationStatement(Json::Value const& _node);
|
|
ASTPointer<ExpressionStatement> createExpressionStatement(Json::Value const& _node);
|
|
ASTPointer<Conditional> createConditional(Json::Value const& _node);
|
|
ASTPointer<Assignment> createAssignment(Json::Value const& _node);
|
|
ASTPointer<TupleExpression> createTupleExpression(Json::Value const& _node);
|
|
ASTPointer<UnaryOperation> createUnaryOperation(Json::Value const& _node);
|
|
ASTPointer<BinaryOperation> createBinaryOperation(Json::Value const& _node);
|
|
ASTPointer<FunctionCall> createFunctionCall(Json::Value const& _node);
|
|
ASTPointer<FunctionCallOptions> createFunctionCallOptions(Json::Value const& _node);
|
|
ASTPointer<NewExpression> createNewExpression(Json::Value const& _node);
|
|
ASTPointer<MemberAccess> createMemberAccess(Json::Value const& _node);
|
|
ASTPointer<IndexAccess> createIndexAccess(Json::Value const& _node);
|
|
ASTPointer<IndexRangeAccess> createIndexRangeAccess(Json::Value const& _node);
|
|
ASTPointer<Identifier> createIdentifier(Json::Value const& _node);
|
|
ASTPointer<ElementaryTypeNameExpression> createElementaryTypeNameExpression(Json::Value const& _node);
|
|
ASTPointer<ASTNode> createLiteral(Json::Value const& _node);
|
|
ASTPointer<StructuredDocumentation> 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<class T>
|
|
///@returns nullptr or an ASTPointer cast to a specific Class
|
|
ASTPointer<T> nullOrCast(Json::Value const& _json);
|
|
/// @returns nullptr or ASTString, given an JSON string or an empty field
|
|
ASTPointer<ASTString> nullOrASTString(Json::Value const& _json, std::string const& _name);
|
|
|
|
// ============== JSON to definition helpers ===============
|
|
/// \defgroup typeHelpers Json to ast-datatype helpers
|
|
/// {@
|
|
ASTPointer<ASTString> 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 ===============
|
|
/// Stores filepath as sourcenames to AST in JSON format
|
|
std::map<std::string, Json::Value> m_sourceList;
|
|
/// list of filepaths (used as sourcenames)
|
|
std::vector<std::shared_ptr<std::string const>> m_sourceLocations;
|
|
/// filepath to AST
|
|
std::map<std::string, ASTPointer<SourceUnit>> m_sourceUnits;
|
|
std::string m_currentSourceName;
|
|
/// IDs already used by the nodes
|
|
std::set<int64_t> m_usedIDs;
|
|
/// Configured EVM version
|
|
langutil::EVMVersion m_evmVersion;
|
|
};
|
|
|
|
}
|