From f2f9bd2e7ac1372073644a4e30a5d99e8c57fbb1 Mon Sep 17 00:00:00 2001 From: Leonid Logvinov Date: Tue, 10 Apr 2018 13:44:15 +0200 Subject: Revert "Merge pull request #493 from hysz/features/deployer/multipleCodebaseSupport" This reverts commit 70d403e6f8c56bc70e6d3471a770b9bbff5d72e7, reversing changes made to 073bf738ddb271b6b4158798baf4cac3cb0608e9. --- packages/deployer/src/compiler.ts | 107 ++++++++++++-------------------------- 1 file changed, 34 insertions(+), 73 deletions(-) (limited to 'packages/deployer/src/compiler.ts') diff --git a/packages/deployer/src/compiler.ts b/packages/deployer/src/compiler.ts index e3ecc6c72..ba360cb57 100644 --- a/packages/deployer/src/compiler.ts +++ b/packages/deployer/src/compiler.ts @@ -1,4 +1,4 @@ -import { AbiType, ContractAbi, MethodAbi } from '@0xproject/types'; +import { ContractAbi } from '@0xproject/types'; import { logUtils, promisify } from '@0xproject/utils'; import * as ethUtil from 'ethereumjs-util'; import * as fs from 'fs'; @@ -11,8 +11,6 @@ import solc = require('solc'); import { binPaths } from './solc/bin_paths'; import { - constructContractId, - constructUniqueSourceFileId, createDirIfDoesNotExistAsync, findImportIfExist, getContractArtifactIfExistsAsync, @@ -25,14 +23,11 @@ import { fsWrapper } from './utils/fs_wrapper'; import { CompilerOptions, ContractArtifact, - ContractDirectory, - ContractIdToSourceFileId, ContractNetworkData, ContractNetworks, - ContractSourceDataByFileId, + ContractSourceData, ContractSources, ContractSpecificSourceData, - FunctionNameToSeenCount, } from './utils/types'; import { utils } from './utils/utils'; @@ -44,22 +39,20 @@ const SOLC_BIN_DIR = path.join(__dirname, '..', '..', 'solc_bin'); * to artifact files. */ export class Compiler { - private _contractDirs: Set; + private _contractsDir: string; private _networkId: number; private _optimizerEnabled: boolean; private _artifactsDir: string; // This get's set in the beggining of `compileAsync` function. It's not called from a constructor, but it's the only public method of that class and could as well be. private _contractSources!: ContractSources; private _specifiedContracts: Set = new Set(); - private _contractSourceDataByFileId: ContractSourceDataByFileId = {}; - + private _contractSourceData: ContractSourceData = {}; /** * Recursively retrieves Solidity source code from directory. * @param dirPath Directory to search. - * @param contractBaseDir Base contracts directory of search tree. - * @return Mapping of sourceFilePath to the contract source. + * @return Mapping of contract fileName to contract source. */ - private static async _getContractSourcesAsync(dirPath: string, contractBaseDir: string): Promise { + private static async _getContractSourcesAsync(dirPath: string): Promise { let dirContents: string[] = []; try { dirContents = await fsWrapper.readdirAsync(dirPath); @@ -75,18 +68,14 @@ export class Compiler { encoding: 'utf8', }; const source = await fsWrapper.readFileAsync(contentPath, opts); - if (!_.startsWith(contentPath, contractBaseDir)) { - throw new Error(`Expected content path '${contentPath}' to begin with '${contractBaseDir}'`); - } - const sourceFilePath = contentPath.slice(contractBaseDir.length); - sources[sourceFilePath] = source; - logUtils.log(`Reading ${sourceFilePath} source...`); + sources[fileName] = source; + logUtils.log(`Reading ${fileName} source...`); } catch (err) { logUtils.log(`Could not find file at ${contentPath}`); } } else { try { - const nestedSources = await Compiler._getContractSourcesAsync(contentPath, contractBaseDir); + const nestedSources = await Compiler._getContractSourcesAsync(contentPath); sources = { ...sources, ...nestedSources, @@ -104,7 +93,7 @@ export class Compiler { * @return An instance of the Compiler class. */ constructor(opts: CompilerOptions) { - this._contractDirs = opts.contractDirs; + this._contractsDir = opts.contractsDir; this._networkId = opts.networkId; this._optimizerEnabled = opts.optimizerEnabled; this._artifactsDir = opts.artifactsDir; @@ -116,49 +105,25 @@ export class Compiler { public async compileAsync(): Promise { await createDirIfDoesNotExistAsync(this._artifactsDir); await createDirIfDoesNotExistAsync(SOLC_BIN_DIR); - this._contractSources = {}; - const contractIdToSourceFileId: ContractIdToSourceFileId = {}; - const contractDirs = Array.from(this._contractDirs.values()); - for (const contractDir of contractDirs) { - const sources = await Compiler._getContractSourcesAsync(contractDir.path, contractDir.path); - _.forIn(sources, (source, sourceFilePath) => { - const sourceFileId = constructUniqueSourceFileId(contractDir.namespace, sourceFilePath); - // Record the file's source and data - if (!_.isUndefined(this._contractSources[sourceFileId])) { - throw new Error(`Found duplicate source files with ID '${sourceFileId}'`); - } - this._contractSources[sourceFileId] = source; - // Create a mapping between the contract id and its source file id - const contractId = constructContractId(contractDir.namespace, sourceFilePath); - if (!_.isUndefined(contractIdToSourceFileId[contractId])) { - throw new Error(`Found duplicate contract with ID '${contractId}'`); - } - contractIdToSourceFileId[contractId] = sourceFileId; - }); - } + this._contractSources = await Compiler._getContractSourcesAsync(this._contractsDir); _.forIn(this._contractSources, this._setContractSpecificSourceData.bind(this)); - const specifiedContractIds = this._specifiedContracts.has(ALL_CONTRACTS_IDENTIFIER) - ? _.keys(contractIdToSourceFileId) + const fileNames = this._specifiedContracts.has(ALL_CONTRACTS_IDENTIFIER) + ? _.keys(this._contractSources) : Array.from(this._specifiedContracts.values()); - await Promise.all( - _.map(specifiedContractIds, async contractId => - this._compileContractAsync(contractIdToSourceFileId[contractId]), - ), - ); + for (const fileName of fileNames) { + await this._compileContractAsync(fileName); + } } /** * Compiles contract and saves artifact to artifactsDir. - * @param sourceFileId Unique ID of the source file. + * @param fileName Name of contract with '.sol' extension. */ - private async _compileContractAsync(sourceFileId: string): Promise { + private async _compileContractAsync(fileName: string): Promise { if (_.isUndefined(this._contractSources)) { throw new Error('Contract sources not yet initialized'); } - if (_.isUndefined(this._contractSourceDataByFileId[sourceFileId])) { - throw new Error(`Contract source for ${sourceFileId} not yet initialized`); - } - const contractSpecificSourceData = this._contractSourceDataByFileId[sourceFileId]; - const currentArtifactIfExists = await getContractArtifactIfExistsAsync(this._artifactsDir, sourceFileId); + const contractSpecificSourceData = this._contractSourceData[fileName]; + const currentArtifactIfExists = await getContractArtifactIfExistsAsync(this._artifactsDir, fileName); const sourceHash = `0x${contractSpecificSourceData.sourceHash.toString('hex')}`; const sourceTreeHash = `0x${contractSpecificSourceData.sourceTreeHash.toString('hex')}`; @@ -197,17 +162,16 @@ export class Compiler { } const solcInstance = solc.setupMethods(requireFromString(solcjs, compilerBinFilename)); - logUtils.log(`Compiling ${sourceFileId} with Solidity v${solcVersion}...`); - const source = this._contractSources[sourceFileId]; + logUtils.log(`Compiling ${fileName} with Solidity v${solcVersion}...`); + const source = this._contractSources[fileName]; const input = { - [sourceFileId]: source, + [fileName]: source, }; const sourcesToCompile = { sources: input, }; - const compiled = solcInstance.compile(sourcesToCompile, Number(this._optimizerEnabled), importPath => - findImportIfExist(this._contractSources, sourceFileId, importPath), + findImportIfExist(this._contractSources, importPath), ); if (!_.isUndefined(compiled.errors)) { @@ -229,11 +193,11 @@ export class Compiler { }); } } - const contractName = path.basename(sourceFileId, constants.SOLIDITY_FILE_EXTENSION); - const contractIdentifier = `${sourceFileId}:${contractName}`; + const contractName = path.basename(fileName, constants.SOLIDITY_FILE_EXTENSION); + const contractIdentifier = `${fileName}:${contractName}`; if (_.isUndefined(compiled.contracts[contractIdentifier])) { throw new Error( - `Contract ${contractName} not found in ${sourceFileId}. Please make sure your contract has the same name as it's file name`, + `Contract ${contractName} not found in ${fileName}. Please make sure your contract has the same name as it's file name`, ); } const abi: ContractAbi = JSON.parse(compiled.contracts[contractIdentifier].interface); @@ -243,7 +207,6 @@ export class Compiler { const sourceMapRuntime = compiled.contracts[contractIdentifier].srcmapRuntime; const sources = _.keys(compiled.sources); const updated_at = Date.now(); - const contractNetworkData: ContractNetworkData = { solc_version: solcVersion, keccak256: sourceHash, @@ -280,30 +243,28 @@ export class Compiler { const artifactString = utils.stringifyWithFormatting(newArtifact); const currentArtifactPath = `${this._artifactsDir}/${contractName}.json`; await fsWrapper.writeFileAsync(currentArtifactPath, artifactString); - logUtils.log(`${sourceFileId} artifact saved!`); + logUtils.log(`${fileName} artifact saved!`); } /** * Gets contract dependendencies and keccak256 hash from source. * @param source Source code of contract. - * @param fileId FileId of the contract source file. * @return Object with contract dependencies and keccak256 hash of source. */ - private _setContractSpecificSourceData(source: string, fileId: string): void { - if (!_.isUndefined(this._contractSourceDataByFileId[fileId])) { + private _setContractSpecificSourceData(source: string, fileName: string): void { + if (!_.isUndefined(this._contractSourceData[fileName])) { return; } const sourceHash = ethUtil.sha3(source); const solcVersionRange = parseSolidityVersionRange(source); - const dependencies = parseDependencies(source, fileId); - const sourceTreeHash = this._getSourceTreeHash(fileId, sourceHash, dependencies); - this._contractSourceDataByFileId[fileId] = { + const dependencies = parseDependencies(source); + const sourceTreeHash = this._getSourceTreeHash(fileName, sourceHash, dependencies); + this._contractSourceData[fileName] = { dependencies, solcVersionRange, sourceHash, sourceTreeHash, }; } - /** * Gets the source tree hash for a file and its dependencies. * @param fileName Name of contract file. @@ -315,7 +276,7 @@ export class Compiler { const dependencySourceTreeHashes = _.map(dependencies, dependency => { const source = this._contractSources[dependency]; this._setContractSpecificSourceData(source, dependency); - const sourceData = this._contractSourceDataByFileId[dependency]; + const sourceData = this._contractSourceData[dependency]; return this._getSourceTreeHash(dependency, sourceData.sourceHash, sourceData.dependencies); }); const sourceTreeHashesBuffer = Buffer.concat([sourceHash, ...dependencySourceTreeHashes]); -- cgit v1.2.3