mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Add annotation field `requiresVirtualLookup`
This commit is contained in:
@@ -125,7 +125,7 @@ bool ImmutableValidator::visit(WhileStatement const& _whileStatement)
|
||||
void ImmutableValidator::endVisit(Identifier const& _identifier)
|
||||
{
|
||||
if (auto const callableDef = dynamic_cast<CallableDeclaration const*>(_identifier.annotation().referencedDeclaration))
|
||||
visitCallableIfNew(callableDef->resolveVirtual(m_currentContract));
|
||||
visitCallableIfNew(*_identifier.annotation().requiredLookup == VirtualLookup::Virtual ? callableDef->resolveVirtual(m_currentContract) : *callableDef);
|
||||
if (auto const varDecl = dynamic_cast<VariableDeclaration const*>(_identifier.annotation().referencedDeclaration))
|
||||
analyseVariableReference(*varDecl, _identifier);
|
||||
}
|
||||
|
||||
@@ -2544,8 +2544,10 @@ bool TypeChecker::visit(MemberAccess const& _memberAccess)
|
||||
TypePointer exprType = type(_memberAccess.expression());
|
||||
ASTString const& memberName = _memberAccess.memberName();
|
||||
|
||||
auto& annotation = _memberAccess.annotation();
|
||||
|
||||
// Retrieve the types of the arguments if this is used to call a function.
|
||||
auto const& arguments = _memberAccess.annotation().arguments;
|
||||
auto const& arguments = annotation.arguments;
|
||||
MemberList::MemberMap possibleMembers = exprType->members(currentDefinitionScope()).membersByName(memberName);
|
||||
size_t const initialMemberCount = possibleMembers.size();
|
||||
if (initialMemberCount > 1 && arguments)
|
||||
@@ -2561,8 +2563,6 @@ bool TypeChecker::visit(MemberAccess const& _memberAccess)
|
||||
++it;
|
||||
}
|
||||
|
||||
auto& annotation = _memberAccess.annotation();
|
||||
|
||||
annotation.isConstant = false;
|
||||
|
||||
if (possibleMembers.empty())
|
||||
@@ -2661,6 +2661,8 @@ bool TypeChecker::visit(MemberAccess const& _memberAccess)
|
||||
annotation.referencedDeclaration = possibleMembers.front().declaration;
|
||||
annotation.type = possibleMembers.front().type;
|
||||
|
||||
VirtualLookup requiredLookup = VirtualLookup::Static;
|
||||
|
||||
if (auto funType = dynamic_cast<FunctionType const*>(annotation.type))
|
||||
{
|
||||
solAssert(
|
||||
@@ -2679,8 +2681,15 @@ bool TypeChecker::visit(MemberAccess const& _memberAccess)
|
||||
_memberAccess.location(),
|
||||
"Using \"." + memberName + "(...)\" is deprecated. Use \"{" + memberName + ": ...}\" instead."
|
||||
);
|
||||
|
||||
if (!funType->bound())
|
||||
if (auto contractType = dynamic_cast<ContractType const*>(exprType))
|
||||
requiredLookup = contractType->isSuper() ? VirtualLookup::Super : VirtualLookup::Virtual;
|
||||
|
||||
}
|
||||
|
||||
annotation.requiredLookup = requiredLookup;
|
||||
|
||||
if (auto const* structType = dynamic_cast<StructType const*>(exprType))
|
||||
annotation.isLValue = !structType->dataStoredIn(DataLocation::CallData);
|
||||
else if (exprType->category() == Type::Category::Array)
|
||||
@@ -3076,6 +3085,10 @@ bool TypeChecker::visit(Identifier const& _identifier)
|
||||
|
||||
annotation.isConstant = isConstant;
|
||||
|
||||
annotation.requiredLookup =
|
||||
dynamic_cast<CallableDeclaration const*>(annotation.referencedDeclaration) ?
|
||||
VirtualLookup::Virtual : VirtualLookup::Static;
|
||||
|
||||
// Check for deprecated function names.
|
||||
// The check is done here for the case without an actual function call.
|
||||
if (FunctionType const* fType = dynamic_cast<FunctionType const*>(_identifier.annotation().type))
|
||||
|
||||
Reference in New Issue
Block a user