Skip to content

Commit

Permalink
Improve parsing of Solidity 0.8
Browse files Browse the repository at this point in the history
  • Loading branch information
montyly committed Mar 29, 2021
1 parent 719d22c commit 2023f99
Showing 1 changed file with 29 additions and 1 deletion.
30 changes: 29 additions & 1 deletion slither/solc_parsing/expressions/expression_parsing.py
Original file line number Diff line number Diff line change
Expand Up @@ -892,7 +892,16 @@ def parse_expression(expression: Dict, caller_context: CallerContext) -> "Expres
assert type_name[caller_context.get_key()] == "UserDefinedTypeName"

if is_compact_ast:
contract_name = type_name["name"]

# Changed introduced in Solidity 0.8
# see https://github.com/crytic/slither/issues/794

# TODO explore more the changes introduced in 0.8 and the usage of pathNode/IdentifierPath
if "name" not in type_name:
assert 'pathNode' in type_name and 'name' in type_name['pathNode']
contract_name = type_name['pathNode']['name']
else:
contract_name = type_name["name"]
else:
contract_name = type_name["attributes"]["name"]
new = NewContract(contract_name)
Expand Down Expand Up @@ -924,4 +933,23 @@ def parse_expression(expression: Dict, caller_context: CallerContext) -> "Expres
base = parse_expression(expression["baseExpression"], caller_context)
return base

# Introduced with solc 0.8
if name == "IdentifierPath":

if caller_context.is_compact_ast:
value = expression["name"]

if "referencedDeclaration" in expression:
referenced_declaration = expression["referencedDeclaration"]
else:
referenced_declaration = None

var = find_variable(value, caller_context, referenced_declaration)

identifier = Identifier(var)
identifier.set_offset(src, caller_context.slither)
return identifier

raise ParsingError('IdentifierPath not currently supported for the legacy ast')

raise ParsingError("Expression not parsed %s" % name)

0 comments on commit 2023f99

Please sign in to comment.