fix: use original source ID's from compiler output

Previously, was generating fresh source ID's but per @LogvinovLeon 's
comment (cited below) that will likely break existing source code
mappings.

Changed to use the original source code mapping ID's that were generated
by the compiler

https://app.asana.com/0/684263176955174/842516551768097/f
https://github.com/0xProject/0x-monorepo/pull/1108
https://github.com/0xProject/0x-monorepo/pull/1108#pullrequestreview-161059063
This commit is contained in:
F. Eugene Aumson
2018-10-03 10:44:19 -04:00
parent 37c55302e7
commit 39a336ca6d

View File

@@ -297,7 +297,7 @@ export class Compiler {
): Promise<void> {
const compiledContract = compilerOutput.contracts[contractPath][contractName];
const { sourceCodes, sources } = this._getSourcesWithDependencies(contractPath);
const { sourceCodes, sources } = this._getSourcesWithDependencies(contractPath, compilerOutput.sources);
const contractVersion: ContractVersionData = {
compilerOutput: compiledContract,
@@ -332,26 +332,39 @@ export class Compiler {
await fsWrapper.writeFileAsync(currentArtifactPath, artifactString);
logUtils.warn(`${contractName} artifact saved!`);
}
/**
* For the given @param contractPath, populates JSON objects to be used in the ContractArtifact interface's
* properties `sources` (source code file names mapped to ID numbers) and `sourceCodes` (source code content of
* contracts) for that contract. The source code pointed to by contractPath is read and parsed directly (via
* `this._resolver.resolve().source`), as are its imports, recursively. The ID numbers for @return `sources` are
* taken from the corresponding ID's in @param fullSources, and the content for @return sourceCodes is read from
* disk (via the aforementioned `resolver.source`).
*/
private _getSourcesWithDependencies(
contractPath: string,
fullSources: { [sourceName: string]: { id: number } },
): { sourceCodes: { [sourceName: string]: string }; sources: { [sourceName: string]: { id: number } } } {
const sources = { [contractPath]: { id: 0 } };
const sources = { [contractPath]: { id: fullSources[contractPath].id } };
const sourceCodes = { [contractPath]: this._resolver.resolve(contractPath).source };
this._recursivelyGatherDependencySources(contractPath, sourceCodes[contractPath], sources, sourceCodes, 1);
this._recursivelyGatherDependencySources(
contractPath,
sourceCodes[contractPath],
fullSources,
sources,
sourceCodes,
);
return { sourceCodes, sources };
}
private _recursivelyGatherDependencySources(
contractPath: string,
contractSource: string,
fullSources: { [sourceName: string]: { id: number } },
sourcesToAppendTo: { [sourceName: string]: { id: number } },
sourceCodesToAppendTo: { [sourceName: string]: string },
nextId: number,
): number {
let nextId_ = nextId;
): void {
const importStatementMatches = contractSource.match(/\nimport[^;]*;/g);
if (importStatementMatches === null) {
return nextId_;
return;
}
for (const importStatementMatch of importStatementMatches) {
const importPathMatches = importStatementMatch.match(/\"([^\"]*)\"/);
@@ -380,20 +393,18 @@ export class Compiler {
importPath = path.resolve('/' + contractFolder, importPath).replace('/', '');
if (_.isUndefined(sourcesToAppendTo[importPath])) {
sourcesToAppendTo[importPath] = { id: nextId_ };
sourcesToAppendTo[importPath] = { id: fullSources[importPath].id };
sourceCodesToAppendTo[importPath] = this._resolver.resolve(importPath).source;
nextId_ += 1;
nextId_ = this._recursivelyGatherDependencySources(
this._recursivelyGatherDependencySources(
importPath,
this._resolver.resolve(importPath).source,
fullSources,
sourcesToAppendTo,
sourceCodesToAppendTo,
nextId_,
);
}
}
return nextId_;
}
private _compile(solcInstance: solc.SolcInstance, standardInput: solc.StandardInput): solc.StandardOutput {
const compiled: solc.StandardOutput = JSON.parse(