Skip to content

Commit 3c8e55e

Browse files
Improve parenting for property definitions
The parent of a property in a property definition isn't the parent in the AST. Take this example: ```js obj.property = {a: 3} ``` Previously `property`'s parent would be the `obj.property` `PropertyAccessExpression` node and `a`'s parent would be the `BinaryExpression` node. Neither of them really are symbols. Instead `property`'s parent should be `obj` ie the `expression` of the `PropertyAccessExpression` node and `a`'s parent should be `obj.property` ie the `left` part of the `BinaryExpression` node.
1 parent 51c8134 commit 3c8e55e

4 files changed

Lines changed: 81 additions & 43 deletions

File tree

snapshots/output/pure-js/src/exports.js

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,30 +5,30 @@ exports.SomeExportedClass = class LocalClassName {
55
// ^^^^^^^^^^^^^^^^^ definition local 2
66
// ^^^^^^^^^^^^^^ reference local 1
77
method() {}
8-
//^^^^^^ definition local 3
8+
//^^^^^^ definition local 4
99
}
1010

1111
module.exports.SomeAnonymousClass = class /*anonymous*/ {
12-
//^^^^ reference local 7
12+
//^^^^ reference local 6
1313
// ^^^^^^^ reference pure-js 1.0.0 src/`exports.js`/
14-
// ^^^^^^^^^^^^^^^^^^ definition local 5
14+
// ^^^^^^^^^^^^^^^^^^ definition local 8
1515
method() {}
16-
//^^^^^^ definition local 9
16+
//^^^^^^ definition local 11
1717
}
1818

1919
exports.someFunc = function localFuncName() {}
20-
//^^^^^ reference local 11
21-
// ^^^^^^^^ definition local 11
22-
// ^^^^^^^^^^^^^ reference local 12
23-
exports.someAnonymousFunc = function () /*anonymous*/ {}
2420
//^^^^^ reference local 14
25-
// ^^^^^^^^^^^^^^^^^ definition local 14
21+
// ^^^^^^^^ definition local 15
22+
// ^^^^^^^^^^^^^ reference local 16
23+
exports.someAnonymousFunc = function () /*anonymous*/ {}
24+
//^^^^^ reference local 19
25+
// ^^^^^^^^^^^^^^^^^ definition local 20
2626

2727
exports.someArrowFunc = () => {}
28-
//^^^^^ reference local 16
29-
// ^^^^^^^^^^^^^ definition local 16
28+
//^^^^^ reference local 23
29+
// ^^^^^^^^^^^^^ definition local 24
3030

3131
exports.someValue = 4
32-
//^^^^^ reference local 18
33-
// ^^^^^^^^^ definition local 18
32+
//^^^^^ reference local 27
33+
// ^^^^^^^^^ definition local 28
3434

snapshots/output/pure-js/src/main.js

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -110,52 +110,52 @@ function SomeClass() {}
110110

111111
SomeClass.prototype = {
112112
//^^^^^^^ reference pure-js 1.0.0 src/`main.js`/SomeClass().
113-
// ^^^^^^^^^ definition local 8
113+
// ^^^^^^^^^ definition pure-js 1.0.0 src/`main.js`/SomeClass().prototype.
114114
someMethod() {},
115-
//^^^^^^^^^^ definition local 10
115+
//^^^^^^^^^^ definition pure-js 1.0.0 src/`main.js`/SomeClass().prototype.someMethod().
116116
}
117117

118118
SomeClass.prototype.someMethod2 = () => {}
119119
//^^^^^^^ reference pure-js 1.0.0 src/`main.js`/SomeClass().
120-
// ^^^^^^^^^ reference local 8
121-
// ^^^^^^^^^^^ definition local 12
120+
// ^^^^^^^^^ reference pure-js 1.0.0 src/`main.js`/SomeClass().prototype.
121+
// ^^^^^^^^^^^ definition pure-js 1.0.0 src/`main.js`/SomeClass().prototype.someMethod2().
122122

123123
new SomeClass().someMethod()
124124
// ^^^^^^^^^ reference pure-js 1.0.0 src/`main.js`/SomeClass().
125-
// ^^^^^^^^^^ reference local 10
125+
// ^^^^^^^^^^ reference pure-js 1.0.0 src/`main.js`/SomeClass().prototype.someMethod().
126126
new SomeClass().someMethod2()
127127
// ^^^^^^^^^ reference pure-js 1.0.0 src/`main.js`/SomeClass().
128-
// ^^^^^^^^^^^ reference local 12
128+
// ^^^^^^^^^^^ reference pure-js 1.0.0 src/`main.js`/SomeClass().prototype.someMethod2().
129129

