Better builtin completion
This commit is contained in:
		
							parent
							
								
									ce443ba1dd
								
							
						
					
					
						commit
						def89a90f5
					
				
							
								
								
									
										240
									
								
								src/data.zig
									
									
									
									
									
								
							
							
						
						
									
										240
									
								
								src/data.zig
									
									
									
									
									
								
							@ -1,105 +1,141 @@
 | 
			
		||||
// You can use `[...$("#toc-Builtin-Functions").parentElement.lastElementChild.children].map(_ => `"${_.innerText}"`).join(",\n")` to get all of the builtin functions on the documentation page.
 | 
			
		||||
// SCRIPT
 | 
			
		||||
// [...document.querySelector("#toc-Builtin-Functions").parentElement.lastElementChild.children].map(_ => {
 | 
			
		||||
 | 
			
		||||
// const code = document.querySelector("#" + _.innerText.slice(1)).nextElementSibling.children[0].innerText;
 | 
			
		||||
// var l = (code.lastIndexOf(") ") == -1 ? code.length : code.lastIndexOf(") ")) + 1
 | 
			
		||||
// var p = code.slice(0, l);
 | 
			
		||||
 | 
			
		||||
// var name = p.slice(0, p.indexOf("("));
 | 
			
		||||
// var body = p.slice(p.indexOf("(") + 1, -1);
 | 
			
		||||
// if (body.len === 0) return `${name}()`;
 | 
			
		||||
// var nb = "";
 | 
			
		||||
// let depth = 0;
 | 
			
		||||
// let vi = 2;
 | 
			
		||||
// let i = 0;
 | 
			
		||||
// let skip = false;
 | 
			
		||||
// for (const c of body) {
 | 
			
		||||
// if (skip) {
 | 
			
		||||
// skip = false;
 | 
			
		||||
// if (c === " ") {i++; continue;}
 | 
			
		||||
// }
 | 
			
		||||
// if (c === "(") depth++;
 | 
			
		||||
// else if (c === ")") depth--;
 | 
			
		||||
 | 
			
		||||
// if (c === "," && depth == 0) {
 | 
			
		||||
// nb += `}, \${${vi}:`;
 | 
			
		||||
// vi++;
 | 
			
		||||
// skip = true;
 | 
			
		||||
// } else if (i === body.length - 1) {
 | 
			
		||||
// nb += c;
 | 
			
		||||
// nb += "}";
 | 
			
		||||
// } else nb += c;
 | 
			
		||||
// i++;
 | 
			
		||||
// }
 | 
			
		||||
// return `${name}(\${1:${nb})`;
 | 
			
		||||
 | 
			
		||||
// }).map(_ => JSON.stringify(_)).join(",\n");
 | 
			
		||||
 | 
			
		||||
/// Builtin functions
 | 
			
		||||
