mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Make ambigous override checker generic.
This commit is contained in:
@@ -312,6 +312,16 @@ ContractDefinition::ContractKind FunctionDefinition::inContractKind() const
|
||||
return contractDef->contractKind();
|
||||
}
|
||||
|
||||
CallableDeclarationAnnotation& CallableDeclaration::annotation() const
|
||||
{
|
||||
solAssert(
|
||||
m_annotation,
|
||||
"CallableDeclarationAnnotation is an abstract base, need to call annotation on the concrete class first."
|
||||
);
|
||||
return dynamic_cast<CallableDeclarationAnnotation&>(*m_annotation);
|
||||
}
|
||||
|
||||
|
||||
FunctionTypePointer FunctionDefinition::functionType(bool _internal) const
|
||||
{
|
||||
if (_internal)
|
||||
|
||||
@@ -624,6 +624,8 @@ public:
|
||||
bool markedVirtual() const { return m_isVirtual; }
|
||||
virtual bool virtualSemantics() const { return markedVirtual(); }
|
||||
|
||||
CallableDeclarationAnnotation& annotation() const override;
|
||||
|
||||
protected:
|
||||
ASTPointer<ParameterList> m_parameters;
|
||||
ASTPointer<OverrideSpecifier> m_overrides;
|
||||
|
||||
@@ -104,19 +104,23 @@ struct ContractDefinitionAnnotation: TypeDeclarationAnnotation, DocumentedAnnota
|
||||
std::map<FunctionDefinition const*, ASTNode const*> baseConstructorArguments;
|
||||
};
|
||||
|
||||
struct FunctionDefinitionAnnotation: ASTAnnotation, DocumentedAnnotation
|
||||
struct CallableDeclarationAnnotation: ASTAnnotation
|
||||
{
|
||||
/// The set of functions/modifiers/events this callable overrides.
|
||||
std::set<CallableDeclaration const*> baseFunctions;
|
||||
};
|
||||
|
||||
struct FunctionDefinitionAnnotation: CallableDeclarationAnnotation, DocumentedAnnotation
|
||||
{
|
||||
/// The set of functions this function overrides.
|
||||
std::set<FunctionDefinition const*> baseFunctions;
|
||||
/// Pointer to the contract this function is defined in
|
||||
ContractDefinition const* contract = nullptr;
|
||||
};
|
||||
|
||||
struct EventDefinitionAnnotation: ASTAnnotation, DocumentedAnnotation
|
||||
struct EventDefinitionAnnotation: CallableDeclarationAnnotation, DocumentedAnnotation
|
||||
{
|
||||
};
|
||||
|
||||
struct ModifierDefinitionAnnotation: ASTAnnotation, DocumentedAnnotation
|
||||
struct ModifierDefinitionAnnotation: CallableDeclarationAnnotation, DocumentedAnnotation
|
||||
{
|
||||
};
|
||||
|
||||
|
||||
@@ -392,7 +392,7 @@ bool ASTJsonConverter::visit(VariableDeclaration const& _node)
|
||||
|
||||
bool ASTJsonConverter::visit(ModifierDefinition const& _node)
|
||||
{
|
||||
setJsonNode(_node, "ModifierDefinition", {
|
||||
std::vector<pair<string, Json::Value>> attributes = {
|
||||
make_pair("name", _node.name()),
|
||||
make_pair("documentation", _node.documentation() ? Json::Value(*_node.documentation()) : Json::nullValue),
|
||||
make_pair("visibility", Declaration::visibilityToString(_node.visibility())),
|
||||
@@ -400,7 +400,10 @@ bool ASTJsonConverter::visit(ModifierDefinition const& _node)
|
||||
make_pair("virtual", _node.markedVirtual()),
|
||||
make_pair("overrides", _node.overrides() ? toJson(*_node.overrides()) : Json::nullValue),
|
||||
make_pair("body", toJson(_node.body()))
|
||||
});
|
||||
};
|
||||
if (!_node.annotation().baseFunctions.empty())
|
||||
attributes.emplace_back(make_pair("baseModifiers", getContainerIds(_node.annotation().baseFunctions, true)));
|
||||
setJsonNode(_node, "ModifierDefinition", std::move(attributes));
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user