-
Notifications
You must be signed in to change notification settings - Fork 236
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat: noir_wasm compilation of noir programs #3272
Changes from 25 commits
41413c5
b2c5741
9abd0ff
b51c19a
e44955d
fa43b73
27c62b2
ae7ef52
94d6399
1473663
3a9bd7e
d62887e
cde221e
d26d6ac
d1b1d4e
c34bb69
c79086e
d1f1ecb
e655751
7ebbf5d
452b858
c635a05
e2c70da
eae79ec
cf82db1
1f38e39
71ba52f
0911592
955417e
8efa75a
47b8c2b
af5832f
eb6f46e
d7abdb5
c2659eb
857101e
d3a51cc
2dde02d
d2af58d
d5ada69
ac66988
b0be295
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -3,7 +3,7 @@ import { LogFn, createDebugLogger } from '@aztec/foundation/log'; | |
import { CompileError, compile } from '@noir-lang/noir_wasm'; | ||
import { isAbsolute } from 'node:path'; | ||
|
||
import { NoirCompilationArtifacts } from '../../noir_artifact.js'; | ||
import { NoirCompilationResult, NoirProgramCompilationArtifacts } from '../../noir_artifact.js'; | ||
import { NoirDependencyManager } from './dependencies/dependency-manager.js'; | ||
import { GithubDependencyResolver as GithubCodeArchiveDependencyResolver } from './dependencies/github-dependency-resolver.js'; | ||
import { LocalDependencyResolver } from './dependencies/local-dependency-resolver.js'; | ||
|
@@ -54,9 +54,6 @@ export class NoirWasmContractCompiler { | |
} | ||
|
||
const noirPackage = NoirPackage.open(projectPath, fileManager); | ||
if (noirPackage.getType() !== 'contract') { | ||
throw new Error('This is not a contract project'); | ||
} | ||
|
||
const dependencyManager = new NoirDependencyManager( | ||
[ | ||
|
@@ -80,22 +77,73 @@ export class NoirWasmContractCompiler { | |
} | ||
|
||
/** | ||
* Compiles the project. | ||
* Compile EntryPoint | ||
*/ | ||
public async compile(): Promise<NoirCompilationArtifacts[]> { | ||
const isContract = this.#package.getType() === 'contract'; | ||
// limit to contracts-only because the rest of the pipeline only supports processing contracts | ||
if (!isContract) { | ||
throw new Error('Noir project is not a contract'); | ||
public async compile(): Promise<NoirCompilationResult[]> { | ||
if (this.#package.getType() === 'contract') { | ||
this.#debugLog(`Compiling Contract at ${this.#package.getEntryPointPath()}`); | ||
return await this.compileContract(); | ||
} else if (this.#package.getType() === 'bin') { | ||
this.#debugLog(`Compiling Program at ${this.#package.getEntryPointPath()}`); | ||
return await this.compileProgram(); | ||
} else { | ||
this.#log( | ||
`Compile skipped - only supports compiling "contract" and "bin" package types (${this.#package.getType()})`, | ||
); | ||
return []; | ||
} | ||
} | ||
|
||
/** | ||
* Compiles the Program. | ||
*/ | ||
public async compileProgram(): Promise<NoirProgramCompilationArtifacts[]> { | ||
await this.#dependencyManager.resolveDependencies(); | ||
this.#debugLog(`Dependencies: ${this.#dependencyManager.getPackageNames().join(', ')}`); | ||
|
||
initializeResolver(this.#resolveFile); | ||
|
||
try { | ||
const isContract: boolean = false; | ||
const result = compile(this.#package.getEntryPointPath(), isContract, { | ||
/* eslint-disable camelcase */ | ||
root_dependencies: this.#dependencyManager.getEntrypointDependencies(), | ||
library_dependencies: this.#dependencyManager.getLibraryDependencies(), | ||
/* eslint-enable camelcase */ | ||
}); | ||
|
||
if (!('program' in result)) { | ||
throw new Error('No program found in compilation result'); | ||
} | ||
|
||
return [{ name: this.#package.getNoirPackageConfig().package.name, ...result }]; | ||
} catch (err) { | ||
if (err instanceof Error && err.name === 'CompileError') { | ||
this.#processCompileError(err as CompileError); | ||
} | ||
|
||
throw err; | ||
} | ||
} | ||
|
||
/** | ||
* Compiles the Contract. | ||
*/ | ||
public async compileContract(): Promise<NoirCompilationResult[]> { | ||
if (!(this.#package.getType() === 'contract' || this.#package.getType() === 'bin')) { | ||
this.#log( | ||
`Compile skipped - only supports compiling "contract" and "bin" package types (${this.#package.getType()})`, | ||
); | ||
return []; | ||
} | ||
this.#debugLog(`Compiling contract at ${this.#package.getEntryPointPath()}`); | ||
await this.#dependencyManager.resolveDependencies(); | ||
this.#debugLog(`Dependencies: ${this.#dependencyManager.getPackageNames().join(', ')}`); | ||
|
||
initializeResolver(this.#resolveFile); | ||
|
||
try { | ||
const isContract: boolean = true; // this.#package.getType() === 'contract'; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. WDYT about removing the commented out code at the end? I like the explicit name for the parameter (here and in There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. oops yeah will remove! |
||
const result = compile(this.#package.getEntryPointPath(), isContract, { | ||
/* eslint-disable camelcase */ | ||
root_dependencies: this.#dependencyManager.getEntrypointDependencies(), | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
must have an auto formatter on, can revert