From 8787c66ced437fbe839e329289185bb30738e6dc Mon Sep 17 00:00:00 2001
From: "google-labs-jules[bot]"
<161369871+google-labs-jules[bot]@users.noreply.github.com>
Date: Fri, 16 Oct 2026 07:56:29 +0000
Subject: [PATCH 1/7] Add functions with parameters and return values and
module import system
Co-authored-by: zs-3 <175098101+zs-3@users.noreply.github.com>
---
Source/SmallBasic.Bridge/Bridge.Generated.cs | 512 +-
.../Bridge/Bridge.Generated.ts | 214 +-
.../Interop/CSInterop.Generated.ts | 90 +-
.../Interop/JSInterop.Generated.ts | 260 +-
Source/SmallBasic.Compiler/Binding/Binder.cs | 44 +-
.../Binding/BoundNodes.Generated.cs | 2469 ++--
.../Diagnostics/DiagnosticBag.Generated.cs | 260 +-
.../Diagnostics/DiagnosticCode.Generated.cs | 142 +-
Source/SmallBasic.Compiler/Parsing/Parser.cs | 84 +-
.../Parsing/SyntaxNodes.Generated.cs | 3237 ++---
.../Visitors/SubModuleNamesCollector.cs | 5 +
Source/SmallBasic.Compiler/Runtime/Frame.cs | 5 +-
.../Runtime/Instructions/OtherInstructions.cs | 45 +-
.../Runtime/Libraries/BuiltInLibraries.cs | 116 +
.../Runtime/Libraries/Libraries.Generated.cs | 10366 ++++++++--------
.../Libraries.Interfaces.Generated.cs | 1078 +-
.../Runtime/ModuleEmitter.cs | 28 +-
.../Runtime/RuntimeModule.cs | 7 +-
.../SmallBasic.Compiler/Scanning/Scanner.cs | 6 +
.../Scanning/TokenKind.Generated.cs | 218 +-
.../Services/CompletionItemProvider.cs | 8 +
.../SmallBasicCompilation.cs | 72 +-
.../SmallBasic.Compiler/SmallBasicEngine.cs | 8 +-
.../Bridge/Bridge.Generated.cs | 220 +-
.../Interop/CSInterop.Generated.cs | 154 +-
.../Interop/JSInterop.Generated.cs | 246 +-
.../SmallBasic.Editor.csproj | 10 +-
.../Binding/BoundNodes.xml | 9 +
.../Parsing/SyntaxNodes.xml | 33 +
.../Scanning/TokenKinds.xml | 8 +
.../SmallBasic.Generators.csproj | 2 +-
.../LoggingTestLibraries.Generated.cs | 2784 ++---
.../Runtime/NewFeaturesTests.cs | 78 +
.../SmallBasic.Tests/SmallBasic.Tests.csproj | 3 +-
Source/SmallBasic.Tests/TestExtensions.cs | 8 +-
global.json | 3 +-
36 files changed, 11828 insertions(+), 11004 deletions(-)
create mode 100644 Source/SmallBasic.Compiler/Runtime/Libraries/BuiltInLibraries.cs
create mode 100644 Source/SmallBasic.Tests/Runtime/NewFeaturesTests.cs
diff --git a/Source/SmallBasic.Bridge/Bridge.Generated.cs b/Source/SmallBasic.Bridge/Bridge.Generated.cs
index 1e1355fc..e31df342 100644
--- a/Source/SmallBasic.Bridge/Bridge.Generated.cs
+++ b/Source/SmallBasic.Bridge/Bridge.Generated.cs
@@ -1,256 +1,256 @@
-//
-// Licensed under the MIT License. See LICENSE file in the project root for license information.
-//
-
-///
-/// This file is auto-generated by a build task. It shouldn't be edited by hand.
-///
-namespace SmallBasic.Bridge
-{
- using System.Diagnostics;
- using Newtonsoft.Json;
- using SmallBasic.Utilities;
- using SmallBasic.Utilities.Bridge;
-
- internal interface IProcessBridge
- {
- void OpenExternalLink(string url);
- }
-
- internal interface IFileBridge
- {
- FileBridgeModels.Result AppendContents(FileBridgeModels.PathAndContentsArgs args);
-
- FileBridgeModels.Result CopyFile(FileBridgeModels.SourceAndDestinationArgs args);
-
- FileBridgeModels.Result CreateDirectory(string directoryPath);
-
- FileBridgeModels.Result DeleteDirectory(string directoryPath);
-
- FileBridgeModels.Result DeleteFile(string filePath);
-
- FileBridgeModels.Result GetDirectories(string directoryPath);
-
- FileBridgeModels.Result GetFiles(string directoryPath);
-
- FileBridgeModels.Result GetTemporaryFilePath();
-
- FileBridgeModels.Result InsertLine(FileBridgeModels.PathAndLineAndContentsArgs args);
-
- FileBridgeModels.Result ReadContents(string filePath);
-
- FileBridgeModels.Result ReadLine(FileBridgeModels.PathAndLineArgs args);
-
- FileBridgeModels.Result WriteContents(FileBridgeModels.PathAndContentsArgs args);
-
- FileBridgeModels.Result WriteLine(FileBridgeModels.PathAndLineAndContentsArgs args);
- }
-
- internal interface INetworkBridge
- {
- ImageListBridgeModels.ImageData LoadImage(string fileNameOrUrl);
-
- string DownloadFile(string url);
-
- string GetWebPageContents(string url);
- }
-
- internal static class BridgeExecution
- {
- private static readonly IProcessBridge Process = new ProcessBridge();
-
- private static readonly IFileBridge File = new FileBridge();
-
- private static readonly INetworkBridge Network = new NetworkBridge();
-
- public static void Run(string[] args)
- {
- Debug.Assert(args.Length >= 2, "Only intended for bridge calls");
-
- string type = args[0];
- string method = args[1];
- string filePath = args.Length > 2 ? args[2] : null;
-
- switch (type)
- {
- case "Process":
- {
- switch (method)
- {
- case "OpenExternalLink":
- {
- string input = JsonConvert.DeserializeObject(System.IO.File.ReadAllText(filePath));
- Process.OpenExternalLink(input);
- break;
- }
-
- default:
- {
- throw ExceptionUtilities.UnexpectedValue(method);
- }
- }
-
- break;
- }
-
- case "File":
- {
- switch (method)
- {
- case "AppendContents":
- {
- FileBridgeModels.PathAndContentsArgs input = JsonConvert.DeserializeObject(System.IO.File.ReadAllText(filePath));
- FileBridgeModels.Result output = File.AppendContents(input);
- System.IO.File.WriteAllText(filePath, JsonConvert.SerializeObject(output));
- break;
- }
-
- case "CopyFile":
- {
- FileBridgeModels.SourceAndDestinationArgs input = JsonConvert.DeserializeObject(System.IO.File.ReadAllText(filePath));
- FileBridgeModels.Result output = File.CopyFile(input);
- System.IO.File.WriteAllText(filePath, JsonConvert.SerializeObject(output));
- break;
- }
-
- case "CreateDirectory":
- {
- string input = JsonConvert.DeserializeObject(System.IO.File.ReadAllText(filePath));
- FileBridgeModels.Result output = File.CreateDirectory(input);
- System.IO.File.WriteAllText(filePath, JsonConvert.SerializeObject(output));
- break;
- }
-
- case "DeleteDirectory":
- {
- string input = JsonConvert.DeserializeObject(System.IO.File.ReadAllText(filePath));
- FileBridgeModels.Result output = File.DeleteDirectory(input);
- System.IO.File.WriteAllText(filePath, JsonConvert.SerializeObject(output));
- break;
- }
-
- case "DeleteFile":
- {
- string input = JsonConvert.DeserializeObject(System.IO.File.ReadAllText(filePath));
- FileBridgeModels.Result output = File.DeleteFile(input);
- System.IO.File.WriteAllText(filePath, JsonConvert.SerializeObject(output));
- break;
- }
-
- case "GetDirectories":
- {
- string input = JsonConvert.DeserializeObject(System.IO.File.ReadAllText(filePath));
- FileBridgeModels.Result output = File.GetDirectories(input);
- System.IO.File.WriteAllText(filePath, JsonConvert.SerializeObject(output));
- break;
- }
-
- case "GetFiles":
- {
- string input = JsonConvert.DeserializeObject(System.IO.File.ReadAllText(filePath));
- FileBridgeModels.Result output = File.GetFiles(input);
- System.IO.File.WriteAllText(filePath, JsonConvert.SerializeObject(output));
- break;
- }
-
- case "GetTemporaryFilePath":
- {
- FileBridgeModels.Result output = File.GetTemporaryFilePath();
- System.IO.File.WriteAllText(filePath, JsonConvert.SerializeObject(output));
- break;
- }
-
- case "InsertLine":
- {
- FileBridgeModels.PathAndLineAndContentsArgs input = JsonConvert.DeserializeObject(System.IO.File.ReadAllText(filePath));
- FileBridgeModels.Result output = File.InsertLine(input);
- System.IO.File.WriteAllText(filePath, JsonConvert.SerializeObject(output));
- break;
- }
-
- case "ReadContents":
- {
- string input = JsonConvert.DeserializeObject(System.IO.File.ReadAllText(filePath));
- FileBridgeModels.Result output = File.ReadContents(input);
- System.IO.File.WriteAllText(filePath, JsonConvert.SerializeObject(output));
- break;
- }
-
- case "ReadLine":
- {
- FileBridgeModels.PathAndLineArgs input = JsonConvert.DeserializeObject(System.IO.File.ReadAllText(filePath));
- FileBridgeModels.Result output = File.ReadLine(input);
- System.IO.File.WriteAllText(filePath, JsonConvert.SerializeObject(output));
- break;
- }
-
- case "WriteContents":
- {
- FileBridgeModels.PathAndContentsArgs input = JsonConvert.DeserializeObject(System.IO.File.ReadAllText(filePath));
- FileBridgeModels.Result output = File.WriteContents(input);
- System.IO.File.WriteAllText(filePath, JsonConvert.SerializeObject(output));
- break;
- }
-
- case "WriteLine":
- {
- FileBridgeModels.PathAndLineAndContentsArgs input = JsonConvert.DeserializeObject(System.IO.File.ReadAllText(filePath));
- FileBridgeModels.Result output = File.WriteLine(input);
- System.IO.File.WriteAllText(filePath, JsonConvert.SerializeObject(output));
- break;
- }
-
- default:
- {
- throw ExceptionUtilities.UnexpectedValue(method);
- }
- }
-
- break;
- }
-
- case "Network":
- {
- switch (method)
- {
- case "LoadImage":
- {
- string input = JsonConvert.DeserializeObject(System.IO.File.ReadAllText(filePath));
- ImageListBridgeModels.ImageData output = Network.LoadImage(input);
- System.IO.File.WriteAllText(filePath, JsonConvert.SerializeObject(output));
- break;
- }
-
- case "DownloadFile":
- {
- string input = JsonConvert.DeserializeObject(System.IO.File.ReadAllText(filePath));
- string output = Network.DownloadFile(input);
- System.IO.File.WriteAllText(filePath, JsonConvert.SerializeObject(output));
- break;
- }
-
- case "GetWebPageContents":
- {
- string input = JsonConvert.DeserializeObject(System.IO.File.ReadAllText(filePath));
- string output = Network.GetWebPageContents(input);
- System.IO.File.WriteAllText(filePath, JsonConvert.SerializeObject(output));
- break;
- }
-
- default:
- {
- throw ExceptionUtilities.UnexpectedValue(method);
- }
- }
-
- break;
- }
-
- default:
- {
- throw ExceptionUtilities.UnexpectedValue(type);
- }
- }
- }
- }
-}
+//
+// Licensed under the MIT License. See LICENSE file in the project root for license information.
+//
+
+///
+/// This file is auto-generated by a build task. It shouldn't be edited by hand.
+///
+namespace SmallBasic.Bridge
+{
+ using System.Diagnostics;
+ using Newtonsoft.Json;
+ using SmallBasic.Utilities;
+ using SmallBasic.Utilities.Bridge;
+
+ internal interface IProcessBridge
+ {
+ void OpenExternalLink(string url);
+ }
+
+ internal interface IFileBridge
+ {
+ FileBridgeModels.Result AppendContents(FileBridgeModels.PathAndContentsArgs args);
+
+ FileBridgeModels.Result CopyFile(FileBridgeModels.SourceAndDestinationArgs args);
+
+ FileBridgeModels.Result CreateDirectory(string directoryPath);
+
+ FileBridgeModels.Result DeleteDirectory(string directoryPath);
+
+ FileBridgeModels.Result DeleteFile(string filePath);
+
+ FileBridgeModels.Result GetDirectories(string directoryPath);
+
+ FileBridgeModels.Result GetFiles(string directoryPath);
+
+ FileBridgeModels.Result GetTemporaryFilePath();
+
+ FileBridgeModels.Result InsertLine(FileBridgeModels.PathAndLineAndContentsArgs args);
+
+ FileBridgeModels.Result ReadContents(string filePath);
+
+ FileBridgeModels.Result ReadLine(FileBridgeModels.PathAndLineArgs args);
+
+ FileBridgeModels.Result WriteContents(FileBridgeModels.PathAndContentsArgs args);
+
+ FileBridgeModels.Result WriteLine(FileBridgeModels.PathAndLineAndContentsArgs args);
+ }
+
+ internal interface INetworkBridge
+ {
+ ImageListBridgeModels.ImageData LoadImage(string fileNameOrUrl);
+
+ string DownloadFile(string url);
+
+ string GetWebPageContents(string url);
+ }
+
+ internal static class BridgeExecution
+ {
+ private static readonly IProcessBridge Process = new ProcessBridge();
+
+ private static readonly IFileBridge File = new FileBridge();
+
+ private static readonly INetworkBridge Network = new NetworkBridge();
+
+ public static void Run(string[] args)
+ {
+ Debug.Assert(args.Length >= 2, "Only intended for bridge calls");
+
+ string type = args[0];
+ string method = args[1];
+ string filePath = args.Length > 2 ? args[2] : null;
+
+ switch (type)
+ {
+ case "Process":
+ {
+ switch (method)
+ {
+ case "OpenExternalLink":
+ {
+ string input = JsonConvert.DeserializeObject(System.IO.File.ReadAllText(filePath));
+ Process.OpenExternalLink(input);
+ break;
+ }
+
+ default:
+ {
+ throw ExceptionUtilities.UnexpectedValue(method);
+ }
+ }
+
+ break;
+ }
+
+ case "File":
+ {
+ switch (method)
+ {
+ case "AppendContents":
+ {
+ FileBridgeModels.PathAndContentsArgs input = JsonConvert.DeserializeObject(System.IO.File.ReadAllText(filePath));
+ FileBridgeModels.Result output = File.AppendContents(input);
+ System.IO.File.WriteAllText(filePath, JsonConvert.SerializeObject(output));
+ break;
+ }
+
+ case "CopyFile":
+ {
+ FileBridgeModels.SourceAndDestinationArgs input = JsonConvert.DeserializeObject(System.IO.File.ReadAllText(filePath));
+ FileBridgeModels.Result output = File.CopyFile(input);
+ System.IO.File.WriteAllText(filePath, JsonConvert.SerializeObject(output));
+ break;
+ }
+
+ case "CreateDirectory":
+ {
+ string input = JsonConvert.DeserializeObject(System.IO.File.ReadAllText(filePath));
+ FileBridgeModels.Result output = File.CreateDirectory(input);
+ System.IO.File.WriteAllText(filePath, JsonConvert.SerializeObject(output));
+ break;
+ }
+
+ case "DeleteDirectory":
+ {
+ string input = JsonConvert.DeserializeObject(System.IO.File.ReadAllText(filePath));
+ FileBridgeModels.Result output = File.DeleteDirectory(input);
+ System.IO.File.WriteAllText(filePath, JsonConvert.SerializeObject(output));
+ break;
+ }
+
+ case "DeleteFile":
+ {
+ string input = JsonConvert.DeserializeObject(System.IO.File.ReadAllText(filePath));
+ FileBridgeModels.Result output = File.DeleteFile(input);
+ System.IO.File.WriteAllText(filePath, JsonConvert.SerializeObject(output));
+ break;
+ }
+
+ case "GetDirectories":
+ {
+ string input = JsonConvert.DeserializeObject(System.IO.File.ReadAllText(filePath));
+ FileBridgeModels.Result output = File.GetDirectories(input);
+ System.IO.File.WriteAllText(filePath, JsonConvert.SerializeObject(output));
+ break;
+ }
+
+ case "GetFiles":
+ {
+ string input = JsonConvert.DeserializeObject(System.IO.File.ReadAllText(filePath));
+ FileBridgeModels.Result output = File.GetFiles(input);
+ System.IO.File.WriteAllText(filePath, JsonConvert.SerializeObject(output));
+ break;
+ }
+
+ case "GetTemporaryFilePath":
+ {
+ FileBridgeModels.Result output = File.GetTemporaryFilePath();
+ System.IO.File.WriteAllText(filePath, JsonConvert.SerializeObject(output));
+ break;
+ }
+
+ case "InsertLine":
+ {
+ FileBridgeModels.PathAndLineAndContentsArgs input = JsonConvert.DeserializeObject(System.IO.File.ReadAllText(filePath));
+ FileBridgeModels.Result output = File.InsertLine(input);
+ System.IO.File.WriteAllText(filePath, JsonConvert.SerializeObject(output));
+ break;
+ }
+
+ case "ReadContents":
+ {
+ string input = JsonConvert.DeserializeObject(System.IO.File.ReadAllText(filePath));
+ FileBridgeModels.Result output = File.ReadContents(input);
+ System.IO.File.WriteAllText(filePath, JsonConvert.SerializeObject(output));
+ break;
+ }
+
+ case "ReadLine":
+ {
+ FileBridgeModels.PathAndLineArgs input = JsonConvert.DeserializeObject(System.IO.File.ReadAllText(filePath));
+ FileBridgeModels.Result output = File.ReadLine(input);
+ System.IO.File.WriteAllText(filePath, JsonConvert.SerializeObject(output));
+ break;
+ }
+
+ case "WriteContents":
+ {
+ FileBridgeModels.PathAndContentsArgs input = JsonConvert.DeserializeObject(System.IO.File.ReadAllText(filePath));
+ FileBridgeModels.Result output = File.WriteContents(input);
+ System.IO.File.WriteAllText(filePath, JsonConvert.SerializeObject(output));
+ break;
+ }
+
+ case "WriteLine":
+ {
+ FileBridgeModels.PathAndLineAndContentsArgs input = JsonConvert.DeserializeObject(System.IO.File.ReadAllText(filePath));
+ FileBridgeModels.Result output = File.WriteLine(input);
+ System.IO.File.WriteAllText(filePath, JsonConvert.SerializeObject(output));
+ break;
+ }
+
+ default:
+ {
+ throw ExceptionUtilities.UnexpectedValue(method);
+ }
+ }
+
+ break;
+ }
+
+ case "Network":
+ {
+ switch (method)
+ {
+ case "LoadImage":
+ {
+ string input = JsonConvert.DeserializeObject(System.IO.File.ReadAllText(filePath));
+ ImageListBridgeModels.ImageData output = Network.LoadImage(input);
+ System.IO.File.WriteAllText(filePath, JsonConvert.SerializeObject(output));
+ break;
+ }
+
+ case "DownloadFile":
+ {
+ string input = JsonConvert.DeserializeObject(System.IO.File.ReadAllText(filePath));
+ string output = Network.DownloadFile(input);
+ System.IO.File.WriteAllText(filePath, JsonConvert.SerializeObject(output));
+ break;
+ }
+
+ case "GetWebPageContents":
+ {
+ string input = JsonConvert.DeserializeObject(System.IO.File.ReadAllText(filePath));
+ string output = Network.GetWebPageContents(input);
+ System.IO.File.WriteAllText(filePath, JsonConvert.SerializeObject(output));
+ break;
+ }
+
+ default:
+ {
+ throw ExceptionUtilities.UnexpectedValue(method);
+ }
+ }
+
+ break;
+ }
+
+ default:
+ {
+ throw ExceptionUtilities.UnexpectedValue(type);
+ }
+ }
+ }
+ }
+}
diff --git a/Source/SmallBasic.Client/Bridge/Bridge.Generated.ts b/Source/SmallBasic.Client/Bridge/Bridge.Generated.ts
index e48a0aea..6b1c1c77 100644
--- a/Source/SmallBasic.Client/Bridge/Bridge.Generated.ts
+++ b/Source/SmallBasic.Client/Bridge/Bridge.Generated.ts
@@ -1,107 +1,107 @@
-/*!
- * Licensed under the MIT License. See LICENSE file in the project root for license information.
- */
-
-///
-/// This file is auto-generated by a build task. It shouldn't be edited by hand.
-///
-import * as fs from "fs";
-import * as os from "os";
-import * as path from "path";
-import * as child_process from "child_process";
-
-const communicationFilePath = path.join(os.tmpdir(), `bridge-comm-${Math.random().toString().split(".")[1]}.json`);
-const bridgeBinaryPath = path.resolve(__dirname, "_bridge", "SmallBasic.Bridge.dll");
-
-(global).Bridge = {
- Process: {
- OpenExternalLink: async (url: object): Promise => {
- fs.writeFileSync(communicationFilePath, JSON.stringify(url));
- child_process.execFileSync("dotnet", [bridgeBinaryPath, "Process", "OpenExternalLink", communicationFilePath]);
- return true;
- }
- },
- File: {
- AppendContents: async (args: object): Promise