pub const builtins = [_][]const u8{
 | 
			
		||||
    "@addWithOverflow",
 | 
			
		||||
    "@alignCast",
 | 
			
		||||
    "@alignOf",
 | 
			
		||||
    "@as",
 | 
			
		||||
    "@asyncCall",
 | 
			
		||||
    "@atomicLoad",
 | 
			
		||||
    "@atomicRmw",
 | 
			
		||||
    "@atomicStore",
 | 
			
		||||
    "@bitCast",
 | 
			
		||||
    "@bitOffsetOf",
 | 
			
		||||
    "@boolToInt",
 | 
			
		||||
    "@bitSizeOf",
 | 
			
		||||
    "@breakpoint",
 | 
			
		||||
    "@mulAdd",
 | 
			
		||||
    "@byteSwap",
 | 
			
		||||
    "@bitReverse",
 | 
			
		||||
    "@byteOffsetOf",
 | 
			
		||||
    "@call",
 | 
			
		||||
    "@cDefine",
 | 
			
		||||
    "@cImport",
 | 
			
		||||
    "@cInclude",
 | 
			
		||||
    "@clz",
 | 
			
		||||
    "@cmpxchgStrong",
 | 
			
		||||
    "@cmpxchgWeak",
 | 
			
		||||
    "@compileError",
 | 
			
		||||
    "@compileLog",
 | 
			
		||||
    "@ctz",
 | 
			
		||||
    "@cUndef",
 | 
			
		||||
    "@divExact",
 | 
			
		||||
    "@divFloor",
 | 
			
		||||
    "@divTrunc",
 | 
			
		||||
    "@embedFile",
 | 
			
		||||
    "@enumToInt",
 | 
			
		||||
    "@errorName",
 | 
			
		||||
    "@errorReturnTrace",
 | 
			
		||||
    "@errorToInt",
 | 
			
		||||
    "@errSetCast",
 | 
			
		||||
    "@export",
 | 
			
		||||
    "@fence",
 | 
			
		||||
    "@field",
 | 
			
		||||
    "@fieldParentPtr",
 | 
			
		||||
    "@floatCast",
 | 
			
		||||
    "@floatToInt",
 | 
			
		||||
    "@frame",
 | 
			
		||||
    "@Frame",
 | 
			
		||||
    "@frameAddress",
 | 
			
		||||
    "@frameSize",
 | 
			
		||||
    "@hasDecl",
 | 
			
		||||
    "@hasField",
 | 
			
		||||
    "@import",
 | 
			
		||||
    "@intCast",
 | 
			
		||||
    "@intToEnum",
 | 
			
		||||
    "@intToError",
 | 
			
		||||
    "@intToFloat",
 | 
			
		||||
    "@intToPtr",
 | 
			
		||||
    "@memcpy",
 | 
			
		||||
    "@memset",
 | 
			
		||||
    "@mod",
 | 
			
		||||
    "@mulWithOverflow",
 | 
			
		||||
    "@OpaqueType",
 | 
			
		||||
    "@panic",
 | 
			
		||||
    "@popCount",
 | 
			
		||||
    "@ptrCast",
 | 
			
		||||
    "@ptrToInt",
 | 
			
		||||
    "@rem",
 | 
			
		||||
    "@returnAddress",
 | 
			
		||||
    "@setAlignStack",
 | 
			
		||||
    "@setCold",
 | 
			
		||||
    "@setEvalBranchQuota",
 | 
			
		||||
    "@setFloatMode",
 | 
			
		||||
    "@setRuntimeSafety",
 | 
			
		||||
    "@shlExact",
 | 
			
		||||
    "@shlWithOverflow",
 | 
			
		||||
    "@shrExact",
 | 
			
		||||
    "@shuffle",
 | 
			
		||||
    "@sizeOf",
 | 
			
		||||
    "@splat",
 | 
			
		||||
    "@sqrt",
 | 
			
		||||
    "@sin",
 | 
			
		||||
    "@cos",
 | 
			
		||||
    "@exp",
 | 
			
		||||
    "@exp2",
 | 
			
		||||
    "@log",
 | 
			
		||||
    "@log2",
 | 
			
		||||
    "@log10",
 | 
			
		||||
    "@fabs",
 | 
			
		||||
    "@floor",
 | 
			
		||||
    "@ceil",
 | 
			
		||||
    "@trunc",
 | 
			
		||||
    "@round",
 | 
			
		||||
    "@subWithOverflow",
 | 
			
		||||
    "@tagName",
 | 
			
		||||
    "@TagType",
 | 
			
		||||
    "@This",
 | 
			
		||||
    "@truncate",
 | 
			
		||||
    "@Type",
 | 
			
		||||
    "@typeInfo",
 | 
			
		||||
    "@typeName",
 | 
			
		||||
    "@TypeOf",
 | 
			
		||||
    "@unionInit",
 | 
			
		||||
    "@Vector"
 | 
			
		||||
    "@addWithOverflow(${1:comptime T: type}, ${2:a: T}, ${3:b: T}, ${4:result: *T})",
 | 
			
		||||
    "@alignCast(${1:comptime alignment: u29}, ${2:ptr: var})",
 | 
			
		||||
    "@alignOf(${1:comptime T: type})",
 | 
			
		||||
    "@as(${1:comptime T: type}, ${2:expression})",
 | 
			
		||||
    "@asyncCall(${1:frame_buffer: []align(@alignOf(@Frame(anyAsyncFunction))) u8}, ${2:result_ptr}, ${3:function_ptr}, ${4:args: ...})",
 | 
			
		||||
    "@atomicLoad(${1:comptime T: type}, ${2:ptr: *const T}, ${3:comptime ordering: builtin.AtomicOrder})",
 | 
			
		||||
    "@atomicRmw(${1:comptime T: type}, ${2:ptr: *T}, ${3:comptime op: builtin.AtomicRmwOp}, ${4:operand: T}, ${5:comptime ordering: builtin.AtomicOrder})",
 | 
			
		||||
    "@atomicStore(${1:comptime T: type}, ${2:ptr: *T}, ${3:value: T}, ${4:comptime ordering: builtin.AtomicOrder})",
 | 
			
		||||
    "@bitCast(${1:comptime DestType: type}, ${2:value: var})",
 | 
			
		||||
    "@bitOffsetOf(${1:comptime T: type}, ${2:comptime field_name: []const u8})",
 | 
			
		||||
    "@boolToInt(${1:value: bool})",
 | 
			
		||||
    "@bitSizeOf(${1:comptime T: type})",
 | 
			
		||||
    "@breakpoint(${1:)",
 | 
			
		||||
    "@mulAdd(${1:comptime T: type}, ${2:a: T}, ${3:b: T}, ${4:c: T})",
 | 
			
		||||
    "@byteSwap(${1:comptime T: type}, ${2:operand: T})",
 | 
			
		||||
    "@bitReverse(${1:comptime T: type}, ${2:integer: T})",
 | 
			
		||||
    "@byteOffsetOf(${1:comptime T: type}, ${2:comptime field_name: []const u8})",
 | 
			
		||||
    "@call(${1:options: std.builtin.CallOptions}, ${2:function: var}, ${3:args: var})",
 | 
			
		||||
    "@cDefine(${1:comptime name: []u8}, ${2:value})",
 | 
			
		||||
    "@cImport(${1:expression})",
 | 
			
		||||
    "@cInclude(${1:comptime path: []u8})",
 | 
			
		||||
    "@clz(${1:comptime T: type}, ${2:integer: T})",
 | 
			
		||||
    "@cmpxchgStrong(${1:comptime T: type}, ${2:ptr: *T}, ${3:expected_value: T}, ${4:new_value: T}, ${5:success_order: AtomicOrder}, ${6:fail_order: AtomicOrder})",
 | 
			
		||||
    "@cmpxchgWeak(${1:comptime T: type}, ${2:ptr: *T}, ${3:expected_value: T}, ${4:new_value: T}, ${5:success_order: AtomicOrder}, ${6:fail_order: AtomicOrder})",
 | 
			
		||||
    "@compileError(${1:comptime msg: []u8})",
 | 
			
		||||
    "@compileLog(${1:args: ...})",
 | 
			
		||||
    "@ctz(${1:comptime T: type}, ${2:integer: T})",
 | 
			
		||||
    "@cUndef(${1:comptime name: []u8})",
 | 
			
		||||
    "@divExact(${1:numerator: T}, ${2:denominator: T})",
 | 
			
		||||
    "@divFloor(${1:numerator: T}, ${2:denominator: T})",
 | 
			
		||||
    "@divTrunc(${1:numerator: T}, ${2:denominator: T})",
 | 
			
		||||
    "@embedFile(${1:comptime path: []const u8})",
 | 
			
		||||
    "@enumToInt(${1:enum_or_tagged_union: var})",
 | 
			
		||||
    "@errorName(${1:err: anyerror})",
 | 
			
		||||
    "@errorReturnTrace(${1:)",
 | 
			
		||||
    "@errorToInt(${1:err: var) std.meta.IntType(false}, ${2:@sizeOf(anyerror})",
 | 
			
		||||
    "@errSetCast(${1:comptime T: DestType}, ${2:value: var})",
 | 
			
		||||
    "@export(${1:target: var}, ${2:comptime options: std.builtin.ExportOptions})",
 | 
			
		||||
    "@fence(${1:order: AtomicOrder})",
 | 
			
		||||
    "@field(${1:lhs: var}, ${2:comptime field_name: []const u8})",
 | 
			
		||||
    "@fieldParentPtr(${1:comptime ParentType: type}, ${2:comptime field_name: []const u8}, ${3:\n    field_ptr: *T})",
 | 
			
		||||
    "@floatCast(${1:comptime DestType: type}, ${2:value: var})",
 | 
			
		||||
    "@floatToInt(${1:comptime DestType: type}, ${2:float: var})",
 | 
			
		||||
    "@frame(${1:)",
 | 
			
		||||
    "@Frame(${1:func: var})",
 | 
			
		||||
    "@frameAddress(${1:)",
 | 
			
		||||
    "@frameSize(${1:)",
 | 
			
		||||
    "@hasDecl(${1:comptime Container: type}, ${2:comptime name: []const u8})",
 | 
			
		||||
    "@hasField(${1:comptime Container: type}, ${2:comptime name: []const u8})",
 | 
			
		||||
    "@import(${1:comptime path: []u8})",
 | 
			
		||||
    "@intCast(${1:comptime DestType: type}, ${2:int: var})",
 | 
			
		||||
    "@intToEnum(${1:comptime DestType: type}, ${2:int_value: @TagType(DestType)})",
 | 
			
		||||
    "@intToError(${1:value: std.meta.IntType(false, @sizeOf(anyerror) * 8)})",
 | 
			
		||||
    "@intToFloat(${1:comptime DestType: type}, ${2:int: var})",
 | 
			
		||||
    "@intToPtr(${1:comptime DestType: type}, ${2:address: usize})",
 | 
			
		||||
    "@memcpy(${1:noalias dest: [*]u8}, ${2:noalias source: [*]const u8}, ${3:byte_count: usize})",
 | 
			
		||||
    "@memset(${1:dest: [*]u8}, ${2:c: u8}, ${3:byte_count: usize})",
 | 
			
		||||
    "@mod(${1:numerator: T}, ${2:denominator: T})",
 | 
			
		||||
    "@mulWithOverflow(${1:comptime T: type}, ${2:a: T}, ${3:b: T}, ${4:result: *T})",
 | 
			
		||||
    "@OpaqueType(${1:)",
 | 
			
		||||
    "@panic(${1:message: []const u8})",
 | 
			
		||||
    "@popCount(${1:comptime T: type}, ${2:integer: T})",
 | 
			
		||||
    "@ptrCast(${1:comptime DestType: type}, ${2:value: var})",
 | 
			
		||||
    "@ptrToInt(${1:value: var})",
 | 
			
		||||
    "@rem(${1:numerator: T}, ${2:denominator: T})",
 | 
			
		||||
    "@returnAddress(${1:)",
 | 
			
		||||
    "@setAlignStack(${1:comptime alignment: u29})",
 | 
			
		||||
    "@setCold(${1:is_cold: bool})",
 | 
			
		||||
    "@setEvalBranchQuota(${1:new_quota: usize})",
 | 
			
		||||
    "@setFloatMode(${1:mode: @import(\"builtin\").FloatMode})",
 | 
			
		||||
    "@setRuntimeSafety(${1:safety_on: bool})",
 | 
			
		||||
    "@shlExact(${1:value: T}, ${2:shift_amt: Log2T})",
 | 
			
		||||
    "@shlWithOverflow(${1:comptime T: type}, ${2:a: T}, ${3:shift_amt: Log2T}, ${4:result: *T})",
 | 
			
		||||
    "@shrExact(${1:value: T}, ${2:shift_amt: Log2T})",
 | 
			
		||||
    "@shuffle(${1:comptime E: type}, ${2:a: @Vector(a_len, E)}, ${3:b: @Vector(b_len, E)}, ${4:comptime mask: @Vector(mask_len, i32)})",
 | 
			
		||||
    "@sizeOf(${1:comptime T: type})",
 | 
			
		||||
    "@splat(${1:comptime len: u32}, ${2:scalar: var})",
 | 
			
		||||
    "@sqrt(${1:value: var})",
 | 
			
		||||
    "@sin(${1:value: var})",
 | 
			
		||||
    "@cos(${1:value: var})",
 | 
			
		||||
    "@exp(${1:value: var})",
 | 
			
		||||
    "@exp2(${1:value: var})",
 | 
			
		||||
    "@log(${1:value: var})",
 | 
			
		||||
    "@log2(${1:value: var})",
 | 
			
		||||
    "@log10(${1:value: var})",
 | 
			
		||||
    "@fabs(${1:value: var})",
 | 
			
		||||
    "@floor(${1:value: var})",
 | 
			
		||||
    "@ceil(${1:value: var})",
 | 
			
		||||
    "@trunc(${1:value: var})",
 | 
			
		||||
    "@round(${1:value: var})",
 | 
			
		||||
    "@subWithOverflow(${1:comptime T: type}, ${2:a: T}, ${3:b: T}, ${4:result: *T})",
 | 
			
		||||
    "@tagName(${1:value: var})",
 | 
			
		||||
    "@TagType(${1:T: type})",
 | 
			
		||||
    "@This(${1:)",
 | 
			
		||||
    "@truncate(${1:comptime T: type}, ${2:integer: var})",
 | 
			
		||||
    "@Type(${1:comptime info: @import(\"builtin\").TypeInfo})",
 | 
			
		||||
    "@typeInfo(${1:comptime T: type})",
 | 
			
		||||
    "@typeName(${1:T: type})",
 | 
			
		||||
    "@TypeOf(${1:...})",
 | 
			
		||||
    "@unionInit(${1:comptime Union: type}, ${2:comptime active_field_name: []const u8}, ${3:init_expr})",
 | 
			
		||||
    "@Vector(${1:comptime len: u32}, ${2:comptime ElemType: type})"
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										20
									
								
								src/main.zig
									
									
									
									
									
								
							
							
						
						
									
										20
									
								
								src/main.zig
									
									
									
									
									
								
							@ -260,16 +260,20 @@ pub fn processJsonRpc(json: []const u8) !void {
 | 
			
		||||
                var builtin_completions: [data.builtins.len]types.CompletionItem = undefined;
 | 
			
		||||
 | 
			
		||||
                for (data.builtins) |builtin, i| {
 | 
			
		||||
                    var cutoff = std.mem.indexOf(u8, builtin, "(") orelse builtin.len;
 | 
			
		||||
                    builtin_completions[i] = types.CompletionItem{
 | 
			
		||||
                        .label = builtin,
 | 
			
		||||
                        .label = builtin[0..cutoff],
 | 
			
		||||
                        .kind = types.CompletionItemKind.Function,
 | 
			
		||||
                        .textEdit = types.TextEdit{
 | 
			
		||||
                            .range = types.Range{
 | 
			
		||||
                                .start = pos,
 | 
			
		||||
                                .end = pos,
 | 
			
		||||
                            },
 | 
			
		||||
                            .newText = builtin,
 | 
			
		||||
                        },
 | 
			
		||||
                        // .textEdit = types.TextEdit{
 | 
			
		||||
                        //     .range = types.Range{
 | 
			
		||||
                        //         .start = pos,
 | 
			
		||||
                        //         .end = pos,
 | 
			
		||||
                        //     },
 | 
			
		||||
                        //     .newText = builtin,
 | 
			
		||||
                        // },
 | 
			
		||||
                        .filterText = builtin[1..cutoff],
 | 
			
		||||
                        .insertText = builtin[1..],
 | 
			
		||||
                        .insertTextFormat = types.InsertTextFormat.Snippet
 | 
			
		||||
                    };
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -220,10 +220,26 @@ pub const CompletionItemKind = enum(Integer) {
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
pub const InsertTextFormat = enum(Integer) {
 | 
			
		||||
    PlainText = 1,
 | 
			
		||||
    Snippet = 2,
 | 
			
		||||
 | 
			
		||||
    pub fn jsonStringify(
 | 
			
		||||
        value: InsertTextFormat,
 | 
			
		||||
        options: json.StringifyOptions,
 | 
			
		||||
        out_stream: var,
 | 
			
		||||
    ) !void {
 | 
			
		||||
        try json.stringify(@enumToInt(value), options, out_stream);
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
pub const CompletionItem = struct {
 | 
			
		||||
    label: String,
 | 
			
		||||
    kind: CompletionItemKind,
 | 
			
		||||
    textEdit: ?TextEdit = null,
 | 
			
		||||
    filterText: ?String = null,
 | 
			
		||||
    insertText: ?String = null,
 | 
			
		||||
    insertTextFormat: ?InsertTextFormat = InsertTextFormat.PlainText
 | 
			
		||||
    // filterText: String = .NotDefined,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user