From: Brendan Hansen Date: Mon, 23 Jan 2023 17:16:50 +0000 (-0600) Subject: working vscode lsp; added Optional X-Git-Url: https://git.brendanfh.com/?a=commitdiff_plain;h=8fe4414a928a1f1c5f4b030cfa20b2b3131cfedc;p=onyx.git working vscode lsp; added Optional --- diff --git a/core/container/map.onyx b/core/container/map.onyx index b17adb0a..d3dbf7d7 100644 --- a/core/container/map.onyx +++ b/core/container/map.onyx @@ -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 index 00000000..0d51e3d2 --- /dev/null +++ b/core/container/optional.onyx @@ -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; + diff --git a/core/container/set.onyx b/core/container/set.onyx index 1ac375b3..6d831c2a 100644 --- a/core/container/set.onyx +++ b/core/container/set.onyx @@ -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; diff --git a/core/std.onyx b/core/std.onyx index ae198e29..c5e4af45 100644 --- a/core/std.onyx +++ b/core/std.onyx @@ -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" diff --git a/misc/vscode/extension.ts b/misc/vscode/extension.ts index 0b96f75c..b0258545 100644 --- a/misc/vscode/extension.ts +++ b/misc/vscode/extension.ts @@ -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 | undefined { + if (!client) { + return undefined; + } + + return client.stop(); +} diff --git a/misc/vscode/onyx-0.1.4.vsix b/misc/vscode/onyx-0.1.4.vsix index c4bb2ce8..04ccc707 100644 Binary files a/misc/vscode/onyx-0.1.4.vsix and b/misc/vscode/onyx-0.1.4.vsix differ diff --git a/misc/vscode/out/extension.js b/misc/vscode/out/extension.js index 9d1a4961..5ed52058 100644 --- a/misc/vscode/out/extension.js +++ b/misc/vscode/out/extension.js @@ -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; diff --git a/shared/include/bh.h b/shared/include/bh.h index e35a8f5e..41c3d8c8 100644 --- a/shared/include/bh.h +++ b/shared/include/bh.h @@ -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"; diff --git a/shared/lib/linux_x86_64/lib/libovmwasm.so b/shared/lib/linux_x86_64/lib/libovmwasm.so index 9368eae7..28469a47 100755 Binary files a/shared/lib/linux_x86_64/lib/libovmwasm.so and b/shared/lib/linux_x86_64/lib/libovmwasm.so differ