working vscode lsp; added Optional
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Mon, 23 Jan 2023 17:16:50 +0000 (11:16 -0600)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Mon, 23 Jan 2023 17:16:50 +0000 (11:16 -0600)
core/container/map.onyx
core/container/optional.onyx [new file with mode: 0644]
core/container/set.onyx
core/std.onyx
misc/vscode/extension.ts
misc/vscode/onyx-0.1.4.vsix
misc/vscode/out/extension.js
shared/include/bh.h
shared/lib/linux_x86_64/lib/libovmwasm.so

index b17adb0a4810e0bc63fa78b59cd6fc1354356a63..d3dbf7d775d60af7175dccb6415e083be311fb9a 100644 (file)
@@ -1,6 +1,6 @@
 package core.map
 
-use core {array, hash, memory, math, conv}
+use core {array, hash, memory, math, conv, Optional}
 use core.intrinsics.onyx { __initialize }
 
 #local ValidKey :: interface (t: $T) {
@@ -30,7 +30,6 @@ Map :: struct (Key_Type: type_expr, Value_Type: type_expr) where ValidKey(Key_Ty
         key   : K;
         value : V;
     }
-
 }
 
 #inject Map {
@@ -38,6 +37,7 @@ Map :: struct (Key_Type: type_expr, Value_Type: type_expr) where ValidKey(Key_Ty
     has     :: has
     get     :: get
     get_ptr :: get_ptr
+    get_opt :: get_opt
     put     :: put
     delete  :: delete
     update  :: update
@@ -111,6 +111,13 @@ get_ptr :: (use map: ^Map, key: map.Key_Type) -> ^map.Value_Type {
     return null;
 }
 
+get_opt :: (use map: ^Map, key: map.Key_Type) -> Optional(map.Value_Type) {
+    lr := lookup(map, key);
+    if lr.entry_index >= 0 do return Optional.make(entries[lr.entry_index].value);
+
+    return .{};
+}
+
 delete :: (use map: ^Map, key: map.Key_Type) {
     lr := lookup(map, key);
     if lr.entry_index < 0 do return;
diff --git a/core/container/optional.onyx b/core/container/optional.onyx
new file mode 100644 (file)
index 0000000..0d51e3d
--- /dev/null
@@ -0,0 +1,64 @@
+package core
+
+@conv.Custom_Format.{ #solidify format {T=Value_Type} }
+Optional :: struct (Value_Type: type_expr) {
+    has_value: bool;
+    value: Value_Type;
+}
+
+#inject Optional {
+    make  :: (x: $T) => Optional(T).{ has_value = true, value = x };
+
+    value_or :: (o: Optional, default: o.Value_Type) -> o.Value_Type {
+        if !o.has_value do return default;
+        return o.value;
+    }
+
+    reset :: (o: ^Optional) {
+        o.has_value = false;
+        core.memory.set(^o.value, 0, sizeof o.Value_Type);
+    }
+
+    set :: (o: ^Optional, value: o.Value_Type) {
+        o.has_value = true;
+        o.value = value;
+    }
+
+    and_then :: (o: Optional($T), transform: (T) -> Optional($R)) -> Optional(R) {
+        if !o.has_value do return .{ false };
+        return transform(o.value);
+    }
+
+    transform :: (o: Optional($T), transform: (T) -> $R) -> Optional(R) {
+        if !o.has_value do return .{ false };
+        return Optional.make(transform(o.value));
+    }
+
+    or_else :: (o: Optional($T), generate: () -> Optional(T)) -> Optional(T) {
+        if o.has_value do return o;
+        return generate();
+    }
+
+    hash :: (o: Optional($T/core.hash.Hashable)) -> u32 {
+        if !o.has_value do return 0;
+        return core.hash.to_u32(o.value);
+    }
+
+    format :: (o: ^conv.Format_Output, format: ^conv.Format, opt: ^Optional($T)) {
+        if opt.has_value {
+            conv.format(o, "Some({\"})", opt.value);
+        } else {
+            o->write("None");
+        }
+    }
+}
+
+#operator == (o1, o2: Optional($T)) -> bool {
+    if o1.has_value != o2.has_value do return false;
+    if !o1.has_value do return true;
+    return o1.value == o2.value;
+}
+
+#overload
+__implicit_bool_cast :: macro (o: Optional) => o.has_value;
+
index 1ac375b342f865803f2b92a51a5571d3c575b370..6d831c2a9c26d12721bde4307b4952f28fb62232 100644 (file)
@@ -1,6 +1,6 @@
 package core.set
 
-use core {array, hash, memory, math}
+use core {array, hash, memory, math, Optional}
 
 #local SetValue :: interface (t: $T) {
     { hash.to_u32(t) } -> u32;
@@ -28,6 +28,7 @@ Set :: struct (Elem_Type: type_expr) where SetValue(Elem_Type) {
     has      :: has
     get      :: get
     get_ptr  :: get_ptr
+    get_opt  :: get_opt
     insert   :: insert
     remove   :: remove
     clear    :: clear
@@ -91,6 +92,13 @@ get_ptr :: (use set: ^Set, value: set.Elem_Type) -> ^set.Elem_Type {
     return (^entries[lr.entry_index].value) if lr.entry_index >= 0 else null;
 }
 
+get_opt :: (use set: ^Set, value: set.Elem_Type) -> Optional(set.Elem_Type) {
+    lr := lookup(set, value);
+    if lr.entry_index >= 0 do return Optional.make(entries[lr.entry_index].value);
+
+    return .{};
+}
+
 remove :: (use set: ^Set, value: set.Elem_Type) {
     lr := lookup(set, value);
     if lr.entry_index < 0 do return;
index ae198e29a0efa18de0803e104df0cd320f2e82bc..c5e4af4514276f0fa6c43123b719c1884d0a5426 100644 (file)
@@ -13,6 +13,7 @@ package core
 #load "./container/bucket_array"
 #load "./container/heap"
 #load "./container/pair"
+#load "./container/optional"
 
 #load "./conv/conv"
 #load "./conv/format"
index 0b96f75c5410388f391ec2067961ec955bcfa4e9..b02585456d5947e2398af0bc6dbd773b06072670 100644 (file)
@@ -3,7 +3,6 @@ import * as vsctmls from 'vscode-textmate-languageservice';
 
 import * as vslc2 from "vscode-languageclient";
 import * as vslc from "vscode-languageclient/node";
-import { TransportKind } from "vscode-languageclient/node";
 
 let client: vslc.LanguageClient;
 
@@ -15,27 +14,38 @@ export async function activate(context: vscode.ExtensionContext) {
        const engine = new vsctmls.textmateEngine.TextmateEngine('onyx', 'source.onyx');
        const documentSymbolProvider = new vsctmls.documentSymbols.DocumentSymbolProvider(engine);
        const workspaceSymbolProvider = new vsctmls.workspaceSymbols.WorkspaceSymbolProvider('onyx', documentSymbolProvider);
-       // const foldingProvider = new vsctmls.folding.FoldingProvider(engine);
        const peekFileDefinitionProvider = new vsctmls.peekDefinitions.PeekDefinitionProvider(documentSymbolProvider);
 
        context.subscriptions.push(vscode.languages.registerDocumentSymbolProvider(selector, documentSymbolProvider));
        context.subscriptions.push(vscode.languages.registerWorkspaceSymbolProvider(workspaceSymbolProvider));
-       // context.subscriptions.push(vscode.languages.registerFoldingRangeProvider(selector, foldingProvider));
        context.subscriptions.push(vscode.languages.registerDefinitionProvider({ 'language': 'onyx' }, peekFileDefinitionProvider));
 
-       // client = new vslc.LanguageClient("onyx-lsp", {
-       //      command: "onyx-lsp",
-       //      transport: TransportKind.stdio,
-       // }, {
-       //      documentSelector: [
-       //              { scheme: "file", language: "onyx" },
-       //      ],
-       //      synchronize: {
-       //              fileEvents: vscode.workspace.createFileSystemWatcher("**/*.onyx")
-       //      }
-       // });
+       let serverOptions: vslc.ServerOptions = {
+               command: "onyx-lsp",
+               transport: vslc.TransportKind.stdio,
+       };
 
-       // client.start();
+       let clientOptions: vslc.LanguageClientOptions = {
+               documentSelector: [
+                       { scheme: "file", language: "onyx" },
+               ],
+               connectionOptions: {
+                       cancellationStrategy: null,
+                       maxRestartCount: 5
+               }
+       };
+
+       client = new vslc.LanguageClient("onyx-lsp", serverOptions, clientOptions);
+
+       client.start();
 
        console.appendLine("Onyx Extension loaded.");
 }
+
+export function deactivate(): Thenable<void> | undefined {
+       if (!client) {
+               return undefined;
+       }
+
+       return client.stop();   
+}
index c4bb2ce828e32e51212956e9be749fe9733b6656..04ccc70736a9e2e81000e45eaf1ced0f6746d859 100644 (file)
Binary files a/misc/vscode/onyx-0.1.4.vsix and b/misc/vscode/onyx-0.1.4.vsix differ
index 9d1a4961839a704a9a7b51faeed3aa21a61e8f1d..5ed52058819943c84a024723cbf3f35117b96fb7 100644 (file)
@@ -9,9 +9,10 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
     });
 };
 Object.defineProperty(exports, "__esModule", { value: true });
