Improve parsing of Solidity 0.8

pull/815/head
Josselin 4 years ago
parent 719d22c42d
commit 2023f9997d
  1. 28
      slither/solc_parsing/expressions/expression_parsing.py

@ -892,6 +892,15 @@ def parse_expression(expression: Dict, caller_context: CallerContext) -> "Expres
assert type_name[caller_context.get_key()] == "UserDefinedTypeName"
if is_compact_ast:
# 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"]
@ -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)

Loading…
Cancel
Save