cobolx-2 1.2.3
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/.github/pull_request_template.md +9 -0
- package/.github/workflows/ci.yml +18 -0
- package/.vscode/launch.json +19 -0
- package/.vscode/tasks.json +14 -0
- package/CHANGELOG.md +16 -0
- package/CONTRIBUTING.md +23 -0
- package/CargoX.lock +2 -0
- package/LICENSE +21 -0
- package/README.md +164 -0
- package/api-demo/CargoX.lock +1 -0
- package/api-demo/README.md +3 -0
- package/api-demo/benchmarks/arith.cbx +6 -0
- package/api-demo/cobolx.toml +6 -0
- package/api-demo/docs-output/index.html +1 -0
- package/api-demo/generated/LEGACYDEMO.cbx +5 -0
- package/api-demo/generated/client-types.ts +2 -0
- package/api-demo/generated/deploy.json +12 -0
- package/api-demo/generated/flowchart.mmd +4 -0
- package/api-demo/migrations/20260411215238_init.sql +1 -0
- package/api-demo/src/main.cbx +5 -0
- package/api-demo/tests/smoke.cbx +6 -0
- package/benchmarks/arithmetic.cbx +6 -0
- package/cargox/package.json +11 -0
- package/cargox/src/index.d.ts +4 -0
- package/cargox/src/index.js +5 -0
- package/cargox/src/index.js.map +1 -0
- package/cargox/src/index.ts +4 -0
- package/cargox/src/lockfile/index.d.ts +1 -0
- package/cargox/src/lockfile/index.js +9 -0
- package/cargox/src/lockfile/index.js.map +1 -0
- package/cargox/src/lockfile/index.ts +9 -0
- package/cargox/src/manifest.d.ts +10 -0
- package/cargox/src/manifest.js +49 -0
- package/cargox/src/manifest.js.map +1 -0
- package/cargox/src/manifest.ts +58 -0
- package/cargox/src/registry/index.d.ts +4 -0
- package/cargox/src/registry/index.js +13 -0
- package/cargox/src/registry/index.js.map +1 -0
- package/cargox/src/registry/index.ts +13 -0
- package/cargox/src/resolver/index.d.ts +5 -0
- package/cargox/src/resolver/index.js +4 -0
- package/cargox/src/resolver/index.js.map +1 -0
- package/cargox/src/resolver/index.ts +8 -0
- package/cargox/tsconfig.json +7 -0
- package/cli/cobolx-cli/package.json +23 -0
- package/cli/cobolx-cli/src/commands/add.ts +18 -0
- package/cli/cobolx-cli/src/commands/bench.ts +47 -0
- package/cli/cobolx-cli/src/commands/build.ts +74 -0
- package/cli/cobolx-cli/src/commands/check.ts +24 -0
- package/cli/cobolx-cli/src/commands/debug.ts +15 -0
- package/cli/cobolx-cli/src/commands/debug_rewind.ts +16 -0
- package/cli/cobolx-cli/src/commands/deploy.ts +18 -0
- package/cli/cobolx-cli/src/commands/dev.ts +24 -0
- package/cli/cobolx-cli/src/commands/doc.ts +19 -0
- package/cli/cobolx-cli/src/commands/fmt.ts +14 -0
- package/cli/cobolx-cli/src/commands/fuzz.ts +24 -0
- package/cli/cobolx-cli/src/commands/generate.ts +38 -0
- package/cli/cobolx-cli/src/commands/install.ts +25 -0
- package/cli/cobolx-cli/src/commands/legacy.ts +17 -0
- package/cli/cobolx-cli/src/commands/lint.ts +17 -0
- package/cli/cobolx-cli/src/commands/migrate.ts +27 -0
- package/cli/cobolx-cli/src/commands/new.ts +20 -0
- package/cli/cobolx-cli/src/commands/profile.ts +8 -0
- package/cli/cobolx-cli/src/commands/publish.ts +16 -0
- package/cli/cobolx-cli/src/commands/repl.ts +30 -0
- package/cli/cobolx-cli/src/commands/run.ts +22 -0
- package/cli/cobolx-cli/src/commands/task.ts +27 -0
- package/cli/cobolx-cli/src/commands/test.ts +44 -0
- package/cli/cobolx-cli/src/commands/update.ts +30 -0
- package/cli/cobolx-cli/src/commands/visualize.ts +25 -0
- package/cli/cobolx-cli/src/index.ts +101 -0
- package/cli/cobolx-cli/src/project.ts +74 -0
- package/cli/cobolx-cli/tsconfig.json +7 -0
- package/cobolx.toml +7 -0
- package/compiler/package.json +14 -0
- package/compiler/src/ast/types.d.ts +87 -0
- package/compiler/src/ast/types.js +2 -0
- package/compiler/src/ast/types.js.map +1 -0
- package/compiler/src/ast/types.ts +329 -0
- package/compiler/src/backend/custom.d.ts +8 -0
- package/compiler/src/backend/custom.js +12 -0
- package/compiler/src/backend/custom.js.map +1 -0
- package/compiler/src/backend/custom.ts +21 -0
- package/compiler/src/borrow_checker/checker.d.ts +3 -0
- package/compiler/src/borrow_checker/checker.js +82 -0
- package/compiler/src/borrow_checker/checker.js.map +1 -0
- package/compiler/src/borrow_checker/checker.ts +100 -0
- package/compiler/src/codegen/javascript.d.ts +2 -0
- package/compiler/src/codegen/javascript.js +89 -0
- package/compiler/src/codegen/javascript.js.map +1 -0
- package/compiler/src/codegen/javascript.ts +175 -0
- package/compiler/src/const_eval/evaluator.ts +58 -0
- package/compiler/src/diagnostics.d.ts +11 -0
- package/compiler/src/diagnostics.js +14 -0
- package/compiler/src/diagnostics.js.map +1 -0
- package/compiler/src/diagnostics.ts +20 -0
- package/compiler/src/hir/lower.d.ts +7 -0
- package/compiler/src/hir/lower.js +44 -0
- package/compiler/src/hir/lower.js.map +1 -0
- package/compiler/src/hir/lower.ts +60 -0
- package/compiler/src/hir/types.d.ts +21 -0
- package/compiler/src/hir/types.js +2 -0
- package/compiler/src/hir/types.js.map +1 -0
- package/compiler/src/hir/types.ts +26 -0
- package/compiler/src/index.d.ts +22 -0
- package/compiler/src/index.js +84 -0
- package/compiler/src/index.js.map +1 -0
- package/compiler/src/index.ts +122 -0
- package/compiler/src/lexer/lexer.d.ts +21 -0
- package/compiler/src/lexer/lexer.js +207 -0
- package/compiler/src/lexer/lexer.js.map +1 -0
- package/compiler/src/lexer/lexer.ts +274 -0
- package/compiler/src/lexer/tokens.d.ts +8 -0
- package/compiler/src/lexer/tokens.js +18 -0
- package/compiler/src/lexer/tokens.js.map +1 -0
- package/compiler/src/lexer/tokens.ts +126 -0
- package/compiler/src/macros/expand.ts +75 -0
- package/compiler/src/main.ts +4 -0
- package/compiler/src/mir/lower.d.ts +3 -0
- package/compiler/src/mir/lower.js +10 -0
- package/compiler/src/mir/lower.js.map +1 -0
- package/compiler/src/mir/lower.ts +12 -0
- package/compiler/src/mir/types.d.ts +13 -0
- package/compiler/src/mir/types.js +2 -0
- package/compiler/src/mir/types.js.map +1 -0
- package/compiler/src/mir/types.ts +16 -0
- package/compiler/src/optimizer/constantFold.d.ts +2 -0
- package/compiler/src/optimizer/constantFold.js +61 -0
- package/compiler/src/optimizer/constantFold.js.map +1 -0
- package/compiler/src/optimizer/constantFold.ts +109 -0
- package/compiler/src/parser/parser.d.ts +33 -0
- package/compiler/src/parser/parser.js +323 -0
- package/compiler/src/parser/parser.js.map +1 -0
- package/compiler/src/parser/parser.ts +710 -0
- package/compiler/src/plugins/api.ts +8 -0
- package/compiler/src/plugins/loader.ts +21 -0
- package/compiler/src/semantic/analyzer.d.ts +12 -0
- package/compiler/src/semantic/analyzer.js +144 -0
- package/compiler/src/semantic/analyzer.js.map +1 -0
- package/compiler/src/semantic/analyzer.ts +277 -0
- package/compiler/src/type_system/checker.d.ts +7 -0
- package/compiler/src/type_system/checker.js +84 -0
- package/compiler/src/type_system/checker.js.map +1 -0
- package/compiler/src/type_system/checker.ts +108 -0
- package/compiler/tsconfig.json +7 -0
- package/debugger/package.json +11 -0
- package/debugger/src/index.d.ts +1 -0
- package/debugger/src/index.js +9 -0
- package/debugger/src/index.js.map +1 -0
- package/debugger/src/index.ts +9 -0
- package/debugger/tsconfig.json +7 -0
- package/docs/CHANGELOG.md +11 -0
- package/docs/CONTRIBUTING.md +15 -0
- package/docs/LICENSE +21 -0
- package/docs/architecture.md +29 -0
- package/docs/cli.md +58 -0
- package/docs/language-spec.md +49 -0
- package/docs/packages.md +19 -0
- package/docs/platform-systems.md +31 -0
- package/docs/release-validation.md +22 -0
- package/docs/runtime.md +10 -0
- package/docs/tooling.md +17 -0
- package/docs/vscode-extension.md +40 -0
- package/enterprise-demo/CargoX.lock +2 -0
- package/enterprise-demo/README.md +3 -0
- package/enterprise-demo/benchmarks/arith.cbx +6 -0
- package/enterprise-demo/cobolx.toml +7 -0
- package/enterprise-demo/src/main.cbx +5 -0
- package/enterprise-demo/tests/smoke.cbx +6 -0
- package/examples/README.md +20 -0
- package/examples/actors-and-flags.md +8 -0
- package/examples/api-server/README.md +9 -0
- package/examples/api-server/cobolx.toml +6 -0
- package/examples/api-server/src/main.cbx +8 -0
- package/examples/debug-replay.md +7 -0
- package/examples/debugging-demo/README.md +3 -0
- package/examples/debugging-demo/cobolx.toml +6 -0
- package/examples/debugging-demo/src/main.cbx +7 -0
- package/examples/distributed-service.md +12 -0
- package/examples/distributed-system/README.md +3 -0
- package/examples/distributed-system/cobolx.toml +6 -0
- package/examples/distributed-system/generated/deploy.json +12 -0
- package/examples/distributed-system/src/main.cbx +6 -0
- package/examples/event-driven.md +5 -0
- package/examples/event-system/README.md +3 -0
- package/examples/event-system/cobolx.toml +6 -0
- package/examples/event-system/src/main.cbx +11 -0
- package/examples/functions.cbx +10 -0
- package/examples/functions.mjs +12 -0
- package/examples/hello.cbx +5 -0
- package/examples/hello.mjs +7 -0
- package/examples/legacy-sample.cob +5 -0
- package/examples/parallel-processing/README.md +3 -0
- package/examples/parallel-processing/cobolx.toml +6 -0
- package/examples/parallel-processing/src/main.cbx +6 -0
- package/examples/parallel-processing.md +8 -0
- package/examples/platform-features.cbx +32 -0
- package/examples/platform-features.mjs +35 -0
- package/examples/service.cbx +10 -0
- package/examples/workflow-engine/README.md +3 -0
- package/examples/workflow-engine/cobolx.toml +6 -0
- package/examples/workflow-engine/generated/flowchart.mmd +8 -0
- package/examples/workflow-engine/src/main.cbx +13 -0
- package/examples/workflow-engine.md +5 -0
- package/formatter/package.json +14 -0
- package/formatter/src/index.d.ts +1 -0
- package/formatter/src/index.js +59 -0
- package/formatter/src/index.js.map +1 -0
- package/formatter/src/index.ts +103 -0
- package/formatter/tsconfig.json +7 -0
- package/generated/LEGACYDEMO.cbx +5 -0
- package/install.ps1 +4 -0
- package/install.sh +5 -0
- package/linter/package.json +14 -0
- package/linter/src/index.d.ts +2 -0
- package/linter/src/index.js +18 -0
- package/linter/src/index.js.map +1 -0
- package/linter/src/index.ts +19 -0
- package/linter/tsconfig.json +7 -0
- package/lsp/server/package.json +16 -0
- package/lsp/server/src/index.ts +168 -0
- package/lsp/server/tsconfig.json +7 -0
- package/package.json +30 -0
- package/profiler/package.json +11 -0
- package/profiler/src/index.d.ts +5 -0
- package/profiler/src/index.js +11 -0
- package/profiler/src/index.js.map +1 -0
- package/profiler/src/index.ts +11 -0
- package/profiler/tsconfig.json +7 -0
- package/release.json +10 -0
- package/runtime/package.json +14 -0
- package/runtime/src/actors/index.ts +27 -0
- package/runtime/src/async/futures.ts +11 -0
- package/runtime/src/code_as_data/index.ts +5 -0
- package/runtime/src/config/index.ts +17 -0
- package/runtime/src/distributed/index.ts +13 -0
- package/runtime/src/events/index.ts +21 -0
- package/runtime/src/feature_flags/index.ts +9 -0
- package/runtime/src/gc_or_arc/index.ts +1 -0
- package/runtime/src/healing/index.ts +26 -0
- package/runtime/src/index.ts +20 -0
- package/runtime/src/intents/index.ts +9 -0
- package/runtime/src/iterators/index.ts +23 -0
- package/runtime/src/memory/arc.ts +22 -0
- package/runtime/src/observability/index.ts +23 -0
- package/runtime/src/repl/context.ts +7 -0
- package/runtime/src/scheduler/taskScheduler.ts +11 -0
- package/runtime/src/security/capabilities.ts +15 -0
- package/runtime/src/security/secrets.ts +13 -0
- package/runtime/src/state/versioned.ts +31 -0
- package/runtime/src/std_hooks/audit.ts +23 -0
- package/runtime/src/time_travel/index.ts +54 -0
- package/runtime/src/workflows/index.ts +35 -0
- package/runtime/tsconfig.json +7 -0
- package/sample-payroll/README.md +3 -0
- package/sample-payroll/cobolx.toml +3 -0
- package/sample-payroll/src/main.cbx +5 -0
- package/stdlib/business/index.js +15 -0
- package/stdlib/core/README.md +8 -0
- package/stdlib/core/runtime.js +191 -0
- package/stdlib/crypto/index.js +5 -0
- package/stdlib/datetime/index.js +3 -0
- package/stdlib/fs/index.js +9 -0
- package/stdlib/http/index.js +7 -0
- package/stdlib/io/index.js +1 -0
- package/stdlib/json/index.js +7 -0
- package/stdlib/net/index.js +4 -0
- package/tests/macros.cbx +10 -0
- package/tests/pattern_match.cbx +16 -0
- package/tests/smoke.cbx +7 -0
- package/tests/validate-release.mjs +54 -0
- package/tsconfig.base.json +24 -0
- package/vscode-extension/LICENSE +21 -0
- package/vscode-extension/README.md +47 -0
- package/vscode-extension/cobolx-1.2.0.vsix +0 -0
- package/vscode-extension/icon.png +0 -0
- package/vscode-extension/icon.svg +15 -0
- package/vscode-extension/language-configuration.json +17 -0
- package/vscode-extension/package.json +148 -0
- package/vscode-extension/snippets/cobolx.code-snippets +49 -0
- package/vscode-extension/src/extension.ts +283 -0
- package/vscode-extension/syntaxes/cobolx.tmLanguage.json +75 -0
- package/vscode-extension/tests/test.cbl +3 -0
- package/vscode-extension/tsconfig.json +7 -0
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
{
|
|
2
|
+
"service": "distributed-system",
|
|
3
|
+
"address": "node://distributed-system",
|
|
4
|
+
"status": {
|
|
5
|
+
"name": "distributed-system",
|
|
6
|
+
"healthy": true,
|
|
7
|
+
"details": {
|
|
8
|
+
"address": "node://distributed-system"
|
|
9
|
+
}
|
|
10
|
+
},
|
|
11
|
+
"discovered": "node://distributed-system"
|
|
12
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
PROGRAM PlatformFeatures
|
|
2
|
+
|
|
3
|
+
/// compile-time constant
|
|
4
|
+
CONST LIMIT = 3
|
|
5
|
+
|
|
6
|
+
ENUM Result:
|
|
7
|
+
OK(value)
|
|
8
|
+
ERR(message)
|
|
9
|
+
END
|
|
10
|
+
|
|
11
|
+
/// simple declarative macro
|
|
12
|
+
MACRO say(value)
|
|
13
|
+
BEGIN
|
|
14
|
+
DISPLAY value
|
|
15
|
+
END-MACRO
|
|
16
|
+
|
|
17
|
+
FUNCTION inspect(item)
|
|
18
|
+
BEGIN
|
|
19
|
+
MATCH item:
|
|
20
|
+
OK(value):
|
|
21
|
+
say!("matched ok")
|
|
22
|
+
DISPLAY value
|
|
23
|
+
ERR(problem):
|
|
24
|
+
DISPLAY problem
|
|
25
|
+
END-MATCH
|
|
26
|
+
RETURN item?
|
|
27
|
+
END-FUNCTION
|
|
28
|
+
|
|
29
|
+
BEGIN
|
|
30
|
+
LET result = OK(LIMIT)
|
|
31
|
+
inspect(result)
|
|
32
|
+
END
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { display, input, math, strings, Result, Option, iter, spawn, channel } from "../stdlib/core/runtime.js";
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
function __variant(tag, values) { return { tag, values }; }
|
|
5
|
+
function __propagate(value) { if (value && value.tag === "ERR") throw new Error(String(value.values?.[0] ?? "propagated error")); return value?.tag === "OK" ? value.values[0] : value; }
|
|
6
|
+
|
|
7
|
+
const LIMIT = 3;
|
|
8
|
+
const OK = (...values) => __variant("OK", values);
|
|
9
|
+
const ERR = (...values) => __variant("ERR", values);
|
|
10
|
+
function __macro_say(value) {
|
|
11
|
+
display(value);
|
|
12
|
+
}
|
|
13
|
+
function inspect(item) {
|
|
14
|
+
{
|
|
15
|
+
const __matchValue = item;
|
|
16
|
+
if (__matchValue?.tag === "OK") {
|
|
17
|
+
const value = __matchValue.values[0];
|
|
18
|
+
__macro_say("matched ok");
|
|
19
|
+
display(value);
|
|
20
|
+
}
|
|
21
|
+
else if (__matchValue?.tag === "ERR") {
|
|
22
|
+
const problem = __matchValue.values[0];
|
|
23
|
+
display(problem);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return __propagate(item);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function main() {
|
|
30
|
+
const result = __variant("OK", [LIMIT]);
|
|
31
|
+
inspect(result);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
main();
|
|
35
|
+
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@cobolx/formatter",
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"main": "./dist/index.js",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"build": "tsc -p tsconfig.json",
|
|
8
|
+
"check": "tsc -p tsconfig.json --noEmit",
|
|
9
|
+
"clean": "if (Test-Path dist) { Remove-Item -Recurse -Force dist }"
|
|
10
|
+
},
|
|
11
|
+
"dependencies": {
|
|
12
|
+
"@cobolx/compiler": "0.2.0"
|
|
13
|
+
}
|
|
14
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function formatSource(source: string): string;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { parseSource } from "@cobolx/compiler";
|
|
2
|
+
function formatExpression(expression) {
|
|
3
|
+
switch (expression.kind) {
|
|
4
|
+
case "NumberLiteral":
|
|
5
|
+
return String(expression.value);
|
|
6
|
+
case "StringLiteral":
|
|
7
|
+
return JSON.stringify(expression.value);
|
|
8
|
+
case "BooleanLiteral":
|
|
9
|
+
return expression.value ? "TRUE" : "FALSE";
|
|
10
|
+
case "Identifier":
|
|
11
|
+
return expression.name;
|
|
12
|
+
case "UnaryExpression":
|
|
13
|
+
return `${expression.operator}${formatExpression(expression.operand)}`;
|
|
14
|
+
case "BinaryExpression":
|
|
15
|
+
return `${formatExpression(expression.left)} ${expression.operator} ${formatExpression(expression.right)}`;
|
|
16
|
+
case "CallExpression":
|
|
17
|
+
return `${expression.callee}(${expression.args.map(formatExpression).join(", ")})`;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
function formatStatement(statement, indent = "") {
|
|
21
|
+
switch (statement.kind) {
|
|
22
|
+
case "SetStatement":
|
|
23
|
+
return `${indent}SET ${statement.name} = ${formatExpression(statement.expression)}`;
|
|
24
|
+
case "DisplayStatement":
|
|
25
|
+
return `${indent}DISPLAY ${formatExpression(statement.expression)}`;
|
|
26
|
+
case "InputStatement":
|
|
27
|
+
return `${indent}INPUT ${statement.name}${statement.prompt ? ` ${formatExpression(statement.prompt)}` : ""}`;
|
|
28
|
+
case "ReturnStatement":
|
|
29
|
+
return `${indent}RETURN ${formatExpression(statement.expression)}`;
|
|
30
|
+
case "ExpressionStatement":
|
|
31
|
+
return `${indent}${formatExpression(statement.expression)}`;
|
|
32
|
+
case "IfStatement": {
|
|
33
|
+
const thenLines = statement.thenBranch.map((child) => formatStatement(child, `${indent} `));
|
|
34
|
+
const elseLines = statement.elseBranch.map((child) => formatStatement(child, `${indent} `));
|
|
35
|
+
const body = [`${indent}IF ${formatExpression(statement.condition)} THEN`, ...thenLines];
|
|
36
|
+
if (elseLines.length > 0) {
|
|
37
|
+
body.push(`${indent}ELSE`, ...elseLines);
|
|
38
|
+
}
|
|
39
|
+
body.push(`${indent}END-IF`);
|
|
40
|
+
return body.join("\n");
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
function formatProgram(program) {
|
|
45
|
+
const lines = [`PROGRAM ${program.name}`, ""];
|
|
46
|
+
for (const fn of program.functions) {
|
|
47
|
+
lines.push(`FUNCTION ${fn.name}(${fn.params.join(", ")}) BEGIN`);
|
|
48
|
+
lines.push(...fn.body.map((statement) => formatStatement(statement, " ")));
|
|
49
|
+
lines.push("END-FUNCTION", "");
|
|
50
|
+
}
|
|
51
|
+
lines.push("BEGIN");
|
|
52
|
+
lines.push(...program.body.map((statement) => formatStatement(statement, " ")));
|
|
53
|
+
lines.push("END", "");
|
|
54
|
+
return lines.join("\n");
|
|
55
|
+
}
|
|
56
|
+
export function formatSource(source) {
|
|
57
|
+
return formatProgram(parseSource(source));
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import type { ExpressionNode, PatternNode, ProgramNode, StatementNode } from "@cobolx/compiler";
|
|
2
|
+
import { parseSource } from "@cobolx/compiler";
|
|
3
|
+
|
|
4
|
+
function formatExpression(expression: ExpressionNode): string {
|
|
5
|
+
switch (expression.kind) {
|
|
6
|
+
case "NumberLiteral":
|
|
7
|
+
return String(expression.value);
|
|
8
|
+
case "StringLiteral":
|
|
9
|
+
return JSON.stringify(expression.value);
|
|
10
|
+
case "BooleanLiteral":
|
|
11
|
+
return expression.value ? "TRUE" : "FALSE";
|
|
12
|
+
case "Identifier":
|
|
13
|
+
return expression.name;
|
|
14
|
+
case "UnaryExpression":
|
|
15
|
+
return `${expression.operator}${formatExpression(expression.operand)}`;
|
|
16
|
+
case "BinaryExpression":
|
|
17
|
+
return `${formatExpression(expression.left)} ${expression.operator} ${formatExpression(expression.right)}`;
|
|
18
|
+
case "CallExpression":
|
|
19
|
+
return `${formatExpression(expression.callee)}(${expression.args.map(formatExpression).join(", ")})`;
|
|
20
|
+
case "TryExpression":
|
|
21
|
+
return `${formatExpression(expression.expression)}?`;
|
|
22
|
+
case "MacroInvocation":
|
|
23
|
+
return `${expression.name}!(${expression.args.map(formatExpression).join(", ")})`;
|
|
24
|
+
case "MemberExpression":
|
|
25
|
+
return `${formatExpression(expression.object)}.${expression.property}`;
|
|
26
|
+
case "EnumConstructorExpression":
|
|
27
|
+
return `${expression.variantName}(${expression.fields.map(formatExpression).join(", ")})`;
|
|
28
|
+
case "ArrayLiteral":
|
|
29
|
+
return `[${expression.items.map(formatExpression).join(", ")}]`;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function formatStatement(statement: StatementNode, indent = ""): string {
|
|
34
|
+
switch (statement.kind) {
|
|
35
|
+
case "LetStatement":
|
|
36
|
+
return `${indent}LET ${statement.isMutable ? "MUT " : ""}${statement.binding.name} = ${formatExpression(statement.expression)}`;
|
|
37
|
+
case "SetStatement":
|
|
38
|
+
return `${indent}SET ${statement.name} = ${formatExpression(statement.expression)}`;
|
|
39
|
+
case "DisplayStatement":
|
|
40
|
+
return `${indent}DISPLAY ${formatExpression(statement.expression)}`;
|
|
41
|
+
case "InputStatement":
|
|
42
|
+
return `${indent}INPUT ${statement.name}${statement.prompt ? ` ${formatExpression(statement.prompt)}` : ""}`;
|
|
43
|
+
case "ReturnStatement":
|
|
44
|
+
return `${indent}RETURN ${formatExpression(statement.expression)}`;
|
|
45
|
+
case "ExpressionStatement":
|
|
46
|
+
return `${indent}${formatExpression(statement.expression)}`;
|
|
47
|
+
case "AssertStatement":
|
|
48
|
+
return `${indent}ASSERT ${formatExpression(statement.expression)}`;
|
|
49
|
+
case "SpawnStatement":
|
|
50
|
+
return `${indent}SPAWN ${formatExpression(statement.expression)}`;
|
|
51
|
+
case "IfStatement": {
|
|
52
|
+
const thenLines = statement.thenBranch.map((child) => formatStatement(child, `${indent} `));
|
|
53
|
+
const elseLines = statement.elseBranch.map((child) => formatStatement(child, `${indent} `));
|
|
54
|
+
const body = [`${indent}IF ${formatExpression(statement.condition)} THEN`, ...thenLines];
|
|
55
|
+
if (elseLines.length > 0) {
|
|
56
|
+
body.push(`${indent}ELSE`, ...elseLines);
|
|
57
|
+
}
|
|
58
|
+
body.push(`${indent}END-IF`);
|
|
59
|
+
return body.join("\n");
|
|
60
|
+
}
|
|
61
|
+
case "MatchStatement": {
|
|
62
|
+
const arms = statement.arms.map((arm) => `${indent} ${formatPattern(arm.pattern)}:\n${arm.body.map((child) => formatStatement(child, `${indent} `)).join("\n")}`);
|
|
63
|
+
return [`${indent}MATCH ${formatExpression(statement.expression)}:`, ...arms, `${indent}END-MATCH`].join("\n");
|
|
64
|
+
}
|
|
65
|
+
case "UnsafeBlock":
|
|
66
|
+
return [`${indent}UNSAFE`, `${indent}BEGIN`, ...statement.body.map((child) => formatStatement(child, `${indent} `)), `${indent}END-UNSAFE`].join("\n");
|
|
67
|
+
case "BlockStatement":
|
|
68
|
+
return statement.body.map((child) => formatStatement(child, indent)).join("\n");
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function formatPattern(pattern: PatternNode): string {
|
|
73
|
+
switch (pattern.kind) {
|
|
74
|
+
case "WildcardPattern":
|
|
75
|
+
return "_";
|
|
76
|
+
case "IdentifierPattern":
|
|
77
|
+
return pattern.name;
|
|
78
|
+
case "VariantPattern":
|
|
79
|
+
return `${pattern.variantName}(${pattern.bindings.join(", ")})`;
|
|
80
|
+
case "LiteralPattern":
|
|
81
|
+
return formatExpression(pattern.expression);
|
|
82
|
+
default:
|
|
83
|
+
return "_";
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
function formatProgram(program: ProgramNode): string {
|
|
88
|
+
const lines = [`PROGRAM ${program.name}`, ""];
|
|
89
|
+
for (const constant of program.consts) lines.push(`CONST ${constant.name} = ${formatExpression(constant.expression)}`);
|
|
90
|
+
for (const fn of program.functions) {
|
|
91
|
+
lines.push(`${fn.signature.isAsync ? "ASYNC " : ""}FUNCTION ${fn.signature.name}(${fn.signature.params.map((param) => param.name).join(", ")}) BEGIN`);
|
|
92
|
+
lines.push(...fn.body.map((statement) => formatStatement(statement, " ")));
|
|
93
|
+
lines.push("END-FUNCTION", "");
|
|
94
|
+
}
|
|
95
|
+
lines.push("BEGIN");
|
|
96
|
+
lines.push(...program.body.map((statement) => formatStatement(statement, " ")));
|
|
97
|
+
lines.push("END", "");
|
|
98
|
+
return lines.join("\n");
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
export function formatSource(source: string): string {
|
|
102
|
+
return formatProgram(parseSource(source));
|
|
103
|
+
}
|
package/install.ps1
ADDED
package/install.sh
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@cobolx/linter",
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"main": "./dist/index.js",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"build": "tsc -p tsconfig.json",
|
|
8
|
+
"check": "tsc -p tsconfig.json --noEmit",
|
|
9
|
+
"clean": "if (Test-Path dist) { Remove-Item -Recurse -Force dist }"
|
|
10
|
+
},
|
|
11
|
+
"dependencies": {
|
|
12
|
+
"@cobolx/compiler": "0.2.0"
|
|
13
|
+
}
|
|
14
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { analyzeSource } from "@cobolx/compiler";
|
|
2
|
+
export function lintSource(source) {
|
|
3
|
+
const diagnostics = [...analyzeSource(source).diagnostics];
|
|
4
|
+
for (const [index, line] of source.split(/\r?\n/).entries()) {
|
|
5
|
+
if (/^\s*(program|begin|end|set|display|input|if|then|else|function|return)\b/.test(line)) {
|
|
6
|
+
diagnostics.push({
|
|
7
|
+
message: "Prefer uppercase COBOL-X keywords for consistency",
|
|
8
|
+
severity: "warning",
|
|
9
|
+
range: {
|
|
10
|
+
start: { line: index + 1, column: 1, offset: 0 },
|
|
11
|
+
end: { line: index + 1, column: line.length + 1, offset: 0 }
|
|
12
|
+
}
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
return diagnostics;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,MAAM,UAAU,UAAU,CAAC,MAAc;IACvC,MAAM,WAAW,GAAG,CAAC,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,CAAC;IAC3D,KAAK,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;QAC5D,IAAI,0EAA0E,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1F,WAAW,CAAC,IAAI,CAAC;gBACf,OAAO,EAAE,mDAAmD;gBAC5D,QAAQ,EAAE,SAAS;gBACnB,KAAK,EAAE;oBACL,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE;oBAChD,GAAG,EAAE,EAAE,IAAI,EAAE,KAAK,GAAG,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE;iBAC7D;aACF,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { Diagnostic } from "@cobolx/compiler";
|
|
2
|
+
import { analyzeSource } from "@cobolx/compiler";
|
|
3
|
+
|
|
4
|
+
export function lintSource(source: string): Diagnostic[] {
|
|
5
|
+
const diagnostics = [...analyzeSource(source).diagnostics];
|
|
6
|
+
for (const [index, line] of source.split(/\r?\n/).entries()) {
|
|
7
|
+
if (/^\s*(program|begin|end|set|display|input|if|then|else|function|return)\b/.test(line)) {
|
|
8
|
+
diagnostics.push({
|
|
9
|
+
message: "Prefer uppercase COBOL-X keywords for consistency",
|
|
10
|
+
severity: "warning",
|
|
11
|
+
range: {
|
|
12
|
+
start: { line: index + 1, column: 1, offset: 0 },
|
|
13
|
+
end: { line: index + 1, column: line.length + 1, offset: 0 }
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
return diagnostics;
|
|
19
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@cobolx/lsp",
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"main": "./dist/index.js",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"build": "tsc -p tsconfig.json",
|
|
8
|
+
"check": "tsc -p tsconfig.json --noEmit",
|
|
9
|
+
"clean": "if (Test-Path dist) { Remove-Item -Recurse -Force dist }"
|
|
10
|
+
},
|
|
11
|
+
"dependencies": {
|
|
12
|
+
"@cobolx/compiler": "0.2.0",
|
|
13
|
+
"vscode-languageserver": "^9.0.1",
|
|
14
|
+
"vscode-languageserver-textdocument": "^1.0.12"
|
|
15
|
+
}
|
|
16
|
+
}
|