diff --git a/libsolidity/AST.cpp b/libsolidity/AST.cpp index 8555d8c6d..15da9e0d8 100644 --- a/libsolidity/AST.cpp +++ b/libsolidity/AST.cpp @@ -250,46 +250,42 @@ void Literal::accept(ASTVisitor& _visitor) void Statement::expectType(Expression& _expression, const Type& _expectedType) { - if (!_expression.checkTypeRequirements()->isImplicitlyConvertibleTo(_expectedType)) + _expression.checkTypeRequirements(); + if (!_expression.getType()->isImplicitlyConvertibleTo(_expectedType)) BOOST_THROW_EXCEPTION(TypeError() << errinfo_comment("Type not implicitly convertible " "to expected type.")); //@todo provide more information to the exception } -ptr Block::checkTypeRequirements() +void Block::checkTypeRequirements() { - for (ptr const& statement: m_statements) + for (std::shared_ptr const& statement: m_statements) statement->checkTypeRequirements(); - return ptr(); } -ptr IfStatement::checkTypeRequirements() +void IfStatement::checkTypeRequirements() { expectType(*m_condition, BoolType()); m_trueBody->checkTypeRequirements(); if (m_falseBody) m_falseBody->checkTypeRequirements(); - return ptr(); } -ptr WhileStatement::checkTypeRequirements() +void WhileStatement::checkTypeRequirements() { expectType(*m_condition, BoolType()); m_body->checkTypeRequirements(); - return ptr(); } -ptr Continue::checkTypeRequirements() +void Continue::checkTypeRequirements() { - return ptr(); } -ptr Break::checkTypeRequirements() +void Break::checkTypeRequirements() { - return ptr(); } -ptr Return::checkTypeRequirements() +void Return::checkTypeRequirements() { BOOST_ASSERT(m_returnParameters != nullptr); if (m_returnParameters->getParameters().size() != 1) @@ -299,10 +295,9 @@ ptr Return::checkTypeRequirements() // this could later be changed such that the paramaters type is an anonymous struct type, // but for now, we only allow one return parameter expectType(*m_expression, *m_returnParameters->getParameters().front()->getType()); - return ptr(); } -ptr VariableDefinition::checkTypeRequirements() +void VariableDefinition::checkTypeRequirements() { // Variables can be declared without type (with "var"), in which case the first assignment // setsthe type. @@ -313,17 +308,20 @@ ptr VariableDefinition::checkTypeRequirements() if (m_variable->getType()) expectType(*m_value, *m_variable->getType()); else + { // no type declared and no previous assignment, infer the type - m_variable->setType(m_value->checkTypeRequirements()); + m_value->checkTypeRequirements(); + m_variable->setType(m_value->getType()); + } } - return ptr(); } -ptr Assignment::checkTypeRequirements() +void Assignment::checkTypeRequirements() { //@todo lefthandside actually has to be assignable // add a feature to the type system to check that - expectType(*m_rightHandSide, *m_leftHandSide->checkTypeRequirements()); + m_leftHandSide->checkTypeRequirements(); + expectType(*m_rightHandSide, *m_leftHandSide->getType()); m_type = m_leftHandSide->getType(); if (m_assigmentOperator != Token::ASSIGN) { @@ -331,19 +329,18 @@ ptr Assignment::checkTypeRequirements() if (!m_type->acceptsBinaryOperator(Token::AssignmentToBinaryOp(m_assigmentOperator))) BOOST_THROW_EXCEPTION(TypeError() << errinfo_comment("Operator not compatible with type.")); } - return m_type; } -ptr UnaryOperation::checkTypeRequirements() +void UnaryOperation::checkTypeRequirements() { // INC, DEC, NOT, BIT_NOT, DELETE - m_type = m_subExpression->checkTypeRequirements(); + m_subExpression->checkTypeRequirements(); + m_type = m_subExpression->getType(); if (m_type->acceptsUnaryOperator(m_operator)) BOOST_THROW_EXCEPTION(TypeError() << errinfo_comment("Unary operator not compatible with type.")); - return m_type; } -ptr BinaryOperation::checkTypeRequirements() +void BinaryOperation::checkTypeRequirements() { m_right->checkTypeRequirements(); m_left->checkTypeRequirements(); @@ -362,19 +359,18 @@ ptr BinaryOperation::checkTypeRequirements() if (!m_commonType->acceptsBinaryOperator(m_operator)) BOOST_THROW_EXCEPTION(TypeError() << errinfo_comment("Operator not compatible with type.")); } - return m_type; } -ptr FunctionCall::checkTypeRequirements() +void FunctionCall::checkTypeRequirements() { m_expression->checkTypeRequirements(); - for (ptr const& argument: m_arguments) + for (ASTPointer const& argument: m_arguments) argument->checkTypeRequirements(); - ptr expressionType = m_expression->getType(); - Type::Category const category = expressionType->getCategory(); + Type const& expressionType = *m_expression->getType(); + Type::Category const category = expressionType.getCategory(); if (category == Type::Category::TYPE) { - TypeType* type = dynamic_cast(expressionType.get()); + TypeType const* type = dynamic_cast(&expressionType); BOOST_ASSERT(type != nullptr); //@todo for structs, we have to check the number of arguments to be equal to the // number of non-mapping members @@ -391,10 +387,10 @@ ptr FunctionCall::checkTypeRequirements() //@todo would be nice to create a struct type from the arguments // and then ask if that is implicitly convertible to the struct represented by the // function parameters - FunctionType* function = dynamic_cast(expressionType.get()); + FunctionType const* function = dynamic_cast(&expressionType); BOOST_ASSERT(function != nullptr); FunctionDefinition const& fun = function->getFunction(); - std::vector> const& parameters = fun.getParameters(); + std::vector> const& parameters = fun.getParameters(); if (parameters.size() != m_arguments.size()) BOOST_THROW_EXCEPTION(TypeError() << errinfo_comment("Wrong argument count for " "function call.")); @@ -413,24 +409,21 @@ ptr FunctionCall::checkTypeRequirements() { BOOST_THROW_EXCEPTION(TypeError() << errinfo_comment("Type does not support invocation.")); } - return m_type; } -ptr MemberAccess::checkTypeRequirements() +void MemberAccess::checkTypeRequirements() { BOOST_ASSERT(false); // not yet implemented // m_type = ; - return m_type; } -ptr IndexAccess::checkTypeRequirements() +void IndexAccess::checkTypeRequirements() { BOOST_ASSERT(false); // not yet implemented // m_type = ; - return m_type; } -ptr Identifier::checkTypeRequirements() +void Identifier::checkTypeRequirements() { BOOST_ASSERT(m_referencedDeclaration != nullptr); //@todo these dynamic casts here are not really nice... @@ -444,11 +437,11 @@ ptr Identifier::checkTypeRequirements() VariableDeclaration* variable = dynamic_cast(m_referencedDeclaration); if (variable != nullptr) { - if (variable->getType().get() == nullptr) + if (!variable->getType()) BOOST_THROW_EXCEPTION(TypeError() << errinfo_comment("Variable referenced before type " "could be determined.")); m_type = variable->getType(); - return m_type; + return; } //@todo can we unify these with TypeName::toType()? StructDefinition* structDef = dynamic_cast(m_referencedDeclaration); @@ -456,7 +449,7 @@ ptr Identifier::checkTypeRequirements() { // note that we do not have a struct type here m_type = std::make_shared(std::make_shared(*structDef)); - return m_type; + return; } FunctionDefinition* functionDef = dynamic_cast(m_referencedDeclaration); if (functionDef != nullptr) @@ -465,28 +458,25 @@ ptr Identifier::checkTypeRequirements() // Calling a function (e.g. function(12), otherContract.function(34)) does not do a type // conversion. m_type = std::make_shared(*functionDef); - return m_type; + return; } ContractDefinition* contractDef = dynamic_cast(m_referencedDeclaration); if (contractDef != nullptr) { m_type = std::make_shared(std::make_shared(*contractDef)); - return m_type; + return; } BOOST_ASSERT(false); // declaration reference of unknown/forbidden type - return m_type; } -ptr ElementaryTypeNameExpression::checkTypeRequirements() +void ElementaryTypeNameExpression::checkTypeRequirements() { m_type = std::make_shared(Type::fromElementaryTypeName(m_typeToken)); - return m_type; } -ptr Literal::checkTypeRequirements() +void Literal::checkTypeRequirements() { m_type = Type::forLiteral(*this); - return m_type; } } diff --git a/libsolidity/AST.h b/libsolidity/AST.h index 661e10a7e..319fc0581 100644 --- a/libsolidity/AST.h +++ b/libsolidity/AST.h @@ -51,9 +51,9 @@ public: virtual void accept(ASTVisitor& _visitor) = 0; template - static void listAccept(std::vector>& _list, ASTVisitor& _visitor) + static void listAccept(std::vector>& _list, ASTVisitor& _visitor) { - for (ptr& element: _list) + for (ASTPointer& element: _list) element->accept(_visitor); } @@ -65,22 +65,22 @@ private: class Declaration: public ASTNode { public: - Declaration(Location const& _location, ptr const& _name) + Declaration(Location const& _location, ASTPointer const& _name) : ASTNode(_location), m_name(_name) {} const ASTString& getName() const { return *m_name; } private: - ptr m_name; + ASTPointer m_name; }; class ContractDefinition: public Declaration { public: ContractDefinition(Location const& _location, - ptr const& _name, - std::vector> const& _definedStructs, - std::vector> const& _stateVariables, - std::vector> const& _definedFunctions) + ASTPointer const& _name, + std::vector> const& _definedStructs, + std::vector> const& _stateVariables, + std::vector> const& _definedFunctions) : Declaration(_location, _name), m_definedStructs(_definedStructs), m_stateVariables(_stateVariables), @@ -89,26 +89,26 @@ public: virtual void accept(ASTVisitor& _visitor) override; - std::vector> const& getDefinedStructs() { return m_definedStructs; } - std::vector> const& getStateVariables() { return m_stateVariables; } - std::vector> const& getDefinedFunctions() { return m_definedFunctions; } + std::vector> const& getDefinedStructs() { return m_definedStructs; } + std::vector> const& getStateVariables() { return m_stateVariables; } + std::vector> const& getDefinedFunctions() { return m_definedFunctions; } private: - std::vector> m_definedStructs; - std::vector> m_stateVariables; - std::vector> m_definedFunctions; + std::vector> m_definedStructs; + std::vector> m_stateVariables; + std::vector> m_definedFunctions; }; class StructDefinition: public Declaration { public: StructDefinition(Location const& _location, - ptr const& _name, - std::vector> const& _members) + ASTPointer const& _name, + std::vector> const& _members) : Declaration(_location, _name), m_members(_members) {} virtual void accept(ASTVisitor& _visitor) override; private: - std::vector> m_members; + std::vector> m_members; }; /// Used as function parameter list and return list @@ -117,23 +117,23 @@ private: class ParameterList: public ASTNode { public: - ParameterList(Location const& _location, std::vector> const& _parameters) + ParameterList(Location const& _location, std::vector> const& _parameters) : ASTNode(_location), m_parameters(_parameters) {} virtual void accept(ASTVisitor& _visitor) override; - std::vector> const& getParameters() { return m_parameters; } + std::vector> const& getParameters() { return m_parameters; } private: - std::vector> m_parameters; + std::vector> m_parameters; }; class FunctionDefinition: public Declaration { public: - FunctionDefinition(Location const& _location, ptr const& _name, bool _isPublic, - ptr const& _parameters, + FunctionDefinition(Location const& _location, ASTPointer const& _name, bool _isPublic, + ASTPointer const& _parameters, bool _isDeclaredConst, - ptr const& _returnParameters, - ptr const& _body) + ASTPointer const& _returnParameters, + ASTPointer const& _body) : Declaration(_location, _name), m_isPublic(_isPublic), m_parameters(_parameters), m_isDeclaredConst(_isDeclaredConst), m_returnParameters(_returnParameters), m_body(_body) {} @@ -141,23 +141,23 @@ public: bool isPublic() const { return m_isPublic; } bool isDeclaredConst() const { return m_isDeclaredConst; } - std::vector> const& getParameters() const { return m_parameters->getParameters(); } + std::vector> const& getParameters() const { return m_parameters->getParameters(); } ParameterList& getParameterList() { return *m_parameters; } - ptr const& getReturnParameterList() const { return m_returnParameters; } + ASTPointer const& getReturnParameterList() const { return m_returnParameters; } Block& getBody() { return *m_body; } private: bool m_isPublic; - ptr m_parameters; + ASTPointer m_parameters; bool m_isDeclaredConst; - ptr m_returnParameters; - ptr m_body; + ASTPointer m_returnParameters; + ASTPointer m_body; }; class VariableDeclaration: public Declaration { public: - VariableDeclaration(Location const& _location, ptr const& _type, - ptr const& _name) + VariableDeclaration(Location const& _location, ASTPointer const& _type, + ASTPointer const& _name) : Declaration(_location, _name), m_typeName(_type) {} virtual void accept(ASTVisitor& _visitor) override; @@ -166,12 +166,12 @@ public: //! Returns the declared or inferred type. Can be an empty pointer if no type was explicitly //! declared and there is no assignment to the variable that fixes the type. - ptr const& getType() const { return m_type; } - void setType(ptr const& _type) { m_type = _type; } + std::shared_ptr const& getType() const { return m_type; } + void setType(std::shared_ptr const& _type) { m_type = _type; } private: - ptr m_typeName; ///< can be empty ("var") + ASTPointer m_typeName; ///< can be empty ("var") - ptr m_type; + std::shared_ptr m_type; }; /// types @@ -183,7 +183,7 @@ public: explicit TypeName(Location const& _location): ASTNode(_location) {} virtual void accept(ASTVisitor& _visitor) override; - virtual ptr toType() = 0; + virtual std::shared_ptr toType() = 0; }; /// any pre-defined type that is not a mapping @@ -193,7 +193,7 @@ public: explicit ElementaryTypeName(Location const& _location, Token::Value _type) : TypeName(_location), m_type(_type) {} virtual void accept(ASTVisitor& _visitor) override; - virtual ptr toType() override { return Type::fromElementaryTypeName(m_type); } + virtual std::shared_ptr toType() override { return Type::fromElementaryTypeName(m_type); } Token::Value getType() const { return m_type; } private: @@ -203,16 +203,16 @@ private: class UserDefinedTypeName: public TypeName { public: - UserDefinedTypeName(Location const& _location, ptr const& _name) + UserDefinedTypeName(Location const& _location, ASTPointer const& _name) : TypeName(_location), m_name(_name) {} virtual void accept(ASTVisitor& _visitor) override; - virtual ptr toType() override { return Type::fromUserDefinedTypeName(*this); } + virtual std::shared_ptr toType() override { return Type::fromUserDefinedTypeName(*this); } const ASTString& getName() const { return *m_name; } void setReferencedStruct(StructDefinition& _referencedStruct) { m_referencedStruct = &_referencedStruct; } StructDefinition const* getReferencedStruct() const { return m_referencedStruct; } private: - ptr m_name; + ASTPointer m_name; StructDefinition* m_referencedStruct; }; @@ -220,14 +220,14 @@ private: class Mapping: public TypeName { public: - Mapping(Location const& _location, ptr const& _keyType, - ptr const& _valueType) + Mapping(Location const& _location, ASTPointer const& _keyType, + ASTPointer const& _valueType) : TypeName(_location), m_keyType(_keyType), m_valueType(_valueType) {} virtual void accept(ASTVisitor& _visitor) override; - virtual ptr toType() override { return Type::fromMapping(*this); } + virtual std::shared_ptr toType() override { return Type::fromMapping(*this); } private: - ptr m_keyType; - ptr m_valueType; + ASTPointer m_keyType; + ASTPointer m_valueType; }; /// @} @@ -244,7 +244,7 @@ public: //! Check all type requirements, throws exception if some requirement is not met. //! For expressions, this also returns the inferred type of the expression. For other //! statements, returns the empty pointer. - virtual ptr checkTypeRequirements() = 0; + virtual void checkTypeRequirements() = 0; protected: //! Check that the inferred type for _expression is _expectedType or at least implicitly //! convertible to _expectedType. If not, throw exception. @@ -254,28 +254,28 @@ protected: class Block: public Statement { public: - Block(Location const& _location, std::vector> const& _statements) + Block(Location const& _location, std::vector> const& _statements) : Statement(_location), m_statements(_statements) {} virtual void accept(ASTVisitor& _visitor) override; - virtual ptr checkTypeRequirements() override; + virtual void checkTypeRequirements() override; private: - std::vector> m_statements; + std::vector> m_statements; }; class IfStatement: public Statement { public: - IfStatement(Location const& _location, ptr const& _condition, - ptr const& _trueBody, ptr const& _falseBody) + IfStatement(Location const& _location, ASTPointer const& _condition, + ASTPointer const& _trueBody, ASTPointer const& _falseBody) : Statement(_location), m_condition(_condition), m_trueBody(_trueBody), m_falseBody(_falseBody) {} virtual void accept(ASTVisitor& _visitor) override; - virtual ptr checkTypeRequirements() override; + virtual void checkTypeRequirements() override; private: - ptr m_condition; - ptr m_trueBody; - ptr m_falseBody; //< "else" part, optional + ASTPointer m_condition; + ASTPointer m_trueBody; + ASTPointer m_falseBody; //< "else" part, optional }; class BreakableStatement: public Statement @@ -288,14 +288,14 @@ public: class WhileStatement: public BreakableStatement { public: - WhileStatement(Location const& _location, ptr const& _condition, - ptr const& _body) + WhileStatement(Location const& _location, ASTPointer const& _condition, + ASTPointer const& _body) : BreakableStatement(_location), m_condition(_condition), m_body(_body) {} virtual void accept(ASTVisitor& _visitor) override; - virtual ptr checkTypeRequirements() override; + virtual void checkTypeRequirements() override; private: - ptr m_condition; - ptr m_body; + ASTPointer m_condition; + ASTPointer m_body; }; class Continue: public Statement @@ -303,7 +303,7 @@ class Continue: public Statement public: Continue(Location const& _location): Statement(_location) {} virtual void accept(ASTVisitor& _visitor) override; - virtual ptr checkTypeRequirements() override; + virtual void checkTypeRequirements() override; }; class Break: public Statement @@ -311,20 +311,20 @@ class Break: public Statement public: Break(Location const& _location): Statement(_location) {} virtual void accept(ASTVisitor& _visitor) override; - virtual ptr checkTypeRequirements() override; + virtual void checkTypeRequirements() override; }; class Return: public Statement { public: - Return(Location const& _location, ptr _expression) + Return(Location const& _location, ASTPointer _expression) : Statement(_location), m_expression(_expression) {} virtual void accept(ASTVisitor& _visitor) override; - virtual ptr checkTypeRequirements() override; + virtual void checkTypeRequirements() override; void setFunctionReturnParameters(ParameterList& _parameters) { m_returnParameters = &_parameters; } private: - ptr m_expression; //< value to return, optional + ASTPointer m_expression; //< value to return, optional ParameterList* m_returnParameters; //< extracted from the function declaration }; @@ -332,24 +332,25 @@ private: class VariableDefinition: public Statement { public: - VariableDefinition(Location const& _location, ptr _variable, - ptr _value) + VariableDefinition(Location const& _location, ASTPointer _variable, + ASTPointer _value) : Statement(_location), m_variable(_variable), m_value(_value) {} virtual void accept(ASTVisitor& _visitor) override; - virtual ptr checkTypeRequirements() override; + virtual void checkTypeRequirements() override; private: - ptr m_variable; - ptr m_value; ///< can be missing + ASTPointer m_variable; + ASTPointer m_value; ///< can be missing }; class Expression: public Statement { public: Expression(Location const& _location): Statement(_location) {} - ptr const& getType() { return m_type; } + std::shared_ptr const& getType() const { return m_type; } protected: - ptr m_type; + //! Inferred type of the expression, only filled after a call to checkTypeRequirements(). + std::shared_ptr m_type; }; /// @} @@ -360,95 +361,95 @@ protected: class Assignment: public Expression { public: - Assignment(Location const& _location, ptr const& _leftHandSide, - Token::Value _assignmentOperator, ptr const& _rightHandSide) + Assignment(Location const& _location, ASTPointer const& _leftHandSide, + Token::Value _assignmentOperator, ASTPointer const& _rightHandSide) : Expression(_location), m_leftHandSide(_leftHandSide), m_assigmentOperator(_assignmentOperator), m_rightHandSide(_rightHandSide) {} virtual void accept(ASTVisitor& _visitor) override; - virtual ptr checkTypeRequirements() override; + virtual void checkTypeRequirements() override; Token::Value getAssignmentOperator() const { return m_assigmentOperator; } private: - ptr m_leftHandSide; + ASTPointer m_leftHandSide; Token::Value m_assigmentOperator; - ptr m_rightHandSide; + ASTPointer m_rightHandSide; }; class UnaryOperation: public Expression { public: UnaryOperation(Location const& _location, Token::Value _operator, - ptr const& _subExpression, bool _isPrefix) + ASTPointer const& _subExpression, bool _isPrefix) : Expression(_location), m_operator(_operator), m_subExpression(_subExpression), m_isPrefix(_isPrefix) {} virtual void accept(ASTVisitor& _visitor) override; - virtual ptr checkTypeRequirements() override; + virtual void checkTypeRequirements() override; Token::Value getOperator() const { return m_operator; } bool isPrefixOperation() const { return m_isPrefix; } private: Token::Value m_operator; - ptr m_subExpression; + ASTPointer m_subExpression; bool m_isPrefix; }; class BinaryOperation: public Expression { public: - BinaryOperation(Location const& _location, ptr const& _left, - Token::Value _operator, ptr const& _right) + BinaryOperation(Location const& _location, ASTPointer const& _left, + Token::Value _operator, ASTPointer const& _right) : Expression(_location), m_left(_left), m_operator(_operator), m_right(_right) {} virtual void accept(ASTVisitor& _visitor) override; - virtual ptr checkTypeRequirements() override; + virtual void checkTypeRequirements() override; Token::Value getOperator() const { return m_operator; } private: - ptr m_left; + ASTPointer m_left; Token::Value m_operator; - ptr m_right; + ASTPointer m_right; - ptr m_commonType; + std::shared_ptr m_commonType; }; /// Can be ordinary function call, type cast or struct construction. class FunctionCall: public Expression { public: - FunctionCall(Location const& _location, ptr const& _expression, - std::vector> const& _arguments) + FunctionCall(Location const& _location, ASTPointer const& _expression, + std::vector> const& _arguments) : Expression(_location), m_expression(_expression), m_arguments(_arguments) {} virtual void accept(ASTVisitor& _visitor) override; - virtual ptr checkTypeRequirements() override; + virtual void checkTypeRequirements() override; private: - ptr m_expression; - std::vector> m_arguments; + ASTPointer m_expression; + std::vector> m_arguments; }; class MemberAccess: public Expression { public: - MemberAccess(Location const& _location, ptr _expression, - ptr const& _memberName) + MemberAccess(Location const& _location, ASTPointer _expression, + ASTPointer const& _memberName) : Expression(_location), m_expression(_expression), m_memberName(_memberName) {} virtual void accept(ASTVisitor& _visitor) override; const ASTString& getMemberName() const { return *m_memberName; } - virtual ptr checkTypeRequirements() override; + virtual void checkTypeRequirements() override; private: - ptr m_expression; - ptr m_memberName; + ASTPointer m_expression; + ASTPointer m_memberName; }; class IndexAccess: public Expression { public: - IndexAccess(Location const& _location, ptr const& _base, - ptr const& _index) + IndexAccess(Location const& _location, ASTPointer const& _base, + ASTPointer const& _index) : Expression(_location), m_base(_base), m_index(_index) {} virtual void accept(ASTVisitor& _visitor) override; - virtual ptr checkTypeRequirements() override; + virtual void checkTypeRequirements() override; private: - ptr m_base; - ptr m_index; + ASTPointer m_base; + ASTPointer m_index; }; class PrimaryExpression: public Expression @@ -460,16 +461,16 @@ public: class Identifier: public PrimaryExpression { public: - Identifier(Location const& _location, ptr const& _name) + Identifier(Location const& _location, ASTPointer const& _name) : PrimaryExpression(_location), m_name(_name) {} virtual void accept(ASTVisitor& _visitor) override; - virtual ptr checkTypeRequirements() override; + virtual void checkTypeRequirements() override; ASTString const& getName() const { return *m_name; } void setReferencedDeclaration(Declaration& _referencedDeclaration) { m_referencedDeclaration = &_referencedDeclaration; } Declaration* getReferencedDeclaration() { return m_referencedDeclaration; } private: - ptr m_name; + ASTPointer m_name; //! Declaration the name refers to. Declaration* m_referencedDeclaration; @@ -481,7 +482,7 @@ public: ElementaryTypeNameExpression(Location const& _location, Token::Value _typeToken) : PrimaryExpression(_location), m_typeToken(_typeToken) {} virtual void accept(ASTVisitor& _visitor) override; - virtual ptr checkTypeRequirements() override; + virtual void checkTypeRequirements() override; Token::Value getTypeToken() const { return m_typeToken; } private: @@ -491,16 +492,16 @@ private: class Literal: public PrimaryExpression { public: - Literal(Location const& _location, Token::Value _token, ptr const& _value) + Literal(Location const& _location, Token::Value _token, ASTPointer const& _value) : PrimaryExpression(_location), m_token(_token), m_value(_value) {} virtual void accept(ASTVisitor& _visitor) override; - virtual ptr checkTypeRequirements() override; + virtual void checkTypeRequirements() override; Token::Value getToken() const { return m_token; } ASTString const& getValue() const { return *m_value; } private: Token::Value m_token; - ptr m_value; + ASTPointer m_value; }; /// @} diff --git a/libsolidity/ASTForward.h b/libsolidity/ASTForward.h index 46fe8393a..c9a780f5f 100644 --- a/libsolidity/ASTForward.h +++ b/libsolidity/ASTForward.h @@ -69,7 +69,7 @@ class Literal; // not do reference counting but point to a special memory area that is completely released // explicitly. template -using ptr = std::shared_ptr; +using ASTPointer = std::shared_ptr; using ASTString = std::string; diff --git a/libsolidity/ASTPrinter.cpp b/libsolidity/ASTPrinter.cpp index 1ff0c52e7..af8f20157 100644 --- a/libsolidity/ASTPrinter.cpp +++ b/libsolidity/ASTPrinter.cpp @@ -28,7 +28,7 @@ namespace dev namespace solidity { -ASTPrinter::ASTPrinter(ptr _ast, std::string const& _source) +ASTPrinter::ASTPrinter(ASTPointer const& _ast, std::string const& _source) : m_indentation(0), m_source(_source), m_ast(_ast) { } diff --git a/libsolidity/ASTPrinter.h b/libsolidity/ASTPrinter.h index 00c681f34..e8d125a54 100644 --- a/libsolidity/ASTPrinter.h +++ b/libsolidity/ASTPrinter.h @@ -35,7 +35,7 @@ class ASTPrinter: public ASTVisitor public: /// Create a printer for the given abstract syntax tree. If the source is specified, /// the corresponding parts of the source are printed with each node. - ASTPrinter(ptr _ast, const std::string& _source = std::string()); + ASTPrinter(ASTPointer const& _ast, const std::string& _source = std::string()); /// Output the string representation of the AST to _stream. void print(std::ostream& _stream); @@ -108,7 +108,7 @@ private: int m_indentation; std::string m_source; - ptr m_ast; + ASTPointer m_ast; std::ostream* m_ostream; }; diff --git a/libsolidity/NameAndTypeResolver.cpp b/libsolidity/NameAndTypeResolver.cpp index 628d94769..84b12a238 100644 --- a/libsolidity/NameAndTypeResolver.cpp +++ b/libsolidity/NameAndTypeResolver.cpp @@ -42,9 +42,9 @@ void NameAndTypeResolver::resolveNamesAndTypes(ContractDefinition& _contract) DeclarationRegistrationHelper registrar(m_scopes, _contract); m_currentScope = &m_scopes[&_contract]; //@todo structs - for (ptr const& variable: _contract.getStateVariables()) + for (ASTPointer const& variable: _contract.getStateVariables()) ReferencesResolver resolver(*variable, *this, nullptr); - for (ptr const& function: _contract.getDefinedFunctions()) + for (ASTPointer const& function: _contract.getDefinedFunctions()) { m_currentScope = &m_scopes[function.get()]; ReferencesResolver referencesResolver(*function, *this, @@ -53,7 +53,7 @@ void NameAndTypeResolver::resolveNamesAndTypes(ContractDefinition& _contract) // First, the parameter types of all functions need to be resolved before we can check // the types, since it is possible to call functions that are only defined later // in the source. - for (ptr const& function: _contract.getDefinedFunctions()) + for (ASTPointer const& function: _contract.getDefinedFunctions()) { m_currentScope = &m_scopes[function.get()]; function->getBody().checkTypeRequirements(); diff --git a/libsolidity/NameAndTypeResolver.h b/libsolidity/NameAndTypeResolver.h index 076b1389f..625454566 100644 --- a/libsolidity/NameAndTypeResolver.h +++ b/libsolidity/NameAndTypeResolver.h @@ -23,7 +23,6 @@ #pragma once #include - #include #include diff --git a/libsolidity/Parser.cpp b/libsolidity/Parser.cpp index 4716c55df..7b1fdeb28 100644 --- a/libsolidity/Parser.cpp +++ b/libsolidity/Parser.cpp @@ -31,7 +31,7 @@ namespace dev namespace solidity { -ptr Parser::parse(std::shared_ptr const& _scanner) +ASTPointer Parser::parse(std::shared_ptr const& _scanner) { m_scanner = _scanner; return parseContractDefinition(); @@ -48,10 +48,10 @@ public: void markEndPosition() { m_location.end = m_parser.getEndPosition(); } void setLocationEmpty() { m_location.end = m_location.start; } /// Set the end position to the one of the given node. - void setEndPositionFromNode(ptr const& _node) { m_location.end = _node->getLocation().end; } + void setEndPositionFromNode(ASTPointer const& _node) { m_location.end = _node->getLocation().end; } template - ptr createNode(Args&& ... _args) + ASTPointer createNode(Args&& ... _args) { if (m_location.end < 0) markEndPosition(); @@ -74,15 +74,15 @@ int Parser::getEndPosition() const } -ptr Parser::parseContractDefinition() +ASTPointer Parser::parseContractDefinition() { ASTNodeFactory nodeFactory(*this); expectToken(Token::CONTRACT); - ptr name = expectIdentifierToken(); + ASTPointer name = expectIdentifierToken(); expectToken(Token::LBRACE); - std::vector> structs; - std::vector> stateVariables; - std::vector> functions; + std::vector> structs; + std::vector> stateVariables; + std::vector> functions; bool visibilityIsPublic = true; while (true) { @@ -115,19 +115,19 @@ ptr Parser::parseContractDefinition() return nodeFactory.createNode(name, structs, stateVariables, functions); } -ptr Parser::parseFunctionDefinition(bool _isPublic) +ASTPointer Parser::parseFunctionDefinition(bool _isPublic) { ASTNodeFactory nodeFactory(*this); expectToken(Token::FUNCTION); - ptr name(expectIdentifierToken()); - ptr parameters(parseParameterList()); + ASTPointer name(expectIdentifierToken()); + ASTPointer parameters(parseParameterList()); bool isDeclaredConst = false; if (m_scanner->getCurrentToken() == Token::CONST) { isDeclaredConst = true; m_scanner->next(); } - ptr returnParameters; + ASTPointer returnParameters; if (m_scanner->getCurrentToken() == Token::RETURNS) { bool const permitEmptyParameterList = false; @@ -139,20 +139,20 @@ ptr Parser::parseFunctionDefinition(bool _isPublic) // create an empty parameter list at a zero-length location ASTNodeFactory nodeFactory(*this); nodeFactory.setLocationEmpty(); - returnParameters = nodeFactory.createNode(std::vector>()); + returnParameters = nodeFactory.createNode(std::vector>()); } - ptr block = parseBlock(); + ASTPointer block = parseBlock(); nodeFactory.setEndPositionFromNode(block); return nodeFactory.createNode(name, _isPublic, parameters, isDeclaredConst, returnParameters, block); } -ptr Parser::parseStructDefinition() +ASTPointer Parser::parseStructDefinition() { ASTNodeFactory nodeFactory(*this); expectToken(Token::STRUCT); - ptr name = expectIdentifierToken(); - std::vector> members; + ASTPointer name = expectIdentifierToken(); + std::vector> members; expectToken(Token::LBRACE); while (m_scanner->getCurrentToken() != Token::RBRACE) { @@ -165,17 +165,17 @@ ptr Parser::parseStructDefinition() return nodeFactory.createNode(name, members); } -ptr Parser::parseVariableDeclaration(bool _allowVar) +ASTPointer Parser::parseVariableDeclaration(bool _allowVar) { ASTNodeFactory nodeFactory(*this); - ptr type = parseTypeName(_allowVar); + ASTPointer type = parseTypeName(_allowVar); nodeFactory.markEndPosition(); return nodeFactory.createNode(type, expectIdentifierToken()); } -ptr Parser::parseTypeName(bool _allowVar) +ASTPointer Parser::parseTypeName(bool _allowVar) { - ptr type; + ASTPointer type; Token::Value token = m_scanner->getCurrentToken(); if (Token::isElementaryTypeName(token)) { @@ -203,28 +203,28 @@ ptr Parser::parseTypeName(bool _allowVar) return type; } -ptr Parser::parseMapping() +ASTPointer Parser::parseMapping() { ASTNodeFactory nodeFactory(*this); expectToken(Token::MAPPING); expectToken(Token::LPAREN); if (!Token::isElementaryTypeName(m_scanner->getCurrentToken())) throwExpectationError("Expected elementary type name for mapping key type"); - ptr keyType; + ASTPointer keyType; keyType = ASTNodeFactory(*this).createNode(m_scanner->getCurrentToken()); m_scanner->next(); expectToken(Token::ARROW); bool const allowVar = false; - ptr valueType = parseTypeName(allowVar); + ASTPointer valueType = parseTypeName(allowVar); nodeFactory.markEndPosition(); expectToken(Token::RPAREN); return nodeFactory.createNode(keyType, valueType); } -ptr Parser::parseParameterList(bool _allowEmpty) +ASTPointer Parser::parseParameterList(bool _allowEmpty) { ASTNodeFactory nodeFactory(*this); - std::vector> parameters; + std::vector> parameters; expectToken(Token::LPAREN); if (!_allowEmpty || m_scanner->getCurrentToken() != Token::RPAREN) { @@ -241,11 +241,11 @@ ptr Parser::parseParameterList(bool _allowEmpty) return nodeFactory.createNode(parameters); } -ptr Parser::parseBlock() +ASTPointer Parser::parseBlock() { ASTNodeFactory nodeFactory(*this); expectToken(Token::LBRACE); - std::vector> statements; + std::vector> statements; while (m_scanner->getCurrentToken() != Token::RBRACE) statements.push_back(parseStatement()); nodeFactory.markEndPosition(); @@ -253,9 +253,9 @@ ptr Parser::parseBlock() return nodeFactory.createNode(statements); } -ptr Parser::parseStatement() +ASTPointer Parser::parseStatement() { - ptr statement; + ASTPointer statement; switch (m_scanner->getCurrentToken()) { case Token::IF: @@ -274,7 +274,7 @@ ptr Parser::parseStatement() case Token::RETURN: { ASTNodeFactory nodeFactory(*this); - ptr expression; + ASTPointer expression; if (m_scanner->next() != Token::SEMICOLON) { expression = parseExpression(); @@ -301,15 +301,15 @@ ptr Parser::parseStatement() return statement; } -ptr Parser::parseIfStatement() +ASTPointer Parser::parseIfStatement() { ASTNodeFactory nodeFactory(*this); expectToken(Token::IF); expectToken(Token::LPAREN); - ptr condition = parseExpression(); + ASTPointer condition = parseExpression(); expectToken(Token::RPAREN); - ptr trueBody = parseStatement(); - ptr falseBody; + ASTPointer trueBody = parseStatement(); + ASTPointer falseBody; if (m_scanner->getCurrentToken() == Token::ELSE) { m_scanner->next(); @@ -321,24 +321,24 @@ ptr Parser::parseIfStatement() return nodeFactory.createNode(condition, trueBody, falseBody); } -ptr Parser::parseWhileStatement() +ASTPointer Parser::parseWhileStatement() { ASTNodeFactory nodeFactory(*this); expectToken(Token::WHILE); expectToken(Token::LPAREN); - ptr condition = parseExpression(); + ASTPointer condition = parseExpression(); expectToken(Token::RPAREN); - ptr body = parseStatement(); + ASTPointer body = parseStatement(); nodeFactory.setEndPositionFromNode(body); return nodeFactory.createNode(condition, body); } -ptr Parser::parseVariableDefinition() +ASTPointer Parser::parseVariableDefinition() { ASTNodeFactory nodeFactory(*this); bool const allowVar = true; - ptr variable = parseVariableDeclaration(allowVar); - ptr value; + ASTPointer variable = parseVariableDeclaration(allowVar); + ASTPointer value; if (m_scanner->getCurrentToken() == Token::ASSIGN) { m_scanner->next(); @@ -350,22 +350,22 @@ ptr Parser::parseVariableDefinition() return nodeFactory.createNode(variable, value); } -ptr Parser::parseExpression() +ASTPointer Parser::parseExpression() { ASTNodeFactory nodeFactory(*this); - ptr expression = parseBinaryExpression(); + ASTPointer expression = parseBinaryExpression(); if (!Token::isAssignmentOp(m_scanner->getCurrentToken())) return expression; Token::Value assignmentOperator = expectAssignmentOperator(); - ptr rightHandSide = parseExpression(); + ASTPointer rightHandSide = parseExpression(); nodeFactory.setEndPositionFromNode(rightHandSide); return nodeFactory.createNode(expression, assignmentOperator, rightHandSide); } -ptr Parser::parseBinaryExpression(int _minPrecedence) +ASTPointer Parser::parseBinaryExpression(int _minPrecedence) { ASTNodeFactory nodeFactory(*this); - ptr expression = parseUnaryExpression(); + ASTPointer expression = parseUnaryExpression(); int precedence = Token::precedence(m_scanner->getCurrentToken()); for (; precedence >= _minPrecedence; --precedence) { @@ -373,7 +373,7 @@ ptr Parser::parseBinaryExpression(int _minPrecedence) { Token::Value op = m_scanner->getCurrentToken(); m_scanner->next(); - ptr right = parseBinaryExpression(precedence + 1); + ASTPointer right = parseBinaryExpression(precedence + 1); nodeFactory.setEndPositionFromNode(right); expression = nodeFactory.createNode(expression, op, right); } @@ -381,7 +381,7 @@ ptr Parser::parseBinaryExpression(int _minPrecedence) return expression; } -ptr Parser::parseUnaryExpression() +ASTPointer Parser::parseUnaryExpression() { ASTNodeFactory nodeFactory(*this); Token::Value token = m_scanner->getCurrentToken(); @@ -389,14 +389,14 @@ ptr Parser::parseUnaryExpression() { // prefix expression m_scanner->next(); - ptr subExpression = parseUnaryExpression(); + ASTPointer subExpression = parseUnaryExpression(); nodeFactory.setEndPositionFromNode(subExpression); return nodeFactory.createNode(token, subExpression, true); } else { // potential postfix expression - ptr subExpression = parseLeftHandSideExpression(); + ASTPointer subExpression = parseLeftHandSideExpression(); token = m_scanner->getCurrentToken(); if (!Token::isCountOp(token)) return subExpression; @@ -406,38 +406,38 @@ ptr Parser::parseUnaryExpression() } } -ptr Parser::parseLeftHandSideExpression() +ASTPointer Parser::parseLeftHandSideExpression() { ASTNodeFactory nodeFactory(*this); - ptr expression = parsePrimaryExpression(); + ASTPointer expression = parsePrimaryExpression(); while (true) { switch (m_scanner->getCurrentToken()) { case Token::LBRACK: - { - m_scanner->next(); - ptr index = parseExpression(); - nodeFactory.markEndPosition(); - expectToken(Token::RBRACK); - expression = nodeFactory.createNode(expression, index); - } + { + m_scanner->next(); + ASTPointer index = parseExpression(); + nodeFactory.markEndPosition(); + expectToken(Token::RBRACK); + expression = nodeFactory.createNode(expression, index); + } break; case Token::PERIOD: - { - m_scanner->next(); - nodeFactory.markEndPosition(); - expression = nodeFactory.createNode(expression, expectIdentifierToken()); - } + { + m_scanner->next(); + nodeFactory.markEndPosition(); + expression = nodeFactory.createNode(expression, expectIdentifierToken()); + } break; case Token::LPAREN: - { - m_scanner->next(); - std::vector> arguments = parseFunctionCallArguments(); - nodeFactory.markEndPosition(); - expectToken(Token::RPAREN); - expression = nodeFactory.createNode(expression, arguments); - } + { + m_scanner->next(); + std::vector> arguments = parseFunctionCallArguments(); + nodeFactory.markEndPosition(); + expectToken(Token::RPAREN); + expression = nodeFactory.createNode(expression, arguments); + } break; default: return expression; @@ -445,16 +445,16 @@ ptr Parser::parseLeftHandSideExpression() } } -ptr Parser::parsePrimaryExpression() +ASTPointer Parser::parsePrimaryExpression() { ASTNodeFactory nodeFactory(*this); Token::Value token = m_scanner->getCurrentToken(); - ptr expression; + ASTPointer expression; switch (token) { case Token::TRUE_LITERAL: case Token::FALSE_LITERAL: - expression = nodeFactory.createNode(token, ptr()); + expression = nodeFactory.createNode(token, ASTPointer()); m_scanner->next(); break; case Token::NUMBER: @@ -467,12 +467,12 @@ ptr Parser::parsePrimaryExpression() expression = nodeFactory.createNode(getLiteralAndAdvance()); break; case Token::LPAREN: - { - m_scanner->next(); - ptr expression = parseExpression(); - expectToken(Token::RPAREN); - return expression; - } + { + m_scanner->next(); + ASTPointer expression = parseExpression(); + expectToken(Token::RPAREN); + return expression; + } default: if (Token::isElementaryTypeName(token)) { @@ -483,16 +483,16 @@ ptr Parser::parsePrimaryExpression() else { throwExpectationError("Expected primary expression."); - return ptr(); // this is not reached + return ASTPointer(); // this is not reached } break; } return expression; } -std::vector> Parser::parseFunctionCallArguments() +std::vector> Parser::parseFunctionCallArguments() { - std::vector> arguments; + std::vector> arguments; if (m_scanner->getCurrentToken() != Token::RPAREN) { arguments.push_back(parseExpression()); @@ -521,16 +521,16 @@ Token::Value Parser::expectAssignmentOperator() return op; } -ptr Parser::expectIdentifierToken() +ASTPointer Parser::expectIdentifierToken() { if (m_scanner->getCurrentToken() != Token::IDENTIFIER) throwExpectationError("Expected identifier"); return getLiteralAndAdvance(); } -ptr Parser::getLiteralAndAdvance() +ASTPointer Parser::getLiteralAndAdvance() { - ptr identifier = std::make_shared(m_scanner->getCurrentLiteral()); + ASTPointer identifier = std::make_shared(m_scanner->getCurrentLiteral()); m_scanner->next(); return identifier; } diff --git a/libsolidity/Parser.h b/libsolidity/Parser.h index 2a8613216..7cc415136 100644 --- a/libsolidity/Parser.h +++ b/libsolidity/Parser.h @@ -34,7 +34,7 @@ class Scanner; class Parser { public: - ptr parse(std::shared_ptr const& _scanner); + ASTPointer parse(std::shared_ptr const& _scanner); private: class ASTNodeFactory; @@ -46,24 +46,24 @@ private: /// Parsing functions for the AST nodes /// @{ - ptr parseContractDefinition(); - ptr parseFunctionDefinition(bool _isPublic); - ptr parseStructDefinition(); - ptr parseVariableDeclaration(bool _allowVar); - ptr parseTypeName(bool _allowVar); - ptr parseMapping(); - ptr parseParameterList(bool _allowEmpty = true); - ptr parseBlock(); - ptr parseStatement(); - ptr parseIfStatement(); - ptr parseWhileStatement(); - ptr parseVariableDefinition(); - ptr parseExpression(); - ptr parseBinaryExpression(int _minPrecedence = 4); - ptr parseUnaryExpression(); - ptr parseLeftHandSideExpression(); - ptr parsePrimaryExpression(); - std::vector> parseFunctionCallArguments(); + ASTPointer parseContractDefinition(); + ASTPointer parseFunctionDefinition(bool _isPublic); + ASTPointer parseStructDefinition(); + ASTPointer parseVariableDeclaration(bool _allowVar); + ASTPointer parseTypeName(bool _allowVar); + ASTPointer parseMapping(); + ASTPointer parseParameterList(bool _allowEmpty = true); + ASTPointer parseBlock(); + ASTPointer parseStatement(); + ASTPointer parseIfStatement(); + ASTPointer parseWhileStatement(); + ASTPointer parseVariableDefinition(); + ASTPointer parseExpression(); + ASTPointer parseBinaryExpression(int _minPrecedence = 4); + ASTPointer parseUnaryExpression(); + ASTPointer parseLeftHandSideExpression(); + ASTPointer parsePrimaryExpression(); + std::vector> parseFunctionCallArguments(); /// @} /// Helper functions @@ -71,8 +71,8 @@ private: /// If current token value is not _value, throw exception otherwise advance token. void expectToken(Token::Value _value); Token::Value expectAssignmentOperator(); - ptr expectIdentifierToken(); - ptr getLiteralAndAdvance(); + ASTPointer expectIdentifierToken(); + ASTPointer getLiteralAndAdvance(); void throwExpectationError(std::string const& _description); /// @} diff --git a/libsolidity/Scanner.cpp b/libsolidity/Scanner.cpp index b65c0545b..d0183db9f 100644 --- a/libsolidity/Scanner.cpp +++ b/libsolidity/Scanner.cpp @@ -81,12 +81,15 @@ bool IsIdentifierPart(char c) int HexValue(char c) { - if (c >= '0' && c <= '9') return c - '0'; - else if (c >= 'a' && c <= 'f') return c - 'a' + 10; - else if (c >= 'A' && c <= 'F') return c - 'A' + 10; + if (c >= '0' && c <= '9') + return c - '0'; + else if (c >= 'a' && c <= 'f') + return c - 'a' + 10; + else if (c >= 'A' && c <= 'F') + return c - 'A' + 10; else return -1; } -} +} // end anonymous namespace Scanner::Scanner(CharStream const& _source) { @@ -409,13 +412,15 @@ bool Scanner::scanEscape() c = '\t'; break; case 'u': - if (!scanHexNumber(c, 4)) return false; + if (!scanHexNumber(c, 4)) + return false; break; case 'v': c = '\v'; break; case 'x': - if (!scanHexNumber(c, 2)) return false; + if (!scanHexNumber(c, 2)) + return false; break; } @@ -612,9 +617,8 @@ case ch: int const keyword_length = sizeof(keyword) - 1; \ BOOST_STATIC_ASSERT(keyword_length >= kMinLength); \ BOOST_STATIC_ASSERT(keyword_length <= kMaxLength); \ - if (input == keyword) { \ - return token; \ - } \ + if (input == keyword) \ + return token; \ } KEYWORDS(KEYWORD_GROUP_CASE, KEYWORD) } @@ -635,9 +639,11 @@ Token::Value Scanner::scanIdentifierOrKeyword() char CharStream::advanceAndGet() { - if (isPastEndOfInput()) return 0; + if (isPastEndOfInput()) + return 0; ++m_pos; - if (isPastEndOfInput()) return 0; + if (isPastEndOfInput()) + return 0; return get(); } @@ -653,7 +659,8 @@ std::string CharStream::getLineAtPosition(int _position) const // if _position points to \n, it returns the line before the \n using size_type = std::string::size_type; size_type searchStart = std::min(m_source.size(), _position); - if (searchStart > 0) searchStart--; + if (searchStart > 0) + searchStart--; size_type lineStart = m_source.rfind('\n', searchStart); if (lineStart == std::string::npos) lineStart = 0; diff --git a/libsolidity/Scope.h b/libsolidity/Scope.h index ced783261..2e36e5281 100644 --- a/libsolidity/Scope.h +++ b/libsolidity/Scope.h @@ -23,7 +23,6 @@ #pragma once #include - #include #include diff --git a/libsolidity/Types.cpp b/libsolidity/Types.cpp index 8ca2c6342..88abbc77d 100644 --- a/libsolidity/Types.cpp +++ b/libsolidity/Types.cpp @@ -28,7 +28,7 @@ namespace dev namespace solidity { -ptr Type::fromElementaryTypeName(Token::Value _typeToken) +std::shared_ptr Type::fromElementaryTypeName(Token::Value _typeToken) { if (Token::INT <= _typeToken && _typeToken <= Token::HASH256) { @@ -52,18 +52,18 @@ ptr Type::fromElementaryTypeName(Token::Value _typeToken) BOOST_ASSERT(false); // @todo add other tyes } -ptr Type::fromUserDefinedTypeName(UserDefinedTypeName const& _typeName) +std::shared_ptr Type::fromUserDefinedTypeName(UserDefinedTypeName const& _typeName) { return std::make_shared(*_typeName.getReferencedStruct()); } -ptr Type::fromMapping(Mapping const&) +std::shared_ptr Type::fromMapping(Mapping const&) { BOOST_ASSERT(false); //@todo not yet implemented - return ptr(); + return std::shared_ptr(); } -ptr Type::forLiteral(Literal const& _literal) +std::shared_ptr Type::forLiteral(Literal const& _literal) { switch (_literal.getToken()) { @@ -73,13 +73,13 @@ ptr Type::forLiteral(Literal const& _literal) case Token::NUMBER: return IntegerType::smallestTypeForLiteral(_literal.getValue()); case Token::STRING_LITERAL: - return ptr(); // @todo + return std::shared_ptr(); // @todo default: - return ptr(); + return std::shared_ptr(); } } -ptr IntegerType::smallestTypeForLiteral(const std::string&) +std::shared_ptr IntegerType::smallestTypeForLiteral(std::string const&) { //@todo return std::make_shared(256, Modifier::UNSIGNED); diff --git a/libsolidity/Types.h b/libsolidity/Types.h index 9ab710942..e0c09bdcf 100644 --- a/libsolidity/Types.h +++ b/libsolidity/Types.h @@ -26,7 +26,7 @@ #include #include #include - +#include #include namespace dev @@ -34,18 +34,6 @@ namespace dev namespace solidity { -// AST forward declarations -class ContractDefinition; -class FunctionDefinition; -class StructDefinition; -class Literal; -class ElementaryTypeName; -class UserDefinedTypeName; -class Mapping; - -template -using ptr = std::shared_ptr; - // @todo realMxN, string, mapping class Type: private boost::noncopyable @@ -57,11 +45,11 @@ public: }; //! factory functions that convert an AST TypeName to a Type. - static ptr fromElementaryTypeName(Token::Value _typeToken); - static ptr fromUserDefinedTypeName(UserDefinedTypeName const& _typeName); - static ptr fromMapping(Mapping const& _typeName); + static std::shared_ptr fromElementaryTypeName(Token::Value _typeToken); + static std::shared_ptr fromUserDefinedTypeName(UserDefinedTypeName const& _typeName); + static std::shared_ptr fromMapping(Mapping const& _typeName); - static ptr forLiteral(Literal const& _literal); + static std::shared_ptr forLiteral(Literal const& _literal); virtual Category getCategory() const = 0; virtual bool isImplicitlyConvertibleTo(Type const&) const { return false; } @@ -82,7 +70,7 @@ public: }; virtual Category getCategory() const { return Category::INTEGER; } - static ptr smallestTypeForLiteral(std::string const& _literal); + static std::shared_ptr smallestTypeForLiteral(std::string const& _literal); explicit IntegerType(int _bits, Modifier _modifier = Modifier::UNSIGNED); @@ -95,6 +83,7 @@ public: bool isHash() const { return m_modifier == Modifier::HASH || m_modifier == Modifier::ADDRESS; } bool isAddress() const { return m_modifier == Modifier::ADDRESS; } int isSigned() const { return m_modifier == Modifier::SIGNED; } + private: int m_bits; Modifier m_modifier; @@ -125,6 +114,7 @@ public: virtual Category getCategory() const { return Category::CONTRACT; } ContractType(ContractDefinition const& _contract): m_contract(_contract) {} virtual bool isImplicitlyConvertibleTo(Type const& _convertTo) const; + private: ContractDefinition const& m_contract; }; @@ -139,6 +129,7 @@ public: { return _operator == Token::DELETE; } + private: StructDefinition const& m_struct; }; @@ -150,6 +141,7 @@ public: FunctionType(FunctionDefinition const& _function): m_function(_function) {} FunctionDefinition const& getFunction() const { return m_function; } + private: FunctionDefinition const& m_function; }; @@ -175,11 +167,12 @@ class TypeType: public Type { public: virtual Category getCategory() const { return Category::TYPE; } - TypeType(ptr const& _actualType): m_actualType(_actualType) {} + TypeType(std::shared_ptr const& _actualType): m_actualType(_actualType) {} + + std::shared_ptr const& getActualType() const { return m_actualType; } - ptr const& getActualType() { return m_actualType; } private: - ptr m_actualType; + std::shared_ptr m_actualType; }; diff --git a/solc/main.cpp b/solc/main.cpp index a2b791462..e155b0fe6 100644 --- a/solc/main.cpp +++ b/solc/main.cpp @@ -15,9 +15,9 @@ namespace dev namespace solidity { -ptr parseAST(std::string const& _source) +ASTPointer parseAST(std::string const& _source) { - ptr scanner = std::make_shared(CharStream(_source)); + ASTPointer scanner = std::make_shared(CharStream(_source)); Parser parser; return parser.parse(scanner); } @@ -73,7 +73,7 @@ int main(int argc, char** argv) } std::cout << "Parsing..." << std::endl; // @todo catch exception - dev::solidity::ptr ast = dev::solidity::parseAST(src); + dev::solidity::ASTPointer ast = dev::solidity::parseAST(src); std::cout << "Syntax tree for the contract:" << std::endl; dev::solidity::ASTPrinter printer(ast, src); printer.print(std::cout); diff --git a/test/solidityNameAndTypeResolution.cpp b/test/solidityNameAndTypeResolution.cpp index ed2cb7b53..833ae6d4b 100644 --- a/test/solidityNameAndTypeResolution.cpp +++ b/test/solidityNameAndTypeResolution.cpp @@ -41,7 +41,7 @@ namespace void parseTextAndResolveNames(const std::string& _source) { Parser parser; - ptr contract = parser.parse( + ASTPointer contract = parser.parse( std::make_shared(CharStream(_source))); NameAndTypeResolver resolver; resolver.resolveNamesAndTypes(*contract); diff --git a/test/solidityParser.cpp b/test/solidityParser.cpp index ef434cc35..025cd74d1 100644 --- a/test/solidityParser.cpp +++ b/test/solidityParser.cpp @@ -37,7 +37,7 @@ namespace test namespace { -ptr parseText(const std::string& _source) +ASTPointer parseText(const std::string& _source) { Parser parser; return parser.parse(std::make_shared(CharStream(_source)));