diff options
author | Lefteris Karapetsas <lefteris@refu.co> | 2014-12-05 00:28:46 +0800 |
---|---|---|
committer | Lefteris Karapetsas <lefteris@refu.co> | 2014-12-05 00:28:46 +0800 |
commit | df4db1de0714e000376bc1efa3db85d57c6a6819 (patch) | |
tree | 98bac4d72a9fc3c5226b9a05ebb65a899ad1ccae /AST.h | |
parent | 05964375f888e8b8a3ccf5bc01d9cfff8fd00566 (diff) | |
parent | 5af545d47d7920d0e58c6813ba34f108ce5d50f6 (diff) | |
download | dexon-solidity-df4db1de0714e000376bc1efa3db85d57c6a6819.tar.gz dexon-solidity-df4db1de0714e000376bc1efa3db85d57c6a6819.tar.zst dexon-solidity-df4db1de0714e000376bc1efa3db85d57c6a6819.zip |
Merge branch 'develop' into natspec_export_json
Diffstat (limited to 'AST.h')
-rw-r--r-- | AST.h | 23 |
1 files changed, 17 insertions, 6 deletions
@@ -88,11 +88,16 @@ public: Declaration(Location const& _location, ASTPointer<ASTString> const& _name): ASTNode(_location), m_name(_name) {} - /// Returns the declared name. + /// @returns the declared name. ASTString const& getName() const { return *m_name; } + /// @returns the scope this declaration resides in. Can be nullptr if it is the global scope. + /// Available only after name and type resolution step. + Declaration* getScope() const { return m_scope; } + void setScope(Declaration* const& _scope) { m_scope = _scope; } private: ASTPointer<ASTString> m_name; + Declaration* m_scope; }; /** @@ -237,6 +242,8 @@ public: std::shared_ptr<Type const> const& getType() const { return m_type; } void setType(std::shared_ptr<Type const> const& _type) { m_type = _type; } + bool isLocalVariable() const { return !!dynamic_cast<FunctionDefinition*>(getScope()); } + private: ASTPointer<TypeName> m_typeName; ///< can be empty ("var") @@ -521,12 +528,16 @@ private: */ class Expression: public ASTNode { +protected: + enum class LValueType { NONE, LOCAL, STORAGE }; + public: - Expression(Location const& _location): ASTNode(_location), m_isLvalue(false), m_lvalueRequested(false) {} + Expression(Location const& _location): ASTNode(_location), m_lvalue(LValueType::NONE), m_lvalueRequested(false) {} virtual void checkTypeRequirements() = 0; std::shared_ptr<Type const> const& getType() const { return m_type; } - bool isLvalue() const { return m_isLvalue; } + bool isLValue() const { return m_lvalue != LValueType::NONE; } + bool isLocalLValue() const { return m_lvalue == LValueType::LOCAL; } /// Helper function, infer the type via @ref checkTypeRequirements and then check that it /// is implicitly convertible to @a _expectedType. If not, throw exception. @@ -541,9 +552,9 @@ public: protected: //! Inferred type of the expression, only filled after a call to checkTypeRequirements(). std::shared_ptr<Type const> m_type; - //! Whether or not this expression is an lvalue, i.e. something that can be assigned to. - //! This is set during calls to @a checkTypeRequirements() - bool m_isLvalue; + //! If this expression is an lvalue (i.e. something that can be assigned to) and is stored + //! locally or in storage. This is set during calls to @a checkTypeRequirements() + LValueType m_lvalue; //! Whether the outer expression requested the address (true) or the value (false) of this expression. bool m_lvalueRequested; }; |