cluaupp 1.5.2 → 2.0.0-beta.1
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/CHANGELOG.md +3 -0
- package/README.md +27 -40
- package/api/generated/bench-latest.json +43 -21
- package/api/generated/lsp-index.json +1 -1
- package/api/manifests/roblox-target.manifest.json +5 -5
- package/api/normalized/roblox-target.profile.json +8729 -267
- package/api/roblox/luau-builtins.d.luau +185 -0
- package/api/roblox/surface.json +1 -0
- package/api/roblox-api.lock.json +11 -2
- package/bin/cluaupp.js +38 -0
- package/editors/vscode/syntaxes/clpp.tmLanguage.json +211 -0
- package/examples/README.md +9 -9
- package/examples/game/cluaupp.config.json +2 -2
- package/examples/game/default.project.json +4 -15
- package/examples/game/out/ReplicatedStorage/Shared/GameInfo.luau +8 -0
- package/examples/game/out/ReplicatedStorage/Shared/GameInfo.luau.map.json +13 -0
- package/examples/game/out/ServerScriptService/Leaderstats.server.luau +26 -0
- package/examples/game/out/ServerScriptService/Leaderstats.server.luau.map.json +13 -0
- package/examples/game/out/ServerScriptService/Main.server.luau +15 -0
- package/examples/game/out/ServerScriptService/Main.server.luau.map.json +13 -0
- package/examples/game/out/StarterPlayer/StarterPlayerScripts/Main.client.luau +10 -0
- package/examples/game/out/StarterPlayer/StarterPlayerScripts/Main.client.luau.map.json +13 -0
- package/examples/game/src/ReplicatedStorage/Shared/GameInfo.clp +1 -0
- package/examples/game/src/ServerScriptService/Leaderstats.server.clp +18 -0
- package/examples/game/src/ServerScriptService/Main.server.clp +9 -0
- package/examples/game/src/StarterPlayer/StarterPlayerScripts/Main.client.clp +4 -0
- package/generated/api/build-profile.js +1 -1
- package/generated/api/loader.js +2 -2
- package/generated/api/surface/build.js +328 -0
- package/generated/api/surface/luau-defs.js +595 -0
- package/generated/api/surface/model.js +8 -0
- package/generated/clpp/contract.js +6 -3
- package/generated/clpp/handshake.js +36 -0
- package/generated/clpp/modules.js +20 -9
- package/generated/clpp/runner.js +62 -31
- package/generated/compile.js +18 -1
- package/generated/compiler/ast.js +3 -0
- package/generated/compiler/checker/calls.js +999 -0
- package/generated/compiler/checker/checker.js +1215 -0
- package/generated/compiler/checker/exprs.js +791 -0
- package/generated/compiler/checker/flow.js +168 -0
- package/generated/compiler/checker/members.js +763 -0
- package/generated/compiler/checker/statements.js +792 -0
- package/generated/compiler/checker/symbols.js +90 -0
- package/generated/compiler/checker/typeops.js +348 -0
- package/generated/compiler/checker/yields.js +115 -0
- package/generated/compiler/diagnostics.js +138 -0
- package/generated/compiler/emit/emitter.js +2356 -0
- package/generated/compiler/emit/luau-types.js +137 -0
- package/generated/compiler/emit/names.js +130 -0
- package/generated/compiler/emit/runtime.js +432 -0
- package/generated/compiler/lexer.js +403 -0
- package/generated/compiler/parser.js +1881 -0
- package/generated/compiler/project.js +332 -0
- package/generated/compiler/roblox/api.js +388 -0
- package/generated/compiler/roblox/context.js +100 -0
- package/generated/compiler/source.js +59 -0
- package/generated/compiler/stdlib.js +232 -0
- package/generated/compiler/types.js +250 -0
- package/generated/target/build-cache.js +4 -4
- package/generated/target/gen-rojo-tree.js +15 -0
- package/generated/target/source-map.js +61 -8
- package/generated/target/studio-bridge.js +1 -0
- package/generated/utils/project.js +83 -25
- package/native/bin/.gitkeep +1 -0
- package/package.json +17 -6
- package/plugins/CluauppNav/Plugin.luau +28 -4
- package/rust/cluaupp/Cargo.lock +795 -0
- package/rust/cluaupp/Cargo.toml +17 -0
- package/rust/cluaupp/src/main.rs +717 -0
- package/scripts/postinstall-native.js +56 -0
- package/skills/README.md +3 -3
- package/skills/clpp-hive-flare/SKILL.md +30 -26
- package/skills/clpp-language/SKILL.md +67 -74
- package/skills/clpp-language/compiler.md +24 -36
- package/skills/clpp-style/SKILL.md +31 -44
- package/src/api/build-profile.ts +1 -1
- package/src/api/loader.ts +2 -2
- package/src/api/surface/build.ts +374 -0
- package/src/api/surface/luau-defs.ts +635 -0
- package/src/api/surface/model.ts +96 -0
- package/src/clpp/contract.ts +20 -3
- package/src/clpp/handshake.ts +25 -0
- package/src/clpp/modules.ts +17 -10
- package/src/clpp/runner.ts +52 -34
- package/src/compile.ts +20 -2
- package/src/compiler/ast.ts +336 -0
- package/src/compiler/checker/calls.ts +1025 -0
- package/src/compiler/checker/checker.ts +1352 -0
- package/src/compiler/checker/exprs.ts +805 -0
- package/src/compiler/checker/flow.ts +174 -0
- package/src/compiler/checker/members.ts +793 -0
- package/src/compiler/checker/statements.ts +802 -0
- package/src/compiler/checker/symbols.ts +219 -0
- package/src/compiler/checker/typeops.ts +355 -0
- package/src/compiler/checker/yields.ts +120 -0
- package/src/compiler/diagnostics.ts +163 -0
- package/src/compiler/emit/emitter.ts +2486 -0
- package/src/compiler/emit/luau-types.ts +143 -0
- package/src/compiler/emit/names.ts +130 -0
- package/src/compiler/emit/runtime.ts +438 -0
- package/src/compiler/lexer.ts +444 -0
- package/src/compiler/parser.ts +1943 -0
- package/src/compiler/project.ts +354 -0
- package/src/compiler/roblox/api.ts +408 -0
- package/src/compiler/roblox/context.ts +108 -0
- package/src/compiler/source.ts +67 -0
- package/src/compiler/stdlib.ts +256 -0
- package/src/compiler/types.ts +313 -0
- package/src/target/build-cache.ts +5 -8
- package/src/target/gen-rojo-tree.ts +15 -0
- package/src/target/source-map.ts +65 -27
- package/src/target/studio-bridge.ts +3 -0
- package/src/types.ts +3 -0
- package/src/utils/project.ts +79 -31
- package/templates/README.md +7 -0
- package/templates/{game → game-modern}/cluaupp.config.json +2 -2
- package/templates/{game → game-modern}/package.json +1 -2
- package/templates/game-modern/rokit.toml +2 -0
- package/templates/game-modern/src/ReplicatedStorage/Shared/GameInfo.clp +1 -0
- package/templates/game-modern/src/ServerScriptService/Handlers/Guard.server.clp +4 -0
- package/templates/game-modern/src/ServerScriptService/Main.server.clp +8 -0
- package/templates/game-modern/src/StarterPlayer/StarterPlayerScripts/Main.client.clp +4 -0
- package/examples/game/out/ReplicatedStorage/Shared/Constants/Datas/TemplateData.luau +0 -29
- package/examples/game/out/ReplicatedStorage/Shared/Constants/Datas/TemplateData.luau.map.json +0 -13
- package/examples/game/out/ReplicatedStorage/Shared/Net/Net.luau +0 -83
- package/examples/game/out/ReplicatedStorage/Shared/Net/Net.luau.map.json +0 -13
- package/examples/game/out/ServerScriptService/Boot/DataBoot.server.luau +0 -18
- package/examples/game/out/ServerScriptService/Boot/DataBoot.server.luau.map.json +0 -13
- package/examples/game/out/ServerScriptService/Configuration/ServerConfig.luau +0 -14
- package/examples/game/out/ServerScriptService/Configuration/ServerConfig.luau.map.json +0 -13
- package/examples/game/out/ServerScriptService/Handlers/Guard.server.luau +0 -15
- package/examples/game/out/ServerScriptService/Handlers/Guard.server.luau.map.json +0 -13
- package/examples/game/out/ServerScriptService/Handlers/PlayerHandler.server.luau +0 -50
- package/examples/game/out/ServerScriptService/Handlers/PlayerHandler.server.luau.map.json +0 -13
- package/examples/game/out/StarterPlayer/StarterCharacterScripts/Character/CharacterReady.client.luau +0 -12
- package/examples/game/out/StarterPlayer/StarterCharacterScripts/Character/CharacterReady.client.luau.map.json +0 -13
- package/examples/game/out/StarterPlayer/StarterPlayerScripts/Controllers/DataController.client.luau +0 -16
- package/examples/game/out/StarterPlayer/StarterPlayerScripts/Controllers/DataController.client.luau.map.json +0 -13
- package/examples/game/src/Client/Controllers/DataController.client.clpp +0 -7
- package/examples/game/src/Client/Main.client.clpp +0 -4
- package/examples/game/src/Declarations/Net.flare +0 -5
- package/examples/game/src/Include/GameTypes.clh +0 -40
- package/examples/game/src/Modules/Core/Guard.server.clpp +0 -7
- package/examples/game/src/Modules/Core/PlayerHandler.server.clpp +0 -23
- package/examples/game/src/Server/Boot/DataBoot.server.clpp +0 -13
- package/examples/game/src/Server/Main.server.clpp +0 -4
- package/templates/game/.clangd +0 -25
- package/templates/game/.vscode/extensions.json +0 -8
- package/templates/game/.vscode/settings.json +0 -17
- package/templates/game/Packages/.gitkeep +0 -0
- package/templates/game/compile_flags.txt +0 -6
- package/templates/game/default.project.json +0 -41
- package/templates/game/include/clpp/datatypes.clh +0 -575
- package/templates/game/include/clpp/generated/enums.clh +0 -4920
- package/templates/game/include/clpp/generated/instances.clh +0 -87182
- package/templates/game/include/clpp/libs/arrayindexer.clh +0 -12
- package/templates/game/include/clpp/libs/axiom.clh +0 -154
- package/templates/game/include/clpp/libs/bloom.clh +0 -58
- package/templates/game/include/clpp/libs/coil.clh +0 -37
- package/templates/game/include/clpp/libs/crest.clh +0 -22
- package/templates/game/include/clpp/libs/echo.clh +0 -52
- package/templates/game/include/clpp/libs/ember.clh +0 -17
- package/templates/game/include/clpp/libs/flare.clh +0 -65
- package/templates/game/include/clpp/libs/gleam.clh +0 -111
- package/templates/game/include/clpp/libs/guide.clh +0 -42
- package/templates/game/include/clpp/libs/helm.clh +0 -31
- package/templates/game/include/clpp/libs/hive.clh +0 -20
- package/templates/game/include/clpp/libs/keep.clh +0 -158
- package/templates/game/include/clpp/libs/lens.clh +0 -24
- package/templates/game/include/clpp/libs/mint.clh +0 -28
- package/templates/game/include/clpp/libs/net.clh +0 -31
- package/templates/game/include/clpp/libs/occlude.clh +0 -15
- package/templates/game/include/clpp/libs/pin.clh +0 -28
- package/templates/game/include/clpp/libs/promise.clh +0 -24
- package/templates/game/include/clpp/libs/roster.clh +0 -123
- package/templates/game/include/clpp/libs/shift.clh +0 -22
- package/templates/game/include/clpp/libs/spark.clh +0 -28
- package/templates/game/include/clpp/libs/stage.clh +0 -23
- package/templates/game/include/clpp/libs/sweep.clh +0 -23
- package/templates/game/include/clpp/libs/trace.clh +0 -18
- package/templates/game/include/clpp/libs/ward.clh +0 -19
- package/templates/game/include/clpp/libs.clh +0 -31
- package/templates/game/include/clpp/roblox.clh +0 -41
- package/templates/game/rokit.toml +0 -5
- package/templates/game/src/Client/Controllers/DataController.client.clpp +0 -7
- package/templates/game/src/Client/Main.client.clpp +0 -4
- package/templates/game/src/Declarations/Net.flare +0 -5
- package/templates/game/src/Include/GameTypes.clh +0 -40
- package/templates/game/src/Modules/Core/Guard.server.clpp +0 -7
- package/templates/game/src/Modules/Core/PlayerHandler.server.clpp +0 -24
- package/templates/game/src/Server/Boot/DataBoot.server.clpp +0 -13
- package/templates/game/src/Server/Main.server.clpp +0 -4
- package/templates/game/stylua.toml +0 -9
- package/templates/game/wally.toml +0 -12
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/** Control flow facts: which statements always exit, and how conditions narrow nullable types. */
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.alwaysExits = alwaysExits;
|
|
5
|
+
exports.containsBreak = containsBreak;
|
|
6
|
+
exports.conditionNarrowings = conditionNarrowings;
|
|
7
|
+
exports.applyNarrowings = applyNarrowings;
|
|
8
|
+
const types_js_1 = require("../types.js");
|
|
9
|
+
const exprs_js_1 = require("./exprs.js");
|
|
10
|
+
/** Does control never fall off the end of these statements? */
|
|
11
|
+
function alwaysExits(c, body) {
|
|
12
|
+
for (const stmt of body) {
|
|
13
|
+
if (stmtExits(c, stmt)) {
|
|
14
|
+
return true;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
function stmtExits(c, stmt) {
|
|
20
|
+
switch (stmt.kind) {
|
|
21
|
+
case "Return":
|
|
22
|
+
return true;
|
|
23
|
+
case "Output":
|
|
24
|
+
return stmt.channel === "report";
|
|
25
|
+
case "Expr":
|
|
26
|
+
return isNoReturnCall(stmt.expr);
|
|
27
|
+
case "If":
|
|
28
|
+
return stmt.else !== null && alwaysExits(c, stmt.then) && alwaysExits(c, stmt.else);
|
|
29
|
+
case "Block":
|
|
30
|
+
return alwaysExits(c, stmt.body);
|
|
31
|
+
case "Try":
|
|
32
|
+
return alwaysExits(c, stmt.body) && alwaysExits(c, stmt.handler);
|
|
33
|
+
case "Match": {
|
|
34
|
+
if (stmt.arms.length === 0) {
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
const exhaustive = stmt.exhaustive === true;
|
|
38
|
+
return exhaustive && stmt.arms.every((a) => alwaysExits(c, a.body));
|
|
39
|
+
}
|
|
40
|
+
case "Switch": {
|
|
41
|
+
const hasDefault = stmt.cases.some((k) => k.test === null);
|
|
42
|
+
return hasDefault && stmt.cases.every((k) => alwaysExits(c, k.body.filter((s) => s.kind !== "Break")));
|
|
43
|
+
}
|
|
44
|
+
case "While": {
|
|
45
|
+
const forever = isTrueLiteral(stmt.cond);
|
|
46
|
+
return forever && !containsBreak(stmt.body);
|
|
47
|
+
}
|
|
48
|
+
case "For":
|
|
49
|
+
return stmt.cond === null && !containsBreak(stmt.body);
|
|
50
|
+
default:
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
function isNoReturnCall(expr) {
|
|
55
|
+
if (expr.kind !== "Call") {
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
const callee = expr.callee;
|
|
59
|
+
return callee.kind === "Name" && callee.name === "error" && callee.res?.kind === "global";
|
|
60
|
+
}
|
|
61
|
+
function isTrueLiteral(e) {
|
|
62
|
+
return (e.kind === "Bool" && e.value) || (e.kind === "Number" && e.value !== 0);
|
|
63
|
+
}
|
|
64
|
+
/** `break` that targets this loop (not a nested loop or switch). */
|
|
65
|
+
function containsBreak(body) {
|
|
66
|
+
for (const s of body) {
|
|
67
|
+
switch (s.kind) {
|
|
68
|
+
case "Break":
|
|
69
|
+
return true;
|
|
70
|
+
case "If":
|
|
71
|
+
if (containsBreak(s.then) || (s.else && containsBreak(s.else))) {
|
|
72
|
+
return true;
|
|
73
|
+
}
|
|
74
|
+
break;
|
|
75
|
+
case "Block":
|
|
76
|
+
if (containsBreak(s.body)) {
|
|
77
|
+
return true;
|
|
78
|
+
}
|
|
79
|
+
break;
|
|
80
|
+
case "Try":
|
|
81
|
+
if (containsBreak(s.body) || containsBreak(s.handler)) {
|
|
82
|
+
return true;
|
|
83
|
+
}
|
|
84
|
+
break;
|
|
85
|
+
case "Match":
|
|
86
|
+
if (s.arms.some((a) => containsBreak(a.body))) {
|
|
87
|
+
return true;
|
|
88
|
+
}
|
|
89
|
+
break;
|
|
90
|
+
default:
|
|
91
|
+
break;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
96
|
+
/** Narrowings that hold when `cond` evaluates to `truthy`. Types must already be on the nodes. */
|
|
97
|
+
function conditionNarrowings(c, cond, truthy) {
|
|
98
|
+
switch (cond.kind) {
|
|
99
|
+
case "Unary":
|
|
100
|
+
if (cond.op === "not") {
|
|
101
|
+
return conditionNarrowings(c, cond.operand, !truthy);
|
|
102
|
+
}
|
|
103
|
+
return [];
|
|
104
|
+
case "Binary": {
|
|
105
|
+
if (cond.op === "and") {
|
|
106
|
+
return truthy ? [...conditionNarrowings(c, cond.left, true), ...conditionNarrowings(c, cond.right, true)] : [];
|
|
107
|
+
}
|
|
108
|
+
if (cond.op === "or") {
|
|
109
|
+
return truthy ? [] : [...conditionNarrowings(c, cond.left, false), ...conditionNarrowings(c, cond.right, false)];
|
|
110
|
+
}
|
|
111
|
+
if (cond.op === "==" || cond.op === "!=") {
|
|
112
|
+
const nullOnRight = cond.right.kind === "Null";
|
|
113
|
+
const nullOnLeft = cond.left.kind === "Null";
|
|
114
|
+
if (!nullOnLeft && !nullOnRight) {
|
|
115
|
+
return [];
|
|
116
|
+
}
|
|
117
|
+
const subject = nullOnRight ? cond.left : cond.right;
|
|
118
|
+
const key = (0, exprs_js_1.exprPathKey)(subject);
|
|
119
|
+
if (!key || !subject.ty) {
|
|
120
|
+
return [];
|
|
121
|
+
}
|
|
122
|
+
const notNull = cond.op === "!=" ? truthy : !truthy;
|
|
123
|
+
return [[key, notNull ? (0, types_js_1.nonNull)(subject.narrowedFrom ?? subject.ty) : types_js_1.T.null]];
|
|
124
|
+
}
|
|
125
|
+
return [];
|
|
126
|
+
}
|
|
127
|
+
case "Name":
|
|
128
|
+
case "Member":
|
|
129
|
+
case "SelfField": {
|
|
130
|
+
const key = (0, exprs_js_1.exprPathKey)(cond);
|
|
131
|
+
const t = cond.narrowedFrom ?? cond.ty;
|
|
132
|
+
if (!key || !t) {
|
|
133
|
+
return [];
|
|
134
|
+
}
|
|
135
|
+
const p = (0, types_js_1.prune)(t);
|
|
136
|
+
if (truthy && (p.k === "option" || p.k === "union")) {
|
|
137
|
+
return [[key, (0, types_js_1.nonNull)(p)]];
|
|
138
|
+
}
|
|
139
|
+
return [];
|
|
140
|
+
}
|
|
141
|
+
case "Call": {
|
|
142
|
+
// x.IsA("Part") / x.IsA<Part>()
|
|
143
|
+
const callee = cond.callee;
|
|
144
|
+
if (truthy && callee.kind === "Member" && callee.name === "IsA") {
|
|
145
|
+
const subject = callee.object;
|
|
146
|
+
const key = (0, exprs_js_1.exprPathKey)(subject);
|
|
147
|
+
let cls = null;
|
|
148
|
+
if (callee.typeArgs && callee.typeArgs[0]?.kind === "Named") {
|
|
149
|
+
cls = callee.typeArgs[0].name;
|
|
150
|
+
}
|
|
151
|
+
else if (cond.args[0]?.value.kind === "String") {
|
|
152
|
+
cls = cond.args[0].value.value;
|
|
153
|
+
}
|
|
154
|
+
if (key && cls && c.api.hasClass(cls)) {
|
|
155
|
+
return [[key, types_js_1.T.instance(cls)]];
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
return [];
|
|
159
|
+
}
|
|
160
|
+
default:
|
|
161
|
+
return [];
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
function applyNarrowings(scope, narrowings) {
|
|
165
|
+
for (const [key, type] of narrowings) {
|
|
166
|
+
scope.narrowed.set(key, type);
|
|
167
|
+
}
|
|
168
|
+
}
|