mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Add skeleton for contract level checker.
This commit is contained in:
parent
6aa9ce2d43
commit
0bd9db480f
@ -1,6 +1,7 @@
|
|||||||
# Until we have a clear separation, libyul has to be included here
|
# Until we have a clear separation, libyul has to be included here
|
||||||
set(sources
|
set(sources
|
||||||
analysis/ConstantEvaluator.cpp
|
analysis/ConstantEvaluator.cpp
|
||||||
|
analysis/ContractLevelChecker.cpp
|
||||||
analysis/ControlFlowAnalyzer.cpp
|
analysis/ControlFlowAnalyzer.cpp
|
||||||
analysis/ControlFlowBuilder.cpp
|
analysis/ControlFlowBuilder.cpp
|
||||||
analysis/ControlFlowGraph.cpp
|
analysis/ControlFlowGraph.cpp
|
||||||
|
37
libsolidity/analysis/ContractLevelChecker.cpp
Normal file
37
libsolidity/analysis/ContractLevelChecker.cpp
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
/*
|
||||||
|
This file is part of solidity.
|
||||||
|
|
||||||
|
solidity 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.
|
||||||
|
|
||||||
|
solidity 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 solidity. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* Component that verifies overloads, abstract contracts, function clashes and others
|
||||||
|
* checks at contract or function level.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <libsolidity/analysis/ContractLevelChecker.h>
|
||||||
|
#include <libsolidity/ast/AST.h>
|
||||||
|
|
||||||
|
#include <liblangutil/ErrorReporter.h>
|
||||||
|
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
using namespace dev;
|
||||||
|
using namespace langutil;
|
||||||
|
using namespace dev::solidity;
|
||||||
|
|
||||||
|
|
||||||
|
bool ContractLevelChecker::check(ContractDefinition const&)
|
||||||
|
{
|
||||||
|
return Error::containsOnlyWarnings(m_errorReporter.errors());
|
||||||
|
}
|
59
libsolidity/analysis/ContractLevelChecker.h
Normal file
59
libsolidity/analysis/ContractLevelChecker.h
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
/*
|
||||||
|
This file is part of solidity.
|
||||||
|
|
||||||
|
solidity 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.
|
||||||
|
|
||||||
|
solidity 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 solidity. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* Component that verifies overloads, abstract contracts, function clashes and others
|
||||||
|
* checks at contract or function level.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <libsolidity/ast/ASTForward.h>
|
||||||
|
|
||||||
|
#include <map>
|
||||||
|
|
||||||
|
namespace langutil
|
||||||
|
{
|
||||||
|
class ErrorReporter;
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace dev
|
||||||
|
{
|
||||||
|
namespace solidity
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Component that verifies overloads, abstract contracts, function clashes and others
|
||||||
|
* checks at contract or function level.
|
||||||
|
*/
|
||||||
|
class ContractLevelChecker
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/// @param _errorReporter provides the error logging functionality.
|
||||||
|
explicit ContractLevelChecker(langutil::ErrorReporter& _errorReporter):
|
||||||
|
m_errorReporter(_errorReporter)
|
||||||
|
{}
|
||||||
|
|
||||||
|
/// Performs checks on the given contract.
|
||||||
|
/// @returns true iff all checks passed. Note even if all checks passed, errors() can still contain warnings
|
||||||
|
bool check(ContractDefinition const& _contract);
|
||||||
|
|
||||||
|
private:
|
||||||
|
langutil::ErrorReporter& m_errorReporter;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
@ -28,6 +28,7 @@
|
|||||||
#include <libsolidity/analysis/SemVerHandler.h>
|
#include <libsolidity/analysis/SemVerHandler.h>
|
||||||
#include <libsolidity/ast/AST.h>
|
#include <libsolidity/ast/AST.h>
|
||||||
#include <libsolidity/parsing/Parser.h>
|
#include <libsolidity/parsing/Parser.h>
|
||||||
|
#include <libsolidity/analysis/ContractLevelChecker.h>
|
||||||
#include <libsolidity/analysis/ControlFlowAnalyzer.h>
|
#include <libsolidity/analysis/ControlFlowAnalyzer.h>
|
||||||
#include <libsolidity/analysis/ControlFlowGraph.h>
|
#include <libsolidity/analysis/ControlFlowGraph.h>
|
||||||
#include <libsolidity/analysis/GlobalContext.h>
|
#include <libsolidity/analysis/GlobalContext.h>
|
||||||
@ -225,8 +226,21 @@ bool CompilerStack::analyze()
|
|||||||
m_contracts[contract->fullyQualifiedName()].contract = contract;
|
m_contracts[contract->fullyQualifiedName()].contract = contract;
|
||||||
}
|
}
|
||||||
|
|
||||||
// This cannot be done in the above loop, because cross-contract types couldn't be resolved.
|
// Next, we check inheritance, overrides, function collisions and other things at
|
||||||
// A good example is `LibraryName.TypeName x;`.
|
// contract or function level.
|
||||||
|
// This also calculates whether a contract is abstract, which is needed by the
|
||||||
|
// type checker.
|
||||||
|
ContractLevelChecker contractLevelChecker(m_errorReporter);
|
||||||
|
for (Source const* source: m_sourceOrder)
|
||||||
|
for (ASTPointer<ASTNode> const& node: source->ast->nodes())
|
||||||
|
if (ContractDefinition* contract = dynamic_cast<ContractDefinition*>(node.get()))
|
||||||
|
if (!contractLevelChecker.check(*contract))
|
||||||
|
noErrors = false;
|
||||||
|
|
||||||
|
// New we run full type checks that go down to the expression level. This
|
||||||
|
// cannot be done earlier, because we need cross-contract types and information
|
||||||
|
// about whether a contract is abstract for the `new` expression.
|
||||||
|
// This populates the `type` annotation for all expressions.
|
||||||
//
|
//
|
||||||
// Note: this does not resolve overloaded functions. In order to do that, types of arguments are needed,
|
// Note: this does not resolve overloaded functions. In order to do that, types of arguments are needed,
|
||||||
// which is only done one step later.
|
// which is only done one step later.
|
||||||
|
Loading…
Reference in New Issue
Block a user