-exports.activate = void 0;
+exports.deactivate = exports.activate = void 0;
 const vscode = require("vscode");
 const vsctmls = require("vscode-textmate-languageservice");
+const vslc = require("vscode-languageclient/node");
 let client;
 function activate(context) {
     return __awaiter(this, void 0, void 0, function* () {
@@ -21,25 +22,33 @@ function activate(context) {
         const engine = new vsctmls.textmateEngine.TextmateEngine('onyx', 'source.onyx');
         const documentSymbolProvider = new vsctmls.documentSymbols.DocumentSymbolProvider(engine);
         const workspaceSymbolProvider = new vsctmls.workspaceSymbols.WorkspaceSymbolProvider('onyx', documentSymbolProvider);
-        // const foldingProvider = new vsctmls.folding.FoldingProvider(engine);
         const peekFileDefinitionProvider = new vsctmls.peekDefinitions.PeekDefinitionProvider(documentSymbolProvider);
         context.subscriptions.push(vscode.languages.registerDocumentSymbolProvider(selector, documentSymbolProvider));
         context.subscriptions.push(vscode.languages.registerWorkspaceSymbolProvider(workspaceSymbolProvider));
-        // context.subscriptions.push(vscode.languages.registerFoldingRangeProvider(selector, foldingProvider));
         context.subscriptions.push(vscode.languages.registerDefinitionProvider({ 'language': 'onyx' }, peekFileDefinitionProvider));
-        // client = new vslc.LanguageClient("onyx-lsp", {
-        //     command: "onyx-lsp",
-        //     transport: TransportKind.stdio,
-        // }, {
-        //     documentSelector: [
-        //             { scheme: "file", language: "onyx" },
-        //     ],
-        //     synchronize: {
-        //             fileEvents: vscode.workspace.createFileSystemWatcher("**/*.onyx")
-        //     }
-        // });
-        // client.start();
+        let serverOptions = {
+            command: "onyx-lsp",
+            transport: vslc.TransportKind.stdio,
+        };
+        let clientOptions = {
+            documentSelector: [
+                { scheme: "file", language: "onyx" },
+            ],
+            connectionOptions: {
+                cancellationStrategy: null,
+                maxRestartCount: 5
+            }
+        };
+        client = new vslc.LanguageClient("onyx-lsp", serverOptions, clientOptions);
+        client.start();
         console.appendLine("Onyx Extension loaded.");
     });
 }
 exports.activate = activate;
+function deactivate() {
+    if (!client) {
+        return undefined;
+    }
+    return client.stop();
+}
+exports.deactivate = deactivate;
index e35a8f5eb950922aae758eab1591941598a91d18..41c3d8c8e76fe8934dcb70d8d442f2c3480bce9b 100644 (file)
@@ -145,7 +145,9 @@ static inline u64 log2_dumb(u64 n) {
     }
 }
 
-
+static inline const char* bh_num_plural(u64 i) {
+    return i != 1 ? "s" : "";
+}
 
 static inline const char* bh_num_suffix(u64 i) {
     if (i == 11 || i == 12 || i == 13) return "th";
index 9368eae74de37c5ae3881b88ef51afc83c84d371..28469a478b665ddd44df95001556dfeec73a864f 100755 (executable)
Binary files a/shared/lib/linux_x86_64/lib/libovmwasm.so and b/shared/lib/linux_x86_64/lib/libovmwasm.so differ