mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
libsolidity: Extend the AST for named AST nodes in order to get precise locations for names.
The actual SourceLocation on an ASTNode is representing the whole ASTNode whereas in an LSP (for example) you are also interested in the SourceLocation of a name of a construct (e.g. variable decarlation, function definition, ...). This also properly encodes non-existend sources as `-1` in the JSON output (eliminating the use of `numeric_limits<size_t>::max()`).
This commit is contained in:
committed by
chriseth
parent
72c6932bf5
commit
32ba5f5ae7
+24
-12
@@ -244,12 +244,14 @@ public:
|
||||
int64_t _id,
|
||||
SourceLocation const& _location,
|
||||
ASTPointer<ASTString> _name,
|
||||
SourceLocation _nameLocation,
|
||||
Visibility _visibility = Visibility::Default
|
||||
):
|
||||
ASTNode(_id, _location), m_name(std::move(_name)), m_visibility(_visibility) {}
|
||||
ASTNode(_id, _location), m_name(std::move(_name)), m_nameLocation(std::move(_nameLocation)), m_visibility(_visibility) {}
|
||||
|
||||
/// @returns the declared name.
|
||||
ASTString const& name() const { return *m_name; }
|
||||
SourceLocation const& nameLocation() const noexcept { return m_nameLocation; }
|
||||
bool noVisibilitySpecified() const { return m_visibility == Visibility::Default; }
|
||||
Visibility visibility() const { return m_visibility == Visibility::Default ? defaultVisibility() : m_visibility; }
|
||||
bool isPublic() const { return visibility() >= Visibility::Public; }
|
||||
@@ -287,6 +289,7 @@ protected:
|
||||
|
||||
private:
|
||||
ASTPointer<ASTString> m_name;
|
||||
SourceLocation m_nameLocation;
|
||||
Visibility m_visibility;
|
||||
};
|
||||
|
||||
@@ -345,9 +348,10 @@ public:
|
||||
SourceLocation const& _location,
|
||||
ASTPointer<ASTString> _path,
|
||||
ASTPointer<ASTString> const& _unitAlias,
|
||||
SourceLocation _unitAliasLocation,
|
||||
SymbolAliasList _symbolAliases
|
||||
):
|
||||
Declaration(_id, _location, _unitAlias),
|
||||
Declaration(_id, _location, _unitAlias, std::move(_unitAliasLocation)),
|
||||
m_path(std::move(_path)),
|
||||
m_symbolAliases(move(_symbolAliases))
|
||||
{ }
|
||||
@@ -477,13 +481,14 @@ public:
|
||||
int64_t _id,
|
||||
SourceLocation const& _location,
|
||||
ASTPointer<ASTString> const& _name,
|
||||
SourceLocation _nameLocation,
|
||||
ASTPointer<StructuredDocumentation> const& _documentation,
|
||||
std::vector<ASTPointer<InheritanceSpecifier>> _baseContracts,
|
||||
std::vector<ASTPointer<ASTNode>> _subNodes,
|
||||
ContractKind _contractKind = ContractKind::Contract,
|
||||
bool _abstract = false
|
||||
):
|
||||
Declaration(_id, _location, _name),
|
||||
Declaration(_id, _location, _name, std::move(_nameLocation)),
|
||||
StructurallyDocumented(_documentation),
|
||||
m_baseContracts(std::move(_baseContracts)),
|
||||
m_subNodes(std::move(_subNodes)),
|
||||
@@ -643,9 +648,10 @@ public:
|
||||
int64_t _id,
|
||||
SourceLocation const& _location,
|
||||
ASTPointer<ASTString> const& _name,
|
||||
SourceLocation _nameLocation,
|
||||
std::vector<ASTPointer<VariableDeclaration>> _members
|
||||
):
|
||||
Declaration(_id, _location, _name), m_members(std::move(_members)) {}
|
||||
Declaration(_id, _location, _name, std::move(_nameLocation)), m_members(std::move(_members)) {}
|
||||
|
||||
void accept(ASTVisitor& _visitor) override;
|
||||
void accept(ASTConstVisitor& _visitor) const override;
|
||||
@@ -670,9 +676,10 @@ public:
|
||||
int64_t _id,
|
||||
SourceLocation const& _location,
|
||||
ASTPointer<ASTString> const& _name,
|
||||
SourceLocation _nameLocation,
|
||||
std::vector<ASTPointer<EnumValue>> _members
|
||||
):
|
||||
Declaration(_id, _location, _name), m_members(std::move(_members)) {}
|
||||
Declaration(_id, _location, _name, std::move(_nameLocation)), m_members(std::move(_members)) {}
|
||||
void accept(ASTVisitor& _visitor) override;
|
||||
void accept(ASTConstVisitor& _visitor) const override;
|
||||
|
||||
@@ -696,7 +703,7 @@ class EnumValue: public Declaration
|
||||
{
|
||||
public:
|
||||
EnumValue(int64_t _id, SourceLocation const& _location, ASTPointer<ASTString> const& _name):
|
||||
Declaration(_id, _location, _name) {}
|
||||
Declaration(_id, _location, _name, _location) {}
|
||||
|
||||
void accept(ASTVisitor& _visitor) override;
|
||||
void accept(ASTConstVisitor& _visitor) const override;
|
||||
@@ -738,13 +745,14 @@ public:
|
||||
int64_t _id,
|
||||
SourceLocation const& _location,
|
||||
ASTPointer<ASTString> const& _name,
|
||||
SourceLocation _nameLocation,
|
||||
Visibility _visibility,
|
||||
ASTPointer<ParameterList> _parameters,
|
||||
bool _isVirtual = false,
|
||||
ASTPointer<OverrideSpecifier> _overrides = nullptr,
|
||||
ASTPointer<ParameterList> _returnParameters = ASTPointer<ParameterList>()
|
||||
):
|
||||
Declaration(_id, _location, _name, _visibility),
|
||||
Declaration(_id, _location, _name, std::move(_nameLocation), _visibility),
|
||||
m_parameters(std::move(_parameters)),
|
||||
m_overrides(std::move(_overrides)),
|
||||
m_returnParameters(std::move(_returnParameters)),
|
||||
@@ -815,6 +823,7 @@ public:
|
||||
int64_t _id,
|
||||
SourceLocation const& _location,
|
||||
ASTPointer<ASTString> const& _name,
|
||||
SourceLocation const& _nameLocation,
|
||||
Visibility _visibility,
|
||||
StateMutability _stateMutability,
|
||||
bool _free,
|
||||
@@ -827,7 +836,7 @@ public:
|
||||
ASTPointer<ParameterList> const& _returnParameters,
|
||||
ASTPointer<Block> const& _body
|
||||
):
|
||||
CallableDeclaration(_id, _location, _name, _visibility, _parameters, _isVirtual, _overrides, _returnParameters),
|
||||
CallableDeclaration(_id, _location, _name, std::move(_nameLocation), _visibility, _parameters, _isVirtual, _overrides, _returnParameters),
|
||||
StructurallyDocumented(_documentation),
|
||||
ImplementationOptional(_body != nullptr),
|
||||
m_stateMutability(_stateMutability),
|
||||
@@ -928,6 +937,7 @@ public:
|
||||
SourceLocation const& _location,
|
||||
ASTPointer<TypeName> _type,
|
||||
ASTPointer<ASTString> const& _name,
|
||||
SourceLocation _nameLocation,
|
||||
ASTPointer<Expression> _value,
|
||||
Visibility _visibility,
|
||||
ASTPointer<StructuredDocumentation> const _documentation = nullptr,
|
||||
@@ -936,7 +946,7 @@ public:
|
||||
ASTPointer<OverrideSpecifier> _overrides = nullptr,
|
||||
Location _referenceLocation = Location::Unspecified
|
||||
):
|
||||
Declaration(_id, _location, _name, _visibility),
|
||||
Declaration(_id, _location, _name, std::move(_nameLocation), _visibility),
|
||||
StructurallyDocumented(std::move(_documentation)),
|
||||
m_typeName(std::move(_type)),
|
||||
m_value(std::move(_value)),
|
||||
@@ -1033,13 +1043,14 @@ public:
|
||||
int64_t _id,
|
||||
SourceLocation const& _location,
|
||||
ASTPointer<ASTString> const& _name,
|
||||
SourceLocation _nameLocation,
|
||||
ASTPointer<StructuredDocumentation> const& _documentation,
|
||||
ASTPointer<ParameterList> const& _parameters,
|
||||
bool _isVirtual,
|
||||
ASTPointer<OverrideSpecifier> const& _overrides,
|
||||
ASTPointer<Block> const& _body
|
||||
):
|
||||
CallableDeclaration(_id, _location, _name, Visibility::Internal, _parameters, _isVirtual, _overrides),
|
||||
CallableDeclaration(_id, _location, _name, std::move(_nameLocation), Visibility::Internal, _parameters, _isVirtual, _overrides),
|
||||
StructurallyDocumented(_documentation),
|
||||
ImplementationOptional(_body != nullptr),
|
||||
m_body(_body)
|
||||
@@ -1108,11 +1119,12 @@ public:
|
||||
int64_t _id,
|
||||
SourceLocation const& _location,
|
||||
ASTPointer<ASTString> const& _name,
|
||||
SourceLocation _nameLocation,
|
||||
ASTPointer<StructuredDocumentation> const& _documentation,
|
||||
ASTPointer<ParameterList> const& _parameters,
|
||||
bool _anonymous = false
|
||||
):
|
||||
CallableDeclaration(_id, _location, _name, Visibility::Default, _parameters),
|
||||
CallableDeclaration(_id, _location, _name, std::move(_nameLocation), Visibility::Default, _parameters),
|
||||
StructurallyDocumented(_documentation),
|
||||
m_anonymous(_anonymous)
|
||||
{
|
||||
@@ -1151,7 +1163,7 @@ class MagicVariableDeclaration: public Declaration
|
||||
{
|
||||
public:
|
||||
MagicVariableDeclaration(int _id, ASTString const& _name, Type const* _type):
|
||||
Declaration(_id, SourceLocation(), std::make_shared<ASTString>(_name)), m_type(_type) { }
|
||||
Declaration(_id, SourceLocation(), std::make_shared<ASTString>(_name), {}), m_type(_type) { }
|
||||
|
||||
void accept(ASTVisitor&) override
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user