diff --git a/src/extraction/tree-sitter.ts b/src/extraction/tree-sitter.ts index 20f5dbb26..6d985d41f 100644 --- a/src/extraction/tree-sitter.ts +++ b/src/extraction/tree-sitter.ts @@ -1091,7 +1091,8 @@ export class TreeSitterExtractor { // SIGNATURE_METHOD_NODE_TYPES for what falling through would otherwise mint. else if ( this.extractor.methodTypes.includes(nodeType) - && (!SIGNATURE_METHOD_NODE_TYPES.has(nodeType) || this.isInsideClassLikeNode()) + && (!(TS_JS_CHAIN_LANGUAGES.has(this.language) || this.language === 'arkts') + || !SIGNATURE_METHOD_NODE_TYPES.has(nodeType) || this.isInsideClassLikeNode()) ) { // TS/JS class fields parse as a methodTypes node; only function-valued // fields are methods — a plain field (`public fonts: Fonts;`) is a @@ -4870,14 +4871,12 @@ export class TreeSitterExtractor { TS_JS_CHAIN_RECEIVER_TYPES.has(receiver.type) && isUnresolvedTsJsChain(receiver, this.source) ) { - // `holder.values.get()` has no inferred property type (#1566). - // Emitting bare `get` exact-matches an unrelated project method; - // preserving the chain alone would still allow receiver guessing. - // Emit nothing until the property type can be established. This - // also covers host chains such as `chrome.storage.local.get()` - // (#1707). Calls inside arguments are visited independently. - // Mirrored in the kernel's extract_call (tsjs/extractors.rs). - return; + // Keep the source call for effect reporting, but never collapse + // it to a guessed method. The resolver only lets frameworks + // with receiver evidence handle these qualified chains. + const chain = getNodeText(func, this.source).replace(/\s+/g, '').replace(/\?\./g, '.'); + if (!/^[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*){2,}$/.test(chain)) return; + calleeName = chain; } else { calleeName = methodName; }