130130
import {
131131
SomeExportedClass,
132-
//^^^^^^^^^^^^^^^^^ reference local 14
132+
//^^^^^^^^^^^^^^^^^ reference local 8
133133
SomeAnonymousClass,
134-
//^^^^^^^^^^^^^^^^^^ reference local 16
134+
//^^^^^^^^^^^^^^^^^^ reference local 10
135135
someFunc,
136-
//^^^^^^^^ reference local 18
136+
//^^^^^^^^ reference local 13
137137
someAnonymousFunc,
138-
//^^^^^^^^^^^^^^^^^ reference local 20
138+
//^^^^^^^^^^^^^^^^^ reference local 16
139139
someArrowFunc,
140-
//^^^^^^^^^^^^^ reference local 22
140+
//^^^^^^^^^^^^^ reference local 19
141141
someValue,
142-
//^^^^^^^^^ reference local 24
142+
//^^^^^^^^^ reference local 22
143143
} from './exports'
144144
// ^^^^^^^^^^^ reference pure-js 1.0.0 src/`exports.js`/
145145

146146
new SomeExportedClass().method()
147-
// ^^^^^^^^^^^^^^^^^ reference local 14
148-
// ^^^^^^ reference local 25
147+
// ^^^^^^^^^^^^^^^^^ reference local 8
148+
// ^^^^^^ reference local 24
149149
new SomeAnonymousClass().method()
150-
// ^^^^^^^^^^^^^^^^^^ reference local 16
151-
// ^^^^^^ reference local 26
150+
// ^^^^^^^^^^^^^^^^^^ reference local 10
151+
// ^^^^^^ reference local 28
152152
someFunc()
153-
//^^^^^^ reference local 18
153+
//^^^^^^ reference local 29
154154
someAnonymousFunc()
155-
//^^^^^^^^^^^^^^^ reference local 20
155+
//^^^^^^^^^^^^^^^ reference local 30
156156
someArrowFunc()
157-
//^^^^^^^^^^^ reference local 22
157+
//^^^^^^^^^^^ reference local 31
158158
const i = someValue
159159
// ^ definition pure-js 1.0.0 src/`main.js`/i.
160-
// ^^^^^^^^^ reference local 24
160+
// ^^^^^^^^^ reference local 32
161161

