diff --git a/package.json b/package.json index 2aaa5bd4..1a3840c6 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,6 @@ ] }, "dependencies": { - "tree-sitter-java-orchard": "0.5.4", "web-tree-sitter": "0.26.6" }, "devDependencies": { @@ -69,6 +68,7 @@ "mitata": "^1.0.34", "mocha": "^11.7.5", "prettier": "^3.8.1", + "tree-sitter-java-orchard": "0.5.4", "tsdown": "^0.21.4", "typescript": "^5.9.3", "typescript-eslint": "^8.57.1" diff --git a/scripts/generate-node-types.ts b/scripts/generate-node-types.ts index fef039b5..afc27bfe 100644 --- a/scripts/generate-node-types.ts +++ b/scripts/generate-node-types.ts @@ -65,6 +65,30 @@ export type UnnamedType = ${nodeTypeInfo export type TypeString = NamedType | UnnamedType; +export const multiFieldsByType: Partial>>> = ${JSON.stringify( + nodeTypeInfo.reduce( + (acc, nodeInfo) => { + if ("fields" in nodeInfo && nodeInfo.fields) { + const multiFields = Object.entries(nodeInfo.fields) + .filter(([, { multiple }]) => multiple) + .reduce( + (fieldAcc, [name]) => { + fieldAcc[name] = true; + return fieldAcc; + }, + {} as Record + ); + + if (Object.keys(multiFields).length > 0) { + acc[nodeInfo.type] = multiFields; + } + } + return acc; + }, + {} as Record> + ) + )}; + export type SyntaxNode = ErrorNode | ${nodeTypeInfo .filter(({ type }) => !type.endsWith("_comment")) .map(getTypeExprFromRef) diff --git a/src/node-types.ts b/src/node-types.ts index 182b144e..3bb7e611 100644 --- a/src/node-types.ts +++ b/src/node-types.ts @@ -318,6 +318,22 @@ export type UnnamedType = export type TypeString = NamedType | UnnamedType; +export const multiFieldsByType: Partial< + Record>> +> = { + array_creation_expression: { dimensions: true }, + cast_expression: { type: true }, + constant_declaration: { declarator: true }, + exports_module_directive: { modules: true }, + field_declaration: { declarator: true }, + for_statement: { init: true, update: true }, + local_variable_declaration: { declarator: true }, + opens_module_directive: { modules: true }, + provides_module_directive: { provider: true }, + requires_module_directive: { modifiers: true }, + spread_parameter: { annotations: true } +}; + export type SyntaxNode = | ErrorNode | LiteralNode diff --git a/src/parser.ts b/src/parser.ts index 0c0a04b6..f6b282e5 100644 --- a/src/parser.ts +++ b/src/parser.ts @@ -1,8 +1,12 @@ import type Prettier from "prettier"; -import nodeTypeInfo from "tree-sitter-java-orchard/src/node-types.json" with { type: "json" }; import { Language, Parser, type Node } from "web-tree-sitter"; import { determinePrettierIgnoreRanges } from "./comments.ts"; -import { SyntaxType, type CommentNode, type SyntaxNode } from "./node-types.ts"; +import { + multiFieldsByType, + SyntaxType, + type CommentNode, + type SyntaxNode +} from "./node-types.ts"; export default { async parse(text) { @@ -44,18 +48,6 @@ const parser = (async () => { return parser; })(); -const multipleFieldsByType = nodeTypeInfo.reduce((map, nodeInfo) => { - if ("fields" in nodeInfo && nodeInfo.fields) { - const fields = Object.entries(nodeInfo.fields) - .filter(([, { multiple }]) => multiple) - .map(([name]) => name); - if (fields.length) { - map.set(nodeInfo.type, new Set(fields)); - } - } - return map; -}, new Map>()); - function processTree( node: Node, fieldName: string | null = null, @@ -92,8 +84,10 @@ function processTree( return javaNode; } - const multipleFields = multipleFieldsByType.get(node.type); - multipleFields?.forEach(name => (javaNode[`${name}Nodes`] = [])); + const multiFields = multiFieldsByType[node.type]; + if (multiFields) { + Object.keys(multiFields).forEach(name => (javaNode[`${name}Nodes`] = [])); + } node.children.forEach((child, index) => { const { type, text: value, startPosition, endPosition } = child; @@ -125,7 +119,7 @@ function processTree( } if (fieldName) { - if (multipleFields?.has(fieldName)) { + if (multiFields?.[fieldName]) { javaNode[`${fieldName}Nodes`].push(javaChild); } else { javaNode[`${fieldName}Node`] = javaChild; diff --git a/tsconfig.json b/tsconfig.json index e00705f1..079a258a 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -8,7 +8,6 @@ "noImplicitThis": false, "module": "esnext", "moduleResolution": "node", - "resolveJsonModule": true, "rewriteRelativeImportExtensions": true }, "include": ["src"] diff --git a/website/docusaurus.config.ts b/website/docusaurus.config.ts index 2e25e2e3..2fbd9097 100644 --- a/website/docusaurus.config.ts +++ b/website/docusaurus.config.ts @@ -97,11 +97,8 @@ export default { ? {} : { fallback: { - fs: false, "fs/promises": false, - module: false, - os: false, - path: false + module: false } }, externals: isServer diff --git a/website/yarn.lock b/website/yarn.lock index a278e927..ea410004 100644 --- a/website/yarn.lock +++ b/website/yarn.lock @@ -6618,11 +6618,6 @@ no-case@^3.0.4: lower-case "^2.0.2" tslib "^2.0.3" -node-addon-api@^8.3.1: - version "8.6.0" - resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-8.6.0.tgz#b22497201b465cd0a92ef2c01074ee5068c79a6d" - integrity sha512-gBVjCaqDlRUk0EwoPNKzIr9KkS9041G/q31IBShPs1Xz6UTA+EXdZADbzqAJQrpDRq71CIMnOP5VMut3SL0z5Q== - node-emoji@^2.1.0: version "2.2.0" resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-2.2.0.tgz#1d000e3c76e462577895be1b436f4aa2d6760eb0" @@ -6633,11 +6628,6 @@ node-emoji@^2.1.0: emojilib "^2.4.0" skin-tone "^2.0.0" -node-gyp-build@^4.8.4: - version "4.8.4" - resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.4.tgz#8a70ee85464ae52327772a90d66c6077a900cfc8" - integrity sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ== - node-releases@^2.0.27: version "2.0.36" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.36.tgz#99fd6552aaeda9e17c4713b57a63964a2e325e9d" @@ -8686,14 +8676,6 @@ tree-dump@^1.0.3, tree-dump@^1.1.0: resolved "https://registry.yarnpkg.com/tree-dump/-/tree-dump-1.1.0.tgz#ab29129169dc46004414f5a9d4a3c6e89f13e8a4" integrity sha512-rMuvhU4MCDbcbnleZTFezWsaZXRFemSqAM+7jPnzUl1fo9w3YEKOxAeui0fz3OI4EU4hf23iyA7uQRVko+UaBA== -tree-sitter-java-orchard@0.5.4: - version "0.5.4" - resolved "https://registry.yarnpkg.com/tree-sitter-java-orchard/-/tree-sitter-java-orchard-0.5.4.tgz#8c698a57566ff99ce979bf3f53a313f0f7888eec" - integrity sha512-MpEi4ic9ksqU9CerMt0XXxOJN5CfDsosGrop++4z6Z9XRkT86bu+I/7LCNJS0rrvA5SoY2t98icBeotSaTtY4A== - dependencies: - node-addon-api "^8.3.1" - node-gyp-build "^4.8.4" - trim-lines@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/trim-lines/-/trim-lines-3.0.1.tgz#d802e332a07df861c48802c04321017b1bd87338"