gitnexus 1.6.13-rc.51 → 1.6.13-rc.53
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_shared/scope-resolution/types.d.ts +1 -1
- package/dist/_shared/scope-resolution/types.d.ts.map +1 -1
- package/dist/core/ingestion/languages/python/index.d.ts +5 -7
- package/dist/core/ingestion/languages/python/index.js +5 -7
- package/dist/core/ingestion/languages/python/interpret.js +3 -1
- package/dist/core/ingestion/languages/python/receiver-binding.d.ts +5 -0
- package/dist/core/ingestion/languages/python/receiver-binding.js +112 -11
- package/dist/core/ingestion/languages/python/scope-resolver.js +1 -0
- package/dist/core/ingestion/method-extractors/configs/python.js +5 -2
- package/dist/core/ingestion/scope-extractor.js +5 -0
- package/dist/core/ingestion/scope-resolution/contract/scope-resolver.d.ts +4 -0
- package/dist/core/ingestion/scope-resolution/passes/receiver-bound-calls.d.ts +1 -1
- package/dist/core/ingestion/scope-resolution/passes/receiver-bound-calls.js +21 -0
- package/dist/core/ingestion/utils/test-file-path.js +1 -0
- package/dist/storage/parse-cache.js +4 -1
- package/package.json +1 -1
|
@@ -595,7 +595,7 @@ export interface TypeRef {
|
|
|
595
595
|
readonly declaredSpelling?: string;
|
|
596
596
|
/** Anchor for resolving `rawName` — the scope where the annotation/inference was written. */
|
|
597
597
|
readonly declaredAtScope: ScopeId;
|
|
598
|
-
readonly source: 'annotation' | 'parameter-annotation' | 'return-annotation' | 'self' | 'assignment-inferred' | 'constructor-inferred' | 'receiver-propagated';
|
|
598
|
+
readonly source: 'annotation' | 'parameter-annotation' | 'return-annotation' | 'self' | 'decorator-unknown' | 'assignment-inferred' | 'constructor-inferred' | 'receiver-propagated';
|
|
599
599
|
/** Reserved for V2+: generic type arguments (`List<User>` → `[TypeRef('User')]`). V1 ignores. */
|
|
600
600
|
readonly typeArgs?: readonly TypeRef[];
|
|
601
601
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/scope-resolution/types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/scope-resolution/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -43,13 +43,11 @@
|
|
|
43
43
|
* and emit a single edge rather than branching. `List[T]` /
|
|
44
44
|
* `Dict[K, V]` strip the outer generic for receiver typing (see
|
|
45
45
|
* `interpret.ts`).
|
|
46
|
-
* 5. **Decorators that rewrite signatures** —
|
|
47
|
-
* `@property`, `@classmethod`, `@staticmethod` are
|
|
48
|
-
* by `receiver-binding.ts`.
|
|
49
|
-
*
|
|
50
|
-
*
|
|
51
|
-
* different callable is followed only through the declared
|
|
52
|
-
* return type.
|
|
46
|
+
* 5. **Decorators that rewrite signatures** — Known descriptor
|
|
47
|
+
* spellings (`@property`, `@classmethod`, `@staticmethod`) are
|
|
48
|
+
* recognized by `receiver-binding.ts`. Unknown decorator expressions
|
|
49
|
+
* leave implicit receiver binding unresolved. Calls through wrappers
|
|
50
|
+
* are followed only through their declared return type.
|
|
53
51
|
* 6. **`typing.TYPE_CHECKING`-guarded imports** — treated like any
|
|
54
52
|
* other `import` for reference resolution. We do not distinguish
|
|
55
53
|
* runtime-visible from type-checker-only imports; this is
|
|
@@ -43,13 +43,11 @@
|
|
|
43
43
|
* and emit a single edge rather than branching. `List[T]` /
|
|
44
44
|
* `Dict[K, V]` strip the outer generic for receiver typing (see
|
|
45
45
|
* `interpret.ts`).
|
|
46
|
-
* 5. **Decorators that rewrite signatures** —
|
|
47
|
-
* `@property`, `@classmethod`, `@staticmethod` are
|
|
48
|
-
* by `receiver-binding.ts`.
|
|
49
|
-
*
|
|
50
|
-
*
|
|
51
|
-
* different callable is followed only through the declared
|
|
52
|
-
* return type.
|
|
46
|
+
* 5. **Decorators that rewrite signatures** — Known descriptor
|
|
47
|
+
* spellings (`@property`, `@classmethod`, `@staticmethod`) are
|
|
48
|
+
* recognized by `receiver-binding.ts`. Unknown decorator expressions
|
|
49
|
+
* leave implicit receiver binding unresolved. Calls through wrappers
|
|
50
|
+
* are followed only through their declared return type.
|
|
53
51
|
* 6. **`typing.TYPE_CHECKING`-guarded imports** — treated like any
|
|
54
52
|
* other `import` for reference resolution. We do not distinguish
|
|
55
53
|
* runtime-visible from type-checker-only imports; this is
|
|
@@ -124,7 +124,9 @@ export function interpretPythonTypeBinding(captures) {
|
|
|
124
124
|
// the variable-annotation and constructor-inferred forms from the
|
|
125
125
|
// classic parameter annotation.
|
|
126
126
|
let source = 'parameter-annotation';
|
|
127
|
-
if (captures['@type-binding.
|
|
127
|
+
if (captures['@type-binding.uncertain-receiver'] !== undefined)
|
|
128
|
+
source = 'decorator-unknown';
|
|
129
|
+
else if (captures['@type-binding.self'] !== undefined)
|
|
128
130
|
source = 'self';
|
|
129
131
|
// `cls` is a self-like receiver; share the source label so downstream
|
|
130
132
|
// `Registry.lookup` Step 2 treats them identically.
|
|
@@ -34,6 +34,11 @@ export declare function classifyPythonBoundReceiver(fnNode: SyntaxNode): PythonB
|
|
|
34
34
|
* The caller is responsible for guaranteeing `fnNode.type ===
|
|
35
35
|
* 'function_definition'`.
|
|
36
36
|
*/
|
|
37
|
+
/**
|
|
38
|
+
* The first parameter of a class method under an unrecognized decorator.
|
|
39
|
+
* Python may still bind it implicitly, but its receiver kind is unproven.
|
|
40
|
+
*/
|
|
41
|
+
export declare function classifyPythonUncertainReceiver(fnNode: SyntaxNode): PythonBoundReceiver | null;
|
|
37
42
|
export declare function synthesizeReceiverTypeBinding(fnNode: SyntaxNode): CaptureMatch | null;
|
|
38
43
|
/**
|
|
39
44
|
* Synthesize class-scope field bindings for the common Python constructor
|
|
@@ -27,20 +27,77 @@ function findEnclosingClassDefinition(node) {
|
|
|
27
27
|
function classDefinitionName(classNode) {
|
|
28
28
|
return classNode.childForFieldName('name')?.text ?? null;
|
|
29
29
|
}
|
|
30
|
-
/**
|
|
31
|
-
|
|
32
|
-
function hasDecorator(fnNode, decoratorName) {
|
|
30
|
+
/** Syntactic decorator expressions; aliases cannot be identified by spelling. */
|
|
31
|
+
function decoratorNames(fnNode) {
|
|
33
32
|
const parent = fnNode.parent;
|
|
34
33
|
if (parent === null || parent.type !== 'decorated_definition')
|
|
35
|
-
return
|
|
34
|
+
return [];
|
|
35
|
+
const names = [];
|
|
36
36
|
for (let i = 0; i < parent.namedChildCount; i++) {
|
|
37
37
|
const child = parent.namedChild(i);
|
|
38
38
|
if (child === null || child.type !== 'decorator')
|
|
39
39
|
continue;
|
|
40
|
-
const text = child.text.replace(/^@/, '').
|
|
41
|
-
|
|
42
|
-
|
|
40
|
+
const text = child.text.replace(/^@/, '').trim();
|
|
41
|
+
names.push(text);
|
|
42
|
+
}
|
|
43
|
+
return names;
|
|
44
|
+
}
|
|
45
|
+
/** Matches bare and module-qualified decorator spellings. */
|
|
46
|
+
function hasDecorator(fnNode, decoratorName) {
|
|
47
|
+
return decoratorNames(fnNode).some((expression) => {
|
|
48
|
+
const name = expression.split('(')[0].trim();
|
|
49
|
+
return name === decoratorName || name.endsWith(`.${decoratorName}`);
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
// These spellings have a known descriptor contract in ordinary Python code.
|
|
53
|
+
// Arbitrary dotted tails, aliases and decorator calls do not.
|
|
54
|
+
const KNOWN_RECEIVER_DECORATORS = new Set(['classmethod', 'staticmethod', 'property']);
|
|
55
|
+
/** Accept a local `@property` accessor chain, skipping only plain unrelated
|
|
56
|
+
* methods. Other intervening class-suite statements may rebind the descriptor,
|
|
57
|
+
* including tuple assignment or control flow. */
|
|
58
|
+
function isLocalPropertyAccessor(fnNode, expression) {
|
|
59
|
+
const methodName = fnNode.childForFieldName('name')?.text;
|
|
60
|
+
if (methodName === undefined ||
|
|
61
|
+
!['getter', 'setter', 'deleter'].some((kind) => expression === `${methodName}.${kind}`))
|
|
62
|
+
return false;
|
|
63
|
+
const wrapper = fnNode.parent;
|
|
64
|
+
const classBody = findEnclosingClassDefinition(fnNode)?.childForFieldName('body');
|
|
65
|
+
if (wrapper?.type !== 'decorated_definition' || classBody === null || classBody === undefined) {
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
let wrapperIndex = -1;
|
|
69
|
+
for (let i = 0; i < classBody.namedChildCount; i++) {
|
|
70
|
+
const sibling = classBody.namedChild(i);
|
|
71
|
+
if (sibling?.id === wrapper.id) {
|
|
72
|
+
wrapperIndex = i;
|
|
73
|
+
break;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
for (let i = wrapperIndex - 1; i >= 0; i--) {
|
|
77
|
+
const sibling = classBody.namedChild(i);
|
|
78
|
+
if (sibling?.type === 'function_definition' &&
|
|
79
|
+
sibling.childForFieldName('name')?.text !== methodName) {
|
|
80
|
+
// A plain function definition binds only its own name in the class suite.
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
if (sibling?.type !== 'decorated_definition')
|
|
84
|
+
return false;
|
|
85
|
+
let candidate = null;
|
|
86
|
+
for (let j = 0; j < sibling.namedChildCount; j++) {
|
|
87
|
+
const child = sibling.namedChild(j);
|
|
88
|
+
if (child?.type === 'function_definition')
|
|
89
|
+
candidate = child;
|
|
90
|
+
}
|
|
91
|
+
if (candidate?.childForFieldName('name')?.text !== methodName)
|
|
92
|
+
return false;
|
|
93
|
+
const decorators = decoratorNames(candidate);
|
|
94
|
+
if (decorators.length !== 1)
|
|
95
|
+
return false;
|
|
96
|
+
if (decorators[0] === 'property')
|
|
43
97
|
return true;
|
|
98
|
+
if (!['getter', 'setter', 'deleter'].some((kind) => decorators[0] === `${methodName}.${kind}`)) {
|
|
99
|
+
return false;
|
|
100
|
+
}
|
|
44
101
|
}
|
|
45
102
|
return false;
|
|
46
103
|
}
|
|
@@ -48,6 +105,9 @@ function hasDecorator(fnNode, decoratorName) {
|
|
|
48
105
|
export function isPythonStaticLikeMethod(fnNode) {
|
|
49
106
|
return (fnNode.childForFieldName('name')?.text === '__new__' || hasDecorator(fnNode, 'staticmethod'));
|
|
50
107
|
}
|
|
108
|
+
function isKnownReceiverDecorator(fnNode, expression) {
|
|
109
|
+
return KNOWN_RECEIVER_DECORATORS.has(expression) || isLocalPropertyAccessor(fnNode, expression);
|
|
110
|
+
}
|
|
51
111
|
function firstBoundReceiverParameter(parameters) {
|
|
52
112
|
for (let i = 0; i < parameters.namedChildCount; i++) {
|
|
53
113
|
const child = parameters.namedChild(i);
|
|
@@ -86,8 +146,16 @@ function firstParameterName(param) {
|
|
|
86
146
|
*/
|
|
87
147
|
export function classifyPythonBoundReceiver(fnNode) {
|
|
88
148
|
const enclosingClass = findEnclosingClassDefinition(fnNode);
|
|
89
|
-
if (enclosingClass === null
|
|
149
|
+
if (enclosingClass === null)
|
|
150
|
+
return null;
|
|
151
|
+
const decorators = decoratorNames(fnNode);
|
|
152
|
+
if (isPythonStaticLikeMethod(fnNode) ||
|
|
153
|
+
decorators.some((name) => !isKnownReceiverDecorator(fnNode, name))) {
|
|
154
|
+
// Python evaluates decorators as expressions. An unrecognized one may
|
|
155
|
+
// replace the function with a class/static descriptor, so its first
|
|
156
|
+
// parameter is not proven to receive an instance.
|
|
90
157
|
return null;
|
|
158
|
+
}
|
|
91
159
|
const functionName = fnNode.childForFieldName('name')?.text;
|
|
92
160
|
// Python applies these descriptor kinds implicitly even without decorators.
|
|
93
161
|
// __new__ is static-like (its class argument is explicit), while
|
|
@@ -103,7 +171,7 @@ export function classifyPythonBoundReceiver(fnNode) {
|
|
|
103
171
|
if (name === null || className === null)
|
|
104
172
|
return null;
|
|
105
173
|
return {
|
|
106
|
-
kind:
|
|
174
|
+
kind: decorators.includes('classmethod') ||
|
|
107
175
|
functionName === '__init_subclass__' ||
|
|
108
176
|
functionName === '__class_getitem__'
|
|
109
177
|
? 'class'
|
|
@@ -142,10 +210,43 @@ function classifyPythonExplicitNewReceiver(fnNode) {
|
|
|
142
210
|
* The caller is responsible for guaranteeing `fnNode.type ===
|
|
143
211
|
* 'function_definition'`.
|
|
144
212
|
*/
|
|
213
|
+
/**
|
|
214
|
+
* The first parameter of a class method under an unrecognized decorator.
|
|
215
|
+
* Python may still bind it implicitly, but its receiver kind is unproven.
|
|
216
|
+
*/
|
|
217
|
+
export function classifyPythonUncertainReceiver(fnNode) {
|
|
218
|
+
const decorators = decoratorNames(fnNode);
|
|
219
|
+
// Python applies decorators bottom-up. An outer built-in staticmethod
|
|
220
|
+
// guarantees no implicit receiver even when an inner decorator is opaque.
|
|
221
|
+
// The first parameter remains explicit and can keep its annotation.
|
|
222
|
+
if (decorators[0] === 'staticmethod')
|
|
223
|
+
return null;
|
|
224
|
+
if (decorators.every((name) => isKnownReceiverDecorator(fnNode, name)))
|
|
225
|
+
return null;
|
|
226
|
+
const enclosingClass = findEnclosingClassDefinition(fnNode);
|
|
227
|
+
const parameters = fnNode.childForFieldName('parameters');
|
|
228
|
+
const parameter = parameters === null ? null : firstBoundReceiverParameter(parameters);
|
|
229
|
+
const name = parameter === null ? null : firstParameterName(parameter);
|
|
230
|
+
const className = enclosingClass === null ? null : classDefinitionName(enclosingClass);
|
|
231
|
+
if (parameter === null || name === null || className === null)
|
|
232
|
+
return null;
|
|
233
|
+
return { kind: 'instance', parameter, name, className };
|
|
234
|
+
}
|
|
145
235
|
export function synthesizeReceiverTypeBinding(fnNode) {
|
|
146
236
|
const receiver = classifyPythonBoundReceiver(fnNode) ?? classifyPythonExplicitNewReceiver(fnNode);
|
|
147
|
-
if (receiver === null)
|
|
148
|
-
|
|
237
|
+
if (receiver === null) {
|
|
238
|
+
// Keep an uncertain receiver anchored to its enclosing class so the
|
|
239
|
+
// resolver can report the missing member without treating it as `self`.
|
|
240
|
+
const uncertain = classifyPythonUncertainReceiver(fnNode);
|
|
241
|
+
if (uncertain === null)
|
|
242
|
+
return null;
|
|
243
|
+
const { parameter: first, name, className } = uncertain;
|
|
244
|
+
return {
|
|
245
|
+
'@type-binding.uncertain-receiver': nodeToCapture('@type-binding.uncertain-receiver', first),
|
|
246
|
+
'@type-binding.name': syntheticCapture('@type-binding.name', first, name),
|
|
247
|
+
'@type-binding.type': syntheticCapture('@type-binding.type', first, className),
|
|
248
|
+
};
|
|
249
|
+
}
|
|
149
250
|
// Receiver convention: instance methods get `self`, classmethods get `cls`.
|
|
150
251
|
// The capture tag records the descriptor kind; the variable may use any
|
|
151
252
|
// spelling.
|
|
@@ -50,6 +50,7 @@ const pythonScopeResolver = {
|
|
|
50
50
|
// A free call naming a class constructs it: `Service(db).do_work()` (#2708).
|
|
51
51
|
constructionSyntax: { bare: true },
|
|
52
52
|
language: SupportedLanguages.Python,
|
|
53
|
+
suppressReceiverLookup: (typeRef) => typeRef.source === 'decorator-unknown',
|
|
53
54
|
languageProvider: pythonProvider,
|
|
54
55
|
importEdgeReason: 'python-scope: import',
|
|
55
56
|
resolveImportTarget: (targetRaw, fromFile, allFilePaths, _resolutionConfig, context) => {
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// Verified against tree-sitter-python 0.23.4
|
|
3
3
|
import { SupportedLanguages } from '../../../../_shared/index.js';
|
|
4
4
|
import { hasKeyword } from '../../field-extractors/configs/helpers.js';
|
|
5
|
-
import { classifyPythonBoundReceiver } from '../../languages/python/receiver-binding.js';
|
|
5
|
+
import { classifyPythonBoundReceiver, classifyPythonUncertainReceiver, isPythonStaticLikeMethod, } from '../../languages/python/receiver-binding.js';
|
|
6
6
|
import { extractSimpleTypeName } from '../../type-extractors/shared.js';
|
|
7
7
|
// ---------------------------------------------------------------------------
|
|
8
8
|
// Python helpers
|
|
@@ -92,7 +92,10 @@ function extractPythonParameters(node) {
|
|
|
92
92
|
return [];
|
|
93
93
|
const params = [];
|
|
94
94
|
let isFirst = true;
|
|
95
|
-
|
|
95
|
+
// An opaque decorator leaves the receiver kind unproven, not the slot: keep
|
|
96
|
+
// stripping it so arity matches ordinary bound calls.
|
|
97
|
+
const boundReceiverId = (classifyPythonBoundReceiver(funcNode) ??
|
|
98
|
+
(isPythonStaticLikeMethod(funcNode) ? null : classifyPythonUncertainReceiver(funcNode)))?.parameter.id;
|
|
96
99
|
for (let i = 0; i < paramList.namedChildCount; i++) {
|
|
97
100
|
const param = paramList.namedChild(i);
|
|
98
101
|
if (!param)
|
|
@@ -1009,6 +1009,11 @@ function followChainedRef(start, draftById) {
|
|
|
1009
1009
|
*/
|
|
1010
1010
|
function typeBindingStrength(source) {
|
|
1011
1011
|
switch (source) {
|
|
1012
|
+
// A method decorator may change what the first parameter receives. An
|
|
1013
|
+
// annotation describes intent, not descriptor binding, so it cannot
|
|
1014
|
+
// override this uncertainty for that parameter.
|
|
1015
|
+
case 'decorator-unknown':
|
|
1016
|
+
return 4;
|
|
1012
1017
|
case 'annotation':
|
|
1013
1018
|
return 3;
|
|
1014
1019
|
case 'parameter-annotation':
|
|
@@ -1235,6 +1235,10 @@ export interface ScopeResolver {
|
|
|
1235
1235
|
* return undefined to retain the shared behavior.
|
|
1236
1236
|
*/
|
|
1237
1237
|
readonly resolveReceiverMember?: (ownerDef: SymbolDefinition, memberName: string, callsite: Callsite, scopes: ScopeResolutionIndexes, model: SemanticModel) => ReceiverMemberResolution | undefined;
|
|
1238
|
+
/** Suppress all receiver dispatch when a captured type cannot prove its
|
|
1239
|
+
* runtime binding. Runs before compound and simple receiver lookup; the
|
|
1240
|
+
* caller records a receiver-unresolved outcome. */
|
|
1241
|
+
readonly suppressReceiverLookup?: (typeRef: TypeRef) => boolean;
|
|
1238
1242
|
/**
|
|
1239
1243
|
* Enable the receiver-bound Case 0.5 fallback for explicit `this`
|
|
1240
1244
|
* receivers (`this->m()` / `this.m()`) that resolves against the
|
|
@@ -72,7 +72,7 @@ import { type HeritageTypeArguments } from '../utils/generic-instantiation.js';
|
|
|
72
72
|
import type { ResolutionOutcomeRecorder } from '../resolution-outcome.js';
|
|
73
73
|
import type { ReceiverOrigin } from '../resolution-outcome.js';
|
|
74
74
|
import type { DecodedReceiverChain } from '../../utils/receiver-chain-codec.js';
|
|
75
|
-
type ReceiverBoundProviderSubset = Pick<ScopeResolver, 'isSuperReceiver' | 'isSuperReceiverInContext' | 'fieldFallbackOnMethodLookup' | 'collapseMemberCallsByCallerTarget' | 'elementTypeOf' | 'hoistTypeBindingsToModule' | 'stripReceiverCastExpressions' | 'constructionSyntax' | 'stripTypePreservingDecoration' | 'resolveQualifiedReceiverMember' | 'namespaceReceiverPaths' | 'resolveReceiverMember' | 'resolveThisViaEnclosingClass' | 'resolveMissingReceiverMembersFromSubtypes' | 'missingReceiverSubtypeCandidateCompatibility' | 'arityCompatibility' | 'conversionRankFn' | 'conversionOnlyArgTypePrefixes' | 'constraintCompatibility' | 'isStaticOnly' | 'normalizeTypeArgument' | 'markConstructionSites' | 'namespaceExportsIncludeImportedNames' | 'resolveNamespaceChains'>;
|
|
75
|
+
type ReceiverBoundProviderSubset = Pick<ScopeResolver, 'isSuperReceiver' | 'isSuperReceiverInContext' | 'fieldFallbackOnMethodLookup' | 'collapseMemberCallsByCallerTarget' | 'elementTypeOf' | 'hoistTypeBindingsToModule' | 'stripReceiverCastExpressions' | 'constructionSyntax' | 'stripTypePreservingDecoration' | 'resolveQualifiedReceiverMember' | 'namespaceReceiverPaths' | 'resolveReceiverMember' | 'suppressReceiverLookup' | 'resolveThisViaEnclosingClass' | 'resolveMissingReceiverMembersFromSubtypes' | 'missingReceiverSubtypeCandidateCompatibility' | 'arityCompatibility' | 'conversionRankFn' | 'conversionOnlyArgTypePrefixes' | 'constraintCompatibility' | 'isStaticOnly' | 'normalizeTypeArgument' | 'markConstructionSites' | 'namespaceExportsIncludeImportedNames' | 'resolveNamespaceChains'>;
|
|
76
76
|
/**
|
|
77
77
|
* Is this dropped receiver rooted inside the analyzed program?
|
|
78
78
|
*
|
|
@@ -849,6 +849,27 @@ export function emitReceiverBoundCalls(graph, scopes, parsedFiles, nodeLookup, h
|
|
|
849
849
|
const receiverName = site.explicitReceiver.name;
|
|
850
850
|
const memberName = site.name;
|
|
851
851
|
const siteKey = `${parsed.filePath}:${site.atRange.startLine}:${site.atRange.startCol}`;
|
|
852
|
+
if (provider.suppressReceiverLookup !== undefined) {
|
|
853
|
+
const baseName = decodeReceiverChain(site.receiverChain)?.baseReceiverName ??
|
|
854
|
+
receiverName.split(/[.([\s]/, 1)[0];
|
|
855
|
+
const baseTypeRef = baseName === undefined
|
|
856
|
+
? undefined
|
|
857
|
+
: findReceiverTypeBinding(site.inScope, baseName, scopes);
|
|
858
|
+
if (baseTypeRef !== undefined && provider.suppressReceiverLookup(baseTypeRef)) {
|
|
859
|
+
options.recordResolutionOutcome?.({
|
|
860
|
+
kind: 'suppressed',
|
|
861
|
+
reason: 'receiver-unresolved',
|
|
862
|
+
candidateIds: [],
|
|
863
|
+
phase: 'receiver-bound-calls',
|
|
864
|
+
filePath: parsed.filePath,
|
|
865
|
+
name: site.name,
|
|
866
|
+
range: site.atRange,
|
|
867
|
+
siteKind: site.kind,
|
|
868
|
+
});
|
|
869
|
+
handledSites.add(siteKey);
|
|
870
|
+
continue;
|
|
871
|
+
}
|
|
872
|
+
}
|
|
852
873
|
// ── owned-but-unbound receiver ───────────────────────────────
|
|
853
874
|
// The language declared this scope REBINDS the receiver and gave
|
|
854
875
|
// it no type — a JS/TS ordinary `function`, whose `this` comes
|
|
@@ -800,7 +800,10 @@ import { copyV8CacheIfPresent, tryLoadV8Cache, writeV8CacheFile } from './v8-sid
|
|
|
800
800
|
// would retain that capacity and could emit a false concrete call target.
|
|
801
801
|
// v119 (#3396): Python subtype method capacities now omit receiverless ordinary
|
|
802
802
|
// methods. Warm v118 ParsedFiles would replay a false compatible target.
|
|
803
|
-
|
|
803
|
+
// v120 (#3394): decorated Python method receiver bindings now distinguish
|
|
804
|
+
// unproven decorators from instance receivers. Warm v119 ParsedFiles would
|
|
805
|
+
// replay a fabricated `self` binding or lack the uncertainty marker entirely.
|
|
806
|
+
const SCHEMA_BUMP = 120;
|
|
804
807
|
const GITNEXUS_PKG_VERSION = (() => {
|
|
805
808
|
try {
|
|
806
809
|
// package.json sits at gitnexus/package.json — two levels up from
|
package/package.json
CHANGED