skittles 1.2.6 → 1.3.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.
Files changed (48) hide show
  1. package/README.md +4 -4
  2. package/dist/commands/clean.d.ts.map +1 -1
  3. package/dist/commands/clean.js +4 -1
  4. package/dist/commands/clean.js.map +1 -1
  5. package/dist/commands/compile.d.ts +1 -0
  6. package/dist/commands/compile.d.ts.map +1 -1
  7. package/dist/commands/compile.js +51 -1
  8. package/dist/commands/compile.js.map +1 -1
  9. package/dist/commands/init.d.ts.map +1 -1
  10. package/dist/commands/init.js +5 -4
  11. package/dist/commands/init.js.map +1 -1
  12. package/dist/commands/test.d.ts +7 -0
  13. package/dist/commands/test.d.ts.map +1 -0
  14. package/dist/commands/test.js +60 -0
  15. package/dist/commands/test.js.map +1 -0
  16. package/dist/compiler/analysis.d.ts +7 -0
  17. package/dist/compiler/analysis.d.ts.map +1 -0
  18. package/dist/compiler/analysis.js +234 -0
  19. package/dist/compiler/analysis.js.map +1 -0
  20. package/dist/compiler/codegen.d.ts +10 -1
  21. package/dist/compiler/codegen.d.ts.map +1 -1
  22. package/dist/compiler/codegen.js +389 -22
  23. package/dist/compiler/codegen.js.map +1 -1
  24. package/dist/compiler/compiler.d.ts +2 -1
  25. package/dist/compiler/compiler.d.ts.map +1 -1
  26. package/dist/compiler/compiler.js +94 -9
  27. package/dist/compiler/compiler.js.map +1 -1
  28. package/dist/compiler/parser.d.ts +7 -1
  29. package/dist/compiler/parser.d.ts.map +1 -1
  30. package/dist/compiler/parser.js +731 -47
  31. package/dist/compiler/parser.js.map +1 -1
  32. package/dist/config/config.d.ts.map +1 -1
  33. package/dist/config/config.js +5 -1
  34. package/dist/config/config.js.map +1 -1
  35. package/dist/exports.d.ts +13 -2
  36. package/dist/exports.d.ts.map +1 -1
  37. package/dist/exports.js.map +1 -1
  38. package/dist/index.js +19 -4
  39. package/dist/index.js.map +1 -1
  40. package/dist/testing.d.ts +93 -0
  41. package/dist/testing.d.ts.map +1 -0
  42. package/dist/testing.js +143 -0
  43. package/dist/testing.js.map +1 -0
  44. package/dist/types/index.d.ts +51 -2
  45. package/dist/types/index.d.ts.map +1 -1
  46. package/dist/types/index.js +1 -0
  47. package/dist/types/index.js.map +1 -1
  48. package/package.json +2 -2
package/README.md CHANGED
@@ -4,15 +4,15 @@
4
4
 
5
5
  # Skittles
6
6
 
7
- Write, Test and Deploy EVM Smart Contracts with TypeScript.
7
+ Write smart contracts in TypeScript.
8
8
 
9
- Skittles compiles TypeScript classes to Solidity source code. Use Hardhat (or any Solidity toolchain) to compile that to ABI and EVM bytecode. You get TypeScript tooling (autocomplete, type checking, familiar syntax) while targeting the EVM.
9
+ Skittles lets you write blockchain smart contracts using TypeScript the language you already know. No new syntax to learn. Full IDE support with autocomplete, type checking, and go-to-definition. Under the hood, Skittles compiles to Solidity for compatibility with every EVM tool and blockchain.
10
10
 
