From 487ac4a71a944a5cf30f34bd74ecb1af6af597bb Mon Sep 17 00:00:00 2001 From: Colby McHenry Date: Tue, 26 May 2026 00:35:14 -0500 Subject: [PATCH] docs(changelog): add Objective-C indexing entry under [Unreleased] Covers #165: tree-sitter-objc extractor for .m / .mm / content-sniffed .h, with full multi-part selectors, @protocol nodes, @property, message expression call edges, extends/implements edges. Validated on AFNetworking / RestKit / Texture. Disclosed limitations match the README's 'Partial support' note (categories produce duplicate class nodes per category file; .mm ObjC++ parses incompletely under the ObjC grammar; mixed Swift/ObjC bridging out of scope, tracked separately). Co-Authored-By: Claude Opus 4.7 (1M context) --- CHANGELOG.md | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 761e3629d..0649567a4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -56,6 +56,34 @@ and adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). banner stays accurate at any debounce value because it's per-file, not a static "wait N ms" instruction. +- **Objective-C indexing — `.m`, `.mm`, and content-sniffed `.h` files now + parse with full structural extraction (#165).** Adds a tree-sitter-objc + extractor that produces `class` nodes for `@interface` / `@implementation` + (deduplicated into one), `protocol` nodes for `@protocol`, methods with + **full multi-part selectors** (`setObject:forKey:`, `tableView:didSelectRowAtIndexPath:` + — not just the first keyword, which would collide distinct methods), + `+`/`-` static distinction, `@property` declarations, `#import` for both + `` and `"local"` forms, and `extends` / `implements` edges for + superclasses and `` conformance lists. Call edges come from + both C-style `call_expression` and ObjC `message_expression` (with + `self`/`super` skipped on qualified callee names). Header files default + to C unless content-sniffing finds `@interface`/`@implementation`/ + `@protocol`/`@synthesize`, so iOS headers classify correctly without + breaking pure-C projects. Validated on AFNetworking (84 files, 100% file + coverage, 93 multi-keyword selectors), RestKit (282 files, 99.6%), and + Texture (926 files, 100% — including heavy `.mm` ObjC++ content). + + Disclosed limitations: categories produce one extra class node per + category file (e.g. `ASDisplayNode+Yoga.m` creates a second `ASDisplayNode` + node attributed to the category file); chained/nested message sends record + only the innermost method; `[Class alloc]` patterns don't yet emit + `instantiates` edges; `@protocol Foo ` refinement lists aren't wired + to `implements`; heavy C++ in `.mm` files may parse incompletely under the + ObjC grammar. Mixed Swift/Objective-C cross-language resolution + (`@objc`-exposed Swift methods, bridging headers, React Native's native + bridge) is **not** in scope for this entry — that's a separate effort + tracked under the dynamic-dispatch coverage playbook. + ### Fixed - **Git worktrees no longer silently borrow another tree's index (#155).** When a worktree is nested inside the main checkout — exactly what agent