feat(extraction): add Objective-C language support (#165)
Adds tree-sitter-objc extractor for `.m`/`.mm` files and `.h` files that content-sniff as Objective-C (`@interface`/`@implementation`/`@protocol`/`@synthesize`). Extraction covers: - `@interface` / `@implementation` (deduplicated into a single class node) - `@protocol` (as `protocol` nodes via new `interfaceKind` config) - Methods with full multi-part selectors (`doThing:with:`, not just `doThing`), including `+`/`-` static distinction - `@property` declarations - Inheritance (`extends`) and protocol conformance (`implements`) - C-style `function_definition` and `#import` (both `<system>` and `"local"` forms) - Call edges from both `call_expression` and `message_expression`, with `self`/`super` skipped on qualified callee names Two new generic hooks on `LanguageExtractor` (`resolveName`, `extractPropertyName`) handle the cases where the default name walk doesn't fit; usable by future languages with similar shape. Import resolver tries `.h`, `.m`, `.mm` for `objc` imports. Validated on AFNetworking (84 files, 100% file coverage), RestKit (282 files, 99.6%), and Texture (926 files, 100%, heavy `.mm` content) — multi-keyword selectors preserved up to 7 parts, no parse failures on ObjC++. Known limitations (disclosed in README): - Categories produce duplicate class nodes (one per category file) - Chained/nested message sends record only the innermost method - `[Class alloc]` patterns don't emit `instantiates` edges - `@protocol Foo <Bar>` refinement lists not yet wired to `implements` - Heavy C++ in `.mm` files may parse incompletely under the ObjC grammar
This commit is contained in:
@@ -120,6 +120,12 @@ export interface LanguageExtractor {
|
||||
|
||||
// --- Existing hooks ---
|
||||
|
||||
/** Override symbol name extraction (e.g. ObjC multi-part selectors). */
|
||||
resolveName?: (node: SyntaxNode, source: string) => string | undefined;
|
||||
|
||||
/** Extract property name when the generic name walk fails (e.g. ObjC @property). */
|
||||
extractPropertyName?: (node: SyntaxNode, source: string) => string | null;
|
||||
|
||||
/** Extract signature from node */
|
||||
getSignature?: (node: SyntaxNode, source: string) => string | undefined;
|
||||
/** Extract visibility from node */
|
||||
|
||||
Reference in New Issue
Block a user