Skip to content

Commit 86f97e8

Browse files
authored
Add support for updated parser (#51)
* Added support for new parser * Updated parser version * Updated version. Fixed typo. Handled errors gracefully. Handled null values * Made filtering of errors simpler * Updated error filtering
1 parent de2ed6f commit 86f97e8

File tree

12 files changed

+825
-277
lines changed

12 files changed

+825
-277
lines changed

package-lock.json

Lines changed: 7 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@solarity/hardhat-zkit",
3-
"version": "0.4.11",
3+
"version": "0.4.12",
44
"description": "The ultimate TypeScript environment for Circom development",
55
"main": "dist/src/index.js",
66
"types": "dist/src/index.d.ts",
@@ -58,7 +58,7 @@
5858
"node": ">=16"
5959
},
6060
"dependencies": {
61-
"@distributedlab/circom-parser": "0.1.5",
61+
"@distributedlab/circom-parser": "0.2.0",
6262
"@solarity/zkit": "0.2.6",
6363
"@solarity/zktype": "0.3.1",
6464
"@wasmer/wasi": "0.12.0",

src/cache/BaseCache.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,11 @@ export class BaseCache<T> {
115115
public async writeToFile(cacheFilePath: string) {
116116
const jsonContent = JSON.stringify(
117117
this._cache,
118-
(_key, value) => {
118+
(key, value) => {
119+
if (key === "context") {
120+
return;
121+
}
122+
119123
if (typeof value === "bigint") {
120124
return { __bigintval__: value.toString() };
121125
}

src/cache/schemas/compile-schemas.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
1-
import { BigIntOrNestedArray } from "@distributedlab/circom-parser";
1+
import { CircomValueType } from "@distributedlab/circom-parser";
22
import { z } from "zod";
33

44
/**
5-
* {@link https://github.com/colinhacks/zod | Zod} schema for defining a recursive type {@link BigIntOrNestedArray}.
5+
* {@link https://github.com/colinhacks/zod | Zod} schema for defining a recursive type {@link CircomValueType}.
66
*
77
* This schema allows for either a `BigInt` value or an array that contains
88
* other `BigInt` values or nested arrays of `BigInt` values, recursively.
99
*/
10-
export const BigIntOrNestedArraySchema: z.ZodType<BigIntOrNestedArray> = z.lazy(() =>
11-
z.union([z.bigint(), BigIntOrNestedArraySchema.array()]),
10+
export const CircomValueTypeSchema: z.ZodType<CircomValueType> = z.lazy(() =>
11+
z.union([z.bigint(), CircomValueTypeSchema.array()]),
1212
);
1313

1414
export const SignalTypeSchema = z.literal("Input").or(z.literal("Output")).or(z.literal("Intermediate"));
@@ -35,7 +35,7 @@ export const TemplatesSchema = z.record(z.string(), TemplateSchema);
3535
export const MainComponentSchema = z.object({
3636
templateName: z.union([z.string(), z.null()]),
3737
publicInputs: z.string().array(),
38-
parameters: BigIntOrNestedArraySchema.array(),
38+
parameters: CircomValueTypeSchema.array(),
3939
});
4040

4141
export const ParsedCircomFileDataSchema = z.object({
@@ -53,7 +53,7 @@ export const SignalInfoSchema = z.object({
5353
});
5454

5555
export const ResolvedMainComponentDataSchema = z.object({
56-
parameters: z.record(z.string(), BigIntOrNestedArraySchema),
56+
parameters: z.record(z.string(), CircomValueTypeSchema),
5757
signals: SignalInfoSchema.array(),
5858
});
5959

src/core/dependencies/CircomFilesResolver.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -250,7 +250,7 @@ export class CircomFilesResolver {
250250
);
251251

252252
const parsedInputs = this._parser.parseTemplateInputs(
253-
fileWithTemplate.absolutePath,
253+
fileWithTemplate,
254254
templateName,
255255
mainComponentData.parameters,
256256
);

src/core/dependencies/parser/CircomFilesParser.ts

Lines changed: 29 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
1-
import { getCircomParser, ParserError, BigIntOrNestedArray } from "@distributedlab/circom-parser";
1+
import { CircomValueType, getCircomParser, ParserError } from "@distributedlab/circom-parser";
22

33
import { CircomFilesVisitor } from "./CircomFilesVisitor";
44
import { CircomTemplateInputsVisitor } from "./CircomTemplateInputsVisitor";
55
import { CircuitsCompileCache } from "../../../cache";
66
import { Reporter } from "../../../reporter";
77

8-
import { InputData, ResolvedFileData } from "../../../types/core";
8+
import { VisitorError } from "../parser/VisitorError";
9+
import { CircomResolvedFile, ErrorType, InputData, ResolvedFileData } from "../../../types/core";
910

1011
/**
1112
* A parser class for handling Circom files and extracting relevant data.
@@ -48,7 +49,7 @@ export class CircomFilesParser {
4849

4950
const parser = getCircomParser(fileContent);
5051

51-
const circomFilesVisitor = new CircomFilesVisitor();
52+
const circomFilesVisitor = new CircomFilesVisitor(absolutePath);
5253

5354
Reporter!.verboseLog("circom-files-parser", "Parsing '%s' file", [absolutePath]);
5455

@@ -60,6 +61,17 @@ export class CircomFilesParser {
6061

6162
circomFilesVisitor.visit(context);
6263

64+
const visitorErrors = circomFilesVisitor.errors.filter(
65+
(error) =>
66+
error.type === ErrorType.InvalidPragmaVersion ||
67+
error.type === ErrorType.TemplateAlreadyUsed ||
68+
error.type === ErrorType.FailedToResolveMainComponentParameter,
69+
);
70+
71+
if (visitorErrors.length > 0) {
72+
throw new VisitorError(visitorErrors);
73+
}
74+
6375
this._cache.set(contentHash, { parsedFileData: circomFilesVisitor.fileData });
6476

6577
return { parsedFileData: circomFilesVisitor.fileData };
@@ -73,29 +85,33 @@ export class CircomFilesParser {
7385
* parsing errors and throws a `ParserError` if any issues are encountered.
7486
* The structured input data associated with the specified template is then returned.
7587
*
76-
* @param absolutePath The absolute path to the Circom file containing the template
88+
* @param circomResolvedFile The resolved Circom file data containing the template to parse
7789
* @param templateName The name of the template whose inputs are being parsed
7890
* @param parameterValues A record of parameter values used for template input resolution
7991
* @returns A structured record of input data for the specified template
8092
* @throws ParserError If any parsing issues occur while processing the template inputs
8193
*/
8294
public parseTemplateInputs(
83-
absolutePath: string,
95+
circomResolvedFile: CircomResolvedFile,
8496
templateName: string,
85-
parameterValues: Record<string, BigIntOrNestedArray>,
97+
parameterValues: Record<string, CircomValueType>,
8698
): Record<string, InputData> {
87-
const parser = getCircomParser(absolutePath);
99+
const circomTemplateInputsVisitor = new CircomTemplateInputsVisitor(
100+
circomResolvedFile.absolutePath,
101+
circomResolvedFile.fileData.parsedFileData.templates[templateName].context,
102+
parameterValues,
103+
);
88104

89-
const circomTemplateInputsVisitor = new CircomTemplateInputsVisitor(templateName, parameterValues);
105+
circomTemplateInputsVisitor.startParse();
90106

91-
const context = parser.circuit();
107+
const visitorErrors = circomTemplateInputsVisitor.errors.filter(
108+
(error) => error.type === ErrorType.SignalDimensionResolution,
109+
);
92110

93-
if (parser.hasAnyErrors()) {
94-
throw new ParserError(parser.getAllErrors());
111+
if (visitorErrors.length > 0) {
112+
throw new VisitorError(visitorErrors);
95113
}
96114

97-
circomTemplateInputsVisitor.visit(context);
98-
99115
return circomTemplateInputsVisitor.templateInputs;
100116
}
101117

0 commit comments

Comments
 (0)