Skip to content

Commit b988d3e

Browse files
authored
Merge pull request #13184 from ethereum/memberAccess_locations
Add location for member in MemberAccess ASTNode
2 parents 2e334c3 + ee710ea commit b988d3e

File tree

6 files changed

+24
-5
lines changed

6 files changed

+24
-5
lines changed

libsolidity/ast/AST.h

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2190,19 +2190,27 @@ class MemberAccess: public Expression
21902190
int64_t _id,
21912191
SourceLocation const& _location,
21922192
ASTPointer<Expression> _expression,
2193-
ASTPointer<ASTString> _memberName
2193+
ASTPointer<ASTString> _memberName,
2194+
SourceLocation _memberLocation
21942195
):
2195-
Expression(_id, _location), m_expression(std::move(_expression)), m_memberName(std::move(_memberName)) {}
2196+
Expression(_id, _location),
2197+
m_expression(std::move(_expression)),
2198+
m_memberName(std::move(_memberName)),
2199+
m_memberLocation(std::move(_memberLocation))
2200+
{}
2201+
21962202
void accept(ASTVisitor& _visitor) override;
21972203
void accept(ASTConstVisitor& _visitor) const override;
21982204
Expression const& expression() const { return *m_expression; }
21992205
ASTString const& memberName() const { return *m_memberName; }
2206+
SourceLocation const& memberLocation() const { return m_memberLocation; }
22002207

22012208
MemberAccessAnnotation& annotation() const override;
22022209

22032210
private:
22042211
ASTPointer<Expression> m_expression;
22052212
ASTPointer<ASTString> m_memberName;
2213+
SourceLocation m_memberLocation;
22062214
};
22072215

22082216
/**

libsolidity/ast/ASTJsonExporter.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -889,6 +889,7 @@ bool ASTJsonExporter::visit(MemberAccess const& _node)
889889
{
890890
std::vector<pair<string, Json::Value>> attributes = {
891891
make_pair("memberName", _node.memberName()),
892+
make_pair("memberLocation", Json::Value(sourceLocationToString(_node.memberLocation()))),
892893
make_pair("expression", toJson(_node.expression())),
893894
make_pair("referencedDeclaration", idOrNull(_node.annotation().referencedDeclaration)),
894895
};

libsolidity/ast/ASTJsonImporter.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -931,10 +931,15 @@ ASTPointer<NewExpression> ASTJsonImporter::createNewExpression(Json::Value const
931931

932932
ASTPointer<MemberAccess> ASTJsonImporter::createMemberAccess(Json::Value const& _node)
933933
{
934+
SourceLocation memberLocation;
935+
if (member(_node, "memberLocation").isString())
936+
memberLocation = solidity::langutil::parseSourceLocation(_node["memberLocation"].asString(), m_sourceNames);
937+
934938
return createASTNode<MemberAccess>(
935939
_node,
936940
convertJsonToASTNode<Expression>(member(_node, "expression")),
937-
memberAsASTString(_node, "memberName")
941+
memberAsASTString(_node, "memberName"),
942+
std::move(memberLocation)
938943
);
939944
}
940945

libsolidity/parsing/Parser.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1897,7 +1897,9 @@ ASTPointer<Expression> Parser::parseLeftHandSideExpression(
18971897
{
18981898
advance();
18991899
nodeFactory.markEndPosition();
1900-
expression = nodeFactory.createNode<MemberAccess>(expression, expectIdentifierTokenOrAddress());
1900+
SourceLocation memberLocation = currentLocation();
1901+
ASTPointer<ASTString> memberName = expectIdentifierTokenOrAddress();
1902+
expression = nodeFactory.createNode<MemberAccess>(expression, std::move(memberName), std::move(memberLocation));
19011903
break;
19021904
}
19031905
case Token::LParen:
@@ -2335,7 +2337,8 @@ ASTPointer<Expression> Parser::expressionFromIndexAccessStructure(
23352337
Identifier const& identifier = dynamic_cast<Identifier const&>(*_iap.path[i]);
23362338
expression = nodeFactory.createNode<MemberAccess>(
23372339
expression,
2338-
make_shared<ASTString>(identifier.name())
2340+
make_shared<ASTString>(identifier.name()),
2341+
identifier.location()
23392342
);
23402343
}
23412344
for (auto const& index: _iap.indices)

test/libsolidity/ASTJSON/enum_value_declaration.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@
7070
"isLValue": false,
7171
"isPure": true,
7272
"lValueRequested": false,
73+
"memberLocation": "57:1:1",
7374
"memberName": "X",
7475
"nodeType": "MemberAccess",
7576
"referencedDeclaration": 1,

test/libsolidity/ASTJSON/enum_value_declaration_parseOnly.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
"typeDescriptions": {}
5050
},
5151
"id": 10,
52+
"memberLocation": "57:1:1",
5253
"memberName": "X",
5354
"nodeType": "MemberAccess",
5455
"src": "55:3:1",

0 commit comments

Comments
 (0)