snapshots/output/syntax/src/object-literals-arrow-function.ts

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -32,17 +32,17 @@ export function consumesArrowFunction(): number {
3232
return (
3333
hasArrowFunctionParameter(1, ({ foobar }) => ({ foobar: foobar + 1 }))
3434
// ^^^^^^^^^^^^^^^^^^^^^^^^^ reference syntax 1.0.0 src/`object-literals-arrow-function.ts`/hasArrowFunctionParameter().
35-
// ^^^^^^ definition local 4
35+
// ^^^^^^ definition local 8
3636
// ^^^^^^ reference syntax 1.0.0 src/`object-literals-arrow-function.ts`/Foobar#foobar.
3737
// ^^^^^^ reference syntax 1.0.0 src/`object-literals-arrow-function.ts`/Foobar#foobar.
38-
// ^^^^^^ reference local 4
38+
// ^^^^^^ reference local 8
3939
.foobar +
4040
// ^^^^^^ reference syntax 1.0.0 src/`object-literals-arrow-function.ts`/Foobar#foobar.
4141
hasArrowFunctionParameter(2, foobar => ({ foobar: foobar.foobar + 2 }))
4242
// ^^^^^^^^^^^^^^^^^^^^^^^^^ reference syntax 1.0.0 src/`object-literals-arrow-function.ts`/hasArrowFunctionParameter().
43-
// ^^^^^^ definition local 6
43+
// ^^^^^^ definition local 11
4444
// ^^^^^^ reference syntax 1.0.0 src/`object-literals-arrow-function.ts`/Foobar#foobar.
45-
// ^^^^^^ reference local 6
45+
// ^^^^^^ reference local 11
4646
// ^^^^^^ reference syntax 1.0.0 src/`object-literals-arrow-function.ts`/Foobar#foobar.
4747
.foobar
4848
// ^^^^^^ reference syntax 1.0.0 src/`object-literals-arrow-function.ts`/Foobar#foobar.
@@ -55,9 +55,9 @@ export function genericArrow(): Foobar[] {
5555
return [1].map<Foobar>(n => ({ foobar: n + 1 }))
5656
// ^^^ reference typescript 5.9.3 lib/`lib.es5.d.ts`/Array#map().
5757
// ^^^^^^ reference syntax 1.0.0 src/`object-literals-arrow-function.ts`/Foobar#
58-
// ^ definition local 10
58+
// ^ definition local 15
5959
// ^^^^^^ reference syntax 1.0.0 src/`object-literals-arrow-function.ts`/Foobar#foobar.
60-
// ^ reference local 10
60+
// ^ reference local 15
6161
}
6262

6363
export function genericArrowOption(): Option<Foobar>[] {
@@ -68,10 +68,10 @@ export function genericArrowOption(): Option<Foobar>[] {
6868
// ^^^ reference typescript 5.9.3 lib/`lib.es5.d.ts`/Array#map().
6969
// ^^^^^^ reference syntax 1.0.0 src/`reusable-types.ts`/Option#
7070
// ^^^^^^ reference syntax 1.0.0 src/`object-literals-arrow-function.ts`/Foobar#
71-
// ^ definition local 14
71+
// ^ definition local 19
7272
// ^^^^^ reference syntax 1.0.0 src/`reusable-types.ts`/Option#value.
7373
// ^^^^^^ reference syntax 1.0.0 src/`object-literals-arrow-function.ts`/Foobar#foobar.
74-
// ^ reference local 14
74+
// ^ reference local 19
7575
}
7676

7777
export function genericArrow2(): Foobar[] {
@@ -81,8 +81,8 @@ export function genericArrow2(): Foobar[] {
8181
// because `map` is missing an explicit `map<Foobar>` annotation.
8282
return [1].map(n => ({ foobar: n + 1 }))
8383
// ^^^ reference typescript 5.9.3 lib/`lib.es5.d.ts`/Array#map().
84-
// ^ definition local 18
84+
// ^ definition local 23
8585
// ^^^^^^ reference syntax 1.0.0 src/`object-literals-arrow-function.ts`/foobar0:
86-
// ^ reference local 18
86+
// ^ reference local 23
8787
}
8888

src/FileIndexer.ts

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -413,6 +413,24 @@ export class FileIndexer {
413413
}
414414

415415
private getParent(node: ts.Node): ts.Node {
416+
if (ts.isPropertyAccessExpression(node.parent)) {
417+
if (node === node.parent.name) {
418+
return node.parent.expression
419+
}
420+
421+
return this.getParent(node.parent)
422+
}
423+
424+
if (
425+
(ts.isObjectLiteralExpression(node.parent) ||
426+
ts.isClassExpression(node.parent)) &&
427+
ts.isBinaryExpression(node.parent.parent) &&
428+
node.parent === node.parent.parent.right &&
429+
node.parent.parent.operatorToken.kind === ts.SyntaxKind.FirstAssignment
430+
) {
431+
return node.parent.parent.left
432+
}
433+
416434
if (isAnonymousContainerOfSymbols(node.parent)) {
417435
return this.getParent(node.parent)
418436
}
@@ -496,6 +514,10 @@ export class FileIndexer {
496514
}
497515
}
498516

517+
if (ts.isPropertyAccessExpression(node)) {
518+
node = node.name
519+
}
520+
499521
const ownerNode = this.getParent(node)
500522
const owner = this.scipSymbol(ownerNode)
501523
if (owner.isEmpty() || owner.isLocal()) {
@@ -584,6 +606,22 @@ export class FileIndexer {
584606
if (ts.isTypeLiteralNode(node)) {
585607
return metaDescriptor('typeLiteral' + this.localCounter.next().toString())
586608
}
609+
if (ts.isIdentifier(node)) {
610+
const sym = this.getTSSymbolAtLocation(node)
611+
if (sym) {
612+
if (sym.flags & ts.SymbolFlags.Class) {
613+
return typeDescriptor(node.getText())
614+
}
615+
616+
if (
617+
sym.flags & ts.SymbolFlags.Function ||
618+
sym.flags & ts.SymbolFlags.Method
619+
) {
620+
return methodDescriptor(node.getText())
621+
}
622+
}
623+
return termDescriptor(node.getText())
624+
}
587625
return undefined
588626
}
589627

0 commit comments

Comments
 (0)