11
11
  Website: [skittles.dev](https://skittles.dev/)
12
12
 
13
13
  ## Quick Start
14
14
 
15
- Requires Node.js 20+.
15
+ Requires Node.js 22+.
16
16
 
17
17
  ```bash
18
18
  npx skittles@latest init
@@ -55,7 +55,7 @@ export class Token {
55
55
  }
56
56
  ```
57
57
 
58
- This compiles to a Solidity contract with events, mappings, a constructor, and a transfer function.
58
+ This creates a simple token contract. Users can transfer tokens to each other, with balance checks and a Transfer event that logs activity on the blockchain.
59
59
 
60
60
  ## Contributing
61
61
 
@@ -1 +1 @@
1
- {"version":3,"file":"clean.d.ts","sourceRoot":"","sources":["../../src/commands/clean.ts"],"names":[],"mappings":"AAKA,wBAAsB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAMrE"}
1
+ {"version":3,"file":"clean.d.ts","sourceRoot":"","sources":["../../src/commands/clean.ts"],"names":[],"mappings":"AAKA,wBAAsB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CASrE"}
@@ -5,8 +5,11 @@ import { loadConfig } from "../config/config.js";
5
5
  export async function cleanCommand(projectRoot) {
6
6
  const config = await loadConfig(projectRoot);
7
7
  const outputDir = path.join(projectRoot, config.outputDir);
8
- logInfo(`Removing build directory: ${config.outputDir}/`);
8
+ const cacheDir = path.join(projectRoot, config.cacheDir);
9
+ logInfo(`Removing output directory: ${config.outputDir}/`);
9
10
  removeDirectory(outputDir);
11
+ logInfo(`Removing cache directory: ${config.cacheDir}/`);
12
+ removeDirectory(cacheDir);
10
13
  logSuccess("Build artifacts cleaned");
11
14
  }
12
15
  //# sourceMappingURL=clean.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"clean.js","sourceRoot":"","sources":["../../src/commands/clean.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,WAAmB;IACpD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,WAAW,CAAC,CAAC;IAC7C,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;IAC3D,OAAO,CAAC,6BAA6B,MAAM,CAAC,SAAS,GAAG,CAAC,CAAC;IAC1D,eAAe,CAAC,SAAS,CAAC,CAAC;IAC3B,UAAU,CAAC,yBAAyB,CAAC,CAAC;AACxC,CAAC"}
1
+ {"version":3,"file":"clean.js","sourceRoot":"","sources":["../../src/commands/clean.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,WAAmB;IACpD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,WAAW,CAAC,CAAC;IAC7C,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;IAC3D,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;IACzD,OAAO,CAAC,8BAA8B,MAAM,CAAC,SAAS,GAAG,CAAC,CAAC;IAC3D,eAAe,CAAC,SAAS,CAAC,CAAC;IAC3B,OAAO,CAAC,6BAA6B,MAAM,CAAC,QAAQ,GAAG,CAAC,CAAC;IACzD,eAAe,CAAC,QAAQ,CAAC,CAAC;IAC1B,UAAU,CAAC,yBAAyB,CAAC,CAAC;AACxC,CAAC"}
@@ -1,2 +1,3 @@
1
1
  export declare function compileCommand(projectRoot: string): Promise<void>;
2
+ export declare function watchCompile(projectRoot: string): Promise<() => void>;
2
3
  //# sourceMappingURL=compile.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"compile.d.ts","sourceRoot":"","sources":["../../src/commands/compile.ts"],"names":[],"mappings":"AAKA,wBAAsB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA4BvE"}
1
+ {"version":3,"file":"compile.d.ts","sourceRoot":"","sources":["../../src/commands/compile.ts"],"names":[],"mappings":"AAOA,wBAAsB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA4BvE;AAED,wBAAsB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,CA6B3E"}
@@ -1,7 +1,9 @@
1
+ import fs from "fs";
2
+ import path from "path";
1
3
  import ora from "ora";
2
4
  import { loadConfig } from "../config/config.js";
3
5
  import { compile } from "../compiler/compiler.js";
4
- import { logSuccess, logError } from "../utils/console.js";
6
+ import { logSuccess, logError, logInfo } from "../utils/console.js";
5
7
  export async function compileCommand(projectRoot) {
6
8
  const spinner = ora({ text: "Loading configuration...", color: "cyan" }).start();
7
9
  try {
@@ -27,4 +29,52 @@ export async function compileCommand(projectRoot) {
27
29
  process.exit(1);
28
30
  }
29
31
  }
32
+ export async function watchCompile(projectRoot) {
33
+ const config = await loadConfig(projectRoot);
34
+ const contractsDir = path.join(projectRoot, config.contractsDir);
35
+ // Run initial compilation
36
+ await runCompilation(projectRoot);
37
+ logInfo(`Watching for file changes in ${config.contractsDir}/...`);
38
+ let debounceTimer = null;
39
+ if (!fs.existsSync(contractsDir)) {
40
+ fs.mkdirSync(contractsDir, { recursive: true });
41
+ }
42
+ const watcher = fs.watch(contractsDir, { recursive: true }, (_event, filename) => {
43
+ if (!filename || !filename.endsWith(".ts"))
44
+ return;
45
+ if (debounceTimer)
46
+ clearTimeout(debounceTimer);
47
+ debounceTimer = setTimeout(() => {
48
+ logInfo(`File changed: ${filename}`);
49
+ runCompilation(projectRoot);
50
+ }, 200);
51
+ });
52
+ return () => {
53
+ if (debounceTimer)
54
+ clearTimeout(debounceTimer);
55
+ watcher.close();
56
+ };
57
+ }
58
+ async function runCompilation(projectRoot) {
59
+ const spinner = ora({ text: "Compiling contracts...", color: "cyan" }).start();
60
+ try {
61
+ const config = await loadConfig(projectRoot);
62
+ const result = await compile(projectRoot, config);
63
+ if (result.success) {
64
+ spinner.succeed("Compilation complete");
65
+ logSuccess(`${result.artifacts.length} contract(s) compiled successfully`);
66
+ }
67
+ else {
68
+ spinner.fail("Compilation failed");
69
+ for (const error of result.errors) {
70
+ logError(error);
71
+ }
72
+ }
73
+ }
74
+ catch (err) {
75
+ spinner.fail("Compilation failed");
76
+ const message = err instanceof Error ? err.message : "Unknown error occurred";
77
+ logError(message);
78
+ }
79
+ }
30
80
  //# sourceMappingURL=compile.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"compile.js","sourceRoot":"","sources":["../../src/commands/compile.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAE3D,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,WAAmB;IACtD,MAAM,OAAO,GAAG,GAAG,CAAC,EAAE,IAAI,EAAE,0BAA0B,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;IAEjF,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,WAAW,CAAC,CAAC;QAC7C,OAAO,CAAC,IAAI,GAAG,wBAAwB,CAAC;QAExC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QAElD,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,OAAO,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;YACxC,UAAU,CACR,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,oCAAoC,CAC/D,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;YACnC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBAClC,QAAQ,CAAC,KAAK,CAAC,CAAC;YAClB,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QACnC,MAAM,OAAO,GACX,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,wBAAwB,CAAC;QAChE,QAAQ,CAAC,OAAO,CAAC,CAAC;QAClB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"compile.js","sourceRoot":"","sources":["../../src/commands/compile.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAmMA,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAsB,WAAW,CAC/B,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,IAAI,CAAC,CAgLf"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAqMA,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAsB,WAAW,CAC/B,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,IAAI,CAAC,CA+Kf"}
@@ -5,8 +5,9 @@ import { writeFile, ensureDirectory } from "../utils/file.js";
5
5
  import { logSuccess, logError, logInfo, logWarning } from "../utils/console.js";
6
6
  const CONFIG_TEMPLATE = JSON.stringify({
7
7
  typeCheck: true,
8
+ consoleLog: true,
8
9
  contractsDir: "contracts",
9
- outputDir: "build",
10
+ outputDir: "artifacts",
10
11
  }, null, 2);
11
12
  const TSCONFIG_TEMPLATE = JSON.stringify({
12
13
  compilerOptions: {
@@ -25,7 +26,7 @@ const TSCONFIG_TEMPLATE = JSON.stringify({
25
26
  rootDir: ".",
26
27
  },
27
28
  include: ["contracts/**/*", "test/**/*", "types/**/*"],
28
- exclude: ["node_modules", "build", "dist"],
29
+ exclude: ["node_modules", "artifacts", "cache", "dist"],
29
30
  }, null, 2);
30
31
  const HARDHAT_CONFIG_TEMPLATE = `import { defineConfig } from "hardhat/config";
31
32
  import hardhatEthers from "@nomicfoundation/hardhat-ethers";
@@ -43,7 +44,7 @@ export default defineConfig({
43
44
  hardhatNetworkHelpers,
44
45
  ],
45
46
  paths: {
46
- sources: "./build/solidity",
47
+ sources: "./artifacts/solidity",
47
48
  tests: "./test",
48
49
  },
49
50
  solidity: {
@@ -79,6 +80,7 @@ export class Token {
79
80
 
80
81
  public transfer(to: address, amount: number): boolean {
81
82
  const sender: address = msg.sender;
83
+ console.log("transfer", sender, to, amount);
82
84
  if (this.balances[sender] < amount) {
83
85
  throw new Error("Insufficient balance");
84
86
  }
@@ -300,7 +302,6 @@ export async function initCommand(projectRoot, options = {}) {
300
302
  // Update .gitignore
301
303
  const gitignorePath = path.join(projectRoot, ".gitignore");
302
304
  const gitignoreEntries = [
303
- "build/",
304
305
  "dist/",
305
306
  "types/",
306
307
  "node_modules/",
@@ -1 +1 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * The `skittles test` command.
3
+ * 1. Compiles all contracts (same as `skittles compile`)
4
+ * 2. Runs hardhat test
5
+ */
6
+ export declare function testCommand(projectRoot: string, watch: boolean): Promise<void>;
7
+ //# sourceMappingURL=test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../../src/commands/test.ts"],"names":[],"mappings":"AAmBA;;;;GAIG;AACH,wBAAsB,WAAW,CAC/B,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,IAAI,CAAC,CA+Cf"}
@@ -0,0 +1,60 @@
1
+ import fs from "fs";
2
+ import path from "path";
3
+ import { spawn } from "child_process";
4
+ import { loadConfig } from "../config/config.js";
5
+ import { compile } from "../compiler/compiler.js";
6
+ import { logSuccess, logError, logInfo } from "../utils/console.js";
7
+ /**
8
+ * Resolve the path to a locally installed binary in node_modules/.bin.
9
+ * Returns the binary name as a fallback if not found locally.
10
+ */
11
+ function resolveLocalBin(projectRoot, bin) {
12
+ const localPath = path.join(projectRoot, "node_modules", ".bin", bin);
13
+ if (fs.existsSync(localPath)) {
14
+ return localPath;
15
+ }
16
+ return bin;
17
+ }
18
+ /**
19
+ * The `skittles test` command.
20
+ * 1. Compiles all contracts (same as `skittles compile`)
21
+ * 2. Runs hardhat test
22
+ */
23
+ export async function testCommand(projectRoot, watch) {
24
+ // Step 1: Compile contracts
25
+ logInfo("Compiling contracts before running tests...");
26
+ try {
27
+ const config = await loadConfig(projectRoot);
28
+ const result = await compile(projectRoot, config);
29
+ if (!result.success) {
30
+ for (const error of result.errors) {
31
+ logError(error);
32
+ }
33
+ process.exit(1);
34
+ }
35
+ logSuccess(`${result.artifacts.length} contract(s) compiled successfully`);
36
+ }
37
+ catch (err) {
38
+ const message = err instanceof Error ? err.message : "Unknown error occurred";
39
+ logError(`Compilation failed: ${message}`);
40
+ process.exit(1);
41
+ }
42
+ // Step 2: Run hardhat test using the locally installed binary
43
+ logInfo(watch ? "Starting tests in watch mode..." : "Running tests...");
44
+ const hardhatBin = resolveLocalBin(projectRoot, "hardhat");
45
+ const args = watch ? ["test", "--watch"] : ["test"];
46
+ const child = spawn(hardhatBin, args, {
47
+ cwd: projectRoot,
48
+ stdio: "inherit",
49
+ shell: true,
50
+ });
51
+ child.on("close", (code) => {
52
+ process.exit(code ?? 0);
53
+ });
54
+ child.on("error", (err) => {
55
+ logError(`Failed to start hardhat: ${err.message}`);
56
+ logInfo("Make sure hardhat is installed: npm install --save-dev hardhat");
57
+ process.exit(1);
58
+ });
59
+ }
60
+ //# sourceMappingURL=test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test.js","sourceRoot":"","sources":["../../src/commands/test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAEpE;;;GAGG;AACH,SAAS,eAAe,CAAC,WAAmB,EAAE,GAAW;IACvD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;IACtE,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7B,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,WAAmB,EACnB,KAAc;IAEd,4BAA4B;IAC5B,OAAO,CAAC,6CAA6C,CAAC,CAAC;IAEvD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,WAAW,CAAC,CAAC;QAC7C,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QAElD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBAClC,QAAQ,CAAC,KAAK,CAAC,CAAC;YAClB,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,UAAU,CACR,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,oCAAoC,CAC/D,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GACX,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,wBAAwB,CAAC;QAChE,QAAQ,CAAC,uBAAuB,OAAO,EAAE,CAAC,CAAC;QAC3C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,8DAA8D;IAC9D,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,iCAAiC,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC;IAExE,MAAM,UAAU,GAAG,eAAe,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;IAC3D,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IACpD,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,EAAE,IAAI,EAAE;QACpC,GAAG,EAAE,WAAW;QAChB,KAAK,EAAE,SAAS;QAChB,KAAK,EAAE,IAAI;KACZ,CAAC,CAAC;IAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;QACzB,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;QACxB,QAAQ,CAAC,4BAA4B,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QACpD,OAAO,CACL,gEAAgE,CACjE,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { SkittlesFunction, SkittlesConstructor } from "../types/index.ts";
2
+ /**
3
+ * Analyze a function body for unreachable code and unused local variables.
4
+ * Returns an array of warning strings.
5
+ */
6
+ export declare function analyzeFunction(fn: SkittlesFunction | SkittlesConstructor, contractName: string): string[];
7
+ //# sourceMappingURL=analysis.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analysis.d.ts","sourceRoot":"","sources":["../../src/compiler/analysis.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAyB,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAEtG;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,EAAE,EAAE,gBAAgB,GAAG,mBAAmB,EAC1C,YAAY,EAAE,MAAM,GACnB,MAAM,EAAE,CAQV"}
@@ -0,0 +1,234 @@
1
+ /**
2
+ * Analyze a function body for unreachable code and unused local variables.
3
+ * Returns an array of warning strings.
4
+ */
5
+ export function analyzeFunction(fn, contractName) {
6
+ const warnings = [];
7
+ const name = "name" in fn ? fn.name : "constructor";
8
+ warnings.push(...checkUnreachableCode(fn.body, contractName, name));
9
+ warnings.push(...checkUnusedVariables(fn.body, fn.parameters.map((p) => p.name), contractName, name));
10
+ return warnings;
11
+ }
12
+ /**
13
+ * Check for unreachable code after return, throw (revert), break, or continue statements.
14
+ */
15
+ function checkUnreachableCode(statements, contractName, functionName) {
16
+ const warnings = [];
17
+ function checkBlock(stmts) {
18
+ for (let i = 0; i < stmts.length; i++) {
19
+ const stmt = stmts[i];
20
+ if (isTerminating(stmt) && i < stmts.length - 1) {
21
+ warnings.push(`${contractName}.${functionName}: Unreachable code after '${stmt.kind === "revert" ? "throw" : stmt.kind}' statement`);
22
+ break;
23
+ }
24
+ // Recurse into nested blocks
25
+ walkNestedBlocks(stmt, checkBlock);
26
+ }
27
+ }
28
+ checkBlock(statements);
29
+ return warnings;
30
+ }
31
+ /**
32
+ * Returns true if a statement always terminates execution flow (return, revert, break, continue).
33
+ */
34
+ function isTerminating(stmt) {
35
+ return (stmt.kind === "return" ||
36
+ stmt.kind === "revert" ||
37
+ stmt.kind === "break" ||
38
+ stmt.kind === "continue");
39
+ }
40
+ /**
41
+ * Recurse into nested blocks of a statement.
42
+ */
43
+ function walkNestedBlocks(stmt, visitor) {
44
+ switch (stmt.kind) {
45
+ case "if":
46
+ visitor(stmt.thenBody);
47
+ if (stmt.elseBody)
48
+ visitor(stmt.elseBody);
49
+ break;
50
+ case "for":
51
+ visitor(stmt.body);
52
+ break;
53
+ case "while":
54
+ visitor(stmt.body);
55
+ break;
56
+ case "do-while":
57
+ visitor(stmt.body);
58
+ break;
59
+ case "switch":
60
+ for (const c of stmt.cases) {
61
+ visitor(c.body);
62
+ }
63
+ break;
64
+ case "try-catch":
65
+ visitor(stmt.successBody);
66
+ visitor(stmt.catchBody);
67
+ break;
68
+ }
69
+ }
70
+ /**
71
+ * Check for unused local variables in a function body.
72
+ * A variable is considered unused if it is declared but never referenced
73
+ * in any expression (including in nested blocks).
74
+ */
75
+ function checkUnusedVariables(statements, parameterNames, contractName, functionName) {
76
+ const warnings = [];
77
+ const declared = new Set();
78
+ const used = new Set();
79
+ // Collect all variable declarations and identifier usages
80
+ walkAllStatements(statements, declared, used);
81
+ // Only warn about declared locals that are never used in any expression
82
+ // Skip parameters – they may be required by an interface signature
83
+ for (const name of declared) {
84
+ if (!used.has(name) && !parameterNames.includes(name)) {
85
+ warnings.push(`${contractName}.${functionName}: Unused variable '${name}'`);
86
+ }
87
+ }
88
+ return warnings;
89
+ }
90
+ /**
91
+ * Walk all statements recursively, collecting declared variable names
92
+ * and used identifier names.
93
+ */
94
+ function walkAllStatements(stmts, declared, used) {
95
+ for (const stmt of stmts) {
96
+ switch (stmt.kind) {
97
+ case "variable-declaration":
98
+ declared.add(stmt.name);
99
+ if (stmt.initializer)
100
+ collectUsedIdentifiers(stmt.initializer, used);
101
+ break;
102
+ case "return":
103
+ if (stmt.value)
104
+ collectUsedIdentifiers(stmt.value, used);
105
+ break;
106
+ case "expression":
107
+ collectUsedIdentifiers(stmt.expression, used);
108
+ break;
109
+ case "if":
110
+ collectUsedIdentifiers(stmt.condition, used);
111
+ walkAllStatements(stmt.thenBody, declared, used);
112
+ if (stmt.elseBody)
113
+ walkAllStatements(stmt.elseBody, declared, used);
114
+ break;
115
+ case "for":
116
+ if (stmt.initializer) {
117
+ if (stmt.initializer.kind === "variable-declaration") {
118
+ declared.add(stmt.initializer.name);
119
+ if (stmt.initializer.initializer)
120
+ collectUsedIdentifiers(stmt.initializer.initializer, used);
121
+ }
122
+ else {
123
+ collectUsedIdentifiers(stmt.initializer.expression, used);
124
+ }
125
+ }
126
+ if (stmt.condition)
127
+ collectUsedIdentifiers(stmt.condition, used);
128
+ if (stmt.incrementor)
129
+ collectUsedIdentifiers(stmt.incrementor, used);
130
+ walkAllStatements(stmt.body, declared, used);
131
+ break;
132
+ case "while":
133
+ collectUsedIdentifiers(stmt.condition, used);
134
+ walkAllStatements(stmt.body, declared, used);
135
+ break;
136
+ case "do-while":
137
+ collectUsedIdentifiers(stmt.condition, used);
138
+ walkAllStatements(stmt.body, declared, used);
139
+ break;
140
+ case "revert":
141
+ if (stmt.message)
142
+ collectUsedIdentifiers(stmt.message, used);
143
+ if (stmt.customErrorArgs) {
144
+ for (const arg of stmt.customErrorArgs) {
145
+ collectUsedIdentifiers(arg, used);
146
+ }
147
+ }
148
+ break;
149
+ case "emit":
150
+ for (const arg of stmt.args) {
151
+ collectUsedIdentifiers(arg, used);
152
+ }
153
+ break;
154
+ case "switch":
155
+ collectUsedIdentifiers(stmt.discriminant, used);
156
+ for (const c of stmt.cases) {
157
+ if (c.value)
158
+ collectUsedIdentifiers(c.value, used);
159
+ walkAllStatements(c.body, declared, used);
160
+ }
161
+ break;
162
+ case "delete":
163
+ collectUsedIdentifiers(stmt.target, used);
164
+ break;
165
+ case "try-catch":
166
+ collectUsedIdentifiers(stmt.call, used);
167
+ if (stmt.returnVarName)
168
+ declared.add(stmt.returnVarName);
169
+ walkAllStatements(stmt.successBody, declared, used);
170
+ walkAllStatements(stmt.catchBody, declared, used);
171
+ break;
172
+ case "console-log":
173
+ for (const arg of stmt.args) {
174
+ collectUsedIdentifiers(arg, used);
175
+ }
176
+ break;
177
+ }
178
+ }
179
+ }
180
+ /**
181
+ * Collect all identifier names used in an expression.
182
+ */
183
+ function collectUsedIdentifiers(expr, used) {
184
+ switch (expr.kind) {
185
+ case "identifier":
186
+ used.add(expr.name);
187
+ break;
188
+ case "binary":
189
+ collectUsedIdentifiers(expr.left, used);
190
+ collectUsedIdentifiers(expr.right, used);
191
+ break;
192
+ case "unary":
193
+ collectUsedIdentifiers(expr.operand, used);
194
+ break;
195
+ case "assignment":
196
+ collectUsedIdentifiers(expr.target, used);
197
+ collectUsedIdentifiers(expr.value, used);
198
+ break;
199
+ case "call":
200
+ collectUsedIdentifiers(expr.callee, used);
201
+ for (const arg of expr.args) {
202
+ collectUsedIdentifiers(arg, used);
203
+ }
204
+ break;
205
+ case "property-access":
206
+ collectUsedIdentifiers(expr.object, used);
207
+ break;
208
+ case "element-access":
209
+ collectUsedIdentifiers(expr.object, used);
210
+ collectUsedIdentifiers(expr.index, used);
211
+ break;
212
+ case "conditional":
213
+ collectUsedIdentifiers(expr.condition, used);
214
+ collectUsedIdentifiers(expr.whenTrue, used);
215
+ collectUsedIdentifiers(expr.whenFalse, used);
216
+ break;
217
+ case "new":
218
+ for (const arg of expr.args) {
219
+ collectUsedIdentifiers(arg, used);
220
+ }
221
+ break;
222
+ case "object-literal":
223
+ for (const prop of expr.properties) {
224
+ collectUsedIdentifiers(prop.value, used);
225
+ }
226
+ break;
227
+ case "tuple-literal":
228
+ for (const elem of expr.elements) {
229
+ collectUsedIdentifiers(elem, used);
230
+ }
231
+ break;
232
+ }
233
+ }
234
+ //# sourceMappingURL=analysis.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analysis.js","sourceRoot":"","sources":["../../src/compiler/analysis.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,UAAU,eAAe,CAC7B,EAA0C,EAC1C,YAAoB;IAEpB,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,IAAI,GAAG,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC;IAEpD,QAAQ,CAAC,IAAI,CAAC,GAAG,oBAAoB,CAAC,EAAE,CAAC,IAAI,EAAE,YAAY,EAAE,IAAI,CAAC,CAAC,CAAC;IACpE,QAAQ,CAAC,IAAI,CAAC,GAAG,oBAAoB,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,YAAY,EAAE,IAAI,CAAC,CAAC,CAAC;IAEtG,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,SAAS,oBAAoB,CAC3B,UAAuB,EACvB,YAAoB,EACpB,YAAoB;IAEpB,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,SAAS,UAAU,CAAC,KAAkB;QACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAEtB,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAChD,QAAQ,CAAC,IAAI,CACX,GAAG,YAAY,IAAI,YAAY,6BAA6B,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,aAAa,CACtH,CAAC;gBACF,MAAM;YACR,CAAC;YAED,6BAA6B;YAC7B,gBAAgB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IAED,UAAU,CAAC,UAAU,CAAC,CAAC;IACvB,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,SAAS,aAAa,CAAC,IAAe;IACpC,OAAO,CACL,IAAI,CAAC,IAAI,KAAK,QAAQ;QACtB,IAAI,CAAC,IAAI,KAAK,QAAQ;QACtB,IAAI,CAAC,IAAI,KAAK,OAAO;QACrB,IAAI,CAAC,IAAI,KAAK,UAAU,CACzB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CACvB,IAAe,EACf,OAAqC;IAErC,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,KAAK,IAAI;YACP,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACvB,IAAI,IAAI,CAAC,QAAQ;gBAAE,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC1C,MAAM;QACR,KAAK,KAAK;YACR,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnB,MAAM;QACR,KAAK,OAAO;YACV,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnB,MAAM;QACR,KAAK,UAAU;YACb,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnB,MAAM;QACR,KAAK,QAAQ;YACX,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;gBAC3B,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAClB,CAAC;YACD,MAAM;QACR,KAAK,WAAW;YACd,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAC1B,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACxB,MAAM;IACV,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,SAAS,oBAAoB,CAC3B,UAAuB,EACvB,cAAwB,EACxB,YAAoB,EACpB,YAAoB;IAEpB,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IACnC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAE/B,0DAA0D;IAC1D,iBAAiB,CAAC,UAAU,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;IAE9C,wEAAwE;IACxE,mEAAmE;IACnE,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC5B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACtD,QAAQ,CAAC,IAAI,CACX,GAAG,YAAY,IAAI,YAAY,sBAAsB,IAAI,GAAG,CAC7D,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;GAGG;AACH,SAAS,iBAAiB,CACxB,KAAkB,EAClB,QAAqB,EACrB,IAAiB;IAEjB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;YAClB,KAAK,sBAAsB;gBACzB,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACxB,IAAI,IAAI,CAAC,WAAW;oBAAE,sBAAsB,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;gBACrE,MAAM;YACR,KAAK,QAAQ;gBACX,IAAI,IAAI,CAAC,KAAK;oBAAE,sBAAsB,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;gBACzD,MAAM;YACR,KAAK,YAAY;gBACf,sBAAsB,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;gBAC9C,MAAM;YACR,KAAK,IAAI;gBACP,sBAAsB,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;gBAC7C,iBAAiB,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;gBACjD,IAAI,IAAI,CAAC,QAAQ;oBAAE,iBAAiB,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;gBACpE,MAAM;YACR,KAAK,KAAK;gBACR,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;oBACrB,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,KAAK,sBAAsB,EAAE,CAAC;wBACrD,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;wBACpC,IAAI,IAAI,CAAC,WAAW,CAAC,WAAW;4BAC9B,sBAAsB,CAAC,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;oBAC/D,CAAC;yBAAM,CAAC;wBACN,sBAAsB,CAAC,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;oBAC5D,CAAC;gBACH,CAAC;gBACD,IAAI,IAAI,CAAC,SAAS;oBAAE,sBAAsB,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;gBACjE,IAAI,IAAI,CAAC,WAAW;oBAAE,sBAAsB,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;gBACrE,iBAAiB,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;gBAC7C,MAAM;YACR,KAAK,OAAO;gBACV,sBAAsB,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;gBAC7C,iBAAiB,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;gBAC7C,MAAM;YACR,KAAK,UAAU;gBACb,sBAAsB,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;gBAC7C,iBAAiB,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;gBAC7C,MAAM;YACR,KAAK,QAAQ;gBACX,IAAI,IAAI,CAAC,OAAO;oBAAE,sBAAsB,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;gBAC7D,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;oBACzB,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;wBACvC,sBAAsB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;oBACpC,CAAC;gBACH,CAAC;gBACD,MAAM;YACR,KAAK,MAAM;gBACT,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;oBAC5B,sBAAsB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;gBACpC,CAAC;gBACD,MAAM;YACR,KAAK,QAAQ;gBACX,sBAAsB,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;gBAChD,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;oBAC3B,IAAI,CAAC,CAAC,KAAK;wBAAE,sBAAsB,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;oBACnD,iBAAiB,CAAC,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;gBAC5C,CAAC;gBACD,MAAM;YACR,KAAK,QAAQ;gBACX,sBAAsB,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;gBAC1C,MAAM;YACR,KAAK,WAAW;gBACd,sBAAsB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;gBACxC,IAAI,IAAI,CAAC,aAAa;oBAAE,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;gBACzD,iBAAiB,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;gBACpD,iBAAiB,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;gBAClD,MAAM;YACR,KAAK,aAAa;gBAChB,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;oBAC5B,sBAAsB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;gBACpC,CAAC;gBACD,MAAM;QACV,CAAC;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,sBAAsB,CAAC,IAAgB,EAAE,IAAiB;IACjE,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,KAAK,YAAY;YACf,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACpB,MAAM;QACR,KAAK,QAAQ;YACX,sBAAsB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YACxC,sBAAsB,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YACzC,MAAM;QACR,KAAK,OAAO;YACV,sBAAsB,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YAC3C,MAAM;QACR,KAAK,YAAY;YACf,sBAAsB,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YAC1C,sBAAsB,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YACzC,MAAM;QACR,KAAK,MAAM;YACT,sBAAsB,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YAC1C,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBAC5B,sBAAsB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YACpC,CAAC;YACD,MAAM;QACR,KAAK,iBAAiB;YACpB,sBAAsB,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YAC1C,MAAM;QACR,KAAK,gBAAgB;YACnB,sBAAsB,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YAC1C,sBAAsB,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YACzC,MAAM;QACR,KAAK,aAAa;YAChB,sBAAsB,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;YAC7C,sBAAsB,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YAC5C,sBAAsB,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;YAC7C,MAAM;QACR,KAAK,KAAK;YACR,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBAC5B,sBAAsB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YACpC,CAAC;YACD,MAAM;QACR,KAAK,gBAAgB;YACnB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;gBACnC,sBAAsB,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YAC3C,CAAC;YACD,MAAM;QACR,KAAK,eAAe;YAClB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACjC,sBAAsB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YACrC,CAAC;YACD,MAAM;IACV,CAAC;AACH,CAAC"}
@@ -1,4 +1,4 @@
1
- import { type SkittlesContract, type SkittlesType, type Statement, type Expression } from "../types/index.ts";
1
+ import { type SkittlesContract, type SkittlesType, type Statement, type Expression, type SourceMapping } from "../types/index.ts";
2
2
  /**
3
3
  * Generate a Solidity file containing multiple contracts.
4
4
  * Used when a single source file defines multiple classes (e.g., for inheritance).
@@ -8,4 +8,13 @@ export declare function generateSolidity(contract: SkittlesContract, imports?: s
8
8
  export declare function generateType(type: SkittlesType): string;
9
9
  export declare function generateExpression(expr: Expression): string;
10
10
  export declare function generateStatement(stmt: Statement, indent: string): string;
11
+ /**
12
+ * Build a source map that maps generated Solidity line numbers
13
+ * back to TypeScript source line numbers.
14
+ *
15
+ * The mapping is built by walking the IR (which has source line info
16
+ * from the parser) and counting lines in the generated Solidity output
17
+ * to correlate each Solidity line with its TypeScript origin.
18
+ */
19
+ export declare function buildSourceMap(solidity: string, contracts: SkittlesContract[], sourceFile: string): SourceMapping;
11
20
  //# sourceMappingURL=codegen.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"codegen.d.ts","sourceRoot":"","sources":["../../src/compiler/codegen.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,gBAAgB,EAKrB,KAAK,YAAY,EAEjB,KAAK,SAAS,EACd,KAAK,UAAU,EAKhB,MAAM,mBAAmB,CAAC;AAM3B;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,gBAAgB,EAAE,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAwE9F;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAEvF;AAqPD,wBAAgB,YAAY,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CA+BvD;AA+BD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAmE3D;AAMD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAiKzE"}
1
+ {"version":3,"file":"codegen.d.ts","sourceRoot":"","sources":["../../src/compiler/codegen.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,gBAAgB,EAKrB,KAAK,YAAY,EAEjB,KAAK,SAAS,EACd,KAAK,UAAU,EAKf,KAAK,aAAa,EACnB,MAAM,mBAAmB,CAAC;AAM3B;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,gBAAgB,EAAE,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAoH9F;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAEvF;AA0XD,wBAAgB,YAAY,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CAiCvD;AA+BD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAiF3D;AAMD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAuLzE;AAqKD;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,gBAAgB,EAAE,EAC7B,UAAU,EAAE,MAAM,GACjB,aAAa,CA8Hf"}