mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Merge pull request #13182 from ethereum/identifierPath_declarations
Add all path declarations in IdentifierPath annotation
This commit is contained in:
commit
2397f09b79
@ -185,8 +185,18 @@ vector<Declaration const*> NameAndTypeResolver::nameFromCurrentScope(ASTString c
|
||||
}
|
||||
|
||||
Declaration const* NameAndTypeResolver::pathFromCurrentScope(vector<ASTString> const& _path) const
|
||||
{
|
||||
if (auto declarations = pathFromCurrentScopeWithAllDeclarations(_path); !declarations.empty())
|
||||
return declarations.back();
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
std::vector<Declaration const*> NameAndTypeResolver::pathFromCurrentScopeWithAllDeclarations(std::vector<ASTString> const& _path) const
|
||||
{
|
||||
solAssert(!_path.empty(), "");
|
||||
vector<Declaration const*> pathDeclarations;
|
||||
|
||||
vector<Declaration const*> candidates = m_currentScope->resolveName(
|
||||
_path.front(),
|
||||
/* _recursive */ true,
|
||||
@ -197,13 +207,19 @@ Declaration const* NameAndTypeResolver::pathFromCurrentScope(vector<ASTString> c
|
||||
for (size_t i = 1; i < _path.size() && candidates.size() == 1; i++)
|
||||
{
|
||||
if (!m_scopes.count(candidates.front()))
|
||||
return nullptr;
|
||||
return {};
|
||||
|
||||
pathDeclarations.push_back(candidates.front());
|
||||
|
||||
candidates = m_scopes.at(candidates.front())->resolveName(_path[i], false);
|
||||
}
|
||||
if (candidates.size() == 1)
|
||||
return candidates.front();
|
||||
{
|
||||
pathDeclarations.push_back(candidates.front());
|
||||
return pathDeclarations;
|
||||
}
|
||||
else
|
||||
return nullptr;
|
||||
return {};
|
||||
}
|
||||
|
||||
void NameAndTypeResolver::warnHomonymDeclarations() const
|
||||
|
@ -93,6 +93,10 @@ public:
|
||||
/// Should only be called during the initial resolving phase.
|
||||
/// @note Returns a null pointer if any component in the path was not unique or not found.
|
||||
Declaration const* pathFromCurrentScope(std::vector<ASTString> const& _path) const;
|
||||
/// Resolves a path starting from the "current" scope, but also searches parent scopes.
|
||||
/// Should only be called during the initial resolving phase.
|
||||
/// @note Returns an empty vector if any component in the path was non-unique or not found. Otherwise, all declarations along the path are returned.
|
||||
std::vector<Declaration const*> pathFromCurrentScopeWithAllDeclarations(std::vector<ASTString> const& _path) const;
|
||||
|
||||
/// Generate and store warnings about declarations with the same name.
|
||||
void warnHomonymDeclarations() const;
|
||||
|
@ -173,14 +173,15 @@ void ReferencesResolver::endVisit(ModifierDefinition const&)
|
||||
|
||||
void ReferencesResolver::endVisit(IdentifierPath const& _path)
|
||||
{
|
||||
Declaration const* declaration = m_resolver.pathFromCurrentScope(_path.path());
|
||||
if (!declaration)
|
||||
std::vector<Declaration const*> declarations = m_resolver.pathFromCurrentScopeWithAllDeclarations(_path.path());
|
||||
if (declarations.empty())
|
||||
{
|
||||
m_errorReporter.fatalDeclarationError(7920_error, _path.location(), "Identifier not found or not unique.");
|
||||
return;
|
||||
}
|
||||
|
||||
_path.annotation().referencedDeclaration = declaration;
|
||||
_path.annotation().referencedDeclaration = declarations.back();
|
||||
_path.annotation().pathDeclarations = std::move(declarations);
|
||||
}
|
||||
|
||||
bool ReferencesResolver::visit(InlineAssembly const& _inlineAssembly)
|
||||
|
@ -256,6 +256,9 @@ struct IdentifierPathAnnotation: ASTAnnotation
|
||||
Declaration const* referencedDeclaration = nullptr;
|
||||
/// What kind of lookup needs to be done (static, virtual, super) find the declaration.
|
||||
util::SetOnce<VirtualLookup> requiredLookup;
|
||||
|
||||
/// Declaration of each path element.
|
||||
std::vector<Declaration const*> pathDeclarations;
|
||||
};
|
||||
|
||||
struct ExpressionAnnotation: ASTAnnotation
|
||||
|
Loading…
Reference in New Issue
Block a user