Skip to content

Commit d749318

Browse files
committed
refactor(typescript-plugin): organize ReactiveNode interface
1 parent bfc4ce5 commit d749318

File tree

1 file changed

+49
-44
lines changed

1 file changed

+49
-44
lines changed

packages/typescript-plugin/lib/requests/getReactiveReferences.ts

Lines changed: 49 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -9,23 +9,22 @@ const enum ReactiveAccessType {
99
Call,
1010
}
1111

12-
interface TsNode {
12+
interface TSNode {
1313
ast: ts.Node;
1414
start: number;
1515
end: number;
1616
}
1717

1818
interface ReactiveNode {
19-
binding?: TsNode & {
20-
isReactiveSource: boolean;
19+
isDependency: boolean;
20+
isDependent: boolean;
21+
binding?: TSNode & {
2122
accessTypes: ReactiveAccessType[];
2223
};
23-
accessor?: TsNode & {
24+
accessor?: TSNode & {
2425
requiredAccess: boolean;
2526
};
26-
callback?: TsNode & {
27-
isReactiveEffect: boolean;
28-
};
27+
callback?: TSNode;
2928
}
3029

3130
const analyzeCache = new WeakMap<ts.SourceFile, ReturnType<typeof analyze>>();
@@ -72,10 +71,7 @@ export function getReactiveReferences(
7271
const dependents = info.binding ? findDependents(info.binding.ast, info.binding.accessTypes) : [];
7372
const dependencies = findDependencies(info);
7473

75-
if (!info.callback?.isReactiveEffect && !dependents.length) {
76-
return;
77-
}
78-
if (!info.binding?.isReactiveSource && !dependencies.length) {
74+
if ((!info.isDependent && !dependents.length) || (!info.isDependency && !dependencies.length)) {
7975
return;
8076
}
8177

@@ -124,8 +120,8 @@ export function getReactiveReferences(
124120
}
125121
visited.add(signal);
126122

127-
const nodes: TsNode[] = [];
128-
let hasReactiveSource = !!signal.binding?.isReactiveSource;
123+
const nodes: TSNode[] = [];
124+
let hasDependency = signal.isDependency;
129125

130126
if (signal.accessor) {
131127
const { requiredAccess } = signal.accessor;
@@ -144,13 +140,13 @@ export function getReactiveReferences(
144140
});
145141
}
146142

147-
if (!hasReactiveSource) {
143+
if (!hasDependency) {
148144
return [];
149145
}
150146

151147
return nodes;
152148

153-
function visit(node: TsNode, requiredAccess: boolean, parentIsPropertyAccess = false) {
149+
function visit(node: TSNode, requiredAccess: boolean, parentIsPropertyAccess = false) {
154150
if (!requiredAccess) {
155151
if (!parentIsPropertyAccess && ts.isIdentifier(node.ast)) {
156152
const definition = languageService.getDefinitionAtPosition(sourceFile.fileName, node.start);
@@ -164,14 +160,14 @@ export function getReactiveReferences(
164160
}
165161
if (signal.binding) {
166162
nodes.push(signal.binding);
167-
hasReactiveSource ||= signal.binding.isReactiveSource;
163+
hasDependency ||= signal.isDependency;
168164
}
169165
if (signal.callback) {
170166
nodes.push(signal.callback);
171167
}
172168
const deps = findDependencies(signal, visited);
173169
nodes.push(...deps);
174-
hasReactiveSource ||= deps.length > 0;
170+
hasDependency ||= deps.length > 0;
175171
}
176172
}
177173
}
@@ -197,23 +193,23 @@ export function getReactiveReferences(
197193
if (ts.isPropertyAccessExpression(node.ast)) {
198194
if (accessType === ReactiveAccessType.ValueProperty && node.ast.name.text === 'value') {
199195
nodes.push(signal.binding);
200-
hasReactiveSource ||= signal.binding.isReactiveSource;
196+
hasDependency ||= signal.isDependency;
201197
}
202198
if (accessType === ReactiveAccessType.AnyProperty && node.ast.name.text !== '') {
203199
nodes.push(signal.binding);
204-
hasReactiveSource ||= signal.binding.isReactiveSource;
200+
hasDependency ||= signal.isDependency;
205201
}
206202
}
207203
else if (ts.isElementAccessExpression(node.ast)) {
208204
if (accessType === ReactiveAccessType.AnyProperty) {
209205
nodes.push(signal.binding);
210-
hasReactiveSource ||= signal.binding.isReactiveSource;
206+
hasDependency ||= signal.isDependency;
211207
}
212208
}
213209
else if (ts.isCallExpression(node.ast)) {
214210
if (accessType === ReactiveAccessType.Call) {
215211
nodes.push(signal.binding);
216-
hasReactiveSource ||= signal.binding.isReactiveSource;
212+
hasDependency ||= signal.isDependency;
217213
}
218214
}
219215
}
@@ -225,7 +221,7 @@ export function getReactiveReferences(
225221
}
226222
const deps = findDependencies(signal, visited);
227223
nodes.push(...deps);
228-
hasReactiveSource ||= deps.length > 0;
224+
hasDependency ||= deps.length > 0;
229225
}
230226
}
231227
}
@@ -250,14 +246,14 @@ export function getReactiveReferences(
250246
.map(range => {
251247
const sourceRange = toSourceRange(range.start, range.end);
252248
if (sourceRange) {
253-
return findSubscribersWorker(sourceRange.start, trackKinds, visited);
249+
return findDependentsWorker(sourceRange.start, trackKinds, visited);
254250
}
255251
return [];
256252
})
257253
.flat();
258254
}
259255

260-
function findSubscribersWorker(pos: number, accessTypes: ReactiveAccessType[], visited = new Set<number>()) {
256+
function findDependentsWorker(pos: number, accessTypes: ReactiveAccessType[], visited = new Set<number>()) {
261257
if (visited.has(pos)) {
262258
return [];
263259
}
@@ -290,13 +286,13 @@ export function getReactiveReferences(
290286
}
291287
}
292288
if (match) {
293-
let hasReactiveEffect = !!effect.callback?.isReactiveEffect;
289+
let hasDependent = effect.isDependent;
294290
if (effect.binding) {
295291
const dependents = findDependents(effect.binding.ast, effect.binding.accessTypes, visited);
296292
result.push(...dependents);
297-
hasReactiveEffect ||= dependents.length > 0;
293+
hasDependent ||= dependents.length > 0;
298294
}
299-
if (hasReactiveEffect) {
295+
if (hasDependent) {
300296
result.push(effect);
301297
}
302298
}
@@ -351,10 +347,11 @@ function analyze(
351347
const nameRange = toSourceRange(node.name.getStart(sourceFile), node.name.end);
352348
if (nameRange) {
353349
signals.push({
350+
isDependency: true,
351+
isDependent: false,
354352
binding: {
355353
...nameRange,
356354
ast: node.name,
357-
isReactiveSource: true,
358355
accessTypes: [ReactiveAccessType.ValueProperty],
359356
},
360357
});
@@ -367,10 +364,11 @@ function analyze(
367364
const nameRange = toSourceRange(node.name.getStart(sourceFile), node.name.end);
368365
if (nameRange) {
369366
signals.push({
367+
isDependency: true,
368+
isDependent: false,
370369
binding: {
371370
...nameRange,
372371
ast: node.name,
373-
isReactiveSource: true,
374372
accessTypes: [ReactiveAccessType.AnyProperty],
375373
},
376374
});
@@ -386,10 +384,11 @@ function analyze(
386384
const bodyRange = toSourceRange(node.body.getStart(sourceFile), node.body.end);
387385
if (nameRange && bodyRange) {
388386
signals.push({
387+
isDependency: false,
388+
isDependent: false,
389389
binding: {
390390
...nameRange,
391391
ast: node.name,
392-
isReactiveSource: false,
393392
accessTypes: [ReactiveAccessType.Call],
394393
},
395394
accessor: {
@@ -400,7 +399,6 @@ function analyze(
400399
callback: {
401400
...bodyRange,
402401
ast: node.body,
403-
isReactiveEffect: false,
404402
},
405403
});
406404
}
@@ -417,10 +415,11 @@ function analyze(
417415
const callbackRange = toSourceRange(callback.getStart(sourceFile), callback.end);
418416
if (nameRange && callbackRange) {
419417
signals.push({
418+
isDependency: false,
419+
isDependent: false,
420420
binding: {
421421
...nameRange,
422422
ast: name,
423-
isReactiveSource: false,
424423
accessTypes: [ReactiveAccessType.Call],
425424
},
426425
accessor: {
@@ -431,7 +430,6 @@ function analyze(
431430
callback: {
432431
...callbackRange,
433432
ast: callback,
434-
isReactiveEffect: false,
435433
},
436434
});
437435
}
@@ -445,11 +443,12 @@ function analyze(
445443
const nameRange = toSourceRange(node.name.getStart(sourceFile), node.name.end);
446444
if (nameRange) {
447445
signals.push({
446+
isDependency: true,
447+
isDependent: false,
448448
binding: {
449449
...nameRange,
450450
ast: node.name,
451451
accessTypes: [ReactiveAccessType.ValueProperty],
452-
isReactiveSource: true,
453452
},
454453
});
455454
}
@@ -465,6 +464,8 @@ function analyze(
465464
const callbackRange = toSourceRange(callback.getStart(sourceFile), callback.end);
466465
if (callbackRange) {
467466
signals.push({
467+
isDependency: false,
468+
isDependent: true,
468469
accessor: {
469470
...callbackRange,
470471
ast: callback.body,
@@ -473,7 +474,6 @@ function analyze(
473474
callback: {
474475
...callbackRange,
475476
ast: callback.body,
476-
isReactiveEffect: true,
477477
},
478478
});
479479
}
@@ -488,6 +488,8 @@ function analyze(
488488
if (depsRange && effectRange) {
489489
if (ts.isArrowFunction(depsCallback) || ts.isFunctionExpression(depsCallback)) {
490490
signals.push({
491+
isDependency: false,
492+
isDependent: true,
491493
accessor: {
492494
...depsRange,
493495
ast: depsCallback.body,
@@ -496,12 +498,13 @@ function analyze(
496498
callback: {
497499
...effectRange,
498500
ast: effectCallback.body,
499-
isReactiveEffect: true,
500501
},
501502
});
502503
}
503504
else {
504505
signals.push({
506+
isDependency: false,
507+
isDependent: true,
505508
accessor: {
506509
...depsRange,
507510
ast: depsCallback,
@@ -510,7 +513,6 @@ function analyze(
510513
callback: {
511514
...effectRange,
512515
ast: effectCallback.body,
513-
isReactiveEffect: true,
514516
},
515517
});
516518
}
@@ -525,14 +527,15 @@ function analyze(
525527
binding = {
526528
...nameRange,
527529
ast: call.parent.name,
528-
isReactiveSource: true,
529530
accessTypes: [ReactiveAccessType.AnyProperty, ReactiveAccessType.Call],
530531
};
531532
}
532533
}
533534
const callRange = toSourceRange(call.getStart(sourceFile), call.end);
534535
if (callRange) {
535536
signals.push({
537+
isDependency: true,
538+
isDependent: false,
536539
binding,
537540
accessor: {
538541
...callRange,
@@ -552,14 +555,15 @@ function analyze(
552555
binding = {
553556
...nameRange,
554557
ast: call.parent.name,
555-
isReactiveSource: true,
556558
accessTypes: [ReactiveAccessType.ValueProperty],
557559
};
558560
}
559561
}
560562
const argRange = toSourceRange(arg.getStart(sourceFile), arg.end);
561563
if (argRange) {
562564
signals.push({
565+
isDependency: true,
566+
isDependent: true,
563567
binding,
564568
accessor: {
565569
...argRange,
@@ -569,7 +573,6 @@ function analyze(
569573
callback: {
570574
...argRange,
571575
ast: arg.body,
572-
isReactiveEffect: true,
573576
},
574577
});
575578
}
@@ -582,14 +585,15 @@ function analyze(
582585
binding = {
583586
...nameRange,
584587
ast: call.parent.name,
585-
isReactiveSource: true,
586588
accessTypes: [ReactiveAccessType.ValueProperty],
587589
};
588590
}
589591
}
590592
const argRange = toSourceRange(arg.getStart(sourceFile), arg.end);
591593
if (argRange) {
592594
signals.push({
595+
isDependency: true,
596+
isDependent: false,
593597
binding,
594598
accessor: {
595599
...argRange,
@@ -609,7 +613,6 @@ function analyze(
609613
binding = {
610614
...nameRange,
611615
ast: call.parent.name,
612-
isReactiveSource: true,
613616
accessTypes: [ReactiveAccessType.ValueProperty],
614617
};
615618
}
@@ -620,6 +623,8 @@ function analyze(
620623
const callbackRange = toSourceRange(callback.getStart(sourceFile), callback.end);
621624
if (callbackRange) {
622625
signals.push({
626+
isDependency: true,
627+
isDependent: true,
623628
binding,
624629
accessor: {
625630
...callbackRange,
@@ -629,7 +634,6 @@ function analyze(
629634
callback: {
630635
...callbackRange,
631636
ast: callback.body,
632-
isReactiveEffect: true,
633637
},
634638
});
635639
}
@@ -639,6 +643,8 @@ function analyze(
639643
const bodyRange = toSourceRange(prop.body.getStart(sourceFile), prop.body.end);
640644
if (bodyRange) {
641645
signals.push({
646+
isDependency: true,
647+
isDependent: true,
642648
binding,
643649
accessor: {
644650
...bodyRange,
@@ -648,7 +654,6 @@ function analyze(
648654
callback: {
649655
...bodyRange,
650656
ast: prop.body,
651-
isReactiveEffect: true,
652657
},
653658
});
654659
}

0 commit comments

Comments
 (0)