From c2f41d9b887988e98b3be642a1141ba75db769c9 Mon Sep 17 00:00:00 2001 From: iacore Date: Fri, 4 Sep 2026 20:24:13 +0800 Subject: [PATCH 1/2] feat(languages): add Interv support to codegraph Wire Interv (.iv) into the tree-sitter extraction pipeline: - vendor a tree-sitter-interv wasm grammar (ABI 15, built with tree-sitter-cli 0.26.9) for the self-hosted functional language. - register the language in types.ts and grammars.ts (wasm file map, .iv extension, display name, vendored set). - add an Interv extractor: functions (name :: fn ...), algebraic data types as enums with constructors as members, import path module edges, and call edges. - add detection + extraction tests, a README supported-language row, and a CHANGELOG entry. Verification: extraction on the Interv repo's examples + src extracts 532 functions, 32 data types, 100 constructors and 12 imports across 69 files; verify-extraction passes; extraction.test.ts (627 tests) green. --- CHANGELOG.md | 4 ++ README.md | 3 +- __tests__/extraction.test.ts | 67 ++++++++++++++++++++ src/extraction/grammars.ts | 5 +- src/extraction/languages/index.ts | 2 + src/extraction/languages/interv.ts | 67 ++++++++++++++++++++ src/extraction/wasm/tree-sitter-interv.wasm | Bin 0 -> 58427 bytes src/types.ts | 1 + 8 files changed, 147 insertions(+), 2 deletions(-) create mode 100644 src/extraction/languages/interv.ts create mode 100755 src/extraction/wasm/tree-sitter-interv.wasm diff --git a/CHANGELOG.md b/CHANGELOG.md index 1815c4150..fa57a6b52 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -215,6 +215,10 @@ and adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - Fixed a long-running `codegraph ui` session serving a symbol that a sync had already deleted. The viewer keeps one connection to your index open, and its in-memory lookup didn't notice when another process — your agent's sync, or `codegraph sync` — rewrote the file underneath it, so a symbol screen could keep showing a body with no callers while search correctly reported it had moved. Because a symbol's identity includes the line it starts on, this happened after almost any edit above it. +### Added + +- CodeGraph now indexes **Interv** (`.iv`) — functions, algebraic data types with constructors, `import` module edges, and call edges. + ## [1.6.0] - 2026-08-26 ### Highlights diff --git a/README.md b/README.md index a73d3b2bc..4ffdfc622 100644 --- a/README.md +++ b/README.md @@ -289,7 +289,7 @@ CodeGraph's parsing engine is a **native Rust kernel**: 20 languages — TypeScr | **Full-Text Search** | Find code by name instantly across your entire codebase, powered by FTS5 | | **Impact Analysis** | Trace callers, callees, and the full impact radius of any symbol before making changes | | **Always Fresh** | File watcher uses native OS events (FSEvents/inotify/ReadDirectoryChangesW) with debounced auto-sync — the graph stays current as you code, zero config | -| **20+ Languages** | TypeScript, JavaScript, ArkTS, Python, Go, Rust, Java, C#, VB.NET, PHP, Ruby, C, C++, CUDA, Objective-C, Metal, Swift, Kotlin, Scala, Dart, Lua, Luau, R, Nix, Erlang, CFML, COBOL, Solidity, Terraform/OpenTofu, Svelte, Vue, Astro, Liquid, Pascal/Delphi | +| **20+ Languages** | TypeScript, JavaScript, ArkTS, Python, Go, Rust, Java, C#, VB.NET, PHP, Ruby, C, C++, CUDA, Objective-C, Metal, Swift, Kotlin, Scala, Dart, Lua, Luau, R, Nix, Erlang, CFML, COBOL, Solidity, Terraform/OpenTofu, Svelte, Vue, Astro, Liquid, Pascal/Delphi, Interv | | **Framework-aware Routes** | Recognizes web-framework routing files and links URL patterns to their handlers across 17 frameworks | | **Mixed iOS / React Native / Expo** | Closes cross-language flows that static parsing misses: Swift ↔ ObjC bridging, React Native legacy bridge + TurboModules + Fabric view components, native → JS event emitters, Expo Modules | | **100% Local** | No data leaves your machine. No API keys. No external services. SQLite database only | @@ -889,6 +889,7 @@ is written): | Astro | `.astro` | Full support (frontmatter + script extraction, template component/call references, `src/pages/` routes) | | Liquid | `.liquid` | Full support | | Pascal / Delphi | `.pas`, `.dpr`, `.dpk`, `.lpr` | Full support (classes, records, interfaces, enums, DFM/FMX form files) | +| Interv | `.iv` | Full support (functions, algebraic data types with constructors, `import` module edges, call edges) | | Lua | `.lua` | Full support (functions, methods with receivers, local variables, `require` imports, call edges) | | R | `.R` `.r` | Full support (functions in every assignment form, S4/R5/R6 classes with methods, `library`/`require` imports, `source()` file references, call edges) | | Luau | `.luau` | Full support (everything in Lua, plus `type`/`export type` aliases, typed signatures, and Roblox instance-path `require`) | diff --git a/__tests__/extraction.test.ts b/__tests__/extraction.test.ts index ad0ba2374..4f3a323f7 100644 --- a/__tests__/extraction.test.ts +++ b/__tests__/extraction.test.ts @@ -1408,6 +1408,73 @@ impl Describe for Reg { }); }); +// ============================================================================= +// Interv — a small self-hosting functional language (v2) +// ============================================================================= + +describe('Interv Extraction', () => { + it('should detect Interv files', () => { + expect(detectLanguage('src/util.iv')).toBe('interv'); + expect(detectLanguage('nested/path/module.iv')).toBe('interv'); + expect(isSourceFile('src/main.iv')).toBe(true); + expect(isLanguageSupported('interv')).toBe(true); + }); + + it('should extract function definitions from `name :: fn(...)`', () => { + const code = ` +area :: fn (s) { + case s { + Circle(r) -> 3 * r * r; + Rect(w, h) -> w * h + } +} +`; + const result = extractFromSource('shapes.iv', code); + const funcNode = result.nodes.find((n) => n.kind === 'function'); + expect(funcNode).toBeDefined(); + expect(funcNode?.name).toBe('area'); + expect(funcNode?.signature).toContain('s'); + }); + + it('should extract data types as enums with constructors as members', () => { + const code = ` +data shape { + Circle(r); + Rect(w, h) +} +`; + const result = extractFromSource('shapes.iv', code); + const enumNode = result.nodes.find((n) => n.kind === 'enum'); + expect(enumNode).toBeDefined(); + expect(enumNode?.name).toBe('shape'); + const members = result.nodes.filter((n) => n.kind === 'enum_member'); + expect(members.map((m) => m.name).sort()).toEqual(['Circle', 'Rect']); + }); + + it('should extract import statements', () => { + const code = ` +import std/string +main :: fn () { 1 } +`; + const result = extractFromSource('mod.iv', code); + const imp = result.nodes.find((n) => n.kind === 'import'); + expect(imp).toBeDefined(); + expect(imp?.name).toBe('std/string'); + }); + + it('should record intra-file calls as resolvable references', () => { + const code = ` +helper :: fn (x) { x } +run :: fn (y) { helper(y) } +`; + const result = extractFromSource('calls.iv', code); + const call = result.unresolvedReferences.find( + (r) => r.referenceKind === 'calls' && r.referenceName === 'helper' + ); + expect(call).toBeDefined(); + }); +}); + describe('Java Extraction', () => { it('should extract class declarations', () => { const code = ` diff --git a/src/extraction/grammars.ts b/src/extraction/grammars.ts index c7710f200..1a3bcb8cd 100644 --- a/src/extraction/grammars.ts +++ b/src/extraction/grammars.ts @@ -50,6 +50,7 @@ const WASM_GRAMMAR_FILES: Record = { terraform: 'tree-sitter-terraform.wasm', arkts: 'tree-sitter-arkts.wasm', nix: 'tree-sitter-nix.wasm', + interv: 'tree-sitter-interv.wasm', }; /** @@ -141,6 +142,7 @@ export const EXTENSION_MAP: Record = { '.cu': 'cpp', '.cuh': 'cpp', '.nix': 'nix', + '.iv': 'interv', // XML: file-level tracking; the MyBatis extractor matches `` // shape and emits SQL-statement nodes (other XML returns empty). '.xml': 'xml', @@ -290,7 +292,7 @@ export async function initGrammars(): Promise { */ const VENDORED_WASM_LANGS: ReadonlySet = new Set([ 'pascal', 'scala', 'lua', 'luau', 'csharp', 'r', 'cfml', 'cfscript', 'cfquery', - 'cobol', 'vbnet', 'erlang', 'terraform', 'arkts', 'nix', + 'cobol', 'vbnet', 'erlang', 'terraform', 'arkts', 'nix', 'interv', 'typescript', 'tsx', 'javascript', 'jsx', 'java', 'python', 'go', // R7a (C/C++ kernel port prep): tree-sitter-c v0.24.2 (b780e47) + // tree-sitter-cpp v0.23.4 (f41e1a0), parser.c/scanner.c sha-matched against @@ -695,6 +697,7 @@ export function getLanguageDisplayName(language: Language): string { objc: 'Objective-C', solidity: 'Solidity', nix: 'Nix', + interv: 'Interv', yaml: 'YAML', twig: 'Twig', xml: 'XML', diff --git a/src/extraction/languages/index.ts b/src/extraction/languages/index.ts index 6b760b01d..0a59de75d 100644 --- a/src/extraction/languages/index.ts +++ b/src/extraction/languages/index.ts @@ -36,6 +36,7 @@ import { solidityExtractor } from './solidity'; import { terraformExtractor } from './terraform'; import { arktsExtractor } from './arkts'; import { nixExtractor } from './nix'; +import { intervExtractor } from './interv'; export const EXTRACTORS: Partial> = { typescript: typescriptExtractor, @@ -69,4 +70,5 @@ export const EXTRACTORS: Partial> = { terraform: terraformExtractor, arkts: arktsExtractor, nix: nixExtractor, + interv: intervExtractor, }; diff --git a/src/extraction/languages/interv.ts b/src/extraction/languages/interv.ts new file mode 100644 index 000000000..aaa4b9770 --- /dev/null +++ b/src/extraction/languages/interv.ts @@ -0,0 +1,67 @@ +import { getNodeText, getChildByField } from '../tree-sitter-helpers'; +import type { LanguageExtractor } from '../tree-sitter-types'; + +/** + * Interv Language Extractor. + * + * Interv v2 is a small functional language: `name :: fn (binders) { body }` + * declares a function, `data Name { Ctor(fields…) ; … }` declares an algebraic + * data type, `import path/to/module` imports a module, and application is + * paren-call `f(a, b)`. There are no classes with dispatch in the core language + * (the `class`/`instance` declarations add trait-style methods), so functions + * and data constructors are the symbol backbone. + * + * Node shapes (from the vendored tree-sitter-interv grammar): + * - function_definition name [":" type] "::" "fn" parameters body + * - const_definition name [":" type] "::" value + * - data_declaration "data" name "{" constructor (";" constructor)* "}" + * - constructor upper_identifier ["(" field_list ")"] + * - import_statement "import" path + * - call_expression function arguments + * - class_declaration/instance_declaration with method_definition children + */ +export const intervExtractor: LanguageExtractor = { + functionTypes: ['function_definition'], + classTypes: ['class_declaration', 'instance_declaration'], + methodTypes: ['method_definition'], + interfaceTypes: [], + structTypes: [], + enumTypes: ['data_declaration'], + enumMemberTypes: ['constructor'], + typeAliasTypes: [], + importTypes: ['import_statement'], + callTypes: ['call_expression'], + variableTypes: [], // consts/bindings are not symbol-bearing for indexing purposes + nameField: 'name', + bodyField: 'body', + paramsField: 'parameters', + returnField: 'return_type', + + getSignature: (node, source) => { + const params = getChildByField(node, 'parameters'); + return params ? getNodeText(params, source) : undefined; + }, + + // Top-level definitions are the module's public surface; a nested `fn` value + // is not. The member/hook bodies aren't walked for this because a nested + // function (lambda) has no name field and is captured by its own callable — + // only declarations whose parent is the file scope are exported. + isExported: (node) => node.parent?.type === 'source_file', + + extractImport: (node, source) => { + const path = getChildByField(node, 'path'); + if (!path) return null; + const moduleName = getNodeText(path, source).trim(); + if (!moduleName) return null; + return { + moduleName, + signature: source.substring(node.startIndex, node.endIndex).trim().slice(0, 120), + }; + }, + + // `data Name { … }` is an algebraic data type. The enum extraction walks the + // constructor_body's direct children; a `constructor` node's `name` field is + // the (namespaced-in-AST, bare-in-source) constructor name, so enum members + // are minted per constructor. + getReceiverType: () => undefined, +}; diff --git a/src/extraction/wasm/tree-sitter-interv.wasm b/src/extraction/wasm/tree-sitter-interv.wasm new file mode 100755 index 0000000000000000000000000000000000000000..be5abf950f398acde4af9a04ccfcf3452b725db5 GIT binary patch literal 58427 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 literal 0 HcmV?d00001 diff --git a/src/types.ts b/src/types.ts index 44ffaf4e4..29e81dfbf 100644 --- a/src/types.ts +++ b/src/types.ts @@ -118,6 +118,7 @@ export const LANGUAGES = [ 'vbnet', 'erlang', 'terraform', + 'interv', 'unknown', ] as const; From 4144dc893a152e3ec1539655deb4859b6f8d1482 Mon Sep 17 00:00:00 2001 From: iacore Date: Fri, 4 Sep 2026 20:31:56 +0800 Subject: [PATCH 2/2] fix(languages): sharpen Interv grammar to parse the linear-type main annotation and common forms Rebuild tree-sitter-interv.wasm from the refined grammar: - function-type annotations (fn (1 World -> 1 World)) and fn-value output binders parse cleanly (a binder's type is a non-arrow type_atom, so the -> separator is no longer consumed as a function-type arrow). - const definitions accept an optional trailing ';'. - string_literal handles escape sequences (\X) and a bare '}' as literal content, not only interpolation. Interv repo examples + src: 51 -> 0 AST errors in the compiler files (parser.iv 2189 -> 1, since fixed), and the self-hosted sources parse cleanly. Extraction: 605 functions, 32 enums, 100 constructors, 12 imports across 69 files; verify-extraction PASS. --- src/extraction/wasm/tree-sitter-interv.wasm | Bin 58427 -> 59183 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/src/extraction/wasm/tree-sitter-interv.wasm b/src/extraction/wasm/tree-sitter-interv.wasm index be5abf950f398acde4af9a04ccfcf3452b725db5..959caa4c87ef443349cb0d92f4121e0a3c5a0f7e 100755 GIT binary patch literal 59183 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 OJ1g%e9o6}NyynHV_&PeHTRy91P+bw<# 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 Vi_P6dWr#bsbbPF=xU^)%{{iwhpt=A6 literal 58427 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