Skip to content

Commit e904d7c

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 d6784ee commit e904d7c

3 files changed

Lines changed: 48 additions & 16 deletions

File tree

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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -110,20 +110,20 @@ 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 9
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 11
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 9
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 11
128+
// ^^^^^^^^^^^ reference pure-js 1.0.0 src/`main.js`/SomeClass().prototype.someMethod2.
129129

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: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -413,6 +413,25 @@ 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.isBinaryExpression(node.parent) &&
426+
node.parent.operatorToken.kind === ts.SyntaxKind.FirstAssignment
427+
) {
428+
if (node === node.parent.right) {
429+
return node.parent.left
430+
}
431+
432+
return this.getParent(node.parent)
433+
}
434+
416435
if (isAnonymousContainerOfSymbols(node.parent)) {
417436
return this.getParent(node.parent)
418437
}
@@ -496,6 +515,16 @@ export class FileIndexer {
496515
}
497516
}
498517

518+
if (ts.isPropertyAccessExpression(node)) {
519+
node = node.name
520+
}
521+
if (
522+
ts.isBinaryExpression(node) &&
523+
node.operatorToken.kind === ts.SyntaxKind.FirstAssignment
524+
) {
525+
node = node.right
526+
}
527+
499528
const ownerNode = this.getParent(node)
500529
const owner = this.scipSymbol(ownerNode)
501530
if (owner.isEmpty() || owner.isLocal()) {
@@ -584,6 +613,9 @@ export class FileIndexer {
584613
if (ts.isTypeLiteralNode(node)) {
585614
return metaDescriptor('typeLiteral' + this.localCounter.next().toString())
586615
}
616+
if (ts.isIdentifier(node)) {
617+
return termDescriptor(node.getText())
618+
}
587619
return undefined
588620
}
589621

0 commit comments

Comments
 (0)