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 | ||||
| set(sources | ||||
| 	analysis/ConstantEvaluator.cpp | ||||
| 	analysis/ContractLevelChecker.cpp | ||||
| 	analysis/ControlFlowAnalyzer.cpp | ||||
| 	analysis/ControlFlowBuilder.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/ast/AST.h> | ||||
| #include <libsolidity/parsing/Parser.h> | ||||
| #include <libsolidity/analysis/ContractLevelChecker.h> | ||||
| #include <libsolidity/analysis/ControlFlowAnalyzer.h> | ||||
| #include <libsolidity/analysis/ControlFlowGraph.h> | ||||
| #include <libsolidity/analysis/GlobalContext.h> | ||||
| @ -225,8 +226,21 @@ bool CompilerStack::analyze() | ||||
| 						m_contracts[contract->fullyQualifiedName()].contract = contract; | ||||
| 				} | ||||
| 
 | ||||
| 		// This cannot be done in the above loop, because cross-contract types couldn't be resolved.
 | ||||
| 		// A good example is `LibraryName.TypeName x;`.
 | ||||
| 		// Next, we check inheritance, overrides, function collisions and other things at
 | ||||
| 		// 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,
 | ||||
| 		// which is only done one step later.
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user