Skip to content
This repository was archived by the owner on Jan 11, 2023. It is now read-only.

Commit 23639f5

Browse files
bomsyjasonLaster
authored andcommitted
Fix computed member expressions (#5655)
* Fix computed member expressions * add more fixtures for computed properties * tweaks * fix flow issues
1 parent 3be4ef0 commit 23639f5

File tree

7 files changed

+160
-113
lines changed

7 files changed

+160
-113
lines changed

src/workers/parser/getSymbols.js

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,12 @@ import * as t from "@babel/types";
99

1010
import createSimplePath, { type SimplePath } from "./utils/simple-path";
1111
import { traverseAst } from "./utils/ast";
12-
import { isVariable, isFunction, getVariables } from "./utils/helpers";
12+
import {
13+
isVariable,
14+
isFunction,
15+
getVariables,
16+
isComputedExpression
17+
} from "./utils/helpers";
1318
import { inferClassName } from "./utils/inferClassName";
1419
import getFunctionName from "./utils/getFunctionName";
1520

@@ -305,17 +310,23 @@ function extractSymbols(sourceId) {
305310
function extendSnippet(
306311
name: string,
307312
expression: string,
308-
path: SimplePath | null = null,
313+
path: SimplePath | Object | null = null,
309314
prevPath: SimplePath | null = null
310315
): string | void {
311316
const computed = path && path.node.computed;
312317
const prevComputed = prevPath && prevPath.node.computed;
313318
const prevArray = t.isArrayExpression(prevPath);
314319
const array = t.isArrayExpression(path);
320+
const value =
321+
(path &&
322+
path.node.property &&
323+
path.node.property.extra &&
324+
path.node.property.extra.raw) ||
325+
"";
315326

316327
if (expression === "") {
317328
if (computed) {
318-
return `[${name}]`;
329+
return name === undefined ? `[${value}]` : `[${name}]`;
319330
}
320331
return name;
321332
}
@@ -324,21 +335,28 @@ function extendSnippet(
324335
if (prevComputed || prevArray) {
325336
return `[${name}]${expression}`;
326337
}
327-
return `[${name}].${expression}`;
338+
return `[${name === undefined ? value : name}].${expression}`;
328339
}
329340

330341
if (prevComputed || prevArray) {
331342
return `${name}${expression}`;
332343
}
333344

345+
if (isComputedExpression(expression) && name !== undefined) {
346+
return `${name}${expression}`;
347+
}
348+
334349
return `${name}.${expression}`;
335350
}
336351

337352
function getMemberSnippet(node: Node, expression: string = "") {
338353
if (t.isMemberExpression(node)) {
339354
const name = node.property.name;
340-
341-
return getMemberSnippet(node.object, extendSnippet(name, expression));
355+
const snippet = getMemberSnippet(
356+
node.object,
357+
extendSnippet(name, expression, { node })
358+
);
359+
return snippet;
342360
}
343361

344362
if (t.isCallExpression(node)) {
@@ -350,6 +368,9 @@ function getMemberSnippet(node: Node, expression: string = "") {
350368
}
351369
352370
if (t.isIdentifier(node)) {
371+
if (isComputedExpression(expression)) {
372+
return `${node.name}${expression}`;
373+
}
353374
return `${node.name}.${expression}`;
354375
}
355376

src/workers/parser/tests/__snapshots__/closest.spec.js.snap

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ Object {
5555
"location": SourceLocation {
5656
"end": Position {
5757
"column": 0,
58-
"line": 24,
58+
"line": 26,
5959
},
6060
"start": Position {
6161
"column": 0,

src/workers/parser/tests/__snapshots__/getSymbols.spec.js.snap

Lines changed: 125 additions & 104 deletions
Original file line numberDiff line numberDiff line change
@@ -368,7 +368,7 @@ callExpressions:
368368
memberExpressions:
369369
[(7, 35), (7, 42)] [(7, 31), (7, 42)] arr.entries entries
370370
[(8, 10), (8, 13)] [(8, 2), (8, 13)] console.log log
371-
[(16, 34), (16, 46)] [(16, 19), (16, 47)] prefsBlueprint.accessorName accessorName
371+
[(16, 34), (16, 46)] [(16, 19), (16, 47)] prefsBlueprint[accessorName] accessorName
372372
373373
objectProperties:
374374
[(1, 8), (1, 9)] b b
@@ -462,9 +462,9 @@ hasTypes: false"
462462

463463
exports[`Parser.getSymbols expression 1`] = `
464464
"functions:
465-
[(8, 10), (8, 23)] render() TodoView
466-
[(21, 0), (21, 28)] params()
467-
[(22, 11), (22, 32)] pars()
465+
[(10, 10), (10, 23)] render() TodoView
466+
[(23, 0), (23, 28)] params()
467+
[(24, 11), (24, 32)] pars()
468468
469469
variables:
470470
[(1, 6), (1, 27)] obj
@@ -476,51 +476,61 @@ variables:
476476
[(5, 21), (5, 27)] b
477477
[(5, 29), (5, 37)] d
478478
[(5, 41), (5, 47)] b
479-
[(12, 12), (12, 25)] a
480-
[(12, 17), (12, 23)] b
481-
[(12, 27), (12, 31)] b
482-
[(13, 8), (13, 21)] a
483-
[(13, 13), (13, 19)] b
484-
[(13, 23), (13, 27)] b
485-
[(16, 6), (16, 32)] res
486-
[(16, 15), (16, 19)] a
487-
[(16, 25), (16, 29)] b
488-
[(17, 6), (17, 30)] res2
489-
[(17, 15), (17, 28)] a
490-
[(17, 21), (17, 25)] b
491-
[(18, 6), (18, 45)] res3
492-
[(18, 15), (18, 28)] a
493-
[(18, 21), (18, 25)] b
494-
[(18, 30), (18, 43)] b
495-
[(18, 36), (18, 40)] c
496-
[(19, 6), (19, 45)] res4
497-
[(19, 17), (19, 21)] a
498-
[(19, 29), (19, 41)] b
499-
[(21, 16), (21, 24)]
500-
[(21, 18), (21, 19)] a
501-
[(21, 21), (21, 22)] b
502-
[(22, 4), (22, 32)] pars
503-
[(22, 20), (22, 28)]
504-
[(22, 22), (22, 23)] a
505-
[(22, 25), (22, 26)] b
506-
[(23, 6), (23, 43)] evil
479+
[(6, 6), (6, 46)] firstAuthor
480+
[(7, 6), (7, 74)] firstActionDirector
481+
[(14, 12), (14, 25)] a
482+
[(14, 17), (14, 23)] b
483+
[(14, 27), (14, 31)] b
484+
[(15, 8), (15, 21)] a
485+
[(15, 13), (15, 19)] b
486+
[(15, 23), (15, 27)] b
487+
[(18, 6), (18, 32)] res
488+
[(18, 15), (18, 19)] a
489+
[(18, 25), (18, 29)] b
490+
[(19, 6), (19, 30)] res2
491+
[(19, 15), (19, 28)] a
492+
[(19, 21), (19, 25)] b
493+
[(20, 6), (20, 45)] res3
494+
[(20, 15), (20, 28)] a
495+
[(20, 21), (20, 25)] b
496+
[(20, 30), (20, 43)] b
497+
[(20, 36), (20, 40)] c
498+
[(21, 6), (21, 45)] res4
499+
[(21, 17), (21, 21)] a
500+
[(21, 29), (21, 41)] b
501+
[(23, 16), (23, 24)]
502+
[(23, 18), (23, 19)] a
503+
[(23, 21), (23, 22)] b
504+
[(24, 4), (24, 32)] pars
505+
[(24, 20), (24, 28)]
506+
[(24, 22), (24, 23)] a
507+
[(24, 25), (24, 26)] b
508+
[(25, 6), (25, 43)] evil
507509
508510
callExpressions:
509511
510512
511513
memberExpressions:
512514
[(2, 19), (2, 33)] [(2, 12), (2, 33)] obj2.c.secondProperty secondProperty
513515
[(2, 17), (2, 18)] [(2, 12), (2, 18)] obj2.c c
514-
[(7, 4), (7, 12)] [(7, 0), (7, 12)] app.TodoView TodoView
515-
[(7, 24), (7, 30)] [(7, 15), (7, 30)] Backbone.extend extend
516-
[(12, 4), (12, 7)] [(12, 0), (12, 7)] obj.foo foo
517-
[(19, 40), (19, 41)] [(19, 32), (19, 41)] a.b.c.v.d d
518-
[(19, 38), (19, 39)] [(19, 32), (19, 39)] a.b.c.v v
519-
[(19, 36), (19, 37)] [(19, 32), (19, 37)] a.b.c c
520-
[(19, 34), (19, 35)] [(19, 32), (19, 35)] a.b b
521-
[(23, 29), (23, 43)] [(23, 13), (23, 43)] secondProperty
522-
[(23, 27), (23, 28)] [(23, 13), (23, 28)] c
523-
[(23, 18), (23, 24)] [(23, 13), (23, 24)] obj2.doEvil doEvil
516+
[(6, 40), (6, 46)] [(6, 20), (6, 46)] collection.books[1].author author
517+
[(6, 37), (6, 38)] [(6, 20), (6, 39)] collection.books[1]
518+
[(6, 31), (6, 36)] [(6, 20), (6, 36)] collection.books books
519+
[(7, 66), (7, 74)] [(7, 28), (7, 74)] collection.genres[\\"sci-fi\\"].movies[0].director director
520+
[(7, 63), (7, 64)] [(7, 28), (7, 65)] collection.genres[\\"sci-fi\\"].movies[0]
521+
[(7, 56), (7, 62)] [(7, 28), (7, 62)] collection.genres[\\"sci-fi\\"].movies movies
522+
[(7, 46), (7, 54)] [(7, 28), (7, 55)] collection.genres[\\"sci-fi\\"]
523+
[(7, 39), (7, 45)] [(7, 28), (7, 45)] collection.genres genres
524+
[(9, 4), (9, 12)] [(9, 0), (9, 12)] app.TodoView TodoView
525+
[(9, 24), (9, 30)] [(9, 15), (9, 30)] Backbone.extend extend
526+
[(14, 4), (14, 7)] [(14, 0), (14, 7)] obj.foo foo
527+
[(21, 40), (21, 41)] [(21, 32), (21, 41)] a.b.c.v.d d
528+
[(21, 38), (21, 39)] [(21, 32), (21, 39)] a.b.c.v v
529+
[(21, 36), (21, 37)] [(21, 32), (21, 37)] a.b.c c
530+
[(21, 34), (21, 35)] [(21, 32), (21, 35)] a.b b
531+
[(25, 29), (25, 43)] [(25, 13), (25, 43)] secondProperty
532+
[(25, 27), (25, 28)] [(25, 13), (25, 28)] c
533+
[(25, 18), (25, 24)] [(25, 13), (25, 24)] obj2.doEvil doEvil
524534
525535
objectProperties:
526536
[(1, 14), (1, 15)] obj.a a
@@ -529,43 +539,43 @@ objectProperties:
529539
[(5, 21), (5, 22)] com[a].b b
530540
[(5, 30), (5, 31)] com[a][d] d
531541
[(5, 42), (5, 43)] com[b] b
532-
[(8, 2), (8, 8)] render
533-
[(12, 12), (12, 13)] obj.foo.a a
534-
[(12, 17), (12, 18)] obj.foo.a.b b
535-
[(12, 27), (12, 28)] obj.foo.b b
536-
[(13, 8), (13, 9)] com.a a
537-
[(13, 13), (13, 14)] com.a.b b
538-
[(13, 23), (13, 24)] com.b b
539-
[(16, 15), (16, 16)] res[0].a a
540-
[(16, 25), (16, 26)] res[1].b b
541-
[(17, 15), (17, 16)] res2.a a
542-
[(17, 21), (17, 22)] res2.a[0].b b
543-
[(18, 15), (18, 16)] res3.a a
544-
[(18, 21), (18, 22)] res3.a[0].b b
545-
[(18, 30), (18, 31)] res3.b b
546-
[(18, 36), (18, 37)] res3.b[0].c c
547-
[(19, 17), (19, 18)] res4[0].a a
548-
[(19, 29), (19, 30)] res4[0].b b
549-
[(21, 18), (21, 19)] a a
550-
[(21, 21), (21, 22)] b b
551-
[(22, 22), (22, 23)] a a
552-
[(22, 25), (22, 26)] b b
542+
[(10, 2), (10, 8)] render
543+
[(14, 12), (14, 13)] obj.foo.a a
544+
[(14, 17), (14, 18)] obj.foo.a.b b
545+
[(14, 27), (14, 28)] obj.foo.b b
546+
[(15, 8), (15, 9)] com.a a
547+
[(15, 13), (15, 14)] com.a.b b
548+
[(15, 23), (15, 24)] com.b b
549+
[(18, 15), (18, 16)] res[0].a a
550+
[(18, 25), (18, 26)] res[1].b b
551+
[(19, 15), (19, 16)] res2.a a
552+
[(19, 21), (19, 22)] res2.a[0].b b
553+
[(20, 15), (20, 16)] res3.a a
554+
[(20, 21), (20, 22)] res3.a[0].b b
555+
[(20, 30), (20, 31)] res3.b b
556+
[(20, 36), (20, 37)] res3.b[0].c c
557+
[(21, 17), (21, 18)] res4[0].a a
558+
[(21, 29), (21, 30)] res4[0].b b
559+
[(23, 18), (23, 19)] a a
560+
[(23, 21), (23, 22)] b b
561+
[(24, 22), (24, 23)] a a
562+
[(24, 25), (24, 26)] b b
553563
554564
comments:
555565
[(1, 29), (1, 44)]
556566
[(2, 35), (2, 68)]
557567
[(4, 0), (4, 22)]
558568
[(5, 51), (5, 67)]
559-
[(11, 0), (11, 14)]
560-
[(12, 35), (12, 54)]
561-
[(13, 31), (13, 46)]
562-
[(15, 0), (15, 9)]
563-
[(16, 34), (16, 50)]
564-
[(17, 32), (17, 50)]
565-
[(18, 47), (18, 65)]
566-
[(19, 47), (19, 66)]
567-
[(21, 29), (21, 38)]
568-
[(23, 45), (23, 70)]
569+
[(13, 0), (13, 14)]
570+
[(14, 35), (14, 54)]
571+
[(15, 31), (15, 46)]
572+
[(17, 0), (17, 9)]
573+
[(18, 34), (18, 50)]
574+
[(19, 32), (19, 50)]
575+
[(20, 47), (20, 65)]
576+
[(21, 47), (21, 66)]
577+
[(23, 29), (23, 38)]
578+
[(25, 45), (25, 70)]
569579
570580
identifiers:
571581
[(1, 6), (1, 27)] obj obj
@@ -577,35 +587,46 @@ identifiers:
577587
[(2, 19), (2, 33)] secondProperty secondProperty
578588
[(5, 6), (5, 49)] com com
579589
[(5, 6), (5, 9)] com com
580-
[(7, 0), (7, 3)] app app
581-
[(7, 4), (7, 12)] TodoView TodoView
582-
[(7, 15), (7, 23)] Backbone Backbone
583-
[(7, 24), (7, 30)] extend extend
584-
[(12, 0), (12, 3)] obj obj
585-
[(12, 4), (12, 7)] foo foo
586-
[(13, 0), (13, 3)] com com
587-
[(16, 6), (16, 32)] res res
588-
[(16, 6), (16, 9)] res res
589-
[(17, 6), (17, 30)] res2 res2
590-
[(17, 6), (17, 10)] res2 res2
591-
[(18, 6), (18, 45)] res3 res3
592-
[(18, 6), (18, 10)] res3 res3
593-
[(19, 6), (19, 45)] res4 res4
594-
[(19, 6), (19, 10)] res4 res4
595-
[(19, 32), (19, 33)] a a
596-
[(19, 34), (19, 35)] b b
597-
[(19, 36), (19, 37)] c c
598-
[(19, 38), (19, 39)] v v
599-
[(19, 40), (19, 41)] d d
600-
[(21, 9), (21, 15)] params params
601-
[(22, 4), (22, 32)] pars pars
602-
[(22, 4), (22, 8)] pars pars
603-
[(23, 6), (23, 43)] evil evil
604-
[(23, 6), (23, 10)] evil evil
605-
[(23, 13), (23, 17)] obj2 obj2
606-
[(23, 18), (23, 24)] doEvil doEvil
607-
[(23, 27), (23, 28)] c c
608-
[(23, 29), (23, 43)] secondProperty secondProperty
590+
[(6, 6), (6, 46)] firstAuthor firstAuthor
591+
[(6, 6), (6, 17)] firstAuthor firstAuthor
592+
[(6, 20), (6, 30)] collection collection
593+
[(6, 31), (6, 36)] books books
594+
[(6, 40), (6, 46)] author author
595+
[(7, 6), (7, 74)] firstActionDirector firstActionDirector
596+
[(7, 6), (7, 25)] firstActionDirector firstActionDirector
597+
[(7, 28), (7, 38)] collection collection
598+
[(7, 39), (7, 45)] genres genres
599+
[(7, 56), (7, 62)] movies movies
600+
[(7, 66), (7, 74)] director director
601+
[(9, 0), (9, 3)] app app
602+
[(9, 4), (9, 12)] TodoView TodoView
603+
[(9, 15), (9, 23)] Backbone Backbone
604+
[(9, 24), (9, 30)] extend extend
605+
[(14, 0), (14, 3)] obj obj
606+
[(14, 4), (14, 7)] foo foo
607+
[(15, 0), (15, 3)] com com
608+
[(18, 6), (18, 32)] res res
609+
[(18, 6), (18, 9)] res res
610+
[(19, 6), (19, 30)] res2 res2
611+
[(19, 6), (19, 10)] res2 res2
612+
[(20, 6), (20, 45)] res3 res3
613+
[(20, 6), (20, 10)] res3 res3
614+
[(21, 6), (21, 45)] res4 res4
615+
[(21, 6), (21, 10)] res4 res4
616+
[(21, 32), (21, 33)] a a
617+
[(21, 34), (21, 35)] b b
618+
[(21, 36), (21, 37)] c c
619+
[(21, 38), (21, 39)] v v
620+
[(21, 40), (21, 41)] d d
621+
[(23, 9), (23, 15)] params params
622+
[(24, 4), (24, 32)] pars pars
623+
[(24, 4), (24, 8)] pars pars
624+
[(25, 6), (25, 43)] evil evil
625+
[(25, 6), (25, 10)] evil evil
626+
[(25, 13), (25, 17)] obj2 obj2
627+
[(25, 18), (25, 24)] doEvil doEvil
628+
[(25, 27), (25, 28)] c c
629+
[(25, 29), (25, 43)] secondProperty secondProperty
609630
610631
classes:
611632
@@ -639,8 +660,8 @@ callExpressions:
639660
[(37, 20), (37, 28)] sayHello Ryan
640661
641662
memberExpressions:
642-
[(23, 18), (23, 29)] [(23, 10), (23, 29)] name.undefined.toUpperCase toUpperCase
643-
[(23, 15), (23, 16)] [(23, 10), (23, 17)] name.
663+
[(23, 18), (23, 29)] [(23, 10), (23, 29)] name[0].toUpperCase toUpperCase
664+
[(23, 15), (23, 16)] [(23, 10), (23, 17)] name[0]
644665
[(23, 39), (23, 48)] [(23, 34), (23, 48)] name.substring substring
645666
[(28, 4), (28, 8)] [(25, 19), (28, 8)] join
646667
[(27, 4), (27, 7)] [(25, 19), (27, 7)] map

src/workers/parser/tests/closest.spec.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ describe("parser", () => {
3737
const source = getSource("expression");
3838
setSource(source);
3939
const expression = getClosestExpression(source.id, "secondProperty", {
40-
line: 6,
40+
line: 8,
4141
column: 32
4242
});
4343

src/workers/parser/tests/fixtures/expression.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ const foo = obj2.c.secondProperty; // e.g. foo.obj2.c.secondProperty
33

44
// computed properties
55
const com = { [a]: { b: "c", [d]: "e" }, [b]: 3 }; // e.g. com[a].b
6+
const firstAuthor = collection.books[1].author;
7+
const firstActionDirector = collection.genres["sci-fi"].movies[0].director;
68

79
app.TodoView = Backbone.extend({
810
render: function() {}

0 commit comments

Comments
 (0)