From 0580b565a2ac1b9cc084f0635fa749bd1dffce98 Mon Sep 17 00:00:00 2001 From: Giovanni Montana Date: Mon, 29 Jun 2026 00:20:38 +0100 Subject: [PATCH] feat: add Zig language support MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Vendored tree-sitter-zig grammar (built with fixes for current Zig 0.16 syntax — struct-literal asm clobbers, the de-keyworded async family, error-set field types, reserved-word labels, conditional slice/pointer element types) plus a Zig extractor for the language's value-as-type idioms: `const X = struct/enum/union/opaque`, `@import` modules, generic-type factories (`fn List(T) type { return struct {...} }`), and `test` blocks. Adds cross-file @import-namespace call resolution (`const m = @import("x.zig"); m.f()`) and function-as-value capture for inline-struct callbacks and comptime dispatch tables. Tests in __tests__/zig-extraction.test.ts. Parses the 0.16 standard library and several large projects (Ghostty, TigerBeetle, libxev, http.zig, zls) at 100%. --- __tests__/zig-extraction.test.ts | 156 +++++++++++ src/extraction/function-ref.ts | 27 ++ src/extraction/grammars.ts | 10 +- src/extraction/languages/index.ts | 2 + src/extraction/languages/zig.ts | 314 +++++++++++++++++++++++ src/extraction/wasm/tree-sitter-zig.wasm | Bin 0 -> 667135 bytes src/resolution/import-resolver.ts | 42 ++- src/types.ts | 1 + 8 files changed, 550 insertions(+), 2 deletions(-) create mode 100644 __tests__/zig-extraction.test.ts create mode 100644 src/extraction/languages/zig.ts create mode 100755 src/extraction/wasm/tree-sitter-zig.wasm diff --git a/__tests__/zig-extraction.test.ts b/__tests__/zig-extraction.test.ts new file mode 100644 index 000000000..66e370250 --- /dev/null +++ b/__tests__/zig-extraction.test.ts @@ -0,0 +1,156 @@ +/** + * Zig Extraction Tests + * + * Zig has no classes — types are values bound to a const (`const X = struct{}`) + * and modules are `const m = @import(...)`. These tests pin the idioms the + * extractor must get right: container types, scope-based methods, fields, enum + * members, constants, imports, test blocks, and the import-namespace mappings + * that make cross-file `callers`/`callees` resolve. + */ + +import { describe, it, expect, beforeAll } from 'vitest'; +import type { ExtractionResult } from '../src/types'; +import { extractFromSource } from '../src/extraction'; +import { + detectLanguage, + isLanguageSupported, + getSupportedLanguages, + initGrammars, + loadAllGrammars, +} from '../src/extraction/grammars'; +import { extractImportMappings } from '../src/resolution/import-resolver'; + +beforeAll(async () => { + await initGrammars(); + await loadAllGrammars(); +}); + +const SAMPLE = ` +const std = @import("std"); +const helper = @import("./util/helper.zig"); + +pub const max_items: u32 = 8; + +pub const Color = enum { red, green, blue }; + +pub const Point = struct { + x: f32, + y: f32, + + pub fn add(self: Point, other: Point) Point { + return .{ .x = self.x + other.x, .y = self.y + other.y }; + } +}; + +pub fn translate(p: Point) Point { + return helper.shift(p); +} + +test "point add" { + _ = Point.add; +} +`; + +describe('Zig language wiring', () => { + it('detects .zig as zig and reports it supported', () => { + expect(detectLanguage('src/main.zig')).toBe('zig'); + expect(isLanguageSupported('zig')).toBe(true); + expect(getSupportedLanguages()).toContain('zig'); + }); +}); + +describe('Zig extraction', () => { + // Computed in beforeAll, not at collection time — the file-level beforeAll + // must load the grammar first. + let result: ExtractionResult; + beforeAll(() => { + result = extractFromSource('shapes.zig', SAMPLE, 'zig'); + }); + + const byKind = (kind: string, name: string) => + result.nodes.find((n) => n.kind === kind && n.name === name); + + it('extracts a const-bound struct as a struct, not a constant', () => { + expect(byKind('struct', 'Point')).toBeDefined(); + expect(byKind('constant', 'Point')).toBeUndefined(); + }); + + it('extracts a struct method as a method (scope-based, no receiver syntax)', () => { + const add = byKind('method', 'add'); + expect(add).toBeDefined(); + expect(add!.qualifiedName).toContain('Point'); + }); + + it('extracts struct fields', () => { + expect(byKind('field', 'x')).toBeDefined(); + expect(byKind('field', 'y')).toBeDefined(); + }); + + it('extracts a const-bound enum and its members', () => { + expect(byKind('enum', 'Color')).toBeDefined(); + expect(byKind('enum_member', 'red')).toBeDefined(); + expect(byKind('enum_member', 'blue')).toBeDefined(); + }); + + it('extracts a top-level fn as a function and a plain const as a constant', () => { + expect(byKind('function', 'translate')).toBeDefined(); + expect(byKind('constant', 'max_items')).toBeDefined(); + }); + + it('extracts @import as import nodes', () => { + expect(byKind('import', 'std')).toBeDefined(); + expect(byKind('import', './util/helper.zig')).toBeDefined(); + }); + + it('extracts a test block as a callable function node', () => { + expect(byKind('function', 'point add')).toBeDefined(); + }); + + it('emits a calls reference for a namespaced member call', () => { + // `helper.shift(p)` — the dotted ref the resolver maps through the import. + const ref = result.unresolvedReferences.find( + (r) => r.referenceName === 'helper.shift' && r.referenceKind === 'calls' + ); + expect(ref).toBeDefined(); + }); +}); + +describe('Zig import mappings (cross-file resolution)', () => { + it('maps @import bindings to namespace imports', () => { + const maps = extractImportMappings('shapes.zig', SAMPLE, 'zig'); + const helper = maps.find((m) => m.localName === 'helper'); + expect(helper).toBeDefined(); + expect(helper!.source).toBe('./util/helper.zig'); + expect(helper!.isNamespace).toBe(true); + expect(maps.find((m) => m.localName === 'std')).toBeDefined(); + }); +}); + +describe('Zig generic-type factories', () => { + // `fn List(T) type { return struct {...} }` — Zig's generic types are + // functions returning an anonymous container. + const FACTORY = ` +pub fn List(comptime T: type) type { + return struct { + items: []T, + pub fn append(self: *@This(), x: T) void { _ = self; _ = x; } + pub fn clear(self: *@This()) void { _ = self; } + }; +}`; + let nodes: { kind: string; name: string; qualifiedName?: string }[]; + beforeAll(() => { + nodes = extractFromSource('list.zig', FACTORY, 'zig').nodes; + }); + + it('indexes the factory as a struct named for the function', () => { + expect(nodes.find((n) => n.kind === 'struct' && n.name === 'List')).toBeDefined(); + }); + + it('indexes the returned container declarations as methods of that type', () => { + const append = nodes.find((n) => n.kind === 'method' && n.name === 'append'); + expect(append).toBeDefined(); + expect(append!.qualifiedName).toContain('List'); + expect(nodes.find((n) => n.kind === 'method' && n.name === 'clear')).toBeDefined(); + expect(nodes.find((n) => n.kind === 'field' && n.name === 'items')).toBeDefined(); + }); +}); diff --git a/src/extraction/function-ref.ts b/src/extraction/function-ref.ts index 1bae970a4..49930d19f 100644 --- a/src/extraction/function-ref.ts +++ b/src/extraction/function-ref.ts @@ -226,6 +226,21 @@ const RUST_SPEC: FnRefSpec = { ]), }; +// Zig has no closures, so a callback is an inline anonymous-struct method passed +// by value: `std.sort.sort(items, ctx, struct { fn cmp(_,a,b) bool {…} }.cmp)`. +// The value is a `field_expression` (.cmp); comptime dispatch tables use +// `.{ .add = addKernel }` (field_initializer) and `.{ a, b }` (initializer_list). +const ZIG_SPEC: FnRefSpec = { + idTypes: new Set(['identifier']), + dispatch: new Map([ + ['arguments', { mode: 'args' }], + ['assignment_expression', { mode: 'rhs', field: 'right' }], + ['field_initializer', { mode: 'value' }], + ['initializer_list', { mode: 'list' }], + ]), + special: new Set(['field_expression']), +}; + const JAVA_SPEC: FnRefSpec = { // No bare-identifier function values in Java — only method references. idTypes: new Set(), @@ -384,6 +399,7 @@ export const FN_REF_SPECS: Record = { python: PYTHON_SPEC, go: GO_SPEC, rust: RUST_SPEC, + zig: ZIG_SPEC, java: JAVA_SPEC, kotlin: KOTLIN_SPEC, csharp: CSHARP_SPEC, @@ -615,6 +631,17 @@ function normalizeSpecial( source: string ): NormalizedRef[] { switch (type) { + // Zig `Container.member` used as a value — the inline-anonymous-struct + // callback idiom `struct { fn cmp(…) {} }.cmp` (Zig's closure substitute). + // Capture the member; the same-file gate keeps only members naming a + // function defined here, so ordinary `obj.field` data reads drop out. + case 'field_expression': { + const member = getChildByField(node, 'member'); + return member && member.type === 'identifier' + ? [{ name: getNodeText(member, source), node: member }] + : []; + } + // Java method references. Receiver decides the resolution route (#808): // `this::run0` / `super::close` → `this.` (class-scoped resolver; // super rides the inherited-member supertype pass) diff --git a/src/extraction/grammars.ts b/src/extraction/grammars.ts index 1b15996c0..26c7635f5 100644 --- a/src/extraction/grammars.ts +++ b/src/extraction/grammars.ts @@ -24,6 +24,12 @@ const WASM_GRAMMAR_FILES: Record = { python: 'tree-sitter-python.wasm', go: 'tree-sitter-go.wasm', rust: 'tree-sitter-rust.wasm', + // Vendored: built from tree-sitter-zig patched for Zig 0.16 (asm-clobbers + // struct, de-keyworded async/await/suspend/resume, error-set field types, + // reserved-word block labels, conditional slice/pointer element types) — not + // in tree-sitter-wasms. 100% parse across the Zig 0.16 standard library, + // Ghostty, TigerBeetle, libxev and http.zig. + zig: 'tree-sitter-zig.wasm', java: 'tree-sitter-java.wasm', c: 'tree-sitter-c.wasm', cpp: 'tree-sitter-cpp.wasm', @@ -61,6 +67,7 @@ export const EXTENSION_MAP: Record = { '.pyw': 'python', '.go': 'go', '.rs': 'rust', + '.zig': 'zig', '.java': 'java', '.c': 'c', '.h': 'c', // Could also be C++, defaulting to C @@ -221,7 +228,7 @@ export async function loadGrammarsForLanguages(languages: Language[]): Promise> = { python: pythonExtractor, go: goExtractor, rust: rustExtractor, + zig: zigExtractor, java: javaExtractor, c: cExtractor, cpp: cppExtractor, diff --git a/src/extraction/languages/zig.ts b/src/extraction/languages/zig.ts new file mode 100644 index 000000000..1ea804f43 --- /dev/null +++ b/src/extraction/languages/zig.ts @@ -0,0 +1,314 @@ +import type { Node as SyntaxNode } from 'web-tree-sitter'; +import { getNodeText, getChildByField, getPrecedingDocstring } from '../tree-sitter-helpers'; +import type { LanguageExtractor, ExtractorContext } from '../tree-sitter-types'; + +/** + * Zig extraction. + * + * Zig has no classes and no top-level named type declarations: a type is a + * VALUE produced by a container expression (`struct`/`enum`/`union`/`opaque`) + * and bound to a `const`, and a module is a `const` bound to `@import(...)`. + * So one grammar node — `variable_declaration` — fans out to several CodeGraph + * kinds depending on its right-hand side: + * + * const Point = struct { ... }; // → struct + * const Color = enum { ... }; // → enum + * const Token = union { ... }; // → struct (no `union` NodeKind) + * const std = @import("std"); // → import + `imports` ref + * const max = 8; // → constant + * var count: usize = 0; // → variable + * + * The node-type dispatch ladder in tree-sitter.ts keys on a single node type, + * so this fan-out is done in the `visitNode` hook (the documented escape hatch + * for languages whose AST shape doesn't fit the ladder — Pascal uses it too). + * Everything UNAMBIGUOUS is left to the ladder: `function_declaration` (a free + * function at file scope, a method when nested in a container scope the hook + * pushed), and `call_expression`. Methods are detected purely by scope — + * `isInsideClassLikeNode()` — because Zig has no receiver syntax; the `self` + * parameter is an ordinary parameter, so `getReceiverType` is deliberately unset. + * + * Container members live as DIRECT children of the container node (there is no + * `body` field), so `extractStruct`/`extractEnum` — which require one — can't be + * reused; the hook walks members itself and routes each back through + * `ctx.visitNode`, so methods/nested types/calls still flow through the core. + */ + +/** Container-expression node types whose members are walked as a scope. */ +const CONTAINER_KINDS = new Set([ + 'struct_declaration', + 'union_declaration', + 'opaque_declaration', + 'enum_declaration', +]); + +/** `@import`/`@embedFile`/`@cImport` builtins that introduce a module dependency. */ +const IMPORT_BUILTINS = new Set(['@import', '@embedFile', '@cImport']); + +/** Scope kinds under which a `const`/`var` is a real symbol, not a function local. */ +const CONTAINER_SCOPE_KINDS = new Set([ + 'file', 'module', 'namespace', 'struct', 'enum', 'class', 'interface', 'trait', +]); + +/** Whether a node has the `pub` visibility modifier as a direct child token. */ +function hasPub(node: SyntaxNode): boolean { + for (let i = 0; i < node.childCount; i++) { + if (node.child(i)?.type === 'pub') return true; + } + return false; +} + +/** `const` vs `var` — read the leading keyword token; default to const. */ +function isConstDecl(node: SyntaxNode): boolean { + for (let i = 0; i < node.childCount; i++) { + const t = node.child(i)?.type; + if (t === 'const') return true; + if (t === 'var') return false; + } + return true; +} + +/** The bound name of a `variable_declaration` — its first `identifier` child + * (the type annotation's identifiers are nested under the `type` field). */ +function declName(node: SyntaxNode, source: string): string | null { + const id = node.namedChildren.find((c: SyntaxNode) => c.type === 'identifier'); + return id ? getNodeText(id, source) : null; +} + +/** The right-hand side of a `variable_declaration`: the first named child that + * begins after the `=` token. Returns null for a bare `var x: T;` (no value). */ +function rhsValue(node: SyntaxNode): SyntaxNode | null { + let eqEnd = -1; + for (let i = 0; i < node.childCount; i++) { + const c = node.child(i); + if (c && c.type === '=') { eqEnd = c.endIndex; break; } + } + if (eqEnd < 0) return null; + return node.namedChildren.find((c: SyntaxNode) => c.startIndex >= eqEnd) ?? null; +} + +/** The imported module/file for an `@import`-family builtin, or null. The string + * argument is returned verbatim ("std", "builtin", "./foo.zig"); a `@cImport` + * with no string argument resolves to the conventional "c" module. */ +function importTarget(builtin: SyntaxNode, source: string): string | null { + const id = builtin.namedChildren.find((c: SyntaxNode) => c.type === 'builtin_identifier'); + if (!id) return null; + const name = getNodeText(id, source); + if (!IMPORT_BUILTINS.has(name)) return null; + const args = builtin.namedChildren.find((c: SyntaxNode) => c.type === 'arguments'); + const str = args?.namedChildren.find((c: SyntaxNode) => c.type === 'string'); + if (!str) return name === '@cImport' ? 'c' : null; + return getNodeText(str, source).replace(/^"/, '').replace(/"$/, ''); +} + +/** The CodeGraph kind of the innermost scope on the stack ('file' when empty). */ +function scopeKind(ctx: ExtractorContext): string { + if (ctx.nodeStack.length === 0) return 'file'; + const top = ctx.nodeStack[ctx.nodeStack.length - 1]; + return ctx.nodes.find((n) => n.id === top)?.kind ?? 'file'; +} + +/** + * Create the type node for a container-valued declaration and walk its members + * under that scope, so nested `function_declaration`s become methods (via the + * core ladder's `isInsideClassLikeNode()` check) and nested types recurse here. + * An `enum`'s `container_field`s are its members (→ `enum_member`); a struct's + * are fields (→ `field`). + */ +function extractContainer( + decl: SyntaxNode, + value: SyntaxNode, + name: string, + ctx: ExtractorContext, +): void { + const isEnum = value.type === 'enum_declaration'; + const owner = ctx.createNode(isEnum ? 'enum' : 'struct', name, decl, { + docstring: getPrecedingDocstring(decl, ctx.source), + visibility: hasPub(decl) ? 'public' : 'private', + isExported: hasPub(decl), + }); + if (!owner) return; + + ctx.pushScope(owner.id); + for (const child of value.namedChildren) { + if (child.type === 'container_field') { + const nameNode = getChildByField(child, 'name') ?? child; + const member = getNodeText(nameNode, ctx.source); + if (isEnum) { + ctx.createNode('enum_member', member, child); + } else { + const typeNode = getChildByField(child, 'type'); + ctx.createNode('field', member, child, { + signature: typeNode ? `: ${getNodeText(typeNode, ctx.source)}` : undefined, + }); + } + } else { + // function_declaration → method, nested variable_declaration → back here, + // test_declaration → test, comptime_declaration → descend for calls. + ctx.visitNode(child); + } + } + ctx.popScope(); +} + +/** An `error { A, B }` set bound to a const → an enum whose members are the + * error names, so `MyError.A` navigation and impact analysis resolve. */ +function extractErrorSet(decl: SyntaxNode, value: SyntaxNode, name: string, ctx: ExtractorContext): void { + const owner = ctx.createNode('enum', name, decl, { + docstring: getPrecedingDocstring(decl, ctx.source), + visibility: hasPub(decl) ? 'public' : 'private', + isExported: hasPub(decl), + }); + if (!owner) return; + ctx.pushScope(owner.id); + for (const child of value.namedChildren) { + if (child.type === 'identifier') { + ctx.createNode('enum_member', getNodeText(child, ctx.source), child); + } + } + ctx.popScope(); +} + +/** `const m = @import("foo.zig")` → an `import` node plus an `imports` reference + * the resolver maps to the target file (internal) or leaves external (std). */ +function extractImport(decl: SyntaxNode, value: SyntaxNode, ctx: ExtractorContext): boolean { + const target = importTarget(value, ctx.source); + if (!target) return false; + ctx.createNode('import', target, decl, { signature: getNodeText(decl, ctx.source).trim() }); + const parentId = ctx.nodeStack[ctx.nodeStack.length - 1]; + if (parentId) { + ctx.addUnresolvedReference({ + fromNodeId: parentId, + referenceName: target, + referenceKind: 'imports', + line: decl.startPosition.row + 1, + column: decl.startPosition.column, + }); + } + return true; +} + +/** Route a `variable_declaration` to the right extraction based on its RHS. */ +function visitVarDecl(node: SyntaxNode, ctx: ExtractorContext): boolean { + const name = declName(node, ctx.source); + if (!name) return false; + const value = rhsValue(node); + + if (value) { + if (CONTAINER_KINDS.has(value.type)) { + extractContainer(node, value, name, ctx); + return true; + } + if (value.type === 'error_set_declaration') { + extractErrorSet(node, value, name, ctx); + return true; + } + if (value.type === 'builtin_function' && extractImport(node, value, ctx)) { + return true; + } + } + + // A plain value is a symbol only at container scope; inside a function body it + // is a local and must not become a node. + if (!CONTAINER_SCOPE_KINDS.has(scopeKind(ctx))) return true; + const valText = value ? getNodeText(value, ctx.source).slice(0, 80) : undefined; + ctx.createNode(isConstDecl(node) ? 'constant' : 'variable', name, node, { + docstring: getPrecedingDocstring(node, ctx.source), + signature: valText ? `= ${valText}${valText.length >= 80 ? '...' : ''}` : undefined, + visibility: hasPub(node) ? 'public' : 'private', + isExported: hasPub(node), + }); + return true; +} + +/** `test "name" { ... }` (or unnamed `test { ... }`) → a `function` node whose + * body is walked, so a test shows up in `callers`/blast-radius of what it + * exercises — the thing CodeGraph is for when triaging a Zig change. */ +function visitTest(node: SyntaxNode, ctx: ExtractorContext): boolean { + const str = node.namedChildren.find((c: SyntaxNode) => c.type === 'string' || c.type === 'identifier'); + const name = str ? getNodeText(str, ctx.source).replace(/^"/, '').replace(/"$/, '') : 'test'; + const fn = ctx.createNode('function', name, node, { signature: 'test' }); + const body = node.namedChildren.find((c: SyntaxNode) => c.type === 'block'); + if (fn && body) { + ctx.pushScope(fn.id); + ctx.visitFunctionBody(body, fn.id); + ctx.popScope(); + } + return true; +} + +/** A type factory `fn Name(...) type { return struct {...}; }` — return the + * container the function produces, or null if it isn't one. Only a direct + * `return` statement is considered; nested scopes (the container's own methods) + * are not searched. A returned `struct {...}` is a type DEFINITION + * (struct_declaration); a returned `.{...}` value is not, so plain functions + * are never mistaken for factories. */ +function returnedContainer(fnNode: SyntaxNode): SyntaxNode | null { + const body = getChildByField(fnNode, 'body'); + if (!body) return null; + for (const stmt of body.namedChildren) { + const ret = stmt.type === 'return_expression' + ? stmt + : stmt.namedChildren.find((c: SyntaxNode) => c.type === 'return_expression'); + const val = ret?.namedChildren[0]; + if (val && CONTAINER_KINDS.has(val.type)) return val; + } + return null; +} + +/** Zig generic types ARE functions returning an anonymous container + * (`fn List(comptime T: type) type { return struct {...}; }` — the ArrayList + * idiom). Index such a factory as the type it yields: a struct/enum named for + * the function, with the container's declarations as methods, so `List.append` + * navigates like any other type. A normal function returns false and falls + * through to the core ladder unchanged. */ +function visitFnDecl(node: SyntaxNode, ctx: ExtractorContext): boolean { + const container = returnedContainer(node); + if (!container) return false; + const nameNode = getChildByField(node, 'name'); + if (!nameNode) return false; + extractContainer(node, container, getNodeText(nameNode, ctx.source), ctx); + return true; +} + +export const zigExtractor: LanguageExtractor = { + // function_declaration is BOTH the free-function and the method node type; + // the ladder picks method when it fires inside a pushed container scope. + functionTypes: ['function_declaration'], + classTypes: [], + methodTypes: ['function_declaration'], + interfaceTypes: [], + // Containers, imports, constants and fields are all reached through + // variable_declaration and handled in visitNode — so these stay empty. + structTypes: [], + enumTypes: [], + typeAliasTypes: [], + importTypes: [], + variableTypes: [], + callTypes: ['call_expression'], + nameField: 'name', + bodyField: 'body', + paramsField: 'parameters', + returnField: 'type', // Zig: a function's return type is the `type` field. + + getSignature: (node, source) => { + const params = node.namedChildren.find((c: SyntaxNode) => c.type === 'parameters'); + const ret = getChildByField(node, 'type'); + if (!params && !ret) return undefined; + let sig = params ? getNodeText(params, source) : '()'; + if (ret) sig += ` ${getNodeText(ret, source)}`; + return sig; + }, + + // `pub` is Zig's only visibility marker (visible to importers); everything + // else is file-private. `export`/`extern` are linkage, not source visibility. + getVisibility: (node) => (hasPub(node) ? 'public' : 'private'), + isExported: (node) => hasPub(node), + + visitNode: (node: SyntaxNode, ctx: ExtractorContext): boolean => { + if (node.type === 'variable_declaration') return visitVarDecl(node, ctx); + if (node.type === 'function_declaration') return visitFnDecl(node, ctx); + if (node.type === 'test_declaration') return visitTest(node, ctx); + return false; + }, + +}; diff --git a/src/extraction/wasm/tree-sitter-zig.wasm b/src/extraction/wasm/tree-sitter-zig.wasm new file mode 100755 index 0000000000000000000000000000000000000000..6a0ef06a95d9aa2a377fcee52b197b42c3b58397 GIT binary patch literal 667135 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 z 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 @@ -1131,7 +1171,7 @@ export function resolveViaImport( // include-dir scan path inside resolveImportPath never produces an // edge — resolveViaImport's symbol lookup below would search the // resolved file for a symbol named like the file extension and fail. - if ((ref.language === 'c' || ref.language === 'cpp') && ref.referenceKind === 'imports') { + if ((ref.language === 'c' || ref.language === 'cpp' || ref.language === 'zig') && ref.referenceKind === 'imports') { // C/C++ quoted includes (`#include "X.h"`) resolve relative to the // INCLUDING file's own directory first (the C standard's quoted-include // search order). Prefer a same-directory header over an -I directory or a diff --git a/src/types.ts b/src/types.ts index 656bb1090..f5da9dc18 100644 --- a/src/types.ts +++ b/src/types.ts @@ -71,6 +71,7 @@ export const LANGUAGES = [ 'python', 'go', 'rust', + 'zig', 'java', 'c', 'cpp',