semantifold 0.3.0 → 0.4.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/README.md +58 -15
- package/build/index.d.ts +48 -2
- package/build/index.d.ts.map +1 -1
- package/build/index.js +57 -8
- package/build/src/artifact-path.d.ts +23 -1
- package/build/src/artifact-path.d.ts.map +1 -1
- package/build/src/artifact-path.js +45 -3
- package/build/src/artifacts.d.ts.map +1 -1
- package/build/src/artifacts.js +66 -1
- package/build/src/backends/c-validation.d.ts.map +1 -1
- package/build/src/backends/c-validation.js +7 -3
- package/build/src/backends/cpp-validation.d.ts.map +1 -1
- package/build/src/backends/cpp-validation.js +7 -3
- package/build/src/backends/csharp.js +7 -1
- package/build/src/backends/dart-runtime.d.ts +2 -0
- package/build/src/backends/dart-runtime.d.ts.map +1 -0
- package/build/src/backends/dart-runtime.js +41 -0
- package/build/src/backends/dart.d.ts +20 -0
- package/build/src/backends/dart.d.ts.map +1 -0
- package/build/src/backends/dart.js +321 -0
- package/build/src/backends/effects.d.ts +60 -0
- package/build/src/backends/effects.d.ts.map +1 -0
- package/build/src/backends/effects.js +746 -0
- package/build/src/backends/go.js +18 -4
- package/build/src/backends/identifiers.d.ts +36 -4
- package/build/src/backends/identifiers.d.ts.map +1 -1
- package/build/src/backends/identifiers.js +154 -10
- package/build/src/backends/index.d.ts.map +1 -1
- package/build/src/backends/index.js +27 -4
- package/build/src/backends/ios.d.ts +68 -0
- package/build/src/backends/ios.d.ts.map +1 -0
- package/build/src/backends/ios.js +1503 -0
- package/build/src/backends/java.d.ts.map +1 -1
- package/build/src/backends/java.js +429 -36
- package/build/src/backends/javascript.d.ts +6 -0
- package/build/src/backends/javascript.d.ts.map +1 -1
- package/build/src/backends/javascript.js +380 -24
- package/build/src/backends/kotlin-runtime.d.ts +3 -0
- package/build/src/backends/kotlin-runtime.d.ts.map +1 -0
- package/build/src/backends/kotlin-runtime.js +29 -0
- package/build/src/backends/kotlin.d.ts +23 -0
- package/build/src/backends/kotlin.d.ts.map +1 -0
- package/build/src/backends/kotlin.js +136 -0
- package/build/src/backends/native-validation.d.ts +2 -2
- package/build/src/backends/native-validation.d.ts.map +1 -1
- package/build/src/backends/native-validation.js +2 -2
- package/build/src/backends/ordered-expressions.d.ts.map +1 -1
- package/build/src/backends/ordered-expressions.js +39 -7
- package/build/src/backends/php-stdlib-support.d.ts +19 -0
- package/build/src/backends/php-stdlib-support.d.ts.map +1 -0
- package/build/src/backends/php-stdlib-support.js +227 -0
- package/build/src/backends/php.d.ts.map +1 -1
- package/build/src/backends/php.js +448 -33
- package/build/src/backends/program.d.ts +81 -0
- package/build/src/backends/program.d.ts.map +1 -0
- package/build/src/backends/program.js +1308 -0
- package/build/src/backends/python.js +7 -1
- package/build/src/backends/ruby.d.ts.map +1 -1
- package/build/src/backends/ruby.js +310 -24
- package/build/src/backends/rust-runtime.d.ts +7 -0
- package/build/src/backends/rust-runtime.d.ts.map +1 -0
- package/build/src/backends/rust-runtime.js +32 -0
- package/build/src/backends/rust-validation.d.ts +9 -0
- package/build/src/backends/rust-validation.d.ts.map +1 -0
- package/build/src/backends/rust-validation.js +78 -0
- package/build/src/backends/rust.d.ts +24 -0
- package/build/src/backends/rust.d.ts.map +1 -0
- package/build/src/backends/rust.js +344 -0
- package/build/src/backends/scalars.d.ts +14 -6
- package/build/src/backends/scalars.d.ts.map +1 -1
- package/build/src/backends/scalars.js +167 -17
- package/build/src/backends/shared.d.ts +23 -4
- package/build/src/backends/shared.d.ts.map +1 -1
- package/build/src/backends/shared.js +2158 -62
- package/build/src/backends/stdlib-support.d.ts +14 -0
- package/build/src/backends/stdlib-support.d.ts.map +1 -0
- package/build/src/backends/stdlib-support.js +237 -0
- package/build/src/backends/swift-runtime.d.ts +3 -0
- package/build/src/backends/swift-runtime.d.ts.map +1 -0
- package/build/src/backends/swift-runtime.js +14 -0
- package/build/src/backends/swift.d.ts +8 -0
- package/build/src/backends/swift.d.ts.map +1 -0
- package/build/src/backends/swift.js +127 -0
- package/build/src/backends/typescript.d.ts.map +1 -1
- package/build/src/backends/typescript.js +344 -24
- package/build/src/backends/wasm.d.ts +43 -0
- package/build/src/backends/wasm.d.ts.map +1 -0
- package/build/src/backends/wasm.js +2164 -0
- package/build/src/backends/writer.d.ts +235 -4
- package/build/src/backends/writer.d.ts.map +1 -1
- package/build/src/backends/writer.js +468 -3
- package/build/src/diagnostic.d.ts +4 -3
- package/build/src/diagnostic.d.ts.map +1 -1
- package/build/src/diagnostic.js +5 -3
- package/build/src/frontends/c.d.ts.map +1 -1
- package/build/src/frontends/c.js +5 -3
- package/build/src/frontends/cpp.d.ts.map +1 -1
- package/build/src/frontends/cpp.js +5 -3
- package/build/src/frontends/csharp.d.ts.map +1 -1
- package/build/src/frontends/csharp.js +7 -3
- package/build/src/frontends/dart.d.ts +10 -0
- package/build/src/frontends/dart.d.ts.map +1 -0
- package/build/src/frontends/dart.js +913 -0
- package/build/src/frontends/index.d.ts +3 -1
- package/build/src/frontends/index.d.ts.map +1 -1
- package/build/src/frontends/index.js +15 -5
- package/build/src/frontends/java.d.ts +110 -1
- package/build/src/frontends/java.d.ts.map +1 -1
- package/build/src/frontends/java.js +1725 -70
- package/build/src/frontends/javascript-typescript.d.ts +69 -1
- package/build/src/frontends/javascript-typescript.d.ts.map +1 -1
- package/build/src/frontends/javascript-typescript.js +1825 -93
- package/build/src/frontends/kotlin.d.ts +10 -0
- package/build/src/frontends/kotlin.d.ts.map +1 -0
- package/build/src/frontends/kotlin.js +685 -0
- package/build/src/frontends/php.d.ts +118 -1
- package/build/src/frontends/php.d.ts.map +1 -1
- package/build/src/frontends/php.js +1583 -76
- package/build/src/frontends/program.d.ts +74 -0
- package/build/src/frontends/program.d.ts.map +1 -0
- package/build/src/frontends/program.js +989 -0
- package/build/src/frontends/ruby.d.ts +68 -1
- package/build/src/frontends/ruby.d.ts.map +1 -1
- package/build/src/frontends/ruby.js +1446 -101
- package/build/src/frontends/rust-parser.d.ts +11 -0
- package/build/src/frontends/rust-parser.d.ts.map +1 -0
- package/build/src/frontends/rust-parser.js +15 -0
- package/build/src/frontends/rust.d.ts +14 -0
- package/build/src/frontends/rust.d.ts.map +1 -0
- package/build/src/frontends/rust.js +715 -0
- package/build/src/frontends/scalars.d.ts +10 -0
- package/build/src/frontends/scalars.d.ts.map +1 -1
- package/build/src/frontends/scalars.js +28 -2
- package/build/src/frontends/swift.d.ts +10 -0
- package/build/src/frontends/swift.d.ts.map +1 -0
- package/build/src/frontends/swift.js +860 -0
- package/build/src/frontends/types.d.ts +186 -0
- package/build/src/frontends/types.d.ts.map +1 -0
- package/build/src/frontends/types.js +634 -0
- package/build/src/language-registry.d.ts +46 -4
- package/build/src/language-registry.d.ts.map +1 -1
- package/build/src/language-registry.js +167 -13
- package/build/src/mapping.d.ts +2 -2
- package/build/src/mapping.d.ts.map +1 -1
- package/build/src/mapping.js +31 -10
- package/build/src/semantic/capabilities.d.ts +66 -0
- package/build/src/semantic/capabilities.d.ts.map +1 -0
- package/build/src/semantic/capabilities.js +649 -0
- package/build/src/semantic/effects.d.ts +26 -0
- package/build/src/semantic/effects.d.ts.map +1 -0
- package/build/src/semantic/effects.js +764 -0
- package/build/src/semantic/generics.d.ts +23 -0
- package/build/src/semantic/generics.d.ts.map +1 -0
- package/build/src/semantic/generics.js +61 -0
- package/build/src/semantic/lifetime.d.ts +37 -0
- package/build/src/semantic/lifetime.d.ts.map +1 -0
- package/build/src/semantic/lifetime.js +527 -0
- package/build/src/semantic/provenance.d.ts +9 -2
- package/build/src/semantic/provenance.d.ts.map +1 -1
- package/build/src/semantic/provenance.js +462 -20
- package/build/src/semantic/scalars.d.ts +11 -0
- package/build/src/semantic/scalars.d.ts.map +1 -1
- package/build/src/semantic/scalars.js +16 -1
- package/build/src/semantic/stdlib.d.ts +254 -0
- package/build/src/semantic/stdlib.d.ts.map +1 -0
- package/build/src/semantic/stdlib.js +880 -0
- package/build/src/semantic/types.d.ts +2952 -202
- package/build/src/semantic/types.d.ts.map +1 -1
- package/build/src/semantic/types.js +688 -15
- package/build/src/semantic/validate.d.ts +85 -5
- package/build/src/semantic/validate.d.ts.map +1 -1
- package/build/src/semantic/validate.js +2576 -98
- package/build/src/stdlib-facades.d.ts +304 -0
- package/build/src/stdlib-facades.d.ts.map +1 -0
- package/build/src/stdlib-facades.js +1167 -0
- package/build/src/stdlib-negotiation.d.ts +69 -0
- package/build/src/stdlib-negotiation.d.ts.map +1 -0
- package/build/src/stdlib-negotiation.js +403 -0
- package/build/src/stdlib-providers.d.ts +72 -0
- package/build/src/stdlib-providers.d.ts.map +1 -0
- package/build/src/stdlib-providers.js +339 -0
- package/build/src/toolchains.d.ts +55 -1
- package/build/src/toolchains.d.ts.map +1 -1
- package/build/src/toolchains.js +15 -4
- package/docs/architecture.md +45 -13
- package/docs/dart.md +60 -0
- package/docs/goals.md +3 -3
- package/docs/ios.md +121 -0
- package/docs/kotlin.md +42 -0
- package/docs/language-support.md +231 -26
- package/docs/multi-file-modules.md +52 -0
- package/docs/parser-qualification.md +121 -8
- package/docs/plans/2026-09-05-standard-library-portability.md +10 -10
- package/docs/rust.md +88 -0
- package/docs/source-maps.md +15 -7
- package/docs/standard-library-portability.md +39 -8
- package/docs/swift.md +44 -0
- package/docs/testing.md +366 -4
- package/docs/webassembly.md +52 -0
- package/index.js +63 -8
- package/node_modules/semantifold-tree-sitter-legacy-internal/README.md +2 -2
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/LICENSE +21 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/README.md +45 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/binding.gyp +30 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/bindings/node/binding.cc +20 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/bindings/node/binding_test.js +9 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/bindings/node/index.d.ts +28 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/bindings/node/index.js +11 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/grammar.js +1630 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/package.json +64 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/prebuilds/darwin-arm64/tree-sitter-rust.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/prebuilds/darwin-x64/tree-sitter-rust.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/prebuilds/linux-arm64/tree-sitter-rust.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/prebuilds/linux-x64/tree-sitter-rust.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/prebuilds/win32-arm64/tree-sitter-rust.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/prebuilds/win32-x64/tree-sitter-rust.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/queries/highlights.scm +159 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/queries/injections.scm +9 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/queries/tags.scm +60 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/grammar.json +9405 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/node-types.json +5399 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/parser.c +192569 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/scanner.c +393 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/tree_sitter/alloc.h +54 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/tree_sitter/array.h +290 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/tree_sitter/parser.h +266 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/tree-sitter-rust.wasm +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/tree-sitter.json +53 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/package.json +3 -2
- package/node_modules/semantifold-tree-sitter-legacy-internal/src/c.js +5 -4
- package/package.json +5 -2
- package/src/artifact-path.js +47 -2
- package/src/artifacts.js +67 -0
- package/src/backends/c-validation.js +6 -1
- package/src/backends/cpp-validation.js +6 -1
- package/src/backends/csharp.js +3 -0
- package/src/backends/dart-runtime.js +41 -0
- package/src/backends/dart.js +326 -0
- package/src/backends/effects.js +705 -0
- package/src/backends/go.js +14 -2
- package/src/backends/identifiers.js +160 -9
- package/src/backends/index.js +27 -2
- package/src/backends/ios.js +1612 -0
- package/src/backends/java.js +454 -36
- package/src/backends/javascript.js +389 -23
- package/src/backends/kotlin-runtime.js +29 -0
- package/src/backends/kotlin.js +141 -0
- package/src/backends/native-validation.js +1 -1
- package/src/backends/ordered-expressions.js +40 -6
- package/src/backends/php-stdlib-support.js +239 -0
- package/src/backends/php.js +469 -32
- package/src/backends/program.js +1407 -0
- package/src/backends/python.js +3 -0
- package/src/backends/ruby.js +326 -23
- package/src/backends/rust-runtime.js +34 -0
- package/src/backends/rust-validation.js +75 -0
- package/src/backends/rust.js +335 -0
- package/src/backends/scalars.js +141 -16
- package/src/backends/shared.js +2304 -124
- package/src/backends/stdlib-support.js +234 -0
- package/src/backends/swift-runtime.js +14 -0
- package/src/backends/swift.js +132 -0
- package/src/backends/typescript.js +349 -23
- package/src/backends/wasm.js +2208 -0
- package/src/backends/writer.js +520 -2
- package/src/diagnostic.js +4 -2
- package/src/frontends/c.js +4 -2
- package/src/frontends/cpp.js +4 -2
- package/src/frontends/csharp.js +4 -2
- package/src/frontends/dart.js +963 -0
- package/src/frontends/index.js +14 -4
- package/src/frontends/java.js +1977 -69
- package/src/frontends/javascript-typescript.js +2046 -102
- package/src/frontends/kotlin.js +713 -0
- package/src/frontends/php.js +1725 -79
- package/src/frontends/program.js +1062 -0
- package/src/frontends/ruby.js +1624 -98
- package/src/frontends/rust-parser.js +18 -0
- package/src/frontends/rust.js +714 -0
- package/src/frontends/scalars.js +31 -1
- package/src/frontends/swift.js +893 -0
- package/src/frontends/types.js +750 -0
- package/src/language-registry.js +172 -12
- package/src/mapping.js +33 -9
- package/src/semantic/capabilities.js +671 -0
- package/src/semantic/effects.js +737 -0
- package/src/semantic/generics.js +58 -0
- package/src/semantic/lifetime.js +517 -0
- package/src/semantic/provenance.js +412 -19
- package/src/semantic/scalars.js +17 -0
- package/src/semantic/stdlib.js +921 -0
- package/src/semantic/types.js +765 -14
- package/src/semantic/validate.js +2934 -209
- package/src/stdlib-facades.js +1211 -0
- package/src/stdlib-negotiation.js +446 -0
- package/src/stdlib-providers.js +377 -0
- package/src/toolchains.js +16 -3
|
@@ -0,0 +1,321 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
import { unsupportedCapability } from "../diagnostic.js";
|
|
3
|
+
import { finalizeMapping, toSourceMapV3 } from "../mapping.js";
|
|
4
|
+
import { emitExpression, validateBackendModule } from "./shared.js";
|
|
5
|
+
import { dartRuntime } from "./dart-runtime.js";
|
|
6
|
+
import { emitScalarType } from "./scalars.js";
|
|
7
|
+
import { SourceWriter } from "./writer.js";
|
|
8
|
+
const pubspec = "name: semantifold_generated\npublish_to: none\nenvironment:\n sdk: 3.13.3\n";
|
|
9
|
+
const lockfile = "# Generated by pub\n# See https://dart.dev/tools/pub/glossary#lockfile\npackages: {}\nsdks:\n dart: \"3.13.3\"\n";
|
|
10
|
+
/**
|
|
11
|
+
* Emits one deterministic dependency-free Dart package candidate.
|
|
12
|
+
* @param {{filename?: string, mapDirective?: unknown, module: import("../semantic/types.js").SemanticModule, sourceMapFilename?: unknown, sources?: {filename: string, content: string, language?: import("../semantic/types.js").SemanticLanguage}[]}} input Backend request.
|
|
13
|
+
* @returns {{artifacts: import("../semantic/types.js").GeneratedSetArtifact[], target: string}} Candidate artifact set.
|
|
14
|
+
*/
|
|
15
|
+
export function generateDartPackage({ filename, mapDirective, module, sourceMapFilename, sources }) {
|
|
16
|
+
validateBackendModule(module, "dart");
|
|
17
|
+
if (filename !== undefined && filename != "bin/program.dart") {
|
|
18
|
+
unsupportedCapability("dart", "artifact filename other than bin/program.dart", module.location);
|
|
19
|
+
}
|
|
20
|
+
if (mapDirective !== undefined || sourceMapFilename !== undefined) {
|
|
21
|
+
unsupportedCapability("dart", "source-map filename or directive option", module.location);
|
|
22
|
+
}
|
|
23
|
+
const unreadLocals = findUnreadLocals(module);
|
|
24
|
+
const writer = new SourceWriter({ filename: "bin/program.dart", language: "dart", module, sources });
|
|
25
|
+
emitProgram(module, writer, unreadLocals);
|
|
26
|
+
const mapping = finalizeMapping(writer.finish());
|
|
27
|
+
const root = mapping.nodes.find(({ path }) => path == "");
|
|
28
|
+
if (!root)
|
|
29
|
+
throw new Error("Validated Dart module omitted its canonical root provenance.");
|
|
30
|
+
const relatedOrigins = relatedRootOrigins(root);
|
|
31
|
+
return {
|
|
32
|
+
artifacts: [{
|
|
33
|
+
content: pubspec,
|
|
34
|
+
contentKind: "text",
|
|
35
|
+
mediaType: "application/yaml",
|
|
36
|
+
ownership: "generated",
|
|
37
|
+
path: "pubspec.yaml",
|
|
38
|
+
provenance: {
|
|
39
|
+
kind: "synthetic",
|
|
40
|
+
reason: "Fixed dependency-free Dart 3.13.3 package configuration.",
|
|
41
|
+
relatedOrigins
|
|
42
|
+
},
|
|
43
|
+
role: "manifest"
|
|
44
|
+
}, {
|
|
45
|
+
content: lockfile,
|
|
46
|
+
contentKind: "text",
|
|
47
|
+
mediaType: "application/yaml",
|
|
48
|
+
ownership: "generated",
|
|
49
|
+
path: "pubspec.lock",
|
|
50
|
+
provenance: {
|
|
51
|
+
kind: "synthetic",
|
|
52
|
+
reason: "Deterministic Dart pub lockfile for a package with no dependencies.",
|
|
53
|
+
relatedOrigins
|
|
54
|
+
},
|
|
55
|
+
role: "manifest"
|
|
56
|
+
}, {
|
|
57
|
+
content: mapping.generated.content,
|
|
58
|
+
contentKind: "text",
|
|
59
|
+
mediaType: "text/x-dart",
|
|
60
|
+
ownership: "generated",
|
|
61
|
+
path: "bin/program.dart",
|
|
62
|
+
provenance: { kind: "text", mapping, sourceMap: toSourceMapV3(mapping) },
|
|
63
|
+
role: "entry"
|
|
64
|
+
}],
|
|
65
|
+
target: "dart"
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Emits the compiler-owned prefix and one complete program.
|
|
70
|
+
* @param {import("../semantic/types.js").SemanticModule} module Semantic module.
|
|
71
|
+
* @param {SourceWriter} writer Source-aware writer.
|
|
72
|
+
* @param {Set<import("../semantic/types.js").LocalDeclaration>} unreadLocals Locals requiring an analyzer-only read.
|
|
73
|
+
* @returns {void}
|
|
74
|
+
*/
|
|
75
|
+
function emitProgram(module, writer, unreadLocals) {
|
|
76
|
+
writer.synthetic(dartRuntime, "Checked Dart safe-integer support", [module], [""]);
|
|
77
|
+
for (let index = 0; index < module.functions.length; index += 1) {
|
|
78
|
+
const declaration = module.functions[index];
|
|
79
|
+
const path = `/functions/${index}`;
|
|
80
|
+
writer.synthetic("\n", "declaration separator", [declaration], [path]);
|
|
81
|
+
writer.mapped(emitScalarType("dart", declaration.returnType), {
|
|
82
|
+
mappingKind: "exact", node: declaration.returnType, path: `${path}/returnType`, role: "type"
|
|
83
|
+
});
|
|
84
|
+
writer.synthetic(" ", "declaration spacing", [declaration], [path]);
|
|
85
|
+
writer.mapped(declaration.name, { mappingKind: "exact", node: declaration, path, role: "name" });
|
|
86
|
+
const flatParameters = declaration.parameters.map((parameter) => `${emitScalarType("dart", parameter.type)} ${parameter.name}`).join(", ");
|
|
87
|
+
const multilineParameters = declaration.parameters.length > 0 &&
|
|
88
|
+
writer.column - 1 + `(${flatParameters}) {`.length > 80;
|
|
89
|
+
writer.mapped("(", { mappingKind: "anchor", node: declaration, path });
|
|
90
|
+
declaration.parameters.forEach((parameter, parameterIndex) => {
|
|
91
|
+
const parameterPath = `${path}/parameters/${parameterIndex}`;
|
|
92
|
+
if (multilineParameters) {
|
|
93
|
+
writer.synthetic(`${parameterIndex ? "" : "\n"} `, "Dart parameter indentation", [parameter], [parameterPath]);
|
|
94
|
+
}
|
|
95
|
+
else if (parameterIndex)
|
|
96
|
+
writer.synthetic(", ", "parameter separator", [parameter], [parameterPath]);
|
|
97
|
+
writer.mapped(emitScalarType("dart", parameter.type), {
|
|
98
|
+
mappingKind: "exact", node: parameter.type, path: `${parameterPath}/type`, role: "type"
|
|
99
|
+
});
|
|
100
|
+
writer.synthetic(" ", "parameter spacing", [parameter], [parameterPath]);
|
|
101
|
+
writer.mapped(parameter.name, { mappingKind: "exact", node: parameter, path: parameterPath, role: "name" });
|
|
102
|
+
if (multilineParameters)
|
|
103
|
+
writer.synthetic(",\n", "Dart formatter parameter separator", [parameter], [parameterPath]);
|
|
104
|
+
});
|
|
105
|
+
writer.mapped(")", { mappingKind: "anchor", node: declaration, path });
|
|
106
|
+
writer.synthetic(" ", "body spacing", [declaration], [path]);
|
|
107
|
+
writer.mapped("{", { mappingKind: "anchor", node: declaration.body, path: `${path}/body` });
|
|
108
|
+
writer.synthetic("\n", "line break", [declaration], [path]);
|
|
109
|
+
emitBlock(writer, declaration.body, " ", `${path}/body`, unreadLocals);
|
|
110
|
+
writer.mapped("}", { mappingKind: "anchor", node: declaration.body, path: `${path}/body` });
|
|
111
|
+
writer.synthetic("\n", "line break", [declaration], [path]);
|
|
112
|
+
}
|
|
113
|
+
writer.synthetic("\nvoid main() {\n", "Dart generated main scaffold", [module.entryPoint], ["/entryPoint"]);
|
|
114
|
+
emitBlock(writer, module.entryPoint.body, " ", "/entryPoint/body", unreadLocals);
|
|
115
|
+
writer.synthetic("}\n", "Dart generated main scaffold", [module.entryPoint], ["/entryPoint"]);
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Emits one ordered semantic block.
|
|
119
|
+
* @param {SourceWriter} writer Source-aware writer.
|
|
120
|
+
* @param {import("../semantic/types.js").Block} block Semantic block.
|
|
121
|
+
* @param {string} indent Current indentation.
|
|
122
|
+
* @param {string} path Exact semantic path.
|
|
123
|
+
* @param {Set<import("../semantic/types.js").LocalDeclaration>} unreadLocals Locals requiring an analyzer-only read.
|
|
124
|
+
* @returns {void}
|
|
125
|
+
*/
|
|
126
|
+
function emitBlock(writer, block, indent, path, unreadLocals) {
|
|
127
|
+
block.statements.forEach((statement, index) => emitStatement(writer, statement, indent, `${path}/statements/${index}`, unreadLocals));
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Emits one Tasks 001-005 statement.
|
|
131
|
+
* @param {SourceWriter} writer Source-aware writer.
|
|
132
|
+
* @param {import("../semantic/types.js").Statement} statement Semantic statement.
|
|
133
|
+
* @param {string} indent Current indentation.
|
|
134
|
+
* @param {string} path Exact semantic path.
|
|
135
|
+
* @param {Set<import("../semantic/types.js").LocalDeclaration>} unreadLocals Locals requiring an analyzer-only read.
|
|
136
|
+
* @returns {void}
|
|
137
|
+
*/
|
|
138
|
+
function emitStatement(writer, statement, indent, path, unreadLocals) {
|
|
139
|
+
writer.synthetic(indent, "indentation", [statement], [path]);
|
|
140
|
+
if (statement.kind == "LocalDeclaration") {
|
|
141
|
+
if (!statement.mutable)
|
|
142
|
+
writer.mapped("final", { mappingKind: "anchor", node: statement, path });
|
|
143
|
+
else
|
|
144
|
+
writer.mapped(emitScalarType("dart", statement.type), {
|
|
145
|
+
mappingKind: "exact", node: statement.type, path: `${path}/type`, role: "type"
|
|
146
|
+
});
|
|
147
|
+
writer.synthetic(" ", "local spacing", [statement], [path]);
|
|
148
|
+
if (!statement.mutable) {
|
|
149
|
+
writer.mapped(emitScalarType("dart", statement.type), {
|
|
150
|
+
mappingKind: "exact", node: statement.type, path: `${path}/type`, role: "type"
|
|
151
|
+
});
|
|
152
|
+
writer.synthetic(" ", "local spacing", [statement], [path]);
|
|
153
|
+
}
|
|
154
|
+
writer.mapped(statement.name, { mappingKind: "exact", node: statement, path, role: "name" });
|
|
155
|
+
writer.synthetic(" ", "assignment spacing", [statement], [path]);
|
|
156
|
+
writer.mapped("=", { mappingKind: "exact", node: statement, path, role: "operator" });
|
|
157
|
+
writer.synthetic(" ", "assignment spacing", [statement], [path]);
|
|
158
|
+
emitExpression(writer, statement.initializer, `${path}/initializer`, "dart", identity);
|
|
159
|
+
writer.mapped(";", { mappingKind: "anchor", node: statement, path });
|
|
160
|
+
writer.synthetic("\n", "line break", [statement], [path]);
|
|
161
|
+
if (unreadLocals.has(statement)) {
|
|
162
|
+
writer.synthetic(`${indent}_semantifoldUse(${statement.name});\n`, "Dart analyzer unread-local use", [statement], [path]);
|
|
163
|
+
}
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
if (statement.kind == "AssignmentStatement") {
|
|
167
|
+
writer.mapped(statement.target.name, { mappingKind: "exact", node: statement.target, path: `${path}/target`, role: "name" });
|
|
168
|
+
writer.synthetic(" ", "assignment spacing", [statement], [path]);
|
|
169
|
+
writer.mapped("=", { mappingKind: "exact", node: statement, path, role: "operator" });
|
|
170
|
+
writer.synthetic(" ", "assignment spacing", [statement], [path]);
|
|
171
|
+
emitExpression(writer, statement.expression, `${path}/expression`, "dart", identity);
|
|
172
|
+
writer.mapped(";", { mappingKind: "anchor", node: statement, path });
|
|
173
|
+
writer.synthetic("\n", "line break", [statement], [path]);
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
if (statement.kind == "IfStatement")
|
|
177
|
+
return emitIf(writer, statement, indent, path, unreadLocals);
|
|
178
|
+
if (statement.kind == "ReturnStatement") {
|
|
179
|
+
writer.mapped("return", { mappingKind: "anchor", node: statement, path });
|
|
180
|
+
if (statement.expression) {
|
|
181
|
+
writer.synthetic(" ", "return spacing", [statement], [path]);
|
|
182
|
+
emitExpression(writer, statement.expression, `${path}/expression`, "dart", identity);
|
|
183
|
+
}
|
|
184
|
+
writer.mapped(";", { mappingKind: "anchor", node: statement, path });
|
|
185
|
+
writer.synthetic("\n", "line break", [statement], [path]);
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
if (statement.kind == "PrintStatement") {
|
|
189
|
+
writer.mapped("print", { mappingKind: "anchor", node: statement, path });
|
|
190
|
+
writer.mapped("(", { mappingKind: "anchor", node: statement, path });
|
|
191
|
+
emitExpression(writer, statement.expression, `${path}/expression`, "dart", identity);
|
|
192
|
+
writer.mapped(");", { mappingKind: "anchor", node: statement, path });
|
|
193
|
+
writer.synthetic("\n", "line break", [statement], [path]);
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
if (statement.kind == "ExpressionStatement") {
|
|
197
|
+
emitExpression(writer, statement.expression, `${path}/expression`, "dart", identity);
|
|
198
|
+
writer.mapped(";", { mappingKind: "anchor", node: statement, path });
|
|
199
|
+
writer.synthetic("\n", "line break", [statement], [path]);
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
throw new TypeError("Unsupported Dart statement reached emission after preflight.");
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Emits one strict Boolean conditional.
|
|
206
|
+
* @param {SourceWriter} writer Source-aware writer.
|
|
207
|
+
* @param {import("../semantic/types.js").IfStatement} statement Conditional.
|
|
208
|
+
* @param {string} indent Current indentation.
|
|
209
|
+
* @param {string} path Exact semantic path.
|
|
210
|
+
* @param {Set<import("../semantic/types.js").LocalDeclaration>} unreadLocals Locals requiring an analyzer-only read.
|
|
211
|
+
* @returns {void}
|
|
212
|
+
*/
|
|
213
|
+
function emitIf(writer, statement, indent, path, unreadLocals) {
|
|
214
|
+
writer.mapped("if", { mappingKind: "anchor", node: statement, path });
|
|
215
|
+
writer.synthetic(" (", "Dart conditional scaffold", [statement], [path]);
|
|
216
|
+
emitExpression(writer, statement.condition, `${path}/condition`, "dart", identity);
|
|
217
|
+
writer.synthetic(") ", "Dart conditional scaffold", [statement], [path]);
|
|
218
|
+
writer.mapped("{", { mappingKind: "anchor", node: statement.consequent, path: `${path}/consequent` });
|
|
219
|
+
writer.synthetic("\n", "line break", [statement], [path]);
|
|
220
|
+
emitBlock(writer, statement.consequent, `${indent} `, `${path}/consequent`, unreadLocals);
|
|
221
|
+
writer.synthetic(indent, "indentation", [statement], [path]);
|
|
222
|
+
writer.mapped("}", { mappingKind: "anchor", node: statement.consequent, path: `${path}/consequent` });
|
|
223
|
+
if (statement.alternate) {
|
|
224
|
+
writer.synthetic(" else ", "Dart alternate scaffold", [statement], [path]);
|
|
225
|
+
writer.mapped("{", { mappingKind: "anchor", node: statement.alternate, path: `${path}/alternate` });
|
|
226
|
+
writer.synthetic("\n", "line break", [statement], [path]);
|
|
227
|
+
emitBlock(writer, statement.alternate, `${indent} `, `${path}/alternate`, unreadLocals);
|
|
228
|
+
writer.synthetic(indent, "indentation", [statement], [path]);
|
|
229
|
+
writer.mapped("}", { mappingKind: "anchor", node: statement.alternate, path: `${path}/alternate` });
|
|
230
|
+
}
|
|
231
|
+
writer.synthetic("\n", "line break", [statement], [path]);
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Finds scalar locals that Dart would diagnose because no semantic expression reads them.
|
|
235
|
+
* @param {import("../semantic/types.js").SemanticModule} module Validated semantic module.
|
|
236
|
+
* @returns {Set<import("../semantic/types.js").LocalDeclaration>} Unread declaration identities.
|
|
237
|
+
*/
|
|
238
|
+
function findUnreadLocals(module) {
|
|
239
|
+
/** @type {Set<import("../semantic/types.js").LocalDeclaration>} */
|
|
240
|
+
const unread = new Set();
|
|
241
|
+
for (const root of [...module.functions.map(({ body }) => body), module.entryPoint.body]) {
|
|
242
|
+
/** @type {import("../semantic/types.js").LocalDeclaration[]} */
|
|
243
|
+
const declarations = [];
|
|
244
|
+
/** @type {Set<string>} */
|
|
245
|
+
const reads = new Set();
|
|
246
|
+
visitStatements(root, (statement) => {
|
|
247
|
+
if (statement.kind == "LocalDeclaration") {
|
|
248
|
+
declarations.push(statement);
|
|
249
|
+
collectIdentifierReads(statement.initializer, reads);
|
|
250
|
+
}
|
|
251
|
+
else if (statement.kind == "IfStatement")
|
|
252
|
+
collectIdentifierReads(statement.condition, reads);
|
|
253
|
+
else if (statement.kind == "AssignmentStatement" || statement.kind == "ExpressionStatement" ||
|
|
254
|
+
statement.kind == "PrintStatement" || statement.kind == "ReturnStatement") {
|
|
255
|
+
if (statement.expression)
|
|
256
|
+
collectIdentifierReads(statement.expression, reads);
|
|
257
|
+
}
|
|
258
|
+
});
|
|
259
|
+
for (const declaration of declarations)
|
|
260
|
+
if (!reads.has(declaration.name))
|
|
261
|
+
unread.add(declaration);
|
|
262
|
+
}
|
|
263
|
+
return unread;
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Visits every Tasks 001-005 statement in one semantic body.
|
|
267
|
+
* @param {import("../semantic/types.js").Block} block Semantic block.
|
|
268
|
+
* @param {(statement: import("../semantic/types.js").Statement) => void} callback Statement visitor.
|
|
269
|
+
* @returns {void}
|
|
270
|
+
*/
|
|
271
|
+
function visitStatements(block, callback) {
|
|
272
|
+
for (const statement of block.statements) {
|
|
273
|
+
callback(statement);
|
|
274
|
+
if (statement.kind == "IfStatement") {
|
|
275
|
+
visitStatements(statement.consequent, callback);
|
|
276
|
+
if (statement.alternate)
|
|
277
|
+
visitStatements(statement.alternate, callback);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Collects identifier reads without treating assignment targets as reads.
|
|
283
|
+
* @param {import("../semantic/types.js").Expression} expression Semantic expression.
|
|
284
|
+
* @param {Set<string>} reads Collected binding names.
|
|
285
|
+
* @returns {void}
|
|
286
|
+
*/
|
|
287
|
+
function collectIdentifierReads(expression, reads) {
|
|
288
|
+
if (expression.kind == "IdentifierExpression")
|
|
289
|
+
reads.add(expression.name);
|
|
290
|
+
else if (expression.kind == "CallExpression") {
|
|
291
|
+
for (const argument of expression.arguments)
|
|
292
|
+
collectIdentifierReads(argument, reads);
|
|
293
|
+
}
|
|
294
|
+
else if (expression.kind == "UnaryExpression")
|
|
295
|
+
collectIdentifierReads(expression.operand, reads);
|
|
296
|
+
else if (expression.kind == "BinaryExpression") {
|
|
297
|
+
collectIdentifierReads(expression.left, reads);
|
|
298
|
+
collectIdentifierReads(expression.right, reads);
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
/**
|
|
302
|
+
* Converts root provenance to artifact-level related origins.
|
|
303
|
+
* @param {import("../semantic/types.js").SemanticNodeProvenance} root Root provenance.
|
|
304
|
+
* @returns {import("../semantic/types.js").RelatedOrigin[]} Related roots.
|
|
305
|
+
*/
|
|
306
|
+
function relatedRootOrigins(root) {
|
|
307
|
+
if (root.origin.kind == "source") {
|
|
308
|
+
return [{ location: root.origin.location, nodeId: root.id, role: "module", sourceId: root.origin.sourceId }];
|
|
309
|
+
}
|
|
310
|
+
const origins = root.origin.kind == "derived" ? root.origin.origins : root.origin.relatedOrigins;
|
|
311
|
+
return origins.map((origin) => ({ ...origin, nodeId: origin.nodeId ?? root.id, role: origin.role ?? "module" }));
|
|
312
|
+
}
|
|
313
|
+
/**
|
|
314
|
+
* Returns one prevalidated Dart identifier unchanged.
|
|
315
|
+
* @param {string} name Validated identifier.
|
|
316
|
+
* @returns {string} Same identifier.
|
|
317
|
+
*/
|
|
318
|
+
function identity(name) {
|
|
319
|
+
return name;
|
|
320
|
+
}
|
|
321
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGFydC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9iYWNrZW5kcy9kYXJ0LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQTtBQUN0RCxPQUFPLEVBQUMsZUFBZSxFQUFFLGFBQWEsRUFBQyxNQUFNLGVBQWUsQ0FBQTtBQUM1RCxPQUFPLEVBQUMsY0FBYyxFQUFFLHFCQUFxQixFQUFDLE1BQU0sYUFBYSxDQUFBO0FBQ2pFLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQTtBQUM3QyxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sY0FBYyxDQUFBO0FBQzNDLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxhQUFhLENBQUE7QUFFeEMsTUFBTSxPQUFPLEdBQUcsOEVBQThFLENBQUE7QUFDOUYsTUFBTSxRQUFRLEdBQUcsbUhBQW1ILENBQUE7QUFFcEk7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxFQUFDLFFBQVEsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLGlCQUFpQixFQUFFLE9BQU8sRUFBQztJQUM5RixxQkFBcUIsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUE7SUFDckMsSUFBSSxRQUFRLEtBQUssU0FBUyxJQUFJLFFBQVEsSUFBSSxrQkFBa0IsRUFBRSxDQUFDO1FBQzdELHFCQUFxQixDQUFDLE1BQU0sRUFBRSwrQ0FBK0MsRUFBRSxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUE7SUFDakcsQ0FBQztJQUNELElBQUksWUFBWSxLQUFLLFNBQVMsSUFBSSxpQkFBaUIsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUNsRSxxQkFBcUIsQ0FBQyxNQUFNLEVBQUUseUNBQXlDLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQzNGLENBQUM7SUFDRCxNQUFNLFlBQVksR0FBRyxnQkFBZ0IsQ0FB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QUFDSCxTQUFTLFFBQVEsQ0FBQyxJQUFJO0lBQ3BCLE9BQU8sSUFBSSxDQUFBO0FBQ2IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQge3Vuc3VwcG9ydGVkQ2FwYWJpbGl0eX0gZnJvbSBcIi4uL2RpYWdub3N0aWMuanNcIlxuaW1wb3J0IHtmaW5hbGl6ZU1hcHBpbmcsIHRvU291cmNlTWFwVjN9IGZyb20gXCIuLi9tYXBwaW5nLmpzXCJcbmltcG9ydCB7ZW1pdEV4cHJlc3Npb24sIHZhbGlkYXRlQmFja2VuZE1vZHVsZX0gZnJvbSBcIi4vc2hhcmVkLmpzXCJcbmltcG9ydCB7ZGFydFJ1bnRpbWV9IGZyb20gXCIuL2RhcnQtcnVudGltZS5qc1wiXG5pbXBvcnQge2VtaXRTY2FsYXJUeXBlfSBmcm9tIFwiLi9zY2FsYXJzLmpzXCJcbmltcG9ydCB7U291cmNlV3JpdGVyfSBmcm9tIFwiLi93cml0ZXIuanNcIlxuXG5jb25zdCBwdWJzcGVjID0gXCJuYW1lOiBzZW1hbnRpZm9sZF9nZW5lcmF0ZWRcXG5wdWJsaXNoX3RvOiBub25lXFxuZW52aXJvbm1lbnQ6XFxuICBzZGs6IDMuMTMuM1xcblwiXG5jb25zdCBsb2NrZmlsZSA9IFwiIyBHZW5lcmF0ZWQgYnkgcHViXFxuIyBTZWUgaHR0cHM6Ly9kYXJ0LmRldi90b29scy9wdWIvZ2xvc3NhcnkjbG9ja2ZpbGVcXG5wYWNrYWdlczoge31cXG5zZGtzOlxcbiAgZGFydDogXFxcIjMuMTMuM1xcXCJcXG5cIlxuXG4vKipcbiAqIEVtaXRzIG9uZSBkZXRlcm1pbmlzdGljIGRlcGVuZGVuY3ktZnJlZSBEYXJ0IHBhY2thZ2UgY2FuZGlkYXRlLlxuICogQHBhcmFtIHt7ZmlsZW5hbWU/OiBzdHJpbmcsIG1hcERpcmVjdGl2ZT86IHVua25vd24sIG1vZHVsZTogaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNNb2R1bGUsIHNvdXJjZU1hcEZpbGVuYW1lPzogdW5rbm93biwgc291cmNlcz86IHtmaWxlbmFtZTogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcsIGxhbmd1YWdlPzogaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNMYW5ndWFnZX1bXX19IGlucHV0IEJhY2tlbmQgcmVxdWVzdC5cbiAqIEByZXR1cm5zIHt7YXJ0aWZhY3RzOiBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5HZW5lcmF0ZWRTZXRBcnRpZmFjdFtdLCB0YXJnZXQ6IHN0cmluZ319IENhbmRpZGF0ZSBhcnRpZmFjdCBzZXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZURhcnRQYWNrYWdlKHtmaWxlbmFtZSwgbWFwRGlyZWN0aXZlLCBtb2R1bGUsIHNvdXJjZU1hcEZpbGVuYW1lLCBzb3VyY2VzfSkge1xuICB2YWxpZGF0ZUJhY2tlbmRNb2R1bGUobW9kdWxlLCBcImRhcnRcIilcbiAgaWYgKGZpbGVuYW1lICE9PSB1bmRlZmluZWQgJiYgZmlsZW5hbWUgIT0gXCJiaW4vcHJvZ3JhbS5kYXJ0XCIpIHtcbiAgICB1bnN1cHBvcnRlZENhcGFiaWxpdHkoXCJkYXJ0XCIsIFwiYXJ0aWZhY3QgZmlsZW5hbWUgb3RoZXIgdGhhbiBiaW4vcHJvZ3JhbS5kYXJ0XCIsIG1vZHVsZS5sb2NhdGlvbilcbiAgfVxuICBpZiAobWFwRGlyZWN0aXZlICE9PSB1bmRlZmluZWQgfHwgc291cmNlTWFwRmlsZW5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgIHVuc3VwcG9ydGVkQ2FwYWJpbGl0eShcImRhcnRcIiwgXCJzb3VyY2UtbWFwIGZpbGVuYW1lIG9yIGRpcmVjdGl2ZSBvcHRpb25cIiwgbW9kdWxlLmxvY2F0aW9uKVxuICB9XG4gIGNvbnN0IHVucmVhZExvY2FscyA9IGZpbmRVbnJlYWRMb2NhbHMobW9kdWxlKVxuICBjb25zdCB3cml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKHtmaWxlbmFtZTogXCJiaW4vcHJvZ3JhbS5kYXJ0XCIsIGxhbmd1YWdlOiBcImRhcnRcIiwgbW9kdWxlLCBzb3VyY2VzfSlcblxuICBlbWl0UHJvZ3JhbShtb2R1bGUsIHdyaXRlciwgdW5yZWFkTG9jYWxzKVxuICBjb25zdCBtYXBwaW5nID0gZmluYWxpemVNYXBwaW5nKHdyaXRlci5maW5pc2goKSlcbiAgY29uc3Qgcm9vdCA9IG1hcHBpbmcubm9kZXMuZmluZCgoe3BhdGh9KSA9PiBwYXRoID09IFwiXCIpXG5cbiAgaWYgKCFyb290KSB0aHJvdyBuZXcgRXJyb3IoXCJWYWxpZGF0ZWQgRGFydCBtb2R1bGUgb21pdHRlZCBpdHMgY2Fub25pY2FsIHJvb3QgcHJvdmVuYW5jZS5cIilcbiAgY29uc3QgcmVsYXRlZE9yaWdpbnMgPSByZWxhdGVkUm9vdE9yaWdpbnMocm9vdClcblxuICByZXR1cm4ge1xuICAgIGFydGlmYWN0czogW3tcbiAgICAgIGNvbnRlbnQ6IHB1YnNwZWMsXG4gICAgICBjb250ZW50S2luZDogXCJ0ZXh0XCIsXG4gICAgICBtZWRpYVR5cGU6IFwiYXBwbGljYXRpb24veWFtbFwiLFxuICAgICAgb3duZXJzaGlwOiBcImdlbmVyYXRlZFwiLFxuICAgICAgcGF0aDogXCJwdWJzcGVjLnlhbWxcIixcbiAgICAgIHByb3ZlbmFuY2U6IHtcbiAgICAgICAga2luZDogXCJzeW50aGV0aWNcIixcbiAgICAgICAgcmVhc29uOiBcIkZpeGVkIGRlcGVuZGVuY3ktZnJlZSBEYXJ0IDMuMTMuMyBwYWNrYWdlIGNvbmZpZ3VyYXRpb24uXCIsXG4gICAgICAgIHJlbGF0ZWRPcmlnaW5zXG4gICAgICB9LFxuICAgICAgcm9sZTogXCJtYW5pZmVzdFwiXG4gICAgfSwge1xuICAgICAgY29udGVudDogbG9ja2ZpbGUsXG4gICAgICBjb250ZW50S2luZDogXCJ0ZXh0XCIsXG4gICAgICBtZWRpYVR5cGU6IFwiYXBwbGljYXRpb24veWFtbFwiLFxuICAgICAgb3duZXJzaGlwOiBcImdlbmVyYXRlZFwiLFxuICAgICAgcGF0aDogXCJwdWJzcGVjLmxvY2tcIixcbiAgICAgIHByb3ZlbmFuY2U6IHtcbiAgICAgICAga2luZDogXCJzeW50aGV0aWNcIixcbiAgICAgICAgcmVhc29uOiBcIkRldGVybWluaXN0aWMgRGFydCBwdWIgbG9ja2ZpbGUgZm9yIGEgcGFja2FnZSB3aXRoIG5vIGRlcGVuZGVuY2llcy5cIixcbiAgICAgICAgcmVsYXRlZE9yaWdpbnNcbiAgICAgIH0sXG4gICAgICByb2xlOiBcIm1hbmlmZXN0XCJcbiAgICB9LCB7XG4gICAgICBjb250ZW50OiBtYXBwaW5nLmdlbmVyYXRlZC5jb250ZW50LFxuICAgICAgY29udGVudEtpbmQ6IFwidGV4dFwiLFxuICAgICAgbWVkaWFUeXBlOiBcInRleHQveC1kYXJ0XCIsXG4gICAgICBvd25lcnNoaXA6IFwiZ2VuZXJhdGVkXCIsXG4gICAgICBwYXRoOiBcImJpbi9wcm9ncmFtLmRhcnRcIixcbiAgICAgIHByb3ZlbmFuY2U6IHtraW5kOiBcInRleHRcIiwgbWFwcGluZywgc291cmNlTWFwOiB0b1NvdXJjZU1hcFYzKG1hcHBpbmcpfSxcbiAgICAgIHJvbGU6IFwiZW50cnlcIlxuICAgIH1dLFxuICAgIHRhcmdldDogXCJkYXJ0XCJcbiAgfVxufVxuXG4vKipcbiAqIEVtaXRzIHRoZSBjb21waWxlci1vd25lZCBwcmVmaXggYW5kIG9uZSBjb21wbGV0ZSBwcm9ncmFtLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY01vZHVsZX0gbW9kdWxlIFNlbWFudGljIG1vZHVsZS5cbiAqIEBwYXJhbSB7U291cmNlV3JpdGVyfSB3cml0ZXIgU291cmNlLWF3YXJlIHdyaXRlci5cbiAqIEBwYXJhbSB7U2V0PGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkxvY2FsRGVjbGFyYXRpb24+fSB1bnJlYWRMb2NhbHMgTG9jYWxzIHJlcXVpcmluZyBhbiBhbmFseXplci1vbmx5IHJlYWQuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gZW1pdFByb2dyYW0obW9kdWxlLCB3cml0ZXIsIHVucmVhZExvY2Fscykge1xuICB3cml0ZXIuc3ludGhldGljKGRhcnRSdW50aW1lLCBcIkNoZWNrZWQgRGFydCBzYWZlLWludGVnZXIgc3VwcG9ydFwiLCBbbW9kdWxlXSwgW1wiXCJdKVxuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgbW9kdWxlLmZ1bmN0aW9ucy5sZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICBjb25zdCBkZWNsYXJhdGlvbiA9IG1vZHVsZS5mdW5jdGlvbnNbaW5kZXhdXG4gICAgY29uc3QgcGF0aCA9IGAvZnVuY3Rpb25zLyR7aW5kZXh9YFxuXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIlxcblwiLCBcImRlY2xhcmF0aW9uIHNlcGFyYXRvclwiLCBbZGVjbGFyYXRpb25dLCBbcGF0aF0pXG4gICAgd3JpdGVyLm1hcHBlZChlbWl0U2NhbGFyVHlwZShcImRhcnRcIiwgZGVjbGFyYXRpb24ucmV0dXJuVHlwZSksIHtcbiAgICAgIG1hcHBpbmdLaW5kOiBcImV4YWN0XCIsIG5vZGU6IGRlY2xhcmF0aW9uLnJldHVyblR5cGUsIHBhdGg6IGAke3BhdGh9L3JldHVyblR5cGVgLCByb2xlOiBcInR5cGVcIlxuICAgIH0pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIiBcIiwgXCJkZWNsYXJhdGlvbiBzcGFjaW5nXCIsIFtkZWNsYXJhdGlvbl0sIFtwYXRoXSlcbiAgICB3cml0ZXIubWFwcGVkKGRlY2xhcmF0aW9uLm5hbWUsIHttYXBwaW5nS2luZDogXCJleGFjdFwiLCBub2RlOiBkZWNsYXJhdGlvbiwgcGF0aCwgcm9sZTogXCJuYW1lXCJ9KVxuICAgIGNvbnN0IGZsYXRQYXJhbWV0ZXJzID0gZGVjbGFyYXRpb24ucGFyYW1ldGVycy5tYXAoKHBhcmFtZXRlcikgPT5cbiAgICAgIGAke2VtaXRTY2FsYXJUeXBlKFwiZGFydFwiLCBwYXJhbWV0ZXIudHlwZSl9ICR7cGFyYW1ldGVyLm5hbWV9YCkuam9pbihcIiwgXCIpXG4gICAgY29uc3QgbXVsdGlsaW5lUGFyYW1ldGVycyA9IGRlY2xhcmF0aW9uLnBhcmFtZXRlcnMubGVuZ3RoID4gMCAmJlxuICAgICAgd3JpdGVyLmNvbHVtbiAtIDEgKyBgKCR7ZmxhdFBhcmFtZXRlcnN9KSB7YC5sZW5ndGggPiA4MFxuXG4gICAgd3JpdGVyLm1hcHBlZChcIihcIiwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBkZWNsYXJhdGlvbiwgcGF0aH0pXG4gICAgZGVjbGFyYXRpb24ucGFyYW1ldGVycy5mb3JFYWNoKChwYXJhbWV0ZXIsIHBhcmFtZXRlckluZGV4KSA9PiB7XG4gICAgICBjb25zdCBwYXJhbWV0ZXJQYXRoID0gYCR7cGF0aH0vcGFyYW1ldGVycy8ke3BhcmFtZXRlckluZGV4fWBcblxuICAgICAgaWYgKG11bHRpbGluZVBhcmFtZXRlcnMpIHtcbiAgICAgICAgd3JpdGVyLnN5bnRoZXRpYyhgJHtwYXJhbWV0ZXJJbmRleCA/IFwiXCIgOiBcIlxcblwifSAgYCwgXCJEYXJ0IHBhcmFtZXRlciBpbmRlbnRhdGlvblwiLCBbcGFyYW1ldGVyXSwgW3BhcmFtZXRlclBhdGhdKVxuICAgICAgfSBlbHNlIGlmIChwYXJhbWV0ZXJJbmRleCkgd3JpdGVyLnN5bnRoZXRpYyhcIiwgXCIsIFwicGFyYW1ldGVyIHNlcGFyYXRvclwiLCBbcGFyYW1ldGVyXSwgW3BhcmFtZXRlclBhdGhdKVxuICAgICAgd3JpdGVyLm1hcHBlZChlbWl0U2NhbGFyVHlwZShcImRhcnRcIiwgcGFyYW1ldGVyLnR5cGUpLCB7XG4gICAgICAgIG1hcHBpbmdLaW5kOiBcImV4YWN0XCIsIG5vZGU6IHBhcmFtZXRlci50eXBlLCBwYXRoOiBgJHtwYXJhbWV0ZXJQYXRofS90eXBlYCwgcm9sZTogXCJ0eXBlXCJcbiAgICAgIH0pXG4gICAgICB3cml0ZXIuc3ludGhldGljKFwiIFwiLCBcInBhcmFtZXRlciBzcGFjaW5nXCIsIFtwYXJhbWV0ZXJdLCBbcGFyYW1ldGVyUGF0aF0pXG4gICAgICB3cml0ZXIubWFwcGVkKHBhcmFtZXRlci5uYW1lLCB7bWFwcGluZ0tpbmQ6IFwiZXhhY3RcIiwgbm9kZTogcGFyYW1ldGVyLCBwYXRoOiBwYXJhbWV0ZXJQYXRoLCByb2xlOiBcIm5hbWVcIn0pXG4gICAgICBpZiAobXVsdGlsaW5lUGFyYW1ldGVycykgd3JpdGVyLnN5bnRoZXRpYyhcIixcXG5cIiwgXCJEYXJ0IGZvcm1hdHRlciBwYXJhbWV0ZXIgc2VwYXJhdG9yXCIsIFtwYXJhbWV0ZXJdLCBbcGFyYW1ldGVyUGF0aF0pXG4gICAgfSlcbiAgICB3cml0ZXIubWFwcGVkKFwiKVwiLCB7bWFwcGluZ0tpbmQ6IFwiYW5jaG9yXCIsIG5vZGU6IGRlY2xhcmF0aW9uLCBwYXRofSlcbiAgICB3cml0ZXIuc3ludGhldGljKFwiIFwiLCBcImJvZHkgc3BhY2luZ1wiLCBbZGVjbGFyYXRpb25dLCBbcGF0aF0pXG4gICAgd3JpdGVyLm1hcHBlZChcIntcIiwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBkZWNsYXJhdGlvbi5ib2R5LCBwYXRoOiBgJHtwYXRofS9ib2R5YH0pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIlxcblwiLCBcImxpbmUgYnJlYWtcIiwgW2RlY2xhcmF0aW9uXSwgW3BhdGhdKVxuICAgIGVtaXRCbG9jayh3cml0ZXIsIGRlY2xhcmF0aW9uLmJvZHksIFwiICBcIiwgYCR7cGF0aH0vYm9keWAsIHVucmVhZExvY2FscylcbiAgICB3cml0ZXIubWFwcGVkKFwifVwiLCB7bWFwcGluZ0tpbmQ6IFwiYW5jaG9yXCIsIG5vZGU6IGRlY2xhcmF0aW9uLmJvZHksIHBhdGg6IGAke3BhdGh9L2JvZHlgfSlcbiAgICB3cml0ZXIuc3ludGhldGljKFwiXFxuXCIsIFwibGluZSBicmVha1wiLCBbZGVjbGFyYXRpb25dLCBbcGF0aF0pXG4gIH1cbiAgd3JpdGVyLnN5bnRoZXRpYyhcIlxcbnZvaWQgbWFpbigpIHtcXG5cIiwgXCJEYXJ0IGdlbmVyYXRlZCBtYWluIHNjYWZmb2xkXCIsIFttb2R1bGUuZW50cnlQb2ludF0sIFtcIi9lbnRyeVBvaW50XCJdKVxuICBlbWl0QmxvY2sod3JpdGVyLCBtb2R1bGUuZW50cnlQb2ludC5ib2R5LCBcIiAgXCIsIFwiL2VudHJ5UG9pbnQvYm9keVwiLCB1bnJlYWRMb2NhbHMpXG4gIHdyaXRlci5zeW50aGV0aWMoXCJ9XFxuXCIsIFwiRGFydCBnZW5lcmF0ZWQgbWFpbiBzY2FmZm9sZFwiLCBbbW9kdWxlLmVudHJ5UG9pbnRdLCBbXCIvZW50cnlQb2ludFwiXSlcbn1cblxuLyoqXG4gKiBFbWl0cyBvbmUgb3JkZXJlZCBzZW1hbnRpYyBibG9jay5cbiAqIEBwYXJhbSB7U291cmNlV3JpdGVyfSB3cml0ZXIgU291cmNlLWF3YXJlIHdyaXRlci5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuQmxvY2t9IGJsb2NrIFNlbWFudGljIGJsb2NrLlxuICogQHBhcmFtIHtzdHJpbmd9IGluZGVudCBDdXJyZW50IGluZGVudGF0aW9uLlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGggRXhhY3Qgc2VtYW50aWMgcGF0aC5cbiAqIEBwYXJhbSB7U2V0PGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkxvY2FsRGVjbGFyYXRpb24+fSB1bnJlYWRMb2NhbHMgTG9jYWxzIHJlcXVpcmluZyBhbiBhbmFseXplci1vbmx5IHJlYWQuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gZW1pdEJsb2NrKHdyaXRlciwgYmxvY2ssIGluZGVudCwgcGF0aCwgdW5yZWFkTG9jYWxzKSB7XG4gIGJsb2NrLnN0YXRlbWVudHMuZm9yRWFjaCgoc3RhdGVtZW50LCBpbmRleCkgPT5cbiAgICBlbWl0U3RhdGVtZW50KHdyaXRlciwgc3RhdGVtZW50LCBpbmRlbnQsIGAke3BhdGh9L3N0YXRlbWVudHMvJHtpbmRleH1gLCB1bnJlYWRMb2NhbHMpKVxufVxuXG4vKipcbiAqIEVtaXRzIG9uZSBUYXNrcyAwMDEtMDA1IHN0YXRlbWVudC5cbiAqIEBwYXJhbSB7U291cmNlV3JpdGVyfSB3cml0ZXIgU291cmNlLWF3YXJlIHdyaXRlci5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU3RhdGVtZW50fSBzdGF0ZW1lbnQgU2VtYW50aWMgc3RhdGVtZW50LlxuICogQHBhcmFtIHtzdHJpbmd9IGluZGVudCBDdXJyZW50IGluZGVudGF0aW9uLlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGggRXhhY3Qgc2VtYW50aWMgcGF0aC5cbiAqIEBwYXJhbSB7U2V0PGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkxvY2FsRGVjbGFyYXRpb24+fSB1bnJlYWRMb2NhbHMgTG9jYWxzIHJlcXVpcmluZyBhbiBhbmFseXplci1vbmx5IHJlYWQuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gZW1pdFN0YXRlbWVudCh3cml0ZXIsIHN0YXRlbWVudCwgaW5kZW50LCBwYXRoLCB1bnJlYWRMb2NhbHMpIHtcbiAgd3JpdGVyLnN5bnRoZXRpYyhpbmRlbnQsIFwiaW5kZW50YXRpb25cIiwgW3N0YXRlbWVudF0sIFtwYXRoXSlcbiAgaWYgKHN0YXRlbWVudC5raW5kID09IFwiTG9jYWxEZWNsYXJhdGlvblwiKSB7XG4gICAgaWYgKCFzdGF0ZW1lbnQubXV0YWJsZSkgd3JpdGVyLm1hcHBlZChcImZpbmFsXCIsIHttYXBwaW5nS2luZDogXCJhbmNob3JcIiwgbm9kZTogc3RhdGVtZW50LCBwYXRofSlcbiAgICBlbHNlIHdyaXRlci5tYXBwZWQoZW1pdFNjYWxhclR5cGUoXCJkYXJ0XCIsIHN0YXRlbWVudC50eXBlKSwge1xuICAgICAgbWFwcGluZ0tpbmQ6IFwiZXhhY3RcIiwgbm9kZTogc3RhdGVtZW50LnR5cGUsIHBhdGg6IGAke3BhdGh9L3R5cGVgLCByb2xlOiBcInR5cGVcIlxuICAgIH0pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIiBcIiwgXCJsb2NhbCBzcGFjaW5nXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gICAgaWYgKCFzdGF0ZW1lbnQubXV0YWJsZSkge1xuICAgICAgd3JpdGVyLm1hcHBlZChlbWl0U2NhbGFyVHlwZShcImRhcnRcIiwgc3RhdGVtZW50LnR5cGUpLCB7XG4gICAgICAgIG1hcHBpbmdLaW5kOiBcImV4YWN0XCIsIG5vZGU6IHN0YXRlbWVudC50eXBlLCBwYXRoOiBgJHtwYXRofS90eXBlYCwgcm9sZTogXCJ0eXBlXCJcbiAgICAgIH0pXG4gICAgICB3cml0ZXIuc3ludGhldGljKFwiIFwiLCBcImxvY2FsIHNwYWNpbmdcIiwgW3N0YXRlbWVudF0sIFtwYXRoXSlcbiAgICB9XG4gICAgd3JpdGVyLm1hcHBlZChzdGF0ZW1lbnQubmFtZSwge21hcHBpbmdLaW5kOiBcImV4YWN0XCIsIG5vZGU6IHN0YXRlbWVudCwgcGF0aCwgcm9sZTogXCJuYW1lXCJ9KVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCIgXCIsIFwiYXNzaWdubWVudCBzcGFjaW5nXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gICAgd3JpdGVyLm1hcHBlZChcIj1cIiwge21hcHBpbmdLaW5kOiBcImV4YWN0XCIsIG5vZGU6IHN0YXRlbWVudCwgcGF0aCwgcm9sZTogXCJvcGVyYXRvclwifSlcbiAgICB3cml0ZXIuc3ludGhldGljKFwiIFwiLCBcImFzc2lnbm1lbnQgc3BhY2luZ1wiLCBbc3RhdGVtZW50XSwgW3BhdGhdKVxuICAgIGVtaXRFeHByZXNzaW9uKHdyaXRlciwgc3RhdGVtZW50LmluaXRpYWxpemVyLCBgJHtwYXRofS9pbml0aWFsaXplcmAsIFwiZGFydFwiLCBpZGVudGl0eSlcbiAgICB3cml0ZXIubWFwcGVkKFwiO1wiLCB7bWFwcGluZ0tpbmQ6IFwiYW5jaG9yXCIsIG5vZGU6IHN0YXRlbWVudCwgcGF0aH0pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIlxcblwiLCBcImxpbmUgYnJlYWtcIiwgW3N0YXRlbWVudF0sIFtwYXRoXSlcbiAgICBpZiAodW5yZWFkTG9jYWxzLmhhcyhzdGF0ZW1lbnQpKSB7XG4gICAgICB3cml0ZXIuc3ludGhldGljKGAke2luZGVudH1fc2VtYW50aWZvbGRVc2UoJHtzdGF0ZW1lbnQubmFtZX0pO1xcbmAsIFwiRGFydCBhbmFseXplciB1bnJlYWQtbG9jYWwgdXNlXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gICAgfVxuICAgIHJldHVyblxuICB9XG4gIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIkFzc2lnbm1lbnRTdGF0ZW1lbnRcIikge1xuICAgIHdyaXRlci5tYXBwZWQoc3RhdGVtZW50LnRhcmdldC5uYW1lLCB7bWFwcGluZ0tpbmQ6IFwiZXhhY3RcIiwgbm9kZTogc3RhdGVtZW50LnRhcmdldCwgcGF0aDogYCR7cGF0aH0vdGFyZ2V0YCwgcm9sZTogXCJuYW1lXCJ9KVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCIgXCIsIFwiYXNzaWdubWVudCBzcGFjaW5nXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gICAgd3JpdGVyLm1hcHBlZChcIj1cIiwge21hcHBpbmdLaW5kOiBcImV4YWN0XCIsIG5vZGU6IHN0YXRlbWVudCwgcGF0aCwgcm9sZTogXCJvcGVyYXRvclwifSlcbiAgICB3cml0ZXIuc3ludGhldGljKFwiIFwiLCBcImFzc2lnbm1lbnQgc3BhY2luZ1wiLCBbc3RhdGVtZW50XSwgW3BhdGhdKVxuICAgIGVtaXRFeHByZXNzaW9uKHdyaXRlciwgc3RhdGVtZW50LmV4cHJlc3Npb24sIGAke3BhdGh9L2V4cHJlc3Npb25gLCBcImRhcnRcIiwgaWRlbnRpdHkpXG4gICAgd3JpdGVyLm1hcHBlZChcIjtcIiwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBzdGF0ZW1lbnQsIHBhdGh9KVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCJcXG5cIiwgXCJsaW5lIGJyZWFrXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKHN0YXRlbWVudC5raW5kID09IFwiSWZTdGF0ZW1lbnRcIikgcmV0dXJuIGVtaXRJZih3cml0ZXIsIHN0YXRlbWVudCwgaW5kZW50LCBwYXRoLCB1bnJlYWRMb2NhbHMpXG4gIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIlJldHVyblN0YXRlbWVudFwiKSB7XG4gICAgd3JpdGVyLm1hcHBlZChcInJldHVyblwiLCB7bWFwcGluZ0tpbmQ6IFwiYW5jaG9yXCIsIG5vZGU6IHN0YXRlbWVudCwgcGF0aH0pXG4gICAgaWYgKHN0YXRlbWVudC5leHByZXNzaW9uKSB7XG4gICAgICB3cml0ZXIuc3ludGhldGljKFwiIFwiLCBcInJldHVybiBzcGFjaW5nXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gICAgICBlbWl0RXhwcmVzc2lvbih3cml0ZXIsIHN0YXRlbWVudC5leHByZXNzaW9uLCBgJHtwYXRofS9leHByZXNzaW9uYCwgXCJkYXJ0XCIsIGlkZW50aXR5KVxuICAgIH1cbiAgICB3cml0ZXIubWFwcGVkKFwiO1wiLCB7bWFwcGluZ0tpbmQ6IFwiYW5jaG9yXCIsIG5vZGU6IHN0YXRlbWVudCwgcGF0aH0pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIlxcblwiLCBcImxpbmUgYnJlYWtcIiwgW3N0YXRlbWVudF0sIFtwYXRoXSlcbiAgICByZXR1cm5cbiAgfVxuICBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJQcmludFN0YXRlbWVudFwiKSB7XG4gICAgd3JpdGVyLm1hcHBlZChcInByaW50XCIsIHttYXBwaW5nS2luZDogXCJhbmNob3JcIiwgbm9kZTogc3RhdGVtZW50LCBwYXRofSlcbiAgICB3cml0ZXIubWFwcGVkKFwiKFwiLCB7bWFwcGluZ0tpbmQ6IFwiYW5jaG9yXCIsIG5vZGU6IHN0YXRlbWVudCwgcGF0aH0pXG4gICAgZW1pdEV4cHJlc3Npb24od3JpdGVyLCBzdGF0ZW1lbnQuZXhwcmVzc2lvbiwgYCR7cGF0aH0vZXhwcmVzc2lvbmAsIFwiZGFydFwiLCBpZGVudGl0eSlcbiAgICB3cml0ZXIubWFwcGVkKFwiKTtcIiwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBzdGF0ZW1lbnQsIHBhdGh9KVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCJcXG5cIiwgXCJsaW5lIGJyZWFrXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKHN0YXRlbWVudC5raW5kID09IFwiRXhwcmVzc2lvblN0YXRlbWVudFwiKSB7XG4gICAgZW1pdEV4cHJlc3Npb24od3JpdGVyLCBzdGF0ZW1lbnQuZXhwcmVzc2lvbiwgYCR7cGF0aH0vZXhwcmVzc2lvbmAsIFwiZGFydFwiLCBpZGVudGl0eSlcbiAgICB3cml0ZXIubWFwcGVkKFwiO1wiLCB7bWFwcGluZ0tpbmQ6IFwiYW5jaG9yXCIsIG5vZGU6IHN0YXRlbWVudCwgcGF0aH0pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIlxcblwiLCBcImxpbmUgYnJlYWtcIiwgW3N0YXRlbWVudF0sIFtwYXRoXSlcbiAgICByZXR1cm5cbiAgfVxuICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiVW5zdXBwb3J0ZWQgRGFydCBzdGF0ZW1lbnQgcmVhY2hlZCBlbWlzc2lvbiBhZnRlciBwcmVmbGlnaHQuXCIpXG59XG5cbi8qKlxuICogRW1pdHMgb25lIHN0cmljdCBCb29sZWFuIGNvbmRpdGlvbmFsLlxuICogQHBhcmFtIHtTb3VyY2VXcml0ZXJ9IHdyaXRlciBTb3VyY2UtYXdhcmUgd3JpdGVyLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5JZlN0YXRlbWVudH0gc3RhdGVtZW50IENvbmRpdGlvbmFsLlxuICogQHBhcmFtIHtzdHJpbmd9IGluZGVudCBDdXJyZW50IGluZGVudGF0aW9uLlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGggRXhhY3Qgc2VtYW50aWMgcGF0aC5cbiAqIEBwYXJhbSB7U2V0PGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkxvY2FsRGVjbGFyYXRpb24+fSB1bnJlYWRMb2NhbHMgTG9jYWxzIHJlcXVpcmluZyBhbiBhbmFseXplci1vbmx5IHJlYWQuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gZW1pdElmKHdyaXRlciwgc3RhdGVtZW50LCBpbmRlbnQsIHBhdGgsIHVucmVhZExvY2Fscykge1xuICB3cml0ZXIubWFwcGVkKFwiaWZcIiwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBzdGF0ZW1lbnQsIHBhdGh9KVxuICB3cml0ZXIuc3ludGhldGljKFwiIChcIiwgXCJEYXJ0IGNvbmRpdGlvbmFsIHNjYWZmb2xkXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gIGVtaXRFeHByZXNzaW9uKHdyaXRlciwgc3RhdGVtZW50LmNvbmRpdGlvbiwgYCR7cGF0aH0vY29uZGl0aW9uYCwgXCJkYXJ0XCIsIGlkZW50aXR5KVxuICB3cml0ZXIuc3ludGhldGljKFwiKSBcIiwgXCJEYXJ0IGNvbmRpdGlvbmFsIHNjYWZmb2xkXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gIHdyaXRlci5tYXBwZWQoXCJ7XCIsIHttYXBwaW5nS2luZDogXCJhbmNob3JcIiwgbm9kZTogc3RhdGVtZW50LmNvbnNlcXVlbnQsIHBhdGg6IGAke3BhdGh9L2NvbnNlcXVlbnRgfSlcbiAgd3JpdGVyLnN5bnRoZXRpYyhcIlxcblwiLCBcImxpbmUgYnJlYWtcIiwgW3N0YXRlbWVudF0sIFtwYXRoXSlcbiAgZW1pdEJsb2NrKHdyaXRlciwgc3RhdGVtZW50LmNvbnNlcXVlbnQsIGAke2luZGVudH0gIGAsIGAke3BhdGh9L2NvbnNlcXVlbnRgLCB1bnJlYWRMb2NhbHMpXG4gIHdyaXRlci5zeW50aGV0aWMoaW5kZW50LCBcImluZGVudGF0aW9uXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gIHdyaXRlci5tYXBwZWQoXCJ9XCIsIHttYXBwaW5nS2luZDogXCJhbmNob3JcIiwgbm9kZTogc3RhdGVtZW50LmNvbnNlcXVlbnQsIHBhdGg6IGAke3BhdGh9L2NvbnNlcXVlbnRgfSlcbiAgaWYgKHN0YXRlbWVudC5hbHRlcm5hdGUpIHtcbiAgICB3cml0ZXIuc3ludGhldGljKFwiIGVsc2UgXCIsIFwiRGFydCBhbHRlcm5hdGUgc2NhZmZvbGRcIiwgW3N0YXRlbWVudF0sIFtwYXRoXSlcbiAgICB3cml0ZXIubWFwcGVkKFwie1wiLCB7bWFwcGluZ0tpbmQ6IFwiYW5jaG9yXCIsIG5vZGU6IHN0YXRlbWVudC5hbHRlcm5hdGUsIHBhdGg6IGAke3BhdGh9L2FsdGVybmF0ZWB9KVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCJcXG5cIiwgXCJsaW5lIGJyZWFrXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gICAgZW1pdEJsb2NrKHdyaXRlciwgc3RhdGVtZW50LmFsdGVybmF0ZSwgYCR7aW5kZW50fSAgYCwgYCR7cGF0aH0vYWx0ZXJuYXRlYCwgdW5yZWFkTG9jYWxzKVxuICAgIHdyaXRlci5zeW50aGV0aWMoaW5kZW50LCBcImluZGVudGF0aW9uXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gICAgd3JpdGVyLm1hcHBlZChcIn1cIiwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBzdGF0ZW1lbnQuYWx0ZXJuYXRlLCBwYXRoOiBgJHtwYXRofS9hbHRlcm5hdGVgfSlcbiAgfVxuICB3cml0ZXIuc3ludGhldGljKFwiXFxuXCIsIFwibGluZSBicmVha1wiLCBbc3RhdGVtZW50XSwgW3BhdGhdKVxufVxuXG4vKipcbiAqIEZpbmRzIHNjYWxhciBsb2NhbHMgdGhhdCBEYXJ0IHdvdWxkIGRpYWdub3NlIGJlY2F1c2Ugbm8gc2VtYW50aWMgZXhwcmVzc2lvbiByZWFkcyB0aGVtLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY01vZHVsZX0gbW9kdWxlIFZhbGlkYXRlZCBzZW1hbnRpYyBtb2R1bGUuXG4gKiBAcmV0dXJucyB7U2V0PGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkxvY2FsRGVjbGFyYXRpb24+fSBVbnJlYWQgZGVjbGFyYXRpb24gaWRlbnRpdGllcy5cbiAqL1xuZnVuY3Rpb24gZmluZFVucmVhZExvY2Fscyhtb2R1bGUpIHtcbiAgLyoqIEB0eXBlIHtTZXQ8aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuTG9jYWxEZWNsYXJhdGlvbj59ICovXG4gIGNvbnN0IHVucmVhZCA9IG5ldyBTZXQoKVxuXG4gIGZvciAoY29uc3Qgcm9vdCBvZiBbLi4ubW9kdWxlLmZ1bmN0aW9ucy5tYXAoKHtib2R5fSkgPT4gYm9keSksIG1vZHVsZS5lbnRyeVBvaW50LmJvZHldKSB7XG4gICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5Mb2NhbERlY2xhcmF0aW9uW119ICovXG4gICAgY29uc3QgZGVjbGFyYXRpb25zID0gW11cbiAgICAvKiogQHR5cGUge1NldDxzdHJpbmc+fSAqL1xuICAgIGNvbnN0IHJlYWRzID0gbmV3IFNldCgpXG5cbiAgICB2aXNpdFN0YXRlbWVudHMocm9vdCwgKHN0YXRlbWVudCkgPT4ge1xuICAgICAgaWYgKHN0YXRlbWVudC5raW5kID09IFwiTG9jYWxEZWNsYXJhdGlvblwiKSB7XG4gICAgICAgIGRlY2xhcmF0aW9ucy5wdXNoKHN0YXRlbWVudClcbiAgICAgICAgY29sbGVjdElkZW50aWZpZXJSZWFkcyhzdGF0ZW1lbnQuaW5pdGlhbGl6ZXIsIHJlYWRzKVxuICAgICAgfSBlbHNlIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIklmU3RhdGVtZW50XCIpIGNvbGxlY3RJZGVudGlmaWVyUmVhZHMoc3RhdGVtZW50LmNvbmRpdGlvbiwgcmVhZHMpXG4gICAgICBlbHNlIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIkFzc2lnbm1lbnRTdGF0ZW1lbnRcIiB8fCBzdGF0ZW1lbnQua2luZCA9PSBcIkV4cHJlc3Npb25TdGF0ZW1lbnRcIiB8fFxuICAgICAgICBzdGF0ZW1lbnQua2luZCA9PSBcIlByaW50U3RhdGVtZW50XCIgfHwgc3RhdGVtZW50LmtpbmQgPT0gXCJSZXR1cm5TdGF0ZW1lbnRcIikge1xuICAgICAgICBpZiAoc3RhdGVtZW50LmV4cHJlc3Npb24pIGNvbGxlY3RJZGVudGlmaWVyUmVhZHMoc3RhdGVtZW50LmV4cHJlc3Npb24sIHJlYWRzKVxuICAgICAgfVxuICAgIH0pXG4gICAgZm9yIChjb25zdCBkZWNsYXJhdGlvbiBvZiBkZWNsYXJhdGlvbnMpIGlmICghcmVhZHMuaGFzKGRlY2xhcmF0aW9uLm5hbWUpKSB1bnJlYWQuYWRkKGRlY2xhcmF0aW9uKVxuICB9XG4gIHJldHVybiB1bnJlYWRcbn1cblxuLyoqXG4gKiBWaXNpdHMgZXZlcnkgVGFza3MgMDAxLTAwNSBzdGF0ZW1lbnQgaW4gb25lIHNlbWFudGljIGJvZHkuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkJsb2NrfSBibG9jayBTZW1hbnRpYyBibG9jay5cbiAqIEBwYXJhbSB7KHN0YXRlbWVudDogaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU3RhdGVtZW50KSA9PiB2b2lkfSBjYWxsYmFjayBTdGF0ZW1lbnQgdmlzaXRvci5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiB2aXNpdFN0YXRlbWVudHMoYmxvY2ssIGNhbGxiYWNrKSB7XG4gIGZvciAoY29uc3Qgc3RhdGVtZW50IG9mIGJsb2NrLnN0YXRlbWVudHMpIHtcbiAgICBjYWxsYmFjayhzdGF0ZW1lbnQpXG4gICAgaWYgKHN0YXRlbWVudC5raW5kID09IFwiSWZTdGF0ZW1lbnRcIikge1xuICAgICAgdmlzaXRTdGF0ZW1lbnRzKHN0YXRlbWVudC5jb25zZXF1ZW50LCBjYWxsYmFjaylcbiAgICAgIGlmIChzdGF0ZW1lbnQuYWx0ZXJuYXRlKSB2aXNpdFN0YXRlbWVudHMoc3RhdGVtZW50LmFsdGVybmF0ZSwgY2FsbGJhY2spXG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQ29sbGVjdHMgaWRlbnRpZmllciByZWFkcyB3aXRob3V0IHRyZWF0aW5nIGFzc2lnbm1lbnQgdGFyZ2V0cyBhcyByZWFkcy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRXhwcmVzc2lvbn0gZXhwcmVzc2lvbiBTZW1hbnRpYyBleHByZXNzaW9uLlxuICogQHBhcmFtIHtTZXQ8c3RyaW5nPn0gcmVhZHMgQ29sbGVjdGVkIGJpbmRpbmcgbmFtZXMuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gY29sbGVjdElkZW50aWZpZXJSZWFkcyhleHByZXNzaW9uLCByZWFkcykge1xuICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiSWRlbnRpZmllckV4cHJlc3Npb25cIikgcmVhZHMuYWRkKGV4cHJlc3Npb24ubmFtZSlcbiAgZWxzZSBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiQ2FsbEV4cHJlc3Npb25cIikge1xuICAgIGZvciAoY29uc3QgYXJndW1lbnQgb2YgZXhwcmVzc2lvbi5hcmd1bWVudHMpIGNvbGxlY3RJZGVudGlmaWVyUmVhZHMoYXJndW1lbnQsIHJlYWRzKVxuICB9IGVsc2UgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIlVuYXJ5RXhwcmVzc2lvblwiKSBjb2xsZWN0SWRlbnRpZmllclJlYWRzKGV4cHJlc3Npb24ub3BlcmFuZCwgcmVhZHMpXG4gIGVsc2UgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIkJpbmFyeUV4cHJlc3Npb25cIikge1xuICAgIGNvbGxlY3RJZGVudGlmaWVyUmVhZHMoZXhwcmVzc2lvbi5sZWZ0LCByZWFkcylcbiAgICBjb2xsZWN0SWRlbnRpZmllclJlYWRzKGV4cHJlc3Npb24ucmlnaHQsIHJlYWRzKVxuICB9XG59XG5cbi8qKlxuICogQ29udmVydHMgcm9vdCBwcm92ZW5hbmNlIHRvIGFydGlmYWN0LWxldmVsIHJlbGF0ZWQgb3JpZ2lucy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNOb2RlUHJvdmVuYW5jZX0gcm9vdCBSb290IHByb3ZlbmFuY2UuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVsYXRlZE9yaWdpbltdfSBSZWxhdGVkIHJvb3RzLlxuICovXG5mdW5jdGlvbiByZWxhdGVkUm9vdE9yaWdpbnMocm9vdCkge1xuICBpZiAocm9vdC5vcmlnaW4ua2luZCA9PSBcInNvdXJjZVwiKSB7XG4gICAgcmV0dXJuIFt7bG9jYXRpb246IHJvb3Qub3JpZ2luLmxvY2F0aW9uLCBub2RlSWQ6IHJvb3QuaWQsIHJvbGU6IFwibW9kdWxlXCIsIHNvdXJjZUlkOiByb290Lm9yaWdpbi5zb3VyY2VJZH1dXG4gIH1cbiAgY29uc3Qgb3JpZ2lucyA9IHJvb3Qub3JpZ2luLmtpbmQgPT0gXCJkZXJpdmVkXCIgPyByb290Lm9yaWdpbi5vcmlnaW5zIDogcm9vdC5vcmlnaW4ucmVsYXRlZE9yaWdpbnNcblxuICByZXR1cm4gb3JpZ2lucy5tYXAoKG9yaWdpbikgPT4gKHsuLi5vcmlnaW4sIG5vZGVJZDogb3JpZ2luLm5vZGVJZCA/PyByb290LmlkLCByb2xlOiBvcmlnaW4ucm9sZSA/PyBcIm1vZHVsZVwifSkpXG59XG5cbi8qKlxuICogUmV0dXJucyBvbmUgcHJldmFsaWRhdGVkIERhcnQgaWRlbnRpZmllciB1bmNoYW5nZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBWYWxpZGF0ZWQgaWRlbnRpZmllci5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFNhbWUgaWRlbnRpZmllci5cbiAqL1xuZnVuY3Rpb24gaWRlbnRpdHkobmFtZSkge1xuICByZXR1cm4gbmFtZVxufVxuIl19
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
export type ExpressionPath = {
|
|
2
|
+
expression: import("../semantic/types.js").Expression;
|
|
3
|
+
path: string;
|
|
4
|
+
};
|
|
5
|
+
export type ExcludedEffect = {
|
|
6
|
+
detail: string;
|
|
7
|
+
location: import("../semantic/types.js").SourceLocation;
|
|
8
|
+
};
|
|
9
|
+
/** @typedef {{expression: import("../semantic/types.js").Expression, path: string}} ExpressionPath */
|
|
10
|
+
/** @typedef {{detail: string, location: import("../semantic/types.js").SourceLocation}} ExcludedEffect */
|
|
11
|
+
/**
|
|
12
|
+
* Validates Task 034 target support before a SourceWriter is allocated.
|
|
13
|
+
* @param {import("../semantic/types.js").SemanticModule} module - Candidate module.
|
|
14
|
+
* @param {import("../semantic/types.js").BackendLanguage} language - Requested target.
|
|
15
|
+
* @param {{usedOperations?: readonly string[]}} [options] - Program-wide used canonical
|
|
16
|
+
* operations for a linked stdlib provider; restricts the reserved support surface to the
|
|
17
|
+
* operations actually materialized in the provider artifact.
|
|
18
|
+
* @returns {void}
|
|
19
|
+
*/
|
|
20
|
+
export declare function preflightEffectCapabilities(module: import("../semantic/types.js").SemanticModule, language: import("../semantic/types.js").BackendLanguage, options?: {
|
|
21
|
+
usedOperations?: readonly string[];
|
|
22
|
+
}): void;
|
|
23
|
+
/**
|
|
24
|
+
* Emits fixed target-private Task 034 conformance support.
|
|
25
|
+
* @param {import("./writer.js").SourceWriter} writer - Destination writer.
|
|
26
|
+
* @param {import("../semantic/types.js").SemanticModule} module - Authorized module.
|
|
27
|
+
* @param {"php" | "ruby" | "javascript" | "typescript" | "java"} language - Adopted target.
|
|
28
|
+
* @param {"top" | "members"} [placement] - Java support placement.
|
|
29
|
+
* @returns {void}
|
|
30
|
+
*/
|
|
31
|
+
export declare function emitEffectSupport(writer: import("./writer.js").SourceWriter, module: import("../semantic/types.js").SemanticModule, language: "php" | "ruby" | "javascript" | "typescript" | "java", placement?: "top" | "members"): void;
|
|
32
|
+
/**
|
|
33
|
+
* Emits the public static provider shims for the program-wide used operations on the Java owner module.
|
|
34
|
+
* @param {import("./writer.js").SourceWriter} writer - Destination writer.
|
|
35
|
+
* @param {import("../semantic/types.js").SemanticModule} module - Owner module.
|
|
36
|
+
* @returns {void}
|
|
37
|
+
*/
|
|
38
|
+
export declare function emitEffectProviderEntries(writer: import("./writer.js").SourceWriter, module: import("../semantic/types.js").SemanticModule): void;
|
|
39
|
+
/**
|
|
40
|
+
* Recognizes only the byte-exact protected support emitted by this backend.
|
|
41
|
+
* Frontends use this in addition to parser-shape checks during generated-source reparse.
|
|
42
|
+
* @param {string} source - Complete candidate source.
|
|
43
|
+
* @param {"php" | "ruby" | "javascript" | "typescript" | "java"} language - Adopted target.
|
|
44
|
+
* @param {"top" | "members"} [placement] - Java support placement.
|
|
45
|
+
* @returns {boolean} Whether the exact protected segment is present.
|
|
46
|
+
*/
|
|
47
|
+
export declare function hasExactEffectSupport(source: string, language: "php" | "ruby" | "javascript" | "typescript" | "java", placement?: "top" | "members"): boolean;
|
|
48
|
+
/**
|
|
49
|
+
* Materializes nested effect sites before their enclosing eager expression.
|
|
50
|
+
* The installed replacements remain active until the next statement begins.
|
|
51
|
+
* @param {import("./writer.js").SourceWriter} writer - Destination writer.
|
|
52
|
+
* @param {import("../semantic/types.js").Statement} statement - Current statement.
|
|
53
|
+
* @param {string} indent - Current target indentation.
|
|
54
|
+
* @param {string} path - Exact statement path.
|
|
55
|
+
* @param {"php" | "ruby" | "javascript" | "typescript" | "java"} language - Adopted target.
|
|
56
|
+
* @param {(expression: import("../semantic/types.js").Expression, path: string) => void} emit - Target expression emitter.
|
|
57
|
+
* @returns {void}
|
|
58
|
+
*/
|
|
59
|
+
export declare function emitEffectPrefixes(writer: import("./writer.js").SourceWriter, statement: import("../semantic/types.js").Statement, indent: string, path: string, language: "php" | "ruby" | "javascript" | "typescript" | "java", emit: (expression: import("../semantic/types.js").Expression, path: string) => void): void;
|
|
60
|
+
//# sourceMappingURL=effects.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"effects.d.ts","sourceRoot":"","sources":["../../../src/backends/effects.js"],"names":[],"mappings":"AAcI,YAAiF,cAAc,GAArF;IAAC,UAAU,EAAE,OAAO,sBAAsB,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAC,CAAgB;AAC/F,YAAqF,cAAc,GAAzF;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,OAAO,sBAAsB,EAAE,cAAc,CAAA;CAAC,CAAgB;AADvG,sGAAsG;AACtG,0GAA0G;AAE1G;;;;;;;;GAQG;AACH,wBAAgB,2BAA2B,CAAC,MAAM,EAPvC,OAAO,sBAAsB,EAAE,cAOQ,EAAE,QAAQ,EANjD,OAAO,sBAAsB,EAAE,eAMkB,EAAE,OAAO,AALlE,CAGA,EAHQ;IAAC,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAK4B,GAF7D,IAAI,CAmChB;AAuFD;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAN7B,OAAO,aAAa,EAAE,YAMO,EAAE,MAAM,EALrC,OAAO,sBAAsB,EAAE,cAKM,EAAE,QAAQ,EAJ/C,KAAK,GAAG,MAAM,GAAG,YAAY,GAAG,YAAY,GAAG,MAIA,EAAE,SAAS,AAHlE,CACA,EADQ,KAAK,GAAG,SAG0D,GAFhE,IAAI,CAgBhB;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAJrC,OAAO,aAAa,EAAE,YAIe,EAAE,MAAM,EAH7C,OAAO,sBAAsB,EAAE,cAGc,GAF3C,IAAI,CAShB;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EALjC,MAKiC,EAAE,QAAQ,EAJ3C,KAAK,GAAG,MAAM,GAAG,YAAY,GAAG,YAAY,GAAG,MAIJ,EAAE,SAAS,AAH9D,CACA,EADQ,KAAK,GAAG,SAGsD,GAF5D,OAAO,CAOnB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAR9B,OAAO,aAAa,EAAE,YAQQ,EAAE,SAAS,EAPzC,OAAO,sBAAsB,EAAE,SAOU,EAAE,MAAM,EANjD,MAMiD,EAAE,IAAI,EALvD,MAKuD,EAAE,QAAQ,EAJjE,KAAK,GAAG,MAAM,GAAG,YAAY,GAAG,YAAY,GAAG,MAIkB,EAAE,IAAI,EAHvE,CAAC,UAAU,EAAE,OAAO,sBAAsB,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,KAAK,IAGF,GAFrE,IAAI,CAuBhB"}
|