semantifold 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +15 -0
- package/README.md +71 -0
- package/build/index.d.ts +54 -0
- package/build/index.d.ts.map +1 -0
- package/build/index.js +45 -0
- package/build/src/backends/identifiers.d.ts +19 -0
- package/build/src/backends/identifiers.d.ts.map +1 -0
- package/build/src/backends/identifiers.js +93 -0
- package/build/src/backends/index.d.ts +35 -0
- package/build/src/backends/index.d.ts.map +1 -0
- package/build/src/backends/index.js +149 -0
- package/build/src/backends/java.d.ts +8 -0
- package/build/src/backends/java.d.ts.map +1 -0
- package/build/src/backends/java.js +172 -0
- package/build/src/backends/javascript.d.ts +8 -0
- package/build/src/backends/javascript.d.ts.map +1 -0
- package/build/src/backends/javascript.js +173 -0
- package/build/src/backends/php.d.ts +8 -0
- package/build/src/backends/php.d.ts.map +1 -0
- package/build/src/backends/php.js +175 -0
- package/build/src/backends/ruby.d.ts +8 -0
- package/build/src/backends/ruby.d.ts.map +1 -0
- package/build/src/backends/ruby.js +155 -0
- package/build/src/backends/scalars.d.ts +15 -0
- package/build/src/backends/scalars.d.ts.map +1 -0
- package/build/src/backends/scalars.js +138 -0
- package/build/src/backends/shared.d.ts +26 -0
- package/build/src/backends/shared.d.ts.map +1 -0
- package/build/src/backends/shared.js +424 -0
- package/build/src/backends/typescript.d.ts +8 -0
- package/build/src/backends/typescript.d.ts.map +1 -0
- package/build/src/backends/typescript.js +160 -0
- package/build/src/backends/writer.d.ts +87 -0
- package/build/src/backends/writer.d.ts.map +1 -0
- package/build/src/backends/writer.js +207 -0
- package/build/src/diagnostic.d.ts +67 -0
- package/build/src/diagnostic.d.ts.map +1 -0
- package/build/src/diagnostic.js +96 -0
- package/build/src/frontends/index.d.ts +14 -0
- package/build/src/frontends/index.d.ts.map +1 -0
- package/build/src/frontends/index.js +36 -0
- package/build/src/frontends/java.d.ts +12 -0
- package/build/src/frontends/java.d.ts.map +1 -0
- package/build/src/frontends/java.js +630 -0
- package/build/src/frontends/javascript-typescript.d.ts +19 -0
- package/build/src/frontends/javascript-typescript.d.ts.map +1 -0
- package/build/src/frontends/javascript-typescript.js +633 -0
- package/build/src/frontends/php.d.ts +12 -0
- package/build/src/frontends/php.d.ts.map +1 -0
- package/build/src/frontends/php.js +523 -0
- package/build/src/frontends/ruby.d.ts +12 -0
- package/build/src/frontends/ruby.d.ts.map +1 -0
- package/build/src/frontends/ruby.js +515 -0
- package/build/src/frontends/scalars.d.ts +19 -0
- package/build/src/frontends/scalars.d.ts.map +1 -0
- package/build/src/frontends/scalars.js +71 -0
- package/build/src/mapping.d.ts +160 -0
- package/build/src/mapping.d.ts.map +1 -0
- package/build/src/mapping.js +1120 -0
- package/build/src/semantic/location.d.ts +61 -0
- package/build/src/semantic/location.d.ts.map +1 -0
- package/build/src/semantic/location.js +142 -0
- package/build/src/semantic/operators.d.ts +16 -0
- package/build/src/semantic/operators.d.ts.map +1 -0
- package/build/src/semantic/operators.js +24 -0
- package/build/src/semantic/provenance.d.ts +74 -0
- package/build/src/semantic/provenance.d.ts.map +1 -0
- package/build/src/semantic/provenance.js +577 -0
- package/build/src/semantic/scalars.d.ts +19 -0
- package/build/src/semantic/scalars.d.ts.map +1 -0
- package/build/src/semantic/scalars.js +40 -0
- package/build/src/semantic/types.d.ts +1003 -0
- package/build/src/semantic/types.d.ts.map +1 -0
- package/build/src/semantic/types.js +279 -0
- package/build/src/semantic/validate.d.ts +60 -0
- package/build/src/semantic/validate.d.ts.map +1 -0
- package/build/src/semantic/validate.js +472 -0
- package/docs/architecture.md +39 -0
- package/docs/coding-standards.md +7 -0
- package/docs/goals.md +7 -0
- package/docs/language-support.md +69 -0
- package/docs/plans/2026-09-02-initial-toolchain.md +54 -0
- package/docs/source-maps.md +134 -0
- package/docs/testing.md +25 -0
- package/index.js +63 -0
- package/package.json +69 -0
- package/src/backends/identifiers.js +101 -0
- package/src/backends/index.js +159 -0
- package/src/backends/java.js +182 -0
- package/src/backends/javascript.js +184 -0
- package/src/backends/php.js +184 -0
- package/src/backends/ruby.js +163 -0
- package/src/backends/scalars.js +120 -0
- package/src/backends/shared.js +456 -0
- package/src/backends/typescript.js +168 -0
- package/src/backends/writer.js +224 -0
- package/src/diagnostic.js +103 -0
- package/src/frontends/index.js +36 -0
- package/src/frontends/java.js +735 -0
- package/src/frontends/javascript-typescript.js +718 -0
- package/src/frontends/php.js +593 -0
- package/src/frontends/ruby.js +622 -0
- package/src/frontends/scalars.js +77 -0
- package/src/mapping.js +1260 -0
- package/src/semantic/location.js +154 -0
- package/src/semantic/operators.js +28 -0
- package/src/semantic/provenance.js +629 -0
- package/src/semantic/scalars.js +44 -0
- package/src/semantic/types.js +319 -0
- package/src/semantic/validate.js +529 -0
- package/tsconfig.json +16 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
ISC License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Kasper Nielsen
|
|
4
|
+
|
|
5
|
+
Permission to use, copy, modify, and/or distribute this software for any
|
|
6
|
+
purpose with or without fee is hereby granted, provided that the above
|
|
7
|
+
copyright notice and this permission notice appear in all copies.
|
|
8
|
+
|
|
9
|
+
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
10
|
+
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
11
|
+
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
12
|
+
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
13
|
+
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
14
|
+
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
15
|
+
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# Semantifold
|
|
2
|
+
|
|
3
|
+
Semantifold is an early language-neutral semantic code toolkit. This first release candidate proves a deliberately small end-to-end slice: parse equivalent PHP, Ruby, JavaScript with JSDoc, TypeScript, and Java programs into one typed semantic representation, then generate and genuinely execute equivalent programs in every target language.
|
|
4
|
+
|
|
5
|
+
## Current API
|
|
6
|
+
|
|
7
|
+
```js
|
|
8
|
+
import {generate, parse} from "semantifold"
|
|
9
|
+
|
|
10
|
+
const module = parse({
|
|
11
|
+
filename: "label.ts",
|
|
12
|
+
language: "typescript",
|
|
13
|
+
source: `
|
|
14
|
+
function label(flag: boolean, fallback: string): string {
|
|
15
|
+
if (flag) return "yes"
|
|
16
|
+
else return fallback
|
|
17
|
+
}
|
|
18
|
+
console.log(label(true, "no"))
|
|
19
|
+
`
|
|
20
|
+
})
|
|
21
|
+
|
|
22
|
+
const javaSource = generate({language: "java", module})
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
`parse` returns parser-independent discriminated semantic nodes with normalized types, source locations, a versioned source registry, and deterministic node/symbol provenance. `generate` accepts that shared module and returns an independently executable source program with its historical bytes unchanged. `generateArtifact` adds an output filename, an authoritative range-based `SemantifoldMapping` v1, and a Source Map v3 sidecar for every target:
|
|
26
|
+
|
|
27
|
+
```js
|
|
28
|
+
import {generateArtifact, originalPositionFor} from "semantifold"
|
|
29
|
+
|
|
30
|
+
const artifact = generateArtifact({language: "java", module})
|
|
31
|
+
const original = originalPositionFor(artifact.mapping, {offset: artifact.code.indexOf("label")})
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Generated output always uses LF. Exact original content, including LF, CRLF, lone CR, and astral UTF-16 coordinates, remains in the source registry and `sourcesContent`. Optional inline/external `sourceMappingURL` directives apply only to JavaScript and TypeScript; PHP, Ruby, and Java use the same rich/v3 sidecars without foreign comments. See [source provenance and mappings](docs/source-maps.md) for schemas, lookups, composition, diagnostics, directives, and compatibility.
|
|
35
|
+
|
|
36
|
+
`supportedLanguages` lists the five exact language identifiers, and `SemantifoldDiagnostic` exposes stable error codes for unsupported syntax, missing types, parse failures, binding/type failures, and backend capabilities.
|
|
37
|
+
|
|
38
|
+
This is not general-purpose support for any of the five languages. The implemented subset is a two-parameter function using explicit integer, boolean, or string types; explicitly typed, initialized scalar locals; plain assignment to mutable locals; ordered lexical blocks; strictly boolean, nested `if` statements with optional `else`; explicit scalar returns; typed scalar operations; a two-argument function call; and sequenced printing. Operations cover integer add/subtract/multiply/negate and ordering, Boolean not/short-circuit and/or, same-type scalar value equality/inequality, and string concatenation. Non-void functions must return on every reachable path, and statements after an unconditional return are rejected. See [language support](docs/language-support.md) before using it on other code.
|
|
39
|
+
|
|
40
|
+
Semantic integers must be JavaScript-safe mathematical integers and have one unsigned zero. Generated JavaScript and TypeScript canonically render scalar output for modules containing negation or multiplication so IEEE-754 `-0` is observed as `0` without folding or rewriting the semantic operation tree. Java generation narrows literals and compile-time-known arithmetic trees further to signed 32-bit `int`; general runtime-overflow equivalence remains outside the portable contract. Strings are parser-decoded Unicode scalar values and are re-escaped for each target without preserving source quotes or escapes. Equality never coerces and never applies to objects or collections. Division, remainder, exponentiation, bitwise/shift/update/compound operations, ternary/nullish forms, casts/assertions, truthiness, implicit returns, loops, switches, exceptions, and constant folding are unsupported. JavaScript and TypeScript functions must be synchronous and non-generator; Ruby annotations must be immediately associated comment blocks; and PHP accepts only an optional exact `declare(strict_types=1)`. Ruby and PHP local carriers default to mutable and use the exact `@semantifold-immutable` profile tag for immutable locals. Frontends reject syntax instead of dropping receivers, arguments, parameters, declarations, or statements. Before emission, each backend recursively validates blocks, flow, scalar types, typed operations, modeled bindings, mutability, target identifiers, and literal representability.
|
|
41
|
+
|
|
42
|
+
## Development
|
|
43
|
+
|
|
44
|
+
Use Node.js 24 and install with `npm ci`. Specs use `@velocious/testing@0.0.0` and the standalone `velocious-test` runner. Run a focused spec with `npx velocious-test spec/repository-contract.spec.js`; run the framework-native `spec` directory discovery with `npm test`.
|
|
45
|
+
|
|
46
|
+
The complete local gate is:
|
|
47
|
+
|
|
48
|
+
```sh
|
|
49
|
+
npm test
|
|
50
|
+
npm run lint
|
|
51
|
+
npm run typecheck
|
|
52
|
+
npm run build
|
|
53
|
+
npm audit --audit-level=high
|
|
54
|
+
npm ls --omit=dev --all
|
|
55
|
+
npm pack --dry-run --json
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
The execution specs require PHP CLI, Ruby, TypeScript, and a Java JDK in addition to Node; missing tools are failures. The canonical container provides them: `docker compose up --build --detach`, followed by `docker compose exec dev npm ci` and the commands above.
|
|
59
|
+
|
|
60
|
+
## Documentation
|
|
61
|
+
|
|
62
|
+
- [Goals](docs/goals.md)
|
|
63
|
+
- [Architecture](docs/architecture.md)
|
|
64
|
+
- [Coding standards](docs/coding-standards.md)
|
|
65
|
+
- [Language support](docs/language-support.md)
|
|
66
|
+
- [Testing](docs/testing.md)
|
|
67
|
+
- [Source provenance and mappings](docs/source-maps.md)
|
|
68
|
+
- [Language feature roadmap](https://github.com/kaspernj/semantifold/blob/master/todo/README.md)
|
|
69
|
+
- [Initial toolchain plan](docs/plans/2026-09-02-initial-toolchain.md)
|
|
70
|
+
|
|
71
|
+
Semantifold is ISC licensed.
|
package/build/index.d.ts
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
export { SemantifoldDiagnostic } from "./src/diagnostic.js";
|
|
2
|
+
export { getNodeProvenance, getSymbolProvenance } from "./src/semantic/provenance.js";
|
|
3
|
+
export { primaryLocation } from "./src/semantic/provenance.js";
|
|
4
|
+
export { composeMappings, composeSourceMaps, generatedPositionFor, mappingFromSourceMap, originalPositionFor, parseMapping, remapDiagnostic, remapLocation, spansForNode, spansForSymbol, stringifyMapping, toSourceMapV3 } from "./src/mapping.js";
|
|
5
|
+
/** @type {readonly import("./src/semantic/types.js").SemanticLanguage[]} */
|
|
6
|
+
export declare const supportedLanguages: readonly import("./src/semantic/types.js").SemanticLanguage[];
|
|
7
|
+
/**
|
|
8
|
+
* Parses source into Semantifold's shared semantic representation.
|
|
9
|
+
* @param {object} input - Parse request.
|
|
10
|
+
* @param {string} input.filename - Source filename used in diagnostics.
|
|
11
|
+
* @param {import("./src/semantic/types.js").SemanticLanguage} input.language - Source language.
|
|
12
|
+
* @param {string} input.source - Source text.
|
|
13
|
+
* @returns {import("./src/semantic/types.js").SemanticModule} Semantic module.
|
|
14
|
+
*/
|
|
15
|
+
export declare function parse(input: {
|
|
16
|
+
filename: string;
|
|
17
|
+
language: import("./src/semantic/types.js").SemanticLanguage;
|
|
18
|
+
source: string;
|
|
19
|
+
}): import("./src/semantic/types.js").SemanticModule;
|
|
20
|
+
/**
|
|
21
|
+
* Generates target-language source from a shared semantic module.
|
|
22
|
+
* @param {object} input - Generation request.
|
|
23
|
+
* @param {import("./src/semantic/types.js").SemanticLanguage} input.language - Target language.
|
|
24
|
+
* @param {import("./src/semantic/types.js").SemanticModule} input.module - Semantic module.
|
|
25
|
+
* @returns {string} Generated source.
|
|
26
|
+
*/
|
|
27
|
+
export declare function generate(input: {
|
|
28
|
+
language: import("./src/semantic/types.js").SemanticLanguage;
|
|
29
|
+
module: import("./src/semantic/types.js").SemanticModule;
|
|
30
|
+
}): string;
|
|
31
|
+
/**
|
|
32
|
+
* Generates a reusable output artifact with rich and Source Map v3 mappings.
|
|
33
|
+
* @param {object} input - Generation request.
|
|
34
|
+
* @param {import("./src/semantic/types.js").SemanticLanguage} input.language - Target language.
|
|
35
|
+
* @param {import("./src/semantic/types.js").SemanticModule} input.module - Semantic module.
|
|
36
|
+
* @param {string} [input.filename] - Output filename.
|
|
37
|
+
* @param {"none" | "external" | "inline"} [input.mapDirective] - JavaScript-family map directive.
|
|
38
|
+
* @param {string} [input.sourceMapFilename] - External map filename.
|
|
39
|
+
* @param {{filename: string, content: string, language?: import("./src/semantic/types.js").SemanticLanguage}[]} [input.sources] - Sources for caller-authored modules.
|
|
40
|
+
* @returns {import("./src/semantic/types.js").GeneratedArtifact} Generated artifact.
|
|
41
|
+
*/
|
|
42
|
+
export declare function generateArtifact(input: {
|
|
43
|
+
language: import("./src/semantic/types.js").SemanticLanguage;
|
|
44
|
+
module: import("./src/semantic/types.js").SemanticModule;
|
|
45
|
+
filename?: string;
|
|
46
|
+
mapDirective?: "none" | "external" | "inline";
|
|
47
|
+
sourceMapFilename?: string;
|
|
48
|
+
sources?: {
|
|
49
|
+
filename: string;
|
|
50
|
+
content: string;
|
|
51
|
+
language?: import("./src/semantic/types.js").SemanticLanguage;
|
|
52
|
+
}[];
|
|
53
|
+
}): import("./src/semantic/types.js").GeneratedArtifact;
|
|
54
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.js"],"names":[],"mappings":"AAKA,OAAO,EAAC,qBAAqB,EAAC,MAAM,qBAAqB,CAAA;AACzD,OAAO,EAAC,iBAAiB,EAAE,mBAAmB,EAAC,MAAM,8BAA8B,CAAA;AACnF,OAAO,EAAC,eAAe,EAAC,MAAM,8BAA8B,CAAA;AAC5D,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,oBAAoB,EACpB,oBAAoB,EACpB,mBAAmB,EACnB,YAAY,EACZ,eAAe,EACf,aAAa,EACb,YAAY,EACZ,cAAc,EACd,gBAAgB,EAChB,aAAa,EACd,MAAM,kBAAkB,CAAA;AAEzB,4EAA4E;AAC5E,eAAO,MAAM,kBAAkB,EADpB,SAAS,OAAO,yBAAyB,EAAE,gBAAgB,EAC8B,CAAA;AAEpG;;;;;;;GAOG;AACH,wBAAgB,KAAK,CAAC,KAAK,EALxB;IAAsB,QAAQ,EAAtB,MAAM,CACd;IAAkE,QAAQ,EAAlE,OAAO,yBAAyB,EAAE,gBAAgB,CAC1D;IAAsB,MAAM,EAApB,MAAM,CACd;CAEwB,GAFd,OAAO,yBAAyB,EAAE,cAAc,CAI5D;AAED;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAJ3B;IAAkE,QAAQ,EAAlE,OAAO,yBAAyB,EAAE,gBAAgB,CAC1D;IAAgE,MAAM,EAA9D,OAAO,yBAAyB,EAAE,cAAc,CACxD;CAE2B,GAFjB,MAAM,CAIlB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EARnC;IAAkE,QAAQ,EAAlE,OAAO,yBAAyB,EAAE,gBAAgB,CAC1D;IAAgE,MAAM,EAA9D,OAAO,yBAAyB,EAAE,cAAc,CACxD;IAAuB,QAAQ,AAA/B,CACA,EADQ,MAAM,CACd;IAA+C,YAAY,AAA3D,CACA,EADQ,MAAM,GAAG,UAAU,GAAG,QAAQ,CACtC;IAAuB,iBAAiB,AAAxC,CACA,EADQ,MAAM,CACd;IAAqH,OAAO,AAA5H,CACA,EADQ;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,yBAAyB,EAAE,gBAAgB,CAAA;KAAC,EAAE,CAC5G;CAEmC,GAFzB,OAAO,yBAAyB,EAAE,iBAAiB,CAI/D"}
|
package/build/index.js
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
import { parseSource } from "./src/frontends/index.js";
|
|
3
|
+
import { generateArtifactSource, generateSource } from "./src/backends/index.js";
|
|
4
|
+
export { SemantifoldDiagnostic } from "./src/diagnostic.js";
|
|
5
|
+
export { getNodeProvenance, getSymbolProvenance } from "./src/semantic/provenance.js";
|
|
6
|
+
export { primaryLocation } from "./src/semantic/provenance.js";
|
|
7
|
+
export { composeMappings, composeSourceMaps, generatedPositionFor, mappingFromSourceMap, originalPositionFor, parseMapping, remapDiagnostic, remapLocation, spansForNode, spansForSymbol, stringifyMapping, toSourceMapV3 } from "./src/mapping.js";
|
|
8
|
+
/** @type {readonly import("./src/semantic/types.js").SemanticLanguage[]} */
|
|
9
|
+
export const supportedLanguages = Object.freeze(["php", "ruby", "javascript", "typescript", "java"]);
|
|
10
|
+
/**
|
|
11
|
+
* Parses source into Semantifold's shared semantic representation.
|
|
12
|
+
* @param {object} input - Parse request.
|
|
13
|
+
* @param {string} input.filename - Source filename used in diagnostics.
|
|
14
|
+
* @param {import("./src/semantic/types.js").SemanticLanguage} input.language - Source language.
|
|
15
|
+
* @param {string} input.source - Source text.
|
|
16
|
+
* @returns {import("./src/semantic/types.js").SemanticModule} Semantic module.
|
|
17
|
+
*/
|
|
18
|
+
export function parse(input) {
|
|
19
|
+
return parseSource(input);
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Generates target-language source from a shared semantic module.
|
|
23
|
+
* @param {object} input - Generation request.
|
|
24
|
+
* @param {import("./src/semantic/types.js").SemanticLanguage} input.language - Target language.
|
|
25
|
+
* @param {import("./src/semantic/types.js").SemanticModule} input.module - Semantic module.
|
|
26
|
+
* @returns {string} Generated source.
|
|
27
|
+
*/
|
|
28
|
+
export function generate(input) {
|
|
29
|
+
return generateSource(input);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Generates a reusable output artifact with rich and Source Map v3 mappings.
|
|
33
|
+
* @param {object} input - Generation request.
|
|
34
|
+
* @param {import("./src/semantic/types.js").SemanticLanguage} input.language - Target language.
|
|
35
|
+
* @param {import("./src/semantic/types.js").SemanticModule} input.module - Semantic module.
|
|
36
|
+
* @param {string} [input.filename] - Output filename.
|
|
37
|
+
* @param {"none" | "external" | "inline"} [input.mapDirective] - JavaScript-family map directive.
|
|
38
|
+
* @param {string} [input.sourceMapFilename] - External map filename.
|
|
39
|
+
* @param {{filename: string, content: string, language?: import("./src/semantic/types.js").SemanticLanguage}[]} [input.sources] - Sources for caller-authored modules.
|
|
40
|
+
* @returns {import("./src/semantic/types.js").GeneratedArtifact} Generated artifact.
|
|
41
|
+
*/
|
|
42
|
+
export function generateArtifact(input) {
|
|
43
|
+
return generateArtifactSource(input);
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLDBCQUEwQixDQUFBO0FBQ3BELE9BQU8sRUFBQyxzQkFBc0IsRUFBRSxjQUFjLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQTtBQUU5RSxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQTtBQUN6RCxPQUFPLEVBQUMsaUJBQWlCLEVBQUUsbUJBQW1CLEVBQUMsTUFBTSw4QkFBOEIsQ0FBQTtBQUNuRixPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sOEJBQThCLENBQUE7QUFDNUQsT0FBTyxFQUNMLGVBQWUsRUFDZixpQkFBaUIsRUFDakIsb0JBQW9CLEVBQ3BCLG9CQUFvQixFQUNwQixtQkFBbUIsRUFDbkIsWUFBWSxFQUNaLGVBQWUsRUFDZixhQUFhLEVBQ2IsWUFBWSxFQUNaLGNBQWMsRUFDZCxnQkFBZ0IsRUFDaEIsYUFBYSxFQUNkLE1BQU0sa0JBQWtCLENBQUE7QUFFekIsNEVBQTRFO0FBQzVFLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQTtBQUVwRzs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxVQUFVLEtBQUssQ0FBQyxLQUFLO0lBQ3pCLE9BQU8sV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFBO0FBQzNCLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsUUFBUSxDQUFDLEtBQUs7SUFDNUIsT0FBTyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUE7QUFDOUIsQ0FBQztBQUVEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsS0FBSztJQUNwQyxPQUFPLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxDQUFBO0FBQ3RDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHtwYXJzZVNvdXJjZX0gZnJvbSBcIi4vc3JjL2Zyb250ZW5kcy9pbmRleC5qc1wiXG5pbXBvcnQge2dlbmVyYXRlQXJ0aWZhY3RTb3VyY2UsIGdlbmVyYXRlU291cmNlfSBmcm9tIFwiLi9zcmMvYmFja2VuZHMvaW5kZXguanNcIlxuXG5leHBvcnQge1NlbWFudGlmb2xkRGlhZ25vc3RpY30gZnJvbSBcIi4vc3JjL2RpYWdub3N0aWMuanNcIlxuZXhwb3J0IHtnZXROb2RlUHJvdmVuYW5jZSwgZ2V0U3ltYm9sUHJvdmVuYW5jZX0gZnJvbSBcIi4vc3JjL3NlbWFudGljL3Byb3ZlbmFuY2UuanNcIlxuZXhwb3J0IHtwcmltYXJ5TG9jYXRpb259IGZyb20gXCIuL3NyYy9zZW1hbnRpYy9wcm92ZW5hbmNlLmpzXCJcbmV4cG9ydCB7XG4gIGNvbXBvc2VNYXBwaW5ncyxcbiAgY29tcG9zZVNvdXJjZU1hcHMsXG4gIGdlbmVyYXRlZFBvc2l0aW9uRm9yLFxuICBtYXBwaW5nRnJvbVNvdXJjZU1hcCxcbiAgb3JpZ2luYWxQb3NpdGlvbkZvcixcbiAgcGFyc2VNYXBwaW5nLFxuICByZW1hcERpYWdub3N0aWMsXG4gIHJlbWFwTG9jYXRpb24sXG4gIHNwYW5zRm9yTm9kZSxcbiAgc3BhbnNGb3JTeW1ib2wsXG4gIHN0cmluZ2lmeU1hcHBpbmcsXG4gIHRvU291cmNlTWFwVjNcbn0gZnJvbSBcIi4vc3JjL21hcHBpbmcuanNcIlxuXG4vKiogQHR5cGUge3JlYWRvbmx5IGltcG9ydChcIi4vc3JjL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljTGFuZ3VhZ2VbXX0gKi9cbmV4cG9ydCBjb25zdCBzdXBwb3J0ZWRMYW5ndWFnZXMgPSBPYmplY3QuZnJlZXplKFtcInBocFwiLCBcInJ1YnlcIiwgXCJqYXZhc2NyaXB0XCIsIFwidHlwZXNjcmlwdFwiLCBcImphdmFcIl0pXG5cbi8qKlxuICogUGFyc2VzIHNvdXJjZSBpbnRvIFNlbWFudGlmb2xkJ3Mgc2hhcmVkIHNlbWFudGljIHJlcHJlc2VudGF0aW9uLlxuICogQHBhcmFtIHtvYmplY3R9IGlucHV0IC0gUGFyc2UgcmVxdWVzdC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBpbnB1dC5maWxlbmFtZSAtIFNvdXJjZSBmaWxlbmFtZSB1c2VkIGluIGRpYWdub3N0aWNzLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3NyYy9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY0xhbmd1YWdlfSBpbnB1dC5sYW5ndWFnZSAtIFNvdXJjZSBsYW5ndWFnZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBpbnB1dC5zb3VyY2UgLSBTb3VyY2UgdGV4dC5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3NyYy9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY01vZHVsZX0gU2VtYW50aWMgbW9kdWxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2UoaW5wdXQpIHtcbiAgcmV0dXJuIHBhcnNlU291cmNlKGlucHV0KVxufVxuXG4vKipcbiAqIEdlbmVyYXRlcyB0YXJnZXQtbGFuZ3VhZ2Ugc291cmNlIGZyb20gYSBzaGFyZWQgc2VtYW50aWMgbW9kdWxlLlxuICogQHBhcmFtIHtvYmplY3R9IGlucHV0IC0gR2VuZXJhdGlvbiByZXF1ZXN0LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3NyYy9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY0xhbmd1YWdlfSBpbnB1dC5sYW5ndWFnZSAtIFRhcmdldCBsYW5ndWFnZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zcmMvc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNNb2R1bGV9IGlucHV0Lm1vZHVsZSAtIFNlbWFudGljIG1vZHVsZS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IEdlbmVyYXRlZCBzb3VyY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZShpbnB1dCkge1xuICByZXR1cm4gZ2VuZXJhdGVTb3VyY2UoaW5wdXQpXG59XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgcmV1c2FibGUgb3V0cHV0IGFydGlmYWN0IHdpdGggcmljaCBhbmQgU291cmNlIE1hcCB2MyBtYXBwaW5ncy5cbiAqIEBwYXJhbSB7b2JqZWN0fSBpbnB1dCAtIEdlbmVyYXRpb24gcmVxdWVzdC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zcmMvc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNMYW5ndWFnZX0gaW5wdXQubGFuZ3VhZ2UgLSBUYXJnZXQgbGFuZ3VhZ2UuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vc3JjL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljTW9kdWxlfSBpbnB1dC5tb2R1bGUgLSBTZW1hbnRpYyBtb2R1bGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2lucHV0LmZpbGVuYW1lXSAtIE91dHB1dCBmaWxlbmFtZS5cbiAqIEBwYXJhbSB7XCJub25lXCIgfCBcImV4dGVybmFsXCIgfCBcImlubGluZVwifSBbaW5wdXQubWFwRGlyZWN0aXZlXSAtIEphdmFTY3JpcHQtZmFtaWx5IG1hcCBkaXJlY3RpdmUuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2lucHV0LnNvdXJjZU1hcEZpbGVuYW1lXSAtIEV4dGVybmFsIG1hcCBmaWxlbmFtZS5cbiAqIEBwYXJhbSB7e2ZpbGVuYW1lOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZywgbGFuZ3VhZ2U/OiBpbXBvcnQoXCIuL3NyYy9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY0xhbmd1YWdlfVtdfSBbaW5wdXQuc291cmNlc10gLSBTb3VyY2VzIGZvciBjYWxsZXItYXV0aG9yZWQgbW9kdWxlcy5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3NyYy9zZW1hbnRpYy90eXBlcy5qc1wiKS5HZW5lcmF0ZWRBcnRpZmFjdH0gR2VuZXJhdGVkIGFydGlmYWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVBcnRpZmFjdChpbnB1dCkge1xuICByZXR1cm4gZ2VuZXJhdGVBcnRpZmFjdFNvdXJjZShpbnB1dClcbn1cbiJdfQ==
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validates an identifier against the target backend's deliberately narrow lexical contract.
|
|
3
|
+
* @param {import("../semantic/types.js").SemanticLanguage} language - Target language.
|
|
4
|
+
* @param {unknown} name - Candidate semantic identifier.
|
|
5
|
+
* @param {string} role - Identifier role for diagnostics.
|
|
6
|
+
* @param {import("../semantic/types.js").SourceLocation | undefined} location - Originating location.
|
|
7
|
+
* @returns {void}
|
|
8
|
+
*/
|
|
9
|
+
export declare function validateTargetIdentifier(language: import("../semantic/types.js").SemanticLanguage, name: unknown, role: string, location: import("../semantic/types.js").SourceLocation | undefined): void;
|
|
10
|
+
/**
|
|
11
|
+
* Validates a binding identifier against target restrictions beyond general identifier syntax.
|
|
12
|
+
* @param {import("../semantic/types.js").SemanticLanguage} language - Target language.
|
|
13
|
+
* @param {unknown} name - Candidate semantic identifier.
|
|
14
|
+
* @param {string} role - Binding role for diagnostics.
|
|
15
|
+
* @param {import("../semantic/types.js").SourceLocation | undefined} location - Originating location.
|
|
16
|
+
* @returns {void}
|
|
17
|
+
*/
|
|
18
|
+
export declare function validateTargetBindingIdentifier(language: import("../semantic/types.js").SemanticLanguage, name: unknown, role: string, location: import("../semantic/types.js").SourceLocation | undefined): void;
|
|
19
|
+
//# sourceMappingURL=identifiers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identifiers.d.ts","sourceRoot":"","sources":["../../../src/backends/identifiers.js"],"names":[],"mappings":"AA8DA;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EANtC,OAAO,sBAAsB,EAAE,gBAMO,EAAE,IAAI,EAL5C,OAK4C,EAAE,IAAI,EAJlD,MAIkD,EAAE,QAAQ,EAH5D,OAAO,sBAAsB,EAAE,cAAc,GAAG,SAGY,GAF1D,IAAI,CAUhB;AAED;;;;;;;GAOG;AACH,wBAAgB,+BAA+B,CAAC,QAAQ,EAN7C,OAAO,sBAAsB,EAAE,gBAMc,EAAE,IAAI,EALnD,OAKmD,EAAE,IAAI,EAJzD,MAIyD,EAAE,QAAQ,EAHnE,OAAO,sBAAsB,EAAE,cAAc,GAAG,SAGmB,GAFjE,IAAI,CAchB"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
import { unsupportedCapability } from "../diagnostic.js";
|
|
3
|
+
/** @type {Record<import("../semantic/types.js").SemanticLanguage, RegExp>} */
|
|
4
|
+
const identifierPatterns = {
|
|
5
|
+
java: /^[A-Za-z_$][A-Za-z0-9_$]*$/u,
|
|
6
|
+
javascript: /^[A-Za-z_$][A-Za-z0-9_$]*$/u,
|
|
7
|
+
php: /^[A-Za-z_][A-Za-z0-9_]*$/u,
|
|
8
|
+
ruby: /^[a-z_][A-Za-z0-9_]*$/u,
|
|
9
|
+
typescript: /^[A-Za-z_$][A-Za-z0-9_$]*$/u
|
|
10
|
+
};
|
|
11
|
+
/** @type {Record<import("../semantic/types.js").SemanticLanguage, Set<string>>} */
|
|
12
|
+
const reservedWords = {
|
|
13
|
+
java: new Set([
|
|
14
|
+
"_", "abstract", "assert", "boolean", "break", "byte", "case", "catch", "char", "class", "const", "continue",
|
|
15
|
+
"default", "do", "double", "else", "enum", "exports", "extends", "false", "final", "finally", "float", "for",
|
|
16
|
+
"goto", "if", "implements", "import", "instanceof", "int", "interface", "long", "module", "native", "new",
|
|
17
|
+
"non-sealed", "null", "open", "opens", "package", "permits", "private", "protected", "provides", "public",
|
|
18
|
+
"record", "requires", "return", "sealed", "short", "static", "strictfp", "super", "switch", "synchronized",
|
|
19
|
+
"this", "throw", "throws", "to", "transient", "transitive", "true", "try", "uses", "var", "void", "volatile",
|
|
20
|
+
"when", "while", "with", "yield"
|
|
21
|
+
]),
|
|
22
|
+
javascript: new Set([
|
|
23
|
+
"await", "break", "case", "catch", "class", "const", "continue", "debugger", "default", "delete", "do", "else",
|
|
24
|
+
"enum", "export", "extends", "false", "finally", "for", "function", "if", "implements", "import", "in",
|
|
25
|
+
"instanceof", "interface", "let", "new", "null", "package", "private", "protected", "public", "return", "static",
|
|
26
|
+
"super", "switch", "this", "throw", "true", "try", "typeof", "var", "void", "while", "with", "yield"
|
|
27
|
+
]),
|
|
28
|
+
php: new Set([
|
|
29
|
+
"__halt_compiler", "abstract", "and", "array", "as", "break", "callable", "case", "catch", "class", "clone",
|
|
30
|
+
"const", "continue", "declare", "default", "die", "do", "echo", "else", "elseif", "empty", "enddeclare",
|
|
31
|
+
"endfor", "endforeach", "endif", "endswitch", "endwhile", "enum", "eval", "exit", "extends", "false", "final",
|
|
32
|
+
"finally", "fn", "for", "foreach", "from", "function", "global", "goto", "if", "implements", "include",
|
|
33
|
+
"include_once", "instanceof", "insteadof", "interface", "isset", "iterable", "list", "match", "mixed", "namespace",
|
|
34
|
+
"never", "new", "null", "object", "or", "parent", "print", "private", "protected", "public", "readonly", "require",
|
|
35
|
+
"require_once", "return", "self", "static", "switch", "throw", "trait", "true", "try", "unset", "use", "var",
|
|
36
|
+
"void", "while", "xor", "yield"
|
|
37
|
+
]),
|
|
38
|
+
ruby: new Set([
|
|
39
|
+
"BEGIN", "END", "__ENCODING__", "__END__", "__FILE__", "__LINE__", "alias", "and", "begin", "break", "case",
|
|
40
|
+
"class", "def", "defined?", "do", "else", "elsif", "end", "ensure", "false", "for", "if", "in", "module",
|
|
41
|
+
"next", "nil", "not", "or", "redo", "rescue", "retry", "return", "self", "super", "then", "true", "undef",
|
|
42
|
+
"unless", "until", "when", "while", "yield"
|
|
43
|
+
]),
|
|
44
|
+
typescript: new Set([
|
|
45
|
+
"abstract", "any", "as", "asserts", "async", "await", "boolean", "break", "case", "catch", "class", "const",
|
|
46
|
+
"constructor", "continue", "debugger", "declare", "default", "delete", "do", "else", "enum", "export", "extends",
|
|
47
|
+
"false", "finally", "for", "from", "function", "get", "if", "implements", "import", "in", "infer", "instanceof",
|
|
48
|
+
"interface", "is", "keyof", "let", "module", "namespace", "never", "new", "null", "number", "object", "of",
|
|
49
|
+
"override", "package", "private", "protected", "public", "readonly", "require", "return", "satisfies", "set",
|
|
50
|
+
"static", "string", "super", "switch", "symbol", "this", "throw", "true", "try", "type", "typeof", "undefined",
|
|
51
|
+
"unique", "unknown", "using", "var", "void", "while", "with", "yield"
|
|
52
|
+
])
|
|
53
|
+
};
|
|
54
|
+
const phpInvalidParameterBindings = new Set([
|
|
55
|
+
"GLOBALS", "_COOKIE", "_ENV", "_FILES", "_GET", "_POST", "_REQUEST", "_SERVER", "_SESSION", "this"
|
|
56
|
+
]);
|
|
57
|
+
const phpInvalidAssignedBindings = new Set(["GLOBALS", "this"]);
|
|
58
|
+
/**
|
|
59
|
+
* Validates an identifier against the target backend's deliberately narrow lexical contract.
|
|
60
|
+
* @param {import("../semantic/types.js").SemanticLanguage} language - Target language.
|
|
61
|
+
* @param {unknown} name - Candidate semantic identifier.
|
|
62
|
+
* @param {string} role - Identifier role for diagnostics.
|
|
63
|
+
* @param {import("../semantic/types.js").SourceLocation | undefined} location - Originating location.
|
|
64
|
+
* @returns {void}
|
|
65
|
+
*/
|
|
66
|
+
export function validateTargetIdentifier(language, name, role, location) {
|
|
67
|
+
if (typeof name != "string")
|
|
68
|
+
unsupportedCapability(language, `${role} identifier`, location);
|
|
69
|
+
const reservedName = language == "php" ? name.toLowerCase() : name;
|
|
70
|
+
if (!identifierPatterns[language].test(name) || reservedWords[language].has(reservedName)) {
|
|
71
|
+
unsupportedCapability(language, `${role} identifier '${name}'`, location);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Validates a binding identifier against target restrictions beyond general identifier syntax.
|
|
76
|
+
* @param {import("../semantic/types.js").SemanticLanguage} language - Target language.
|
|
77
|
+
* @param {unknown} name - Candidate semantic identifier.
|
|
78
|
+
* @param {string} role - Binding role for diagnostics.
|
|
79
|
+
* @param {import("../semantic/types.js").SourceLocation | undefined} location - Originating location.
|
|
80
|
+
* @returns {void}
|
|
81
|
+
*/
|
|
82
|
+
export function validateTargetBindingIdentifier(language, name, role, location) {
|
|
83
|
+
validateTargetIdentifier(language, name, role, location);
|
|
84
|
+
const invalidTypeScriptBinding = language == "typescript" && (name == "arguments" || name == "eval");
|
|
85
|
+
const invalidPhpVariable = language == "php" && typeof name == "string" &&
|
|
86
|
+
((role == "parameter" && phpInvalidParameterBindings.has(name)) ||
|
|
87
|
+
((role == "local" || role == "assignment target") && phpInvalidAssignedBindings.has(name)));
|
|
88
|
+
const invalidRubyBinding = language == "ruby" && typeof name == "string" && /^_[1-9]$/u.test(name);
|
|
89
|
+
if (invalidTypeScriptBinding || invalidPhpVariable || invalidRubyBinding) {
|
|
90
|
+
unsupportedCapability(language, `${role} identifier '${name}'`, location);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWRlbnRpZmllcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYmFja2VuZHMvaWRlbnRpZmllcnMuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLGtCQUFrQixDQUFBO0FBRXRELDhFQUE4RTtBQUM5RSxNQUFNLGtCQUFrQixHQUFHO0lBQ3pCLElBQUksRUFBRSw2QkFBNkI7SUFDbkMsVUFBVSxFQUFFLDZCQUE2QjtJQUN6QyxHQUFHLEVBQUUsMkJBQTJCO0lBQ2hDLElBQUksRUFBRSx3QkFBd0I7SUFDOUIsVUFBVSxFQUFFLDZCQUE2QjtDQUMxQyxDQUFBO0FBRUQsbUZBQW1GO0FBQ25GLE1BQU0sYUFBYSxHQUFHO0lBQ3BCLElBQUksRUFBRSxJQUFJLEdBQUcsQ0FBQztRQUNaLEdBQUcsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsVUFBVTtRQUM1RyxTQUFTLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLEtBQUs7UUFDNUcsTUFBTSxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLEtBQUs7UUFDekcsWUFBWSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsUUFBUTtRQUN6RyxRQUFRLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxRQUFR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QUFDO0FBQ0gsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsK0JBQStCLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsUUFBUTtJQUM1RSx3QkFBd0IsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQTtJQUV4RCxNQUFNLHdCQUF3QixHQUFHLFFBQVEsSUFBSSxZQUFZLElBQUksQ0FBQyxJQUFJLElBQUksV0FBVyxJQUFJLElBQUksSUFBSSxNQUFNLENBQUMsQ0FBQTtJQUNwRyxNQUFNLGtCQUFrQixHQUFHLFFBQVEsSUFBSSxLQUFLLElBQUksT0FBTyxJQUFJLElBQUksUUFBUTtRQUNyRSxDQUFDLENBQUMsSUFBSSxJQUFJLFdBQVcsSUFBSSwyQkFBMkIsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDN0QsQ0FBQyxDQUFDLElBQUksSUFBSSxPQUFPLElBQUksSUFBSSxJQUFJLG1CQUFtQixDQUFDLElBQUksMEJBQTBCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUMvRixNQUFNLGtCQUFrQixHQUFHLFFBQVEsSUFBSSxNQUFNLElBQUksT0FBTyxJQUFJLElBQUksUUFBUSxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7SUFFbEcsSUFBSSx3QkFBd0IsSUFBSSxrQkFBa0IsSUFBSSxrQkFBa0IsRUFBRSxDQUFDO1FBQ3pFLHFCQUFxQixDQUFDLFFBQVEsRUFBRSxHQUFHLElBQUksZ0JBQWdCLElBQUksR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFBO0lBQzNFLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB7dW5zdXBwb3J0ZWRDYXBhYmlsaXR5fSBmcm9tIFwiLi4vZGlhZ25vc3RpYy5qc1wiXG5cbi8qKiBAdHlwZSB7UmVjb3JkPGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljTGFuZ3VhZ2UsIFJlZ0V4cD59ICovXG5jb25zdCBpZGVudGlmaWVyUGF0dGVybnMgPSB7XG4gIGphdmE6IC9eW0EtWmEtel8kXVtBLVphLXowLTlfJF0qJC91LFxuICBqYXZhc2NyaXB0OiAvXltBLVphLXpfJF1bQS1aYS16MC05XyRdKiQvdSxcbiAgcGhwOiAvXltBLVphLXpfXVtBLVphLXowLTlfXSokL3UsXG4gIHJ1Ynk6IC9eW2Etel9dW0EtWmEtejAtOV9dKiQvdSxcbiAgdHlwZXNjcmlwdDogL15bQS1aYS16XyRdW0EtWmEtejAtOV8kXSokL3Vcbn1cblxuLyoqIEB0eXBlIHtSZWNvcmQ8aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNMYW5ndWFnZSwgU2V0PHN0cmluZz4+fSAqL1xuY29uc3QgcmVzZXJ2ZWRXb3JkcyA9IHtcbiAgamF2YTogbmV3IFNldChbXG4gICAgXCJfXCIsIFwiYWJzdHJhY3RcIiwgXCJhc3NlcnRcIiwgXCJib29sZWFuXCIsIFwiYnJlYWtcIiwgXCJieXRlXCIsIFwiY2FzZVwiLCBcImNhdGNoXCIsIFwiY2hhclwiLCBcImNsYXNzXCIsIFwiY29uc3RcIiwgXCJjb250aW51ZVwiLFxuICAgIFwiZGVmYXVsdFwiLCBcImRvXCIsIFwiZG91YmxlXCIsIFwiZWxzZVwiLCBcImVudW1cIiwgXCJleHBvcnRzXCIsIFwiZXh0ZW5kc1wiLCBcImZhbHNlXCIsIFwiZmluYWxcIiwgXCJmaW5hbGx5XCIsIFwiZmxvYXRcIiwgXCJmb3JcIixcbiAgICBcImdvdG9cIiwgXCJpZlwiLCBcImltcGxlbWVudHNcIiwgXCJpbXBvcnRcIiwgXCJpbnN0YW5jZW9mXCIsIFwiaW50XCIsIFwiaW50ZXJmYWNlXCIsIFwibG9uZ1wiLCBcIm1vZHVsZVwiLCBcIm5hdGl2ZVwiLCBcIm5ld1wiLFxuICAgIFwibm9uLXNlYWxlZFwiLCBcIm51bGxcIiwgXCJvcGVuXCIsIFwib3BlbnNcIiwgXCJwYWNrYWdlXCIsIFwicGVybWl0c1wiLCBcInByaXZhdGVcIiwgXCJwcm90ZWN0ZWRcIiwgXCJwcm92aWRlc1wiLCBcInB1YmxpY1wiLFxuICAgIFwicmVjb3JkXCIsIFwicmVxdWlyZXNcIiwgXCJyZXR1cm5cIiwgXCJzZWFsZWRcIiwgXCJzaG9ydFwiLCBcInN0YXRpY1wiLCBcInN0cmljdGZwXCIsIFwic3VwZXJcIiwgXCJzd2l0Y2hcIiwgXCJzeW5jaHJvbml6ZWRcIixcbiAgICBcInRoaXNcIiwgXCJ0aHJvd1wiLCBcInRocm93c1wiLCBcInRvXCIsIFwidHJhbnNpZW50XCIsIFwidHJhbnNpdGl2ZVwiLCBcInRydWVcIiwgXCJ0cnlcIiwgXCJ1c2VzXCIsIFwidmFyXCIsIFwidm9pZFwiLCBcInZvbGF0aWxlXCIsXG4gICAgXCJ3aGVuXCIsIFwid2hpbGVcIiwgXCJ3aXRoXCIsIFwieWllbGRcIlxuICBdKSxcbiAgamF2YXNjcmlwdDogbmV3IFNldChbXG4gICAgXCJhd2FpdFwiLCBcImJyZWFrXCIsIFwiY2FzZVwiLCBcImNhdGNoXCIsIFwiY2xhc3NcIiwgXCJjb25zdFwiLCBcImNvbnRpbnVlXCIsIFwiZGVidWdnZXJcIiwgXCJkZWZhdWx0XCIsIFwiZGVsZXRlXCIsIFwiZG9cIiwgXCJlbHNlXCIsXG4gICAgXCJlbnVtXCIsIFwiZXhwb3J0XCIsIFwiZXh0ZW5kc1wiLCBcImZhbHNlXCIsIFwiZmluYWxseVwiLCBcImZvclwiLCBcImZ1bmN0aW9uXCIsIFwiaWZcIiwgXCJpbXBsZW1lbnRzXCIsIFwiaW1wb3J0XCIsIFwiaW5cIixcbiAgICBcImluc3RhbmNlb2ZcIiwgXCJpbnRlcmZhY2VcIiwgXCJsZXRcIiwgXCJuZXdcIiwgXCJudWxsXCIsIFwicGFja2FnZVwiLCBcInByaXZhdGVcIiwgXCJwcm90ZWN0ZWRcIiwgXCJwdWJsaWNcIiwgXCJyZXR1cm5cIiwgXCJzdGF0aWNcIixcbiAgICBcInN1cGVyXCIsIFwic3dpdGNoXCIsIFwidGhpc1wiLCBcInRocm93XCIsIFwidHJ1ZVwiLCBcInRyeVwiLCBcInR5cGVvZlwiLCBcInZhclwiLCBcInZvaWRcIiwgXCJ3aGlsZVwiLCBcIndpdGhcIiwgXCJ5aWVsZFwiXG4gIF0pLFxuICBwaHA6IG5ldyBTZXQoW1xuICAgIFwiX19oYWx0X2NvbXBpbGVyXCIsIFwiYWJzdHJhY3RcIiwgXCJhbmRcIiwgXCJhcnJheVwiLCBcImFzXCIsIFwiYnJlYWtcIiwgXCJjYWxsYWJsZVwiLCBcImNhc2VcIiwgXCJjYXRjaFwiLCBcImNsYXNzXCIsIFwiY2xvbmVcIixcbiAgICBcImNvbnN0XCIsIFwiY29udGludWVcIiwgXCJkZWNsYXJlXCIsIFwiZGVmYXVsdFwiLCBcImRpZVwiLCBcImRvXCIsIFwiZWNob1wiLCBcImVsc2VcIiwgXCJlbHNlaWZcIiwgXCJlbXB0eVwiLCBcImVuZGRlY2xhcmVcIixcbiAgICBcImVuZGZvclwiLCBcImVuZGZvcmVhY2hcIiwgXCJlbmRpZlwiLCBcImVuZHN3aXRjaFwiLCBcImVuZHdoaWxlXCIsIFwiZW51bVwiLCBcImV2YWxcIiwgXCJleGl0XCIsIFwiZXh0ZW5kc1wiLCBcImZhbHNlXCIsIFwiZmluYWxcIixcbiAgICBcImZpbmFsbHlcIiwgXCJmblwiLCBcImZvclwiLCBcImZvcmVhY2hcIiwgXCJmcm9tXCIsIFwiZnVuY3Rpb25cIiwgXCJnbG9iYWxcIiwgXCJnb3RvXCIsIFwiaWZcIiwgXCJpbXBsZW1lbnRzXCIsIFwiaW5jbHVkZVwiLFxuICAgIFwiaW5jbHVkZV9vbmNlXCIsIFwiaW5zdGFuY2VvZlwiLCBcImluc3RlYWRvZlwiLCBcImludGVyZmFjZVwiLCBcImlzc2V0XCIsIFwiaXRlcmFibGVcIiwgXCJsaXN0XCIsIFwibWF0Y2hcIiwgXCJtaXhlZFwiLCBcIm5hbWVzcGFjZVwiLFxuICAgIFwibmV2ZXJcIiwgXCJuZXdcIiwgXCJudWxsXCIsIFwib2JqZWN0XCIsIFwib3JcIiwgXCJwYXJlbnRcIiwgXCJwcmludFwiLCBcInByaXZhdGVcIiwgXCJwcm90ZWN0ZWRcIiwgXCJwdWJsaWNcIiwgXCJyZWFkb25seVwiLCBcInJlcXVpcmVcIixcbiAgICBcInJlcXVpcmVfb25jZVwiLCBcInJldHVyblwiLCBcInNlbGZcIiwgXCJzdGF0aWNcIiwgXCJzd2l0Y2hcIiwgXCJ0aHJvd1wiLCBcInRyYWl0XCIsIFwidHJ1ZVwiLCBcInRyeVwiLCBcInVuc2V0XCIsIFwidXNlXCIsIFwidmFyXCIsXG4gICAgXCJ2b2lkXCIsIFwid2hpbGVcIiwgXCJ4b3JcIiwgXCJ5aWVsZFwiXG4gIF0pLFxuICBydWJ5OiBuZXcgU2V0KFtcbiAgICBcIkJFR0lOXCIsIFwiRU5EXCIsIFwiX19FTkNPRElOR19fXCIsIFwiX19FTkRfX1wiLCBcIl9fRklMRV9fXCIsIFwiX19MSU5FX19cIiwgXCJhbGlhc1wiLCBcImFuZFwiLCBcImJlZ2luXCIsIFwiYnJlYWtcIiwgXCJjYXNlXCIsXG4gICAgXCJjbGFzc1wiLCBcImRlZlwiLCBcImRlZmluZWQ/XCIsIFwiZG9cIiwgXCJlbHNlXCIsIFwiZWxzaWZcIiwgXCJlbmRcIiwgXCJlbnN1cmVcIiwgXCJmYWxzZVwiLCBcImZvclwiLCBcImlmXCIsIFwiaW5cIiwgXCJtb2R1bGVcIixcbiAgICBcIm5leHRcIiwgXCJuaWxcIiwgXCJub3RcIiwgXCJvclwiLCBcInJlZG9cIiwgXCJyZXNjdWVcIiwgXCJyZXRyeVwiLCBcInJldHVyblwiLCBcInNlbGZcIiwgXCJzdXBlclwiLCBcInRoZW5cIiwgXCJ0cnVlXCIsIFwidW5kZWZcIixcbiAgICBcInVubGVzc1wiLCBcInVudGlsXCIsIFwid2hlblwiLCBcIndoaWxlXCIsIFwieWllbGRcIlxuICBdKSxcbiAgdHlwZXNjcmlwdDogbmV3IFNldChbXG4gICAgXCJhYnN0cmFjdFwiLCBcImFueVwiLCBcImFzXCIsIFwiYXNzZXJ0c1wiLCBcImFzeW5jXCIsIFwiYXdhaXRcIiwgXCJib29sZWFuXCIsIFwiYnJlYWtcIiwgXCJjYXNlXCIsIFwiY2F0Y2hcIiwgXCJjbGFzc1wiLCBcImNvbnN0XCIsXG4gICAgXCJjb25zdHJ1Y3RvclwiLCBcImNvbnRpbnVlXCIsIFwiZGVidWdnZXJcIiwgXCJkZWNsYXJlXCIsIFwiZGVmYXVsdFwiLCBcImRlbGV0ZVwiLCBcImRvXCIsIFwiZWxzZVwiLCBcImVudW1cIiwgXCJleHBvcnRcIiwgXCJleHRlbmRzXCIsXG4gICAgXCJmYWxzZVwiLCBcImZpbmFsbHlcIiwgXCJmb3JcIiwgXCJmcm9tXCIsIFwiZnVuY3Rpb25cIiwgXCJnZXRcIiwgXCJpZlwiLCBcImltcGxlbWVudHNcIiwgXCJpbXBvcnRcIiwgXCJpblwiLCBcImluZmVyXCIsIFwiaW5zdGFuY2VvZlwiLFxuICAgIFwiaW50ZXJmYWNlXCIsIFwiaXNcIiwgXCJrZXlvZlwiLCBcImxldFwiLCBcIm1vZHVsZVwiLCBcIm5hbWVzcGFjZVwiLCBcIm5ldmVyXCIsIFwibmV3XCIsIFwibnVsbFwiLCBcIm51bWJlclwiLCBcIm9iamVjdFwiLCBcIm9mXCIsXG4gICAgXCJvdmVycmlkZVwiLCBcInBhY2thZ2VcIiwgXCJwcml2YXRlXCIsIFwicHJvdGVjdGVkXCIsIFwicHVibGljXCIsIFwicmVhZG9ubHlcIiwgXCJyZXF1aXJlXCIsIFwicmV0dXJuXCIsIFwic2F0aXNmaWVzXCIsIFwic2V0XCIsXG4gICAgXCJzdGF0aWNcIiwgXCJzdHJpbmdcIiwgXCJzdXBlclwiLCBcInN3aXRjaFwiLCBcInN5bWJvbFwiLCBcInRoaXNcIiwgXCJ0aHJvd1wiLCBcInRydWVcIiwgXCJ0cnlcIiwgXCJ0eXBlXCIsIFwidHlwZW9mXCIsIFwidW5kZWZpbmVkXCIsXG4gICAgXCJ1bmlxdWVcIiwgXCJ1bmtub3duXCIsIFwidXNpbmdcIiwgXCJ2YXJcIiwgXCJ2b2lkXCIsIFwid2hpbGVcIiwgXCJ3aXRoXCIsIFwieWllbGRcIlxuICBdKVxufVxuXG5jb25zdCBwaHBJbnZhbGlkUGFyYW1ldGVyQmluZGluZ3MgPSBuZXcgU2V0KFtcbiAgXCJHTE9CQUxTXCIsIFwiX0NPT0tJRVwiLCBcIl9FTlZcIiwgXCJfRklMRVNcIiwgXCJfR0VUXCIsIFwiX1BPU1RcIiwgXCJfUkVRVUVTVFwiLCBcIl9TRVJWRVJcIiwgXCJfU0VTU0lPTlwiLCBcInRoaXNcIlxuXSlcbmNvbnN0IHBocEludmFsaWRBc3NpZ25lZEJpbmRpbmdzID0gbmV3IFNldChbXCJHTE9CQUxTXCIsIFwidGhpc1wiXSlcblxuLyoqXG4gKiBWYWxpZGF0ZXMgYW4gaWRlbnRpZmllciBhZ2FpbnN0IHRoZSB0YXJnZXQgYmFja2VuZCdzIGRlbGliZXJhdGVseSBuYXJyb3cgbGV4aWNhbCBjb250cmFjdC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNMYW5ndWFnZX0gbGFuZ3VhZ2UgLSBUYXJnZXQgbGFuZ3VhZ2UuXG4gKiBAcGFyYW0ge3Vua25vd259IG5hbWUgLSBDYW5kaWRhdGUgc2VtYW50aWMgaWRlbnRpZmllci5cbiAqIEBwYXJhbSB7c3RyaW5nfSByb2xlIC0gSWRlbnRpZmllciByb2xlIGZvciBkaWFnbm9zdGljcy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU291cmNlTG9jYXRpb24gfCB1bmRlZmluZWR9IGxvY2F0aW9uIC0gT3JpZ2luYXRpbmcgbG9jYXRpb24uXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlVGFyZ2V0SWRlbnRpZmllcihsYW5ndWFnZSwgbmFtZSwgcm9sZSwgbG9jYXRpb24pIHtcbiAgaWYgKHR5cGVvZiBuYW1lICE9IFwic3RyaW5nXCIpIHVuc3VwcG9ydGVkQ2FwYWJpbGl0eShsYW5ndWFnZSwgYCR7cm9sZX0gaWRlbnRpZmllcmAsIGxvY2F0aW9uKVxuXG4gIGNvbnN0IHJlc2VydmVkTmFtZSA9IGxhbmd1YWdlID09IFwicGhwXCIgPyBuYW1lLnRvTG93ZXJDYXNlKCkgOiBuYW1lXG5cbiAgaWYgKCFpZGVudGlmaWVyUGF0dGVybnNbbGFuZ3VhZ2VdLnRlc3QobmFtZSkgfHwgcmVzZXJ2ZWRXb3Jkc1tsYW5ndWFnZV0uaGFzKHJlc2VydmVkTmFtZSkpIHtcbiAgICB1bnN1cHBvcnRlZENhcGFiaWxpdHkobGFuZ3VhZ2UsIGAke3JvbGV9IGlkZW50aWZpZXIgJyR7bmFtZX0nYCwgbG9jYXRpb24pXG4gIH1cbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgYSBiaW5kaW5nIGlkZW50aWZpZXIgYWdhaW5zdCB0YXJnZXQgcmVzdHJpY3Rpb25zIGJleW9uZCBnZW5lcmFsIGlkZW50aWZpZXIgc3ludGF4LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY0xhbmd1YWdlfSBsYW5ndWFnZSAtIFRhcmdldCBsYW5ndWFnZS5cbiAqIEBwYXJhbSB7dW5rbm93bn0gbmFtZSAtIENhbmRpZGF0ZSBzZW1hbnRpYyBpZGVudGlmaWVyLlxuICogQHBhcmFtIHtzdHJpbmd9IHJvbGUgLSBCaW5kaW5nIHJvbGUgZm9yIGRpYWdub3N0aWNzLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbiB8IHVuZGVmaW5lZH0gbG9jYXRpb24gLSBPcmlnaW5hdGluZyBsb2NhdGlvbi5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVUYXJnZXRCaW5kaW5nSWRlbnRpZmllcihsYW5ndWFnZSwgbmFtZSwgcm9sZSwgbG9jYXRpb24pIHtcbiAgdmFsaWRhdGVUYXJnZXRJZGVudGlmaWVyKGxhbmd1YWdlLCBuYW1lLCByb2xlLCBsb2NhdGlvbilcblxuICBjb25zdCBpbnZhbGlkVHlwZVNjcmlwdEJpbmRpbmcgPSBsYW5ndWFnZSA9PSBcInR5cGVzY3JpcHRcIiAmJiAobmFtZSA9PSBcImFyZ3VtZW50c1wiIHx8IG5hbWUgPT0gXCJldmFsXCIpXG4gIGNvbnN0IGludmFsaWRQaHBWYXJpYWJsZSA9IGxhbmd1YWdlID09IFwicGhwXCIgJiYgdHlwZW9mIG5hbWUgPT0gXCJzdHJpbmdcIiAmJlxuICAgICgocm9sZSA9PSBcInBhcmFtZXRlclwiICYmIHBocEludmFsaWRQYXJhbWV0ZXJCaW5kaW5ncy5oYXMobmFtZSkpIHx8XG4gICAgICAoKHJvbGUgPT0gXCJsb2NhbFwiIHx8IHJvbGUgPT0gXCJhc3NpZ25tZW50IHRhcmdldFwiKSAmJiBwaHBJbnZhbGlkQXNzaWduZWRCaW5kaW5ncy5oYXMobmFtZSkpKVxuICBjb25zdCBpbnZhbGlkUnVieUJpbmRpbmcgPSBsYW5ndWFnZSA9PSBcInJ1YnlcIiAmJiB0eXBlb2YgbmFtZSA9PSBcInN0cmluZ1wiICYmIC9eX1sxLTldJC91LnRlc3QobmFtZSlcblxuICBpZiAoaW52YWxpZFR5cGVTY3JpcHRCaW5kaW5nIHx8IGludmFsaWRQaHBWYXJpYWJsZSB8fCBpbnZhbGlkUnVieUJpbmRpbmcpIHtcbiAgICB1bnN1cHBvcnRlZENhcGFiaWxpdHkobGFuZ3VhZ2UsIGAke3JvbGV9IGlkZW50aWZpZXIgJyR7bmFtZX0nYCwgbG9jYXRpb24pXG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generates target source from a semantic module.
|
|
3
|
+
* @param {object} input - Generation request.
|
|
4
|
+
* @param {import("../semantic/types.js").SemanticLanguage} input.language - Target language.
|
|
5
|
+
* @param {import("../semantic/types.js").SemanticModule} input.module - Semantic module.
|
|
6
|
+
* @returns {string} Generated source.
|
|
7
|
+
*/
|
|
8
|
+
export declare function generateSource({ language, module }: {
|
|
9
|
+
language: import("../semantic/types.js").SemanticLanguage;
|
|
10
|
+
module: import("../semantic/types.js").SemanticModule;
|
|
11
|
+
}): string;
|
|
12
|
+
/**
|
|
13
|
+
* Generates source together with authoritative rich and Source Map v3 mappings.
|
|
14
|
+
* @param {object} input - Generation request.
|
|
15
|
+
* @param {import("../semantic/types.js").SemanticLanguage} input.language - Target language.
|
|
16
|
+
* @param {import("../semantic/types.js").SemanticModule} input.module - Semantic module.
|
|
17
|
+
* @param {string} [input.filename] - Output filename.
|
|
18
|
+
* @param {"none" | "external" | "inline"} [input.mapDirective] - JavaScript-family source map directive.
|
|
19
|
+
* @param {string} [input.sourceMapFilename] - External source map filename.
|
|
20
|
+
* @param {{filename: string, content: string, language?: import("../semantic/types.js").SemanticLanguage}[]} [input.sources] - Source content for legacy or assembled modules.
|
|
21
|
+
* @returns {import("../semantic/types.js").GeneratedArtifact} Generated artifact.
|
|
22
|
+
*/
|
|
23
|
+
export declare function generateArtifactSource({ language, filename, mapDirective, module, sourceMapFilename, sources }: {
|
|
24
|
+
language: import("../semantic/types.js").SemanticLanguage;
|
|
25
|
+
module: import("../semantic/types.js").SemanticModule;
|
|
26
|
+
filename?: string;
|
|
27
|
+
mapDirective?: "none" | "external" | "inline";
|
|
28
|
+
sourceMapFilename?: string;
|
|
29
|
+
sources?: {
|
|
30
|
+
filename: string;
|
|
31
|
+
content: string;
|
|
32
|
+
language?: import("../semantic/types.js").SemanticLanguage;
|
|
33
|
+
}[];
|
|
34
|
+
}): import("../semantic/types.js").GeneratedArtifact;
|
|
35
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/backends/index.js"],"names":[],"mappings":"AAuBA;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,EAAC,QAAQ,EAAE,MAAM,EAAC,EAJ9C;IAA+D,QAAQ,EAA/D,OAAO,sBAAsB,EAAE,gBAAgB,CACvD;IAA6D,MAAM,EAA3D,OAAO,sBAAsB,EAAE,cAAc,CACrD;CAE8C,GAFpC,MAAM,CAIlB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,sBAAsB,CAAC,EAAC,QAAQ,EAAE,QAAqC,EAAE,YAAqB,EAAE,MAAM,EAAE,iBAAqC,EAAE,OAAO,EAAC,EARpK;IAA+D,QAAQ,EAA/D,OAAO,sBAAsB,EAAE,gBAAgB,CACvD;IAA6D,MAAM,EAA3D,OAAO,sBAAsB,EAAE,cAAc,CACrD;IAAuB,QAAQ,AAA/B,CACA,EADQ,MAAM,CACd;IAA+C,YAAY,AAA3D,CACA,EADQ,MAAM,GAAG,UAAU,GAAG,QAAQ,CACtC;IAAuB,iBAAiB,AAAxC,CACA,EADQ,MAAM,CACd;IAAkH,OAAO,AAAzH,CACA,EADQ;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,sBAAsB,EAAE,gBAAgB,CAAA;KAAC,EAAE,CACzG;CAEoK,GAF1J,OAAO,sBAAsB,EAAE,iBAAiB,CAyD5D"}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
import { SemantifoldDiagnostic, unsupportedCapability } from "../diagnostic.js";
|
|
3
|
+
import { generateJava } from "./java.js";
|
|
4
|
+
import { generateJavaScript } from "./javascript.js";
|
|
5
|
+
import { generatePhp } from "./php.js";
|
|
6
|
+
import { generateRuby } from "./ruby.js";
|
|
7
|
+
import { validateBackendModule } from "./shared.js";
|
|
8
|
+
import { generateTypeScript } from "./typescript.js";
|
|
9
|
+
import { SourceWriter } from "./writer.js";
|
|
10
|
+
import { finalizeMapping, toSourceMapV3 } from "../mapping.js";
|
|
11
|
+
/** @type {Readonly<Record<import("../semantic/types.js").SemanticLanguage, string>>} */
|
|
12
|
+
const defaultFilenames = Object.freeze({
|
|
13
|
+
java: "Main.java",
|
|
14
|
+
javascript: "program.js",
|
|
15
|
+
php: "program.php",
|
|
16
|
+
ruby: "program.rb",
|
|
17
|
+
typescript: "program.ts"
|
|
18
|
+
});
|
|
19
|
+
const lineTerminatorPattern = /[\n\r\u2028\u2029]/u;
|
|
20
|
+
const syntheticArtifactBase = Object.freeze(["__semantifold_artifacts__"]);
|
|
21
|
+
/**
|
|
22
|
+
* Generates target source from a semantic module.
|
|
23
|
+
* @param {object} input - Generation request.
|
|
24
|
+
* @param {import("../semantic/types.js").SemanticLanguage} input.language - Target language.
|
|
25
|
+
* @param {import("../semantic/types.js").SemanticModule} input.module - Semantic module.
|
|
26
|
+
* @returns {string} Generated source.
|
|
27
|
+
*/
|
|
28
|
+
export function generateSource({ language, module }) {
|
|
29
|
+
return generateArtifactSource({ language, module }).code;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Generates source together with authoritative rich and Source Map v3 mappings.
|
|
33
|
+
* @param {object} input - Generation request.
|
|
34
|
+
* @param {import("../semantic/types.js").SemanticLanguage} input.language - Target language.
|
|
35
|
+
* @param {import("../semantic/types.js").SemanticModule} input.module - Semantic module.
|
|
36
|
+
* @param {string} [input.filename] - Output filename.
|
|
37
|
+
* @param {"none" | "external" | "inline"} [input.mapDirective] - JavaScript-family source map directive.
|
|
38
|
+
* @param {string} [input.sourceMapFilename] - External source map filename.
|
|
39
|
+
* @param {{filename: string, content: string, language?: import("../semantic/types.js").SemanticLanguage}[]} [input.sources] - Source content for legacy or assembled modules.
|
|
40
|
+
* @returns {import("../semantic/types.js").GeneratedArtifact} Generated artifact.
|
|
41
|
+
*/
|
|
42
|
+
export function generateArtifactSource({ language, filename = defaultFilenames[language], mapDirective = "none", module, sourceMapFilename = `${filename}.map`, sources }) {
|
|
43
|
+
validateBackendModule(module, language);
|
|
44
|
+
if (typeof filename != "string" || filename.length == 0 || lineTerminatorPattern.test(filename)) {
|
|
45
|
+
throw new TypeError("Generated filename must be a non-empty single-line string.");
|
|
46
|
+
}
|
|
47
|
+
if (typeof sourceMapFilename != "string" || sourceMapFilename.length == 0 || lineTerminatorPattern.test(sourceMapFilename)) {
|
|
48
|
+
throw new TypeError("Source map filename must be a non-empty single-line string.");
|
|
49
|
+
}
|
|
50
|
+
if (language == "java" && filename.split(/[\\/]/u).at(-1) != "Main.java") {
|
|
51
|
+
unsupportedCapability(language, "artifact filename basename other than Main.java", module.location);
|
|
52
|
+
}
|
|
53
|
+
if (!["none", "external", "inline"].includes(mapDirective))
|
|
54
|
+
throw new TypeError(`Unsupported map directive: ${mapDirective}`);
|
|
55
|
+
if (mapDirective != "none" && language != "javascript" && language != "typescript") {
|
|
56
|
+
throw new TypeError("Source map directives are supported only for JavaScript and TypeScript outputs.");
|
|
57
|
+
}
|
|
58
|
+
const writer = new SourceWriter({ filename, language, module, sources });
|
|
59
|
+
if (language == "php")
|
|
60
|
+
generatePhp(module, writer);
|
|
61
|
+
else if (language == "ruby")
|
|
62
|
+
generateRuby(module, writer);
|
|
63
|
+
else if (language == "javascript")
|
|
64
|
+
generateJavaScript(module, writer);
|
|
65
|
+
else if (language == "typescript")
|
|
66
|
+
generateTypeScript(module, writer);
|
|
67
|
+
else if (language == "java")
|
|
68
|
+
generateJava(module, writer);
|
|
69
|
+
else {
|
|
70
|
+
throw new SemantifoldDiagnostic({
|
|
71
|
+
code: "UNSUPPORTED_LANGUAGE",
|
|
72
|
+
language,
|
|
73
|
+
location: module.location,
|
|
74
|
+
message: "No source backend is registered for this language."
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
const sourceMap = toSourceMapV3(writer.finish());
|
|
78
|
+
if (mapDirective == "external") {
|
|
79
|
+
const sourceMapUrl = encodeArtifactPath(relativeArtifactPath(filename, sourceMapFilename));
|
|
80
|
+
writer.synthetic(`//# sourceMappingURL=${sourceMapUrl}\n`, "external source map directive", [module]);
|
|
81
|
+
}
|
|
82
|
+
else if (mapDirective == "inline") {
|
|
83
|
+
const encoded = base64Utf8(JSON.stringify(sourceMap));
|
|
84
|
+
writer.synthetic(`//# sourceMappingURL=data:application/json;charset=utf-8;base64,${encoded}\n`, "inline source map directive", [module]);
|
|
85
|
+
}
|
|
86
|
+
const mapping = finalizeMapping(writer.finish());
|
|
87
|
+
return {
|
|
88
|
+
code: mapping.generated.content,
|
|
89
|
+
filename,
|
|
90
|
+
language,
|
|
91
|
+
mapping,
|
|
92
|
+
sourceMap,
|
|
93
|
+
sourceMapFilename
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Resolves one logical artifact filename relative to another artifact's directory.
|
|
98
|
+
* @param {string} generatedFilename - Generated code artifact filename.
|
|
99
|
+
* @param {string} relatedFilename - Related artifact filename.
|
|
100
|
+
* @returns {string} Portable forward-slash relative path.
|
|
101
|
+
*/
|
|
102
|
+
function relativeArtifactPath(generatedFilename, relatedFilename) {
|
|
103
|
+
const generatedDirectory = resolvedArtifactPathParts(generatedFilename);
|
|
104
|
+
const related = resolvedArtifactPathParts(relatedFilename);
|
|
105
|
+
generatedDirectory.pop();
|
|
106
|
+
let common = 0;
|
|
107
|
+
while (common < generatedDirectory.length && common < related.length && generatedDirectory[common] == related[common])
|
|
108
|
+
common++;
|
|
109
|
+
return [...generatedDirectory.slice(common).map(() => ".."), ...related.slice(common)].join("/") || ".";
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Resolves separators and dot segments against the shared synthetic artifact base.
|
|
113
|
+
* @param {string} filename - Logical artifact filename.
|
|
114
|
+
* @returns {string[]} Resolved path parts.
|
|
115
|
+
*/
|
|
116
|
+
function resolvedArtifactPathParts(filename) {
|
|
117
|
+
const parts = [...syntheticArtifactBase];
|
|
118
|
+
for (const part of filename.replaceAll("\\", "/").split("/")) {
|
|
119
|
+
if (part == "" || part == ".")
|
|
120
|
+
continue;
|
|
121
|
+
if (part == "..") {
|
|
122
|
+
if (parts.length > syntheticArtifactBase.length)
|
|
123
|
+
parts.pop();
|
|
124
|
+
}
|
|
125
|
+
else
|
|
126
|
+
parts.push(part);
|
|
127
|
+
}
|
|
128
|
+
return parts;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Encodes literal filesystem path segments without encoding structural slashes.
|
|
132
|
+
* @param {string} path - Relative artifact path.
|
|
133
|
+
* @returns {string} URL-safe relative artifact path.
|
|
134
|
+
*/
|
|
135
|
+
function encodeArtifactPath(path) {
|
|
136
|
+
return path.split("/").map((part) => encodeURIComponent(part)).join("/");
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Encodes Unicode JSON without relying on a Node-only artifact contract.
|
|
140
|
+
* @param {string} value - Unicode string.
|
|
141
|
+
* @returns {string} Base64 UTF-8.
|
|
142
|
+
*/
|
|
143
|
+
function base64Utf8(value) {
|
|
144
|
+
let binary = "";
|
|
145
|
+
for (const byte of new TextEncoder().encode(value))
|
|
146
|
+
binary += String.fromCharCode(byte);
|
|
147
|
+
return btoa(binary);
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYmFja2VuZHMvaW5kZXguanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sRUFBQyxxQkFBcUIsRUFBRSxxQkFBcUIsRUFBQyxNQUFNLGtCQUFrQixDQUFBO0FBQzdFLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxXQUFXLENBQUE7QUFDdEMsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0saUJBQWlCLENBQUE7QUFDbEQsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLFVBQVUsQ0FBQTtBQUNwQyxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sV0FBVyxDQUFBO0FBQ3RDLE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLGFBQWEsQ0FBQTtBQUNqRCxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQTtBQUNsRCxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sYUFBYSxDQUFBO0FBQ3hDLE9BQU8sRUFBQyxlQUFlLEVBQUUsYUFBYSxFQUFDLE1BQU0sZUFBZSxDQUFBO0FBRTVELHdGQUF3RjtBQUN4RixNQUFNLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDckMsSUFBSSxFQUFFLFdBQVc7SUFDakIsVUFBVSxFQUFFLFlBQVk7SUFDeEIsR0FBRyxFQUFFLGFBQWE7SUFDbEIsSUFBSSxFQUFFLFlBQVk7SUFDbEIsVUFBVSxFQUFFLFlBQVk7Q0FDekIsQ0FBQyxDQUFBO0FBQ0YsTUFBTSxxQkFBcUIsR0FBRyxxQkFBcUIsQ0FBQTtBQUNuRCxNQUFNLHFCQUFxQixHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQywyQkFBMkIsQ0FBQyxDQUFDLENBQUE7QUFFMUU7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLGNBQWMsQ0FBQyxFQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUM7SUFDL0MsT0FBTyxzQkFBc0IsQ0FBQyxF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TSxJQUFJLE1BQU0sQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUE7SUFFdkYsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUE7QUFDckIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQge1NlbWFudGlmb2xkRGlhZ25vc3RpYywgdW5zdXBwb3J0ZWRDYXBhYmlsaXR5fSBmcm9tIFwiLi4vZGlhZ25vc3RpYy5qc1wiXG5pbXBvcnQge2dlbmVyYXRlSmF2YX0gZnJvbSBcIi4vamF2YS5qc1wiXG5pbXBvcnQge2dlbmVyYXRlSmF2YVNjcmlwdH0gZnJvbSBcIi4vamF2YXNjcmlwdC5qc1wiXG5pbXBvcnQge2dlbmVyYXRlUGhwfSBmcm9tIFwiLi9waHAuanNcIlxuaW1wb3J0IHtnZW5lcmF0ZVJ1Ynl9IGZyb20gXCIuL3J1YnkuanNcIlxuaW1wb3J0IHt2YWxpZGF0ZUJhY2tlbmRNb2R1bGV9IGZyb20gXCIuL3NoYXJlZC5qc1wiXG5pbXBvcnQge2dlbmVyYXRlVHlwZVNjcmlwdH0gZnJvbSBcIi4vdHlwZXNjcmlwdC5qc1wiXG5pbXBvcnQge1NvdXJjZVdyaXRlcn0gZnJvbSBcIi4vd3JpdGVyLmpzXCJcbmltcG9ydCB7ZmluYWxpemVNYXBwaW5nLCB0b1NvdXJjZU1hcFYzfSBmcm9tIFwiLi4vbWFwcGluZy5qc1wiXG5cbi8qKiBAdHlwZSB7UmVhZG9ubHk8UmVjb3JkPGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljTGFuZ3VhZ2UsIHN0cmluZz4+fSAqL1xuY29uc3QgZGVmYXVsdEZpbGVuYW1lcyA9IE9iamVjdC5mcmVlemUoe1xuICBqYXZhOiBcIk1haW4uamF2YVwiLFxuICBqYXZhc2NyaXB0OiBcInByb2dyYW0uanNcIixcbiAgcGhwOiBcInByb2dyYW0ucGhwXCIsXG4gIHJ1Ynk6IFwicHJvZ3JhbS5yYlwiLFxuICB0eXBlc2NyaXB0OiBcInByb2dyYW0udHNcIlxufSlcbmNvbnN0IGxpbmVUZXJtaW5hdG9yUGF0dGVybiA9IC9bXFxuXFxyXFx1MjAyOFxcdTIwMjldL3VcbmNvbnN0IHN5bnRoZXRpY0FydGlmYWN0QmFzZSA9IE9iamVjdC5mcmVlemUoW1wiX19zZW1hbnRpZm9sZF9hcnRpZmFjdHNfX1wiXSlcblxuLyoqXG4gKiBHZW5lcmF0ZXMgdGFyZ2V0IHNvdXJjZSBmcm9tIGEgc2VtYW50aWMgbW9kdWxlLlxuICogQHBhcmFtIHtvYmplY3R9IGlucHV0IC0gR2VuZXJhdGlvbiByZXF1ZXN0LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY0xhbmd1YWdlfSBpbnB1dC5sYW5ndWFnZSAtIFRhcmdldCBsYW5ndWFnZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNNb2R1bGV9IGlucHV0Lm1vZHVsZSAtIFNlbWFudGljIG1vZHVsZS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IEdlbmVyYXRlZCBzb3VyY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZVNvdXJjZSh7bGFuZ3VhZ2UsIG1vZHVsZX0pIHtcbiAgcmV0dXJuIGdlbmVyYXRlQXJ0aWZhY3RTb3VyY2Uoe2xhbmd1YWdlLCBtb2R1bGV9KS5jb2RlXG59XG5cbi8qKlxuICogR2VuZXJhdGVzIHNvdXJjZSB0b2dldGhlciB3aXRoIGF1dGhvcml0YXRpdmUgcmljaCBhbmQgU291cmNlIE1hcCB2MyBtYXBwaW5ncy5cbiAqIEBwYXJhbSB7b2JqZWN0fSBpbnB1dCAtIEdlbmVyYXRpb24gcmVxdWVzdC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNMYW5ndWFnZX0gaW5wdXQubGFuZ3VhZ2UgLSBUYXJnZXQgbGFuZ3VhZ2UuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljTW9kdWxlfSBpbnB1dC5tb2R1bGUgLSBTZW1hbnRpYyBtb2R1bGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2lucHV0LmZpbGVuYW1lXSAtIE91dHB1dCBmaWxlbmFtZS5cbiAqIEBwYXJhbSB7XCJub25lXCIgfCBcImV4dGVybmFsXCIgfCBcImlubGluZVwifSBbaW5wdXQubWFwRGlyZWN0aXZlXSAtIEphdmFTY3JpcHQtZmFtaWx5IHNvdXJjZSBtYXAgZGlyZWN0aXZlLlxuICogQHBhcmFtIHtzdHJpbmd9IFtpbnB1dC5zb3VyY2VNYXBGaWxlbmFtZV0gLSBFeHRlcm5hbCBzb3VyY2UgbWFwIGZpbGVuYW1lLlxuICogQHBhcmFtIHt7ZmlsZW5hbWU6IHN0cmluZywgY29udGVudDogc3RyaW5nLCBsYW5ndWFnZT86IGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljTGFuZ3VhZ2V9W119IFtpbnB1dC5zb3VyY2VzXSAtIFNvdXJjZSBjb250ZW50IGZvciBsZWdhY3kgb3IgYXNzZW1ibGVkIG1vZHVsZXMuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuR2VuZXJhdGVkQXJ0aWZhY3R9IEdlbmVyYXRlZCBhcnRpZmFjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlQXJ0aWZhY3RTb3VyY2Uoe2xhbmd1YWdlLCBmaWxlbmFtZSA9IGRlZmF1bHRGaWxlbmFtZXNbbGFuZ3VhZ2VdLCBtYXBEaXJlY3RpdmUgPSBcIm5vbmVcIiwgbW9kdWxlLCBzb3VyY2VNYXBGaWxlbmFtZSA9IGAke2ZpbGVuYW1lfS5tYXBgLCBzb3VyY2VzfSkge1xuICB2YWxpZGF0ZUJhY2tlbmRNb2R1bGUobW9kdWxlLCBsYW5ndWFnZSlcblxuICBpZiAodHlwZW9mIGZpbGVuYW1lICE9IFwic3RyaW5nXCIgfHwgZmlsZW5hbWUubGVuZ3RoID09IDAgfHwgbGluZVRlcm1pbmF0b3JQYXR0ZXJuLnRlc3QoZmlsZW5hbWUpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlbmVyYXRlZCBmaWxlbmFtZSBtdXN0IGJlIGEgbm9uLWVtcHR5IHNpbmdsZS1saW5lIHN0cmluZy5cIilcbiAgfVxuICBpZiAodHlwZW9mIHNvdXJjZU1hcEZpbGVuYW1lICE9IFwic3RyaW5nXCIgfHwgc291cmNlTWFwRmlsZW5hbWUubGVuZ3RoID09IDAgfHwgbGluZVRlcm1pbmF0b3JQYXR0ZXJuLnRlc3Qoc291cmNlTWFwRmlsZW5hbWUpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlNvdXJjZSBtYXAgZmlsZW5hbWUgbXVzdCBiZSBhIG5vbi1lbXB0eSBzaW5nbGUtbGluZSBzdHJpbmcuXCIpXG4gIH1cbiAgaWYgKGxhbmd1YWdlID09IFwiamF2YVwiICYmIGZpbGVuYW1lLnNwbGl0KC9bXFxcXC9dL3UpLmF0KC0xKSAhPSBcIk1haW4uamF2YVwiKSB7XG4gICAgdW5zdXBwb3J0ZWRDYXBhYmlsaXR5KGxhbmd1YWdlLCBcImFydGlmYWN0IGZpbGVuYW1lIGJhc2VuYW1lIG90aGVyIHRoYW4gTWFpbi5qYXZhXCIsIG1vZHVsZS5sb2NhdGlvbilcbiAgfVxuICBpZiAoIVtcIm5vbmVcIiwgXCJleHRlcm5hbFwiLCBcImlubGluZVwiXS5pbmNsdWRlcyhtYXBEaXJlY3RpdmUpKSB0aHJvdyBuZXcgVHlwZUVycm9yKGBVbnN1cHBvcnRlZCBtYXAgZGlyZWN0aXZlOiAke21hcERpcmVjdGl2ZX1gKVxuICBpZiAobWFwRGlyZWN0aXZlICE9IFwibm9uZVwiICYmIGxhbmd1YWdlICE9IFwiamF2YXNjcmlwdFwiICYmIGxhbmd1YWdlICE9IFwidHlwZXNjcmlwdFwiKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlNvdXJjZSBtYXAgZGlyZWN0aXZlcyBhcmUgc3VwcG9ydGVkIG9ubHkgZm9yIEphdmFTY3JpcHQgYW5kIFR5cGVTY3JpcHQgb3V0cHV0cy5cIilcbiAgfVxuXG4gIGNvbnN0IHdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoe2ZpbGVuYW1lLCBsYW5ndWFnZSwgbW9kdWxlLCBzb3VyY2VzfSlcblxuICBpZiAobGFuZ3VhZ2UgPT0gXCJwaHBcIikgZ2VuZXJhdGVQaHAobW9kdWxlLCB3cml0ZXIpXG4gIGVsc2UgaWYgKGxhbmd1YWdlID09IFwicnVieVwiKSBnZW5lcmF0ZVJ1YnkobW9kdWxlLCB3cml0ZXIpXG4gIGVsc2UgaWYgKGxhbmd1YWdlID09IFwiamF2YXNjcmlwdFwiKSBnZW5lcmF0ZUphdmFTY3JpcHQobW9kdWxlLCB3cml0ZXIpXG4gIGVsc2UgaWYgKGxhbmd1YWdlID09IFwidHlwZXNjcmlwdFwiKSBnZW5lcmF0ZVR5cGVTY3JpcHQobW9kdWxlLCB3cml0ZXIpXG4gIGVsc2UgaWYgKGxhbmd1YWdlID09IFwiamF2YVwiKSBnZW5lcmF0ZUphdmEobW9kdWxlLCB3cml0ZXIpXG4gIGVsc2Uge1xuICAgIHRocm93IG5ldyBTZW1hbnRpZm9sZERpYWdub3N0aWMoe1xuICAgICAgY29kZTogXCJVTlNVUFBPUlRFRF9MQU5HVUFHRVwiLFxuICAgICAgbGFuZ3VhZ2UsXG4gICAgICBsb2NhdGlvbjogbW9kdWxlLmxvY2F0aW9uLFxuICAgICAgbWVzc2FnZTogXCJObyBzb3VyY2UgYmFja2VuZCBpcyByZWdpc3RlcmVkIGZvciB0aGlzIGxhbmd1YWdlLlwiXG4gICAgfSlcbiAgfVxuXG4gIGNvbnN0IHNvdXJjZU1hcCA9IHRvU291cmNlTWFwVjMod3JpdGVyLmZpbmlzaCgpKVxuXG4gIGlmIChtYXBEaXJlY3RpdmUgPT0gXCJleHRlcm5hbFwiKSB7XG4gICAgY29uc3Qgc291cmNlTWFwVXJsID0gZW5jb2RlQXJ0aWZhY3RQYXRoKHJlbGF0aXZlQXJ0aWZhY3RQYXRoKGZpbGVuYW1lLCBzb3VyY2VNYXBGaWxlbmFtZSkpXG5cbiAgICB3cml0ZXIuc3ludGhldGljKGAvLyMgc291cmNlTWFwcGluZ1VSTD0ke3NvdXJjZU1hcFVybH1cXG5gLCBcImV4dGVybmFsIHNvdXJjZSBtYXAgZGlyZWN0aXZlXCIsIFttb2R1bGVdKVxuICB9IGVsc2UgaWYgKG1hcERpcmVjdGl2ZSA9PSBcImlubGluZVwiKSB7XG4gICAgY29uc3QgZW5jb2RlZCA9IGJhc2U2NFV0ZjgoSlNPTi5zdHJpbmdpZnkoc291cmNlTWFwKSlcblxuICAgIHdyaXRlci5zeW50aGV0aWMoYC8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCwke2VuY29kZWR9XFxuYCwgXCJpbmxpbmUgc291cmNlIG1hcCBkaXJlY3RpdmVcIiwgW21vZHVsZV0pXG4gIH1cblxuICBjb25zdCBtYXBwaW5nID0gZmluYWxpemVNYXBwaW5nKHdyaXRlci5maW5pc2goKSlcblxuICByZXR1cm4ge1xuICAgIGNvZGU6IG1hcHBpbmcuZ2VuZXJhdGVkLmNvbnRlbnQsXG4gICAgZmlsZW5hbWUsXG4gICAgbGFuZ3VhZ2UsXG4gICAgbWFwcGluZyxcbiAgICBzb3VyY2VNYXAsXG4gICAgc291cmNlTWFwRmlsZW5hbWVcbiAgfVxufVxuXG4vKipcbiAqIFJlc29sdmVzIG9uZSBsb2dpY2FsIGFydGlmYWN0IGZpbGVuYW1lIHJlbGF0aXZlIHRvIGFub3RoZXIgYXJ0aWZhY3QncyBkaXJlY3RvcnkuXG4gKiBAcGFyYW0ge3N0cmluZ30gZ2VuZXJhdGVkRmlsZW5hbWUgLSBHZW5lcmF0ZWQgY29kZSBhcnRpZmFjdCBmaWxlbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSByZWxhdGVkRmlsZW5hbWUgLSBSZWxhdGVkIGFydGlmYWN0IGZpbGVuYW1lLlxuICogQHJldHVybnMge3N0cmluZ30gUG9ydGFibGUgZm9yd2FyZC1zbGFzaCByZWxhdGl2ZSBwYXRoLlxuICovXG5mdW5jdGlvbiByZWxhdGl2ZUFydGlmYWN0UGF0aChnZW5lcmF0ZWRGaWxlbmFtZSwgcmVsYXRlZEZpbGVuYW1lKSB7XG4gIGNvbnN0IGdlbmVyYXRlZERpcmVjdG9yeSA9IHJlc29sdmVkQXJ0aWZhY3RQYXRoUGFydHMoZ2VuZXJhdGVkRmlsZW5hbWUpXG4gIGNvbnN0IHJlbGF0ZWQgPSByZXNvbHZlZEFydGlmYWN0UGF0aFBhcnRzKHJlbGF0ZWRGaWxlbmFtZSlcblxuICBnZW5lcmF0ZWREaXJlY3RvcnkucG9wKClcbiAgbGV0IGNvbW1vbiA9IDBcblxuICB3aGlsZSAoY29tbW9uIDwgZ2VuZXJhdGVkRGlyZWN0b3J5Lmxlbmd0aCAmJiBjb21tb24gPCByZWxhdGVkLmxlbmd0aCAmJiBnZW5lcmF0ZWREaXJlY3RvcnlbY29tbW9uXSA9PSByZWxhdGVkW2NvbW1vbl0pIGNvbW1vbisrXG5cbiAgcmV0dXJuIFsuLi5nZW5lcmF0ZWREaXJlY3Rvcnkuc2xpY2UoY29tbW9uKS5tYXAoKCkgPT4gXCIuLlwiKSwgLi4ucmVsYXRlZC5zbGljZShjb21tb24pXS5qb2luKFwiL1wiKSB8fCBcIi5cIlxufVxuXG4vKipcbiAqIFJlc29sdmVzIHNlcGFyYXRvcnMgYW5kIGRvdCBzZWdtZW50cyBhZ2FpbnN0IHRoZSBzaGFyZWQgc3ludGhldGljIGFydGlmYWN0IGJhc2UuXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZW5hbWUgLSBMb2dpY2FsIGFydGlmYWN0IGZpbGVuYW1lLlxuICogQHJldHVybnMge3N0cmluZ1tdfSBSZXNvbHZlZCBwYXRoIHBhcnRzLlxuICovXG5mdW5jdGlvbiByZXNvbHZlZEFydGlmYWN0UGF0aFBhcnRzKGZpbGVuYW1lKSB7XG4gIGNvbnN0IHBhcnRzID0gWy4uLnN5bnRoZXRpY0FydGlmYWN0QmFzZV1cblxuICBmb3IgKGNvbnN0IHBhcnQgb2YgZmlsZW5hbWUucmVwbGFjZUFsbChcIlxcXFxcIiwgXCIvXCIpLnNwbGl0KFwiL1wiKSkge1xuICAgIGlmIChwYXJ0ID09IFwiXCIgfHwgcGFydCA9PSBcIi5cIikgY29udGludWVcbiAgICBpZiAocGFydCA9PSBcIi4uXCIpIHtcbiAgICAgIGlmIChwYXJ0cy5sZW5ndGggPiBzeW50aGV0aWNBcnRpZmFjdEJhc2UubGVuZ3RoKSBwYXJ0cy5wb3AoKVxuICAgIH0gZWxzZSBwYXJ0cy5wdXNoKHBhcnQpXG4gIH1cblxuICByZXR1cm4gcGFydHNcbn1cblxuLyoqXG4gKiBFbmNvZGVzIGxpdGVyYWwgZmlsZXN5c3RlbSBwYXRoIHNlZ21lbnRzIHdpdGhvdXQgZW5jb2Rpbmcgc3RydWN0dXJhbCBzbGFzaGVzLlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBSZWxhdGl2ZSBhcnRpZmFjdCBwYXRoLlxuICogQHJldHVybnMge3N0cmluZ30gVVJMLXNhZmUgcmVsYXRpdmUgYXJ0aWZhY3QgcGF0aC5cbiAqL1xuZnVuY3Rpb24gZW5jb2RlQXJ0aWZhY3RQYXRoKHBhdGgpIHtcbiAgcmV0dXJuIHBhdGguc3BsaXQoXCIvXCIpLm1hcCgocGFydCkgPT4gZW5jb2RlVVJJQ29tcG9uZW50KHBhcnQpKS5qb2luKFwiL1wiKVxufVxuXG4vKipcbiAqIEVuY29kZXMgVW5pY29kZSBKU09OIHdpdGhvdXQgcmVseWluZyBvbiBhIE5vZGUtb25seSBhcnRpZmFjdCBjb250cmFjdC5cbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSAtIFVuaWNvZGUgc3RyaW5nLlxuICogQHJldHVybnMge3N0cmluZ30gQmFzZTY0IFVURi04LlxuICovXG5mdW5jdGlvbiBiYXNlNjRVdGY4KHZhbHVlKSB7XG4gIGxldCBiaW5hcnkgPSBcIlwiXG5cbiAgZm9yIChjb25zdCBieXRlIG9mIG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZSh2YWx1ZSkpIGJpbmFyeSArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ5dGUpXG5cbiAgcmV0dXJuIGJ0b2EoYmluYXJ5KVxufVxuIl19
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Emits an independently executable Java `Main` program through the source-aware writer.
|
|
3
|
+
* @param {import("../semantic/types.js").SemanticModule} module - Semantic module.
|
|
4
|
+
* @param {import("./writer.js").SourceWriter} writer - Source-aware writer.
|
|
5
|
+
* @returns {void}
|
|
6
|
+
*/
|
|
7
|
+
export declare function generateJava(module: import("../semantic/types.js").SemanticModule, writer: import("./writer.js").SourceWriter): void;
|
|
8
|
+
//# sourceMappingURL=java.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"java.d.ts","sourceRoot":"","sources":["../../../src/backends/java.js"],"names":[],"mappings":"AAKA;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAJxB,OAAO,sBAAsB,EAAE,cAIP,EAAE,MAAM,EAHhC,OAAO,aAAa,EAAE,YAGU,GAF9B,IAAI,CAyDhB"}
|