From 7f75479399e4d97fef97795d30bdf4326173cecc Mon Sep 17 00:00:00 2001 From: Haruku Umemura <60563079+Plumvery@users.noreply.github.com> Date: Fri, 21 Aug 2026 15:59:45 +0900 Subject: [PATCH] feat(extraction): add GDScript language support MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds GDScript (.gd) as a supported language on the wasm extraction path: - Extractor (src/extraction/languages/gdscript.ts): functions and typed signatures, `_init` constructors (no name field in the grammar — resolveName supplies the conventional name), inner classes with methods, enums with members (`enumerator` names via `left`), `static func` detection (static_keyword child scan), and call edges through `call`, `attribute_call`, and `base_call`. - The var/const family (`variable_statement`, `export_variable_statement`, `onready_variable_statement`, `const_statement`) names its target via a `name`-typed child, not `identifier`, so the core's generic variable fallback can't read them — a visitNode hook creates variable/constant nodes itself and walks initializers so calls inside them (`preload(...)`, `Foo.new()`) are captured. - Signals extract as properties carrying their parameter list, so connect()-heavy scripts expose their signal surface in the graph. - Grammar: PrestonKnopp/tree-sitter-gdscript v6.1.0 (MIT), vendored as an ABI-15 wasm rebuilt from upstream source (tree-sitter-cli 0.25.10 generate + build --wasm, emscripten/emsdk:4.0.4); external scanner (indentation) included. check-grammar.mjs: ABI 15, 20/20 clean parses, heap-safe under multi-grammar reuse. Validated with the add-lang verification gate on two corpora: - godotengine/godot-demo-projects (public): 461 .gd files -> 5,216 nodes / 6,783 edges in 3.7s (classes 45, methods 184, signals 141, enums 39+130). - A private Godot 4 game (138 .gd files): 2,996 nodes / 11,484 edges; all critical and soft checks pass (2,858 structural symbols, density 20.7/file). Co-Authored-By: Claude Opus 5 --- CHANGELOG.md | 4 + README.md | 3 +- __tests__/extraction.test.ts | 113 ++++++++++++++++++ src/extraction/grammars.ts | 5 +- src/extraction/languages/gdscript.ts | 102 ++++++++++++++++ src/extraction/languages/index.ts | 2 + src/extraction/wasm/tree-sitter-gdscript.wasm | Bin 0 -> 294775 bytes src/types.ts | 1 + 8 files changed, 228 insertions(+), 2 deletions(-) create mode 100644 src/extraction/languages/gdscript.ts create mode 100644 src/extraction/wasm/tree-sitter-gdscript.wasm diff --git a/CHANGELOG.md b/CHANGELOG.md index 3ca5b9ff1..aa3012278 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,10 @@ and adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] +### New Features + +- GDScript (`.gd`) is now a supported language: functions and typed signatures, `_init` constructors, inner classes with methods, the full `var`/`const`/`@export`/`@onready` variable family, signals (extracted as properties with their parameter lists), enums with members, `static func` detection, and call edges — including calls inside initializers like `preload(...)`. Grammar: PrestonKnopp/tree-sitter-gdscript v6.1.0, vendored as an ABI-15 wasm rebuilt from upstream source. + ## [1.6.0] - 2026-08-26 diff --git a/README.md b/README.md index 48323f6fd..5c224cb67 100644 --- a/README.md +++ b/README.md @@ -278,7 +278,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, GDScript, R, Nix, Erlang, CFML, COBOL, Solidity, Terraform/OpenTofu, Svelte, Vue, Astro, Liquid, Pascal/Delphi | | **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 | @@ -818,6 +818,7 @@ is written): | 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`) | +| GDScript | `.gd` | Full support (functions with typed signatures, `_init` constructors, inner classes, `var`/`const`/`@export`/`@onready` variables, signals, enums with members, static detection, call edges — including calls inside initializers like `preload()`) | | CFML | `.cfc`, `.cfm`, `.cfs` | Full support (tag-based ``/`` and bare-script `component { ... }` styles, `extends`/`implements`, embedded `` delegation, call edges) | | COBOL | `.cbl`, `.cob`, `.cpy` | Full support (programs, sections/paragraphs with PERFORM/GO TO call edges, CALL 'literal' cross-program calls, COPY copybook imports — including standalone `.cpy` files — DATA DIVISION records/fields/88-levels, EXEC CICS LINK/XCTL and EXEC SQL INCLUDE targets; fixed and free format) | | Visual Basic .NET | `.vb` | Full support (classes, Modules, interfaces, structures, enums, properties, events, `Declare` P/Invoke, `Handles`/`WithEvents`, `Inherits`/`Implements` edges, call edges through VB's call/index paren ambiguity, `As New` instantiation, interpolated strings, LINQ, Unicode identifiers) | diff --git a/__tests__/extraction.test.ts b/__tests__/extraction.test.ts index ad0ba2374..1f7a72c87 100644 --- a/__tests__/extraction.test.ts +++ b/__tests__/extraction.test.ts @@ -144,6 +144,12 @@ describe('Language Detection', () => { expect(detectLanguage('entry/src/main/ets/common/utils.ts')).toBe('typescript'); }); + it('should detect GDScript files', () => { + expect(detectLanguage('player.gd')).toBe('gdscript'); + expect(detectLanguage('scripts/enemies/boss_ai.gd')).toBe('gdscript'); + expect(isSourceFile('player.gd')).toBe(true); + }); + it('should detect Nix files', () => { expect(detectLanguage('default.nix')).toBe('nix'); expect(detectLanguage('pkgs/development/tools/misc/codegraph/default.nix')).toBe('nix'); @@ -252,6 +258,7 @@ describe('Language Support', () => { expect(languages).toContain('dart'); expect(languages).toContain('solidity'); expect(languages).toContain('nix'); + expect(languages).toContain('gdscript'); }); }); @@ -394,6 +401,112 @@ in }); }); +describe('GDScript Extraction', () => { + it('should extract functions, constructor, and signatures', () => { + const code = `extends Node2D + +func _ready() -> void: + set_process(true) + +func _init(width: int, height: int = 32): + pass + +static func clamp_value(v: float, lo: float, hi: float) -> float: + return clampf(v, lo, hi) +`; + + const result = extractFromSource('player.gd', code); + + const ready = result.nodes.find((n) => n.kind === 'function' && n.name === '_ready'); + expect(ready?.signature).toBe('() -> void'); + + // constructor_definition has no name field; resolveName supplies _init + const init = result.nodes.find((n) => n.name === '_init'); + expect(init).toBeDefined(); + expect(init?.signature).toBe('(width: int, height: int = 32)'); + + const clampValue = result.nodes.find((n) => n.name === 'clamp_value'); + expect(clampValue?.signature).toBe('(v: float, lo: float, hi: float) -> float'); + expect(clampValue?.isStatic).toBe(true); + + const calls = result.unresolvedReferences.filter((r) => r.referenceKind === 'calls').map((r) => r.referenceName); + expect(calls).toContain('set_process'); + expect(calls).toContain('clampf'); + }); + + it('should extract the var/const family and walk initializers for calls', () => { + const code = `extends Node + +const MAX_SPEED := 300.0 +var health: int = 100 +@export var display_name: String = "Player" +@onready var sprite = get_node("Sprite2D") +var scene = preload("res://enemy.tscn") +`; + + const result = extractFromSource('stats.gd', code); + + const maxSpeed = result.nodes.find((n) => n.kind === 'constant' && n.name === 'MAX_SPEED'); + expect(maxSpeed).toBeDefined(); + + const health = result.nodes.find((n) => n.kind === 'variable' && n.name === 'health'); + expect(health?.signature).toBe(': int = 100'); + + expect(result.nodes.find((n) => n.kind === 'variable' && n.name === 'display_name')).toBeDefined(); + expect(result.nodes.find((n) => n.kind === 'variable' && n.name === 'sprite')).toBeDefined(); + + // Initializers are walked, so calls inside them are captured. + const calls = result.unresolvedReferences.filter((r) => r.referenceKind === 'calls').map((r) => r.referenceName); + expect(calls).toContain('get_node'); + expect(calls).toContain('preload'); + }); + + it('should extract signals as properties with their parameter list', () => { + const code = `extends Node + +signal died +signal health_changed(old_value, new_value) +`; + + const result = extractFromSource('events.gd', code); + + const died = result.nodes.find((n) => n.kind === 'property' && n.name === 'died'); + expect(died).toBeDefined(); + + const healthChanged = result.nodes.find((n) => n.kind === 'property' && n.name === 'health_changed'); + expect(healthChanged?.signature).toBe('(old_value, new_value)'); + }); + + it('should extract enums with members and inner classes with methods', () => { + const code = `extends Node + +enum State { IDLE, RUNNING = 10, DEAD } + +class Inventory: + var items := [] + + func add(item) -> void: + items.append(item) +`; + + const result = extractFromSource('game.gd', code); + + expect(result.nodes.find((n) => n.kind === 'enum' && n.name === 'State')).toBeDefined(); + const members = result.nodes.filter((n) => n.kind === 'enum_member').map((n) => n.name); + expect(members).toContain('IDLE'); + expect(members).toContain('RUNNING'); + expect(members).toContain('DEAD'); + + expect(result.nodes.find((n) => n.kind === 'class' && n.name === 'Inventory')).toBeDefined(); + const add = result.nodes.find((n) => n.kind === 'method' && n.name === 'add'); + expect(add?.signature).toBe('(item) -> void'); + + // obj.method(args) parses as attribute_call — the bare method name is emitted. + const calls = result.unresolvedReferences.filter((r) => r.referenceKind === 'calls').map((r) => r.referenceName); + expect(calls).toContain('append'); + }); +}); + describe('TypeScript Extraction', () => { it('should extract function declarations', () => { const code = ` diff --git a/src/extraction/grammars.ts b/src/extraction/grammars.ts index 84647c3e4..bfa07209a 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', + gdscript: 'tree-sitter-gdscript.wasm', }; /** @@ -121,6 +122,7 @@ export const EXTENSION_MAP: Record = { '.sc': 'scala', '.lua': 'lua', '.luau': 'luau', + '.gd': 'gdscript', '.m': 'objc', '.mm': 'objc', '.sol': 'solidity', @@ -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', 'gdscript', '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 @@ -679,6 +681,7 @@ export function getLanguageDisplayName(language: Language): string { scala: 'Scala', lua: 'Lua', luau: 'Luau', + gdscript: 'GDScript', objc: 'Objective-C', solidity: 'Solidity', nix: 'Nix', diff --git a/src/extraction/languages/gdscript.ts b/src/extraction/languages/gdscript.ts new file mode 100644 index 000000000..da0ed3886 --- /dev/null +++ b/src/extraction/languages/gdscript.ts @@ -0,0 +1,102 @@ +import { getNodeText, getChildByField } from '../tree-sitter-helpers'; +import type { LanguageExtractor } from '../tree-sitter-types'; + +// GDScript (Godot, tree-sitter-gdscript). A Python-like indentation grammar +// where every `.gd` file is an implicit class — top-level `func`s extract as +// functions, `class X:` inner classes as classes with methods. +// +// Grammar shapes that need care: +// - The var/const family (`variable_statement`, `export_variable_statement`, +// `onready_variable_statement`, `const_statement`) names its target via a +// `name`-typed child, NOT `identifier`, so the core's generic variable +// fallback (which looks for identifier children) can't read them. The +// visitNode hook creates variable/constant nodes itself, then walks the +// initializer so calls inside it (`preload(...)`, `Foo.new()`) are captured. +// - `func _init(...)` (constructor_definition) has no name field; resolveName +// supplies the conventional `_init`. +// - `enumerator` names its identifier via `left`, not `name`. +// - `obj.method(args)` parses as attribute(identifier, attribute_call(...)), +// so attribute_call joins callTypes; the core's namedChild(0) callee +// fallback then yields the bare method name (resolution is name-match only, +// matching how self/this receivers are emitted elsewhere). +// - `signal foo(a, b)` extracts as a property carrying the parameter list, so +// connect()-heavy scripts expose their signal surface in the graph. +const VARIABLE_NODE_TYPES = new Set([ + 'variable_statement', + 'export_variable_statement', + 'onready_variable_statement', + 'const_statement', +]); + +export const gdscriptExtractor: LanguageExtractor = { + functionTypes: ['function_definition', 'constructor_definition'], + classTypes: ['class_definition'], + methodTypes: ['function_definition', 'constructor_definition'], + interfaceTypes: [], + structTypes: [], + enumTypes: ['enum_definition'], + enumMemberTypes: ['enumerator'], + typeAliasTypes: [], + importTypes: [], + callTypes: ['call', 'attribute_call', 'base_call'], + variableTypes: [], // handled by the visitNode hook (see above) + nameField: 'name', + bodyField: 'body', + paramsField: 'parameters', + returnField: 'return_type', + + resolveName: (node, source) => { + if (node.type === 'constructor_definition') return '_init'; + if (node.type === 'enumerator') { + const left = getChildByField(node, 'left'); + return left ? getNodeText(left, source) : undefined; + } + return undefined; + }, + + // `static` is a named static_keyword CHILD (no field) on function_definition; + // the var statements carry it via a field, but a child scan covers both. + isStatic: (node) => node.namedChildren.some((c) => c?.type === 'static_keyword'), + + getSignature: (node, source) => { + const params = getChildByField(node, 'parameters'); + if (!params) return undefined; + let sig = getNodeText(params, source); + const ret = getChildByField(node, 'return_type'); + if (ret) sig += ' -> ' + getNodeText(ret, source); + return sig; + }, + + visitNode: (node, ctx) => { + if (node.type === 'signal_statement') { + const nameNode = node.childForFieldName('name'); + if (nameNode) { + const params = node.childForFieldName('parameters'); + ctx.createNode('property', getNodeText(nameNode, ctx.source), node, { + signature: params ? getNodeText(params, ctx.source) : undefined, + }); + } + return true; + } + if (VARIABLE_NODE_TYPES.has(node.type)) { + const nameNode = node.childForFieldName('name'); + const valueNode = node.childForFieldName('value'); + if (nameNode) { + const typeNode = node.childForFieldName('type'); + const typeSig = typeNode ? `: ${getNodeText(typeNode, ctx.source)}` : ''; + const initValue = valueNode ? getNodeText(valueNode, ctx.source).slice(0, 100) : ''; + const initSig = initValue ? ` = ${initValue}${initValue.length >= 100 ? '...' : ''}` : ''; + ctx.createNode( + node.type === 'const_statement' ? 'constant' : 'variable', + getNodeText(nameNode, ctx.source), + node, + { signature: (typeSig + initSig).trim() || undefined }, + ); + } + // Walk the initializer so calls inside it (preload(), Foo.new()) are captured. + if (valueNode) ctx.visitNode(valueNode); + return true; + } + return false; + }, +}; diff --git a/src/extraction/languages/index.ts b/src/extraction/languages/index.ts index 6b760b01d..1feacac5c 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 { gdscriptExtractor } from './gdscript'; export const EXTRACTORS: Partial> = { typescript: typescriptExtractor, @@ -69,4 +70,5 @@ export const EXTRACTORS: Partial> = { terraform: terraformExtractor, arkts: arktsExtractor, nix: nixExtractor, + gdscript: gdscriptExtractor, }; diff --git a/src/extraction/wasm/tree-sitter-gdscript.wasm b/src/extraction/wasm/tree-sitter-gdscript.wasm new file mode 100644 index 0000000000000000000000000000000000000000..a67891fab845a3b7f898a1191e97b04367cfb28e GIT binary patch literal 294775 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 Zev-OK{p4vP{rQx+C2<*mZ;841{6DzA`T76= literal 0 HcmV?d00001 diff --git a/src/types.ts b/src/types.ts index 186f57adc..130dfb5af 100644 --- a/src/types.ts +++ b/src/types.ts @@ -102,6 +102,7 @@ export const LANGUAGES = [ 'scala', 'lua', 'luau', + 'gdscript', 'objc', 'r', 'solidity',