solidity/libsolidity/ASTAnnotations.h

134 lines
4.0 KiB
C
Raw Normal View History

/*
This file is part of cpp-ethereum.
cpp-ethereum is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
cpp-ethereum is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with cpp-ethereum. If not, see <http://www.gnu.org/licenses/>.
*/
/**
* @author Christian <c@ethdev.com>
* @date 2015
* Object containing the type and other annotations for the AST nodes.
*/
#pragma once
#include <map>
#include <memory>
#include <vector>
2015-10-07 13:57:17 +00:00
#include <set>
2015-09-21 16:55:58 +00:00
#include <libsolidity/ASTForward.h>
namespace dev
{
namespace solidity
{
class Type;
using TypePointer = std::shared_ptr<Type const>;
struct ASTAnnotation
{
2015-09-21 16:55:58 +00:00
virtual ~ASTAnnotation() {}
};
struct TypeDeclarationAnnotation: ASTAnnotation
{
/// The name of this type, prefixed by proper namespaces if globally accessible.
std::string canonicalName;
};
struct ContractDefinitionAnnotation: TypeDeclarationAnnotation
2015-09-21 16:55:58 +00:00
{
/// Whether all functions are implemented.
bool isFullyImplemented = true;
/// List of all (direct and indirect) base contracts in order from derived to
/// base, including the contract itself.
std::vector<ContractDefinition const*> linearizedBaseContracts;
2015-10-07 13:57:17 +00:00
/// List of contracts this contract creates, i.e. which need to be compiled first.
/// Also includes all contracts from @a linearizedBaseContracts.
std::set<ContractDefinition const*> contractDependencies;
2015-09-21 16:55:58 +00:00
};
struct VariableDeclarationAnnotation: ASTAnnotation
{
/// Type of variable (type of identifier referencing this variable).
TypePointer type;
};
struct ReturnAnnotation: ASTAnnotation
{
/// Reference to the return parameters of the function.
ParameterList const* functionReturnParameters = nullptr;
};
struct TypeNameAnnotation: ASTAnnotation
{
/// Type declared by this type name, i.e. type of a variable where this type name is used.
/// Set during reference resolution stage.
TypePointer type;
};
struct UserDefinedTypeNameAnnotation: TypeNameAnnotation
{
/// Referenced declaration, set during reference resolution stage.
Declaration const* referencedDeclaration = nullptr;
};
2015-09-21 16:55:58 +00:00
struct ExpressionAnnotation: ASTAnnotation
{
/// Inferred type of the expression.
TypePointer type;
2015-09-21 16:55:58 +00:00
/// Whether it is an LValue (i.e. something that can be assigned to).
bool isLValue = false;
2015-09-21 16:55:58 +00:00
/// Whether the expression is used in a context where the LValue is actually required.
bool lValueRequested = false;
2015-09-21 16:55:58 +00:00
/// Types of arguments if the expression is a function that is called - used
/// for overload resolution.
std::shared_ptr<std::vector<TypePointer>> argumentTypes;
2015-09-21 16:55:58 +00:00
};
struct IdentifierAnnotation: ExpressionAnnotation
{
/// Stores a reference to the current contract.
/// This is needed because types of base contracts change depending on the context.
ContractDefinition const* contractScope = nullptr;
/// Referenced declaration, set at latest during overload resolution stage.
Declaration const* referencedDeclaration = nullptr;
2015-09-21 16:55:58 +00:00
/// List of possible declarations it could refer to.
std::vector<Declaration const*> overloadedDeclarations;
2015-09-21 16:55:58 +00:00
};
struct MemberAccessAnnotation: ExpressionAnnotation
{
/// Referenced declaration, set at latest during overload resolution stage.
Declaration const* referencedDeclaration = nullptr;
};
struct BinaryOperationAnnotation: ExpressionAnnotation
{
/// The common type that is used for the operation, not necessarily the result type (which
/// e.g. for comparisons is bool).
TypePointer commonType;
};
struct FunctionCallAnnotation: ExpressionAnnotation
{
/// Whether this is an explicit type conversion.
bool isTypeConversion = false;
2015-09-21 16:55:58 +00:00
/// Whether this is a struct constructor call.
bool isStructConstructorCall = false;
};
}
}