mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Stop after parsing.
This commit is contained in:
committed by
Mathias Baumann
parent
4c02cd2310
commit
fda8bde2d7
@@ -23,6 +23,7 @@
|
||||
#include <libsolidity/ast/ASTJsonConverter.h>
|
||||
|
||||
#include <libsolidity/ast/AST.h>
|
||||
#include <libsolidity/ast/TypeProvider.h>
|
||||
|
||||
#include <libyul/AsmJsonConverter.h>
|
||||
#include <libyul/AsmData.h>
|
||||
@@ -69,8 +70,9 @@ void addIfSet(std::vector<pair<string, Json::Value>>& _attributes, string const&
|
||||
namespace solidity::frontend
|
||||
{
|
||||
|
||||
ASTJsonConverter::ASTJsonConverter(bool _legacy, map<string, unsigned> _sourceIndices):
|
||||
ASTJsonConverter::ASTJsonConverter(bool _legacy, CompilerStack::State _stackState, map<string, unsigned> _sourceIndices):
|
||||
m_legacy(_legacy),
|
||||
m_stackState(_stackState),
|
||||
m_sourceIndices(std::move(_sourceIndices))
|
||||
{
|
||||
}
|
||||
@@ -204,7 +206,6 @@ void ASTJsonConverter::appendExpressionAttributes(
|
||||
{
|
||||
std::vector<pair<string, Json::Value>> exprAttributes = {
|
||||
make_pair("typeDescriptions", typePointerToJson(_annotation.type)),
|
||||
make_pair("lValueRequested", _annotation.willBeWrittenTo),
|
||||
make_pair("argumentTypes", typePointerToJson(_annotation.arguments))
|
||||
};
|
||||
|
||||
@@ -212,6 +213,9 @@ void ASTJsonConverter::appendExpressionAttributes(
|
||||
addIfSet(exprAttributes, "isPure", _annotation.isPure);
|
||||
addIfSet(exprAttributes, "isConstant", _annotation.isConstant);
|
||||
|
||||
if (m_stackState > CompilerStack::State::ParsedAndImported)
|
||||
exprAttributes.emplace_back("lValueRequested", _annotation.willBeWrittenTo);
|
||||
|
||||
_attributes += exprAttributes;
|
||||
}
|
||||
|
||||
@@ -260,6 +264,7 @@ bool ASTJsonConverter::visit(SourceUnit const& _node)
|
||||
addIfSet(attributes, "absolutePath", _node.annotation().path);
|
||||
|
||||
setJsonNode(_node, "SourceUnit", std::move(attributes));
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -268,7 +273,7 @@ bool ASTJsonConverter::visit(PragmaDirective const& _node)
|
||||
Json::Value literals(Json::arrayValue);
|
||||
for (auto const& literal: _node.literals())
|
||||
literals.append(literal);
|
||||
setJsonNode( _node, "PragmaDirective", {
|
||||
setJsonNode(_node, "PragmaDirective", {
|
||||
make_pair("literals", std::move(literals))
|
||||
});
|
||||
return false;
|
||||
@@ -278,7 +283,7 @@ bool ASTJsonConverter::visit(ImportDirective const& _node)
|
||||
{
|
||||
std::vector<pair<string, Json::Value>> attributes = {
|
||||
make_pair("file", _node.path()),
|
||||
make_pair(m_legacy ? "SourceUnit" : "sourceUnit", nodeId(*_node.annotation().sourceUnit)),
|
||||
make_pair(m_legacy ? "SourceUnit" : "sourceUnit", idOrNull(_node.annotation().sourceUnit)),
|
||||
make_pair("scope", idOrNull(_node.scope()))
|
||||
};
|
||||
|
||||
@@ -395,18 +400,11 @@ bool ASTJsonConverter::visit(OverrideSpecifier const& _node)
|
||||
|
||||
bool ASTJsonConverter::visit(FunctionDefinition const& _node)
|
||||
{
|
||||
Visibility visibility;
|
||||
if (_node.isConstructor())
|
||||
visibility = _node.annotation().contract->abstract() ? Visibility::Internal : Visibility::Public;
|
||||
else
|
||||
visibility = _node.visibility();
|
||||
|
||||
std::vector<pair<string, Json::Value>> attributes = {
|
||||
make_pair("name", _node.name()),
|
||||
make_pair("documentation", _node.documentation() ? toJson(*_node.documentation()) : Json::nullValue),
|
||||
make_pair("kind", _node.isFree() ? "freeFunction" : TokenTraits::toString(_node.kind())),
|
||||
make_pair("stateMutability", stateMutabilityToString(_node.stateMutability())),
|
||||
make_pair("visibility", Declaration::visibilityToString(visibility)),
|
||||
make_pair("virtual", _node.markedVirtual()),
|
||||
make_pair("overrides", _node.overrides() ? toJson(*_node.overrides()) : Json::nullValue),
|
||||
make_pair("parameters", toJson(_node.parameterList())),
|
||||
@@ -417,7 +415,19 @@ bool ASTJsonConverter::visit(FunctionDefinition const& _node)
|
||||
make_pair("scope", idOrNull(_node.scope()))
|
||||
};
|
||||
|
||||
if (_node.isPartOfExternalInterface())
|
||||
optional<Visibility> visibility;
|
||||
if (_node.isConstructor())
|
||||
{
|
||||
if (_node.annotation().contract)
|
||||
visibility = _node.annotation().contract->abstract() ? Visibility::Internal : Visibility::Public;
|
||||
}
|
||||
else
|
||||
visibility = _node.visibility();
|
||||
|
||||
if (visibility)
|
||||
attributes.emplace_back("visibility", Declaration::visibilityToString(*visibility));
|
||||
|
||||
if (_node.isPartOfExternalInterface() && m_stackState > CompilerStack::State::ParsedAndImported)
|
||||
attributes.emplace_back("functionSelector", _node.externalIdentifierHex());
|
||||
if (!_node.annotation().baseFunctions.empty())
|
||||
attributes.emplace_back(make_pair("baseFunctions", getContainerIds(_node.annotation().baseFunctions, true)));
|
||||
@@ -718,7 +728,7 @@ bool ASTJsonConverter::visit(Assignment const& _node)
|
||||
make_pair("rightHandSide", toJson(_node.rightHandSide()))
|
||||
};
|
||||
appendExpressionAttributes(attributes, _node.annotation());
|
||||
setJsonNode( _node, "Assignment", std::move(attributes));
|
||||
setJsonNode(_node, "Assignment", std::move(attributes));
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -770,15 +780,19 @@ bool ASTJsonConverter::visit(FunctionCall const& _node)
|
||||
make_pair("tryCall", _node.annotation().tryCall)
|
||||
};
|
||||
|
||||
FunctionCallKind nodeKind = *_node.annotation().kind;
|
||||
|
||||
if (m_legacy)
|
||||
if (_node.annotation().kind.set())
|
||||
{
|
||||
attributes.emplace_back("isStructConstructorCall", nodeKind == FunctionCallKind::StructConstructorCall);
|
||||
attributes.emplace_back("type_conversion", nodeKind == FunctionCallKind::TypeConversion);
|
||||
FunctionCallKind nodeKind = *_node.annotation().kind;
|
||||
|
||||
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));
|
||||
}
|
||||
else
|
||||
attributes.emplace_back("kind", functionCallKind(nodeKind));
|
||||
|
||||
appendExpressionAttributes(attributes, _node.annotation());
|
||||
setJsonNode(_node, "FunctionCall", std::move(attributes));
|
||||
return false;
|
||||
|
||||
@@ -25,6 +25,7 @@
|
||||
|
||||
#include <libsolidity/ast/ASTAnnotations.h>
|
||||
#include <libsolidity/ast/ASTVisitor.h>
|
||||
#include <libsolidity/interface/CompilerStack.h>
|
||||
#include <liblangutil/Exceptions.h>
|
||||
|
||||
#include <json/json.h>
|
||||
@@ -51,9 +52,11 @@ class ASTJsonConverter: public ASTConstVisitor
|
||||
public:
|
||||
/// 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 _sourceIndices is used to abbreviate source names in source locations.
|
||||
explicit ASTJsonConverter(
|
||||
bool _legacy,
|
||||
CompilerStack::State _stackState,
|
||||
std::map<std::string, unsigned> _sourceIndices = std::map<std::string, unsigned>()
|
||||
);
|
||||
/// Output the json representation of the AST to _stream.
|
||||
@@ -189,6 +192,7 @@ private:
|
||||
}
|
||||
|
||||
bool m_legacy = false; ///< if true, use legacy format
|
||||
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
|
||||
Json::Value m_currentValue;
|
||||
std::map<std::string, unsigned> m_sourceIndices;
|
||||
|
||||
@@ -140,7 +140,9 @@ util::Result<TypePointers> transformParametersToExternal(TypePointers const& _pa
|
||||
|
||||
for (auto const& type: _parameters)
|
||||
{
|
||||
if (TypePointer ext = type->interfaceType(_inLibrary).get())
|
||||
if (!type)
|
||||
return util::Result<TypePointers>::err("Type information not present.");
|
||||
else if (TypePointer ext = type->interfaceType(_inLibrary).get())
|
||||
transformed.push_back(ext);
|
||||
else
|
||||
return util::Result<TypePointers>::err("Parameter should have external type.");
|
||||
|
||||
Reference in New Issue
Block a user