Remove plain new operators from AST.

This commit is contained in:
chriseth 2019-11-27 18:03:09 +01:00
parent 0bb88dabb7
commit 23181f549e
2 changed files with 25 additions and 30 deletions

View File

@ -55,11 +55,6 @@ ASTNode::ASTNode(SourceLocation const& _location):
{ {
} }
ASTNode::~ASTNode()
{
delete m_annotation;
}
void ASTNode::resetID() void ASTNode::resetID()
{ {
IDDispenser::reset(); IDDispenser::reset();
@ -68,14 +63,14 @@ void ASTNode::resetID()
ASTAnnotation& ASTNode::annotation() const ASTAnnotation& ASTNode::annotation() const
{ {
if (!m_annotation) if (!m_annotation)
m_annotation = new ASTAnnotation(); m_annotation = make_unique<ASTAnnotation>();
return *m_annotation; return *m_annotation;
} }
SourceUnitAnnotation& SourceUnit::annotation() const SourceUnitAnnotation& SourceUnit::annotation() const
{ {
if (!m_annotation) if (!m_annotation)
m_annotation = new SourceUnitAnnotation(); m_annotation = make_unique<SourceUnitAnnotation>();
return dynamic_cast<SourceUnitAnnotation&>(*m_annotation); return dynamic_cast<SourceUnitAnnotation&>(*m_annotation);
} }
@ -99,7 +94,7 @@ set<SourceUnit const*> SourceUnit::referencedSourceUnits(bool _recurse, set<Sour
ImportAnnotation& ImportDirective::annotation() const ImportAnnotation& ImportDirective::annotation() const
{ {
if (!m_annotation) if (!m_annotation)
m_annotation = new ImportAnnotation(); m_annotation = make_unique<ImportAnnotation>();
return dynamic_cast<ImportAnnotation&>(*m_annotation); return dynamic_cast<ImportAnnotation&>(*m_annotation);
} }
@ -168,7 +163,7 @@ vector<EventDefinition const*> const& ContractDefinition::interfaceEvents() cons
if (!m_interfaceEvents) if (!m_interfaceEvents)
{ {
set<string> eventsSeen; set<string> eventsSeen;
m_interfaceEvents.reset(new vector<EventDefinition const*>()); m_interfaceEvents = make_unique<vector<EventDefinition const*>>();
for (ContractDefinition const* contract: annotation().linearizedBaseContracts) for (ContractDefinition const* contract: annotation().linearizedBaseContracts)
for (EventDefinition const* e: contract->events()) for (EventDefinition const* e: contract->events())
{ {
@ -193,7 +188,7 @@ vector<pair<FixedHash<4>, FunctionTypePointer>> const& ContractDefinition::inter
if (!m_interfaceFunctionList) if (!m_interfaceFunctionList)
{ {
set<string> signaturesSeen; set<string> signaturesSeen;
m_interfaceFunctionList.reset(new vector<pair<FixedHash<4>, FunctionTypePointer>>()); m_interfaceFunctionList = make_unique<vector<pair<FixedHash<4>, FunctionTypePointer>>>();
for (ContractDefinition const* contract: annotation().linearizedBaseContracts) for (ContractDefinition const* contract: annotation().linearizedBaseContracts)
{ {
vector<FunctionTypePointer> functions; vector<FunctionTypePointer> functions;
@ -225,7 +220,7 @@ vector<Declaration const*> const& ContractDefinition::inheritableMembers() const
{ {
if (!m_inheritableMembers) if (!m_inheritableMembers)
{ {
m_inheritableMembers.reset(new vector<Declaration const*>()); m_inheritableMembers = make_unique<vector<Declaration const*>>();
auto addInheritableMember = [&](Declaration const* _decl) auto addInheritableMember = [&](Declaration const* _decl)
{ {
solAssert(_decl, "addInheritableMember got a nullpointer."); solAssert(_decl, "addInheritableMember got a nullpointer.");
@ -259,14 +254,14 @@ TypePointer ContractDefinition::type() const
ContractDefinitionAnnotation& ContractDefinition::annotation() const ContractDefinitionAnnotation& ContractDefinition::annotation() const
{ {
if (!m_annotation) if (!m_annotation)
m_annotation = new ContractDefinitionAnnotation(); m_annotation = make_unique<ContractDefinitionAnnotation>();
return dynamic_cast<ContractDefinitionAnnotation&>(*m_annotation); return dynamic_cast<ContractDefinitionAnnotation&>(*m_annotation);
} }
TypeNameAnnotation& TypeName::annotation() const TypeNameAnnotation& TypeName::annotation() const
{ {
if (!m_annotation) if (!m_annotation)
m_annotation = new TypeNameAnnotation(); m_annotation = make_unique<TypeNameAnnotation>();
return dynamic_cast<TypeNameAnnotation&>(*m_annotation); return dynamic_cast<TypeNameAnnotation&>(*m_annotation);
} }
@ -278,7 +273,7 @@ TypePointer StructDefinition::type() const
TypeDeclarationAnnotation& StructDefinition::annotation() const TypeDeclarationAnnotation& StructDefinition::annotation() const
{ {
if (!m_annotation) if (!m_annotation)
m_annotation = new TypeDeclarationAnnotation(); m_annotation = make_unique<TypeDeclarationAnnotation>();
return dynamic_cast<TypeDeclarationAnnotation&>(*m_annotation); return dynamic_cast<TypeDeclarationAnnotation&>(*m_annotation);
} }
@ -297,7 +292,7 @@ TypePointer EnumDefinition::type() const
TypeDeclarationAnnotation& EnumDefinition::annotation() const TypeDeclarationAnnotation& EnumDefinition::annotation() const
{ {
if (!m_annotation) if (!m_annotation)
m_annotation = new TypeDeclarationAnnotation(); m_annotation = make_unique<TypeDeclarationAnnotation>();
return dynamic_cast<TypeDeclarationAnnotation&>(*m_annotation); return dynamic_cast<TypeDeclarationAnnotation&>(*m_annotation);
} }
@ -357,7 +352,7 @@ string FunctionDefinition::externalSignature() const
FunctionDefinitionAnnotation& FunctionDefinition::annotation() const FunctionDefinitionAnnotation& FunctionDefinition::annotation() const
{ {
if (!m_annotation) if (!m_annotation)
m_annotation = new FunctionDefinitionAnnotation(); m_annotation = make_unique<FunctionDefinitionAnnotation>();
return dynamic_cast<FunctionDefinitionAnnotation&>(*m_annotation); return dynamic_cast<FunctionDefinitionAnnotation&>(*m_annotation);
} }
@ -369,7 +364,7 @@ TypePointer ModifierDefinition::type() const
ModifierDefinitionAnnotation& ModifierDefinition::annotation() const ModifierDefinitionAnnotation& ModifierDefinition::annotation() const
{ {
if (!m_annotation) if (!m_annotation)
m_annotation = new ModifierDefinitionAnnotation(); m_annotation = make_unique<ModifierDefinitionAnnotation>();
return dynamic_cast<ModifierDefinitionAnnotation&>(*m_annotation); return dynamic_cast<ModifierDefinitionAnnotation&>(*m_annotation);
} }
@ -389,14 +384,14 @@ FunctionTypePointer EventDefinition::functionType(bool _internal) const
EventDefinitionAnnotation& EventDefinition::annotation() const EventDefinitionAnnotation& EventDefinition::annotation() const
{ {
if (!m_annotation) if (!m_annotation)
m_annotation = new EventDefinitionAnnotation(); m_annotation = make_unique<EventDefinitionAnnotation>();
return dynamic_cast<EventDefinitionAnnotation&>(*m_annotation); return dynamic_cast<EventDefinitionAnnotation&>(*m_annotation);
} }
UserDefinedTypeNameAnnotation& UserDefinedTypeName::annotation() const UserDefinedTypeNameAnnotation& UserDefinedTypeName::annotation() const
{ {
if (!m_annotation) if (!m_annotation)
m_annotation = new UserDefinedTypeNameAnnotation(); m_annotation = make_unique<UserDefinedTypeNameAnnotation>();
return dynamic_cast<UserDefinedTypeNameAnnotation&>(*m_annotation); return dynamic_cast<UserDefinedTypeNameAnnotation&>(*m_annotation);
} }
@ -604,63 +599,63 @@ FunctionTypePointer VariableDeclaration::functionType(bool _internal) const
VariableDeclarationAnnotation& VariableDeclaration::annotation() const VariableDeclarationAnnotation& VariableDeclaration::annotation() const
{ {
if (!m_annotation) if (!m_annotation)
m_annotation = new VariableDeclarationAnnotation(); m_annotation = make_unique<VariableDeclarationAnnotation>();
return dynamic_cast<VariableDeclarationAnnotation&>(*m_annotation); return dynamic_cast<VariableDeclarationAnnotation&>(*m_annotation);
} }
StatementAnnotation& Statement::annotation() const StatementAnnotation& Statement::annotation() const
{ {
if (!m_annotation) if (!m_annotation)
m_annotation = new StatementAnnotation(); m_annotation = make_unique<StatementAnnotation>();
return dynamic_cast<StatementAnnotation&>(*m_annotation); return dynamic_cast<StatementAnnotation&>(*m_annotation);
} }
InlineAssemblyAnnotation& InlineAssembly::annotation() const InlineAssemblyAnnotation& InlineAssembly::annotation() const
{ {
if (!m_annotation) if (!m_annotation)
m_annotation = new InlineAssemblyAnnotation(); m_annotation = make_unique<InlineAssemblyAnnotation>();
return dynamic_cast<InlineAssemblyAnnotation&>(*m_annotation); return dynamic_cast<InlineAssemblyAnnotation&>(*m_annotation);
} }
ReturnAnnotation& Return::annotation() const ReturnAnnotation& Return::annotation() const
{ {
if (!m_annotation) if (!m_annotation)
m_annotation = new ReturnAnnotation(); m_annotation = make_unique<ReturnAnnotation>();
return dynamic_cast<ReturnAnnotation&>(*m_annotation); return dynamic_cast<ReturnAnnotation&>(*m_annotation);
} }
ExpressionAnnotation& Expression::annotation() const ExpressionAnnotation& Expression::annotation() const
{ {
if (!m_annotation) if (!m_annotation)
m_annotation = new ExpressionAnnotation(); m_annotation = make_unique<ExpressionAnnotation>();
return dynamic_cast<ExpressionAnnotation&>(*m_annotation); return dynamic_cast<ExpressionAnnotation&>(*m_annotation);
} }
MemberAccessAnnotation& MemberAccess::annotation() const MemberAccessAnnotation& MemberAccess::annotation() const
{ {
if (!m_annotation) if (!m_annotation)
m_annotation = new MemberAccessAnnotation(); m_annotation = make_unique<MemberAccessAnnotation>();
return dynamic_cast<MemberAccessAnnotation&>(*m_annotation); return dynamic_cast<MemberAccessAnnotation&>(*m_annotation);
} }
BinaryOperationAnnotation& BinaryOperation::annotation() const BinaryOperationAnnotation& BinaryOperation::annotation() const
{ {
if (!m_annotation) if (!m_annotation)
m_annotation = new BinaryOperationAnnotation(); m_annotation = make_unique<BinaryOperationAnnotation>();
return dynamic_cast<BinaryOperationAnnotation&>(*m_annotation); return dynamic_cast<BinaryOperationAnnotation&>(*m_annotation);
} }
FunctionCallAnnotation& FunctionCall::annotation() const FunctionCallAnnotation& FunctionCall::annotation() const
{ {
if (!m_annotation) if (!m_annotation)
m_annotation = new FunctionCallAnnotation(); m_annotation = make_unique<FunctionCallAnnotation>();
return dynamic_cast<FunctionCallAnnotation&>(*m_annotation); return dynamic_cast<FunctionCallAnnotation&>(*m_annotation);
} }
IdentifierAnnotation& Identifier::annotation() const IdentifierAnnotation& Identifier::annotation() const
{ {
if (!m_annotation) if (!m_annotation)
m_annotation = new IdentifierAnnotation(); m_annotation = make_unique<IdentifierAnnotation>();
return dynamic_cast<IdentifierAnnotation&>(*m_annotation); return dynamic_cast<IdentifierAnnotation&>(*m_annotation);
} }

View File

@ -67,7 +67,7 @@ public:
using SourceLocation = langutil::SourceLocation; using SourceLocation = langutil::SourceLocation;
explicit ASTNode(SourceLocation const& _location); explicit ASTNode(SourceLocation const& _location);
virtual ~ASTNode(); virtual ~ASTNode() {}
/// @returns an identifier of this AST node that is unique for a single compilation run. /// @returns an identifier of this AST node that is unique for a single compilation run.
size_t id() const { return m_id; } size_t id() const { return m_id; }
@ -111,7 +111,7 @@ public:
protected: protected:
size_t const m_id = 0; size_t const m_id = 0;
/// Annotation - is specialised in derived classes, is created upon request (because of polymorphism). /// Annotation - is specialised in derived classes, is created upon request (because of polymorphism).
mutable ASTAnnotation* m_annotation = nullptr; mutable std::unique_ptr<ASTAnnotation> m_annotation;
private: private:
SourceLocation m_location; SourceLocation m_location;