Skip to content

Instantly share code, notes, and snippets.

@wldcordeiro
Created June 28, 2017 21:08
Show Gist options
  • Save wldcordeiro/1acf6b11f947291fdb47a94cffa23096 to your computer and use it in GitHub Desktop.
Save wldcordeiro/1acf6b11f947291fdb47a94cffa23096 to your computer and use it in GitHub Desktop.
Parsing more function symbol types
diff --git a/package.json b/package.json
index ad9169df..12e1affd 100644
--- a/package.json
+++ b/package.json
@@ -51,9 +51,9 @@
"@percy-io/react-percy-storybook": "^0.1.11",
"babel-plugin-transform-es2015-modules-commonjs": "^6.22.0",
"babel-preset-react": "^6.24.1",
- "babel-traverse": "^6.22.1",
- "babel-types": "^6.22.0",
- "babylon": "^6.15.0",
+ "babel-traverse": "^6.25.0",
+ "babel-types": "^6.25.0",
+ "babylon": "^6.17.4",
"codemirror": "^5.1.0",
"devtools-components": "^0.0.1",
"devtools-launchpad": "0.0.87",
diff --git a/src/actions/tests/__snapshots__/ast.js.snap b/src/actions/tests/__snapshots__/ast.js.snap
index b3d70195..88e95200 100644
--- a/src/actions/tests/__snapshots__/ast.js.snap
+++ b/src/actions/tests/__snapshots__/ast.js.snap
@@ -1,6 +1,94 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`ast getOutOfScopeLocations with selected line 1`] = `
+Object {
+ "functions": Array [
+ Object {
+ "identifier": Object {
+ "end": 13,
+ "loc": Object {
+ "end": Object {
+ "column": 13,
+ "line": 1,
+ },
+ "identifierName": "base",
+ "start": Object {
+ "column": 9,
+ "line": 1,
+ },
+ },
+ "name": "base",
+ "start": 9,
+ "type": "Identifier",
+ },
+ "location": Object {
+ "end": Object {
+ "column": 21,
+ "line": 1,
+ },
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ },
+ },
+ "name": "base",
+ "parameterNames": Array [
+ "boo",
+ ],
+ },
+ ],
+ "identifiers": Array [
+ Object {
+ "expression": "base",
+ "location": Object {
+ "end": Object {
+ "column": 13,
+ "line": 1,
+ },
+ "start": Object {
+ "column": 9,
+ "line": 1,
+ },
+ },
+ "name": "base",
+ },
+ Object {
+ "expression": "boo",
+ "location": Object {
+ "end": Object {
+ "column": 17,
+ "line": 1,
+ },
+ "start": Object {
+ "column": 14,
+ "line": 1,
+ },
+ },
+ "name": "boo",
+ },
+ ],
+ "memberExpressions": Array [],
+ "objectProperties": Array [],
+ "variables": Array [
+ Object {
+ "location": Object {
+ "end": Object {
+ "column": 17,
+ "line": 1,
+ },
+ "identifierName": "boo",
+ "start": Object {
+ "column": 14,
+ "line": 1,
+ },
+ },
+ "name": "boo",
+ },
+ ],
+}
+`;
+
+exports[`ast getOutOfScopeLocations with selected line 2`] = `
Array [
Object {
"end": Object {
@@ -15,7 +103,7 @@ Array [
]
`;
-exports[`ast getOutOfScopeLocations with selected line 2`] = `
+exports[`ast getOutOfScopeLocations with selected line 3`] = `
Array [
1,
2,
diff --git a/src/utils/parser/tests/__snapshots__/closest.js.snap b/src/utils/parser/tests/__snapshots__/closest.js.snap
index 1eff6b32..9c5757b3 100644
--- a/src/utils/parser/tests/__snapshots__/closest.js.snap
+++ b/src/utils/parser/tests/__snapshots__/closest.js.snap
@@ -77,7 +77,6 @@ FunctionDeclaration (1:0,3:1)
operator: '*'
right: Identifier (2:13,2:14)
name: 'n'
- directives: []
expression: false
generator: false
id: Identifier (1:9,1:15)
@@ -93,12 +92,9 @@ FunctionExpression (7:1,9:1)
body: BlockStatement (7:12,9:1)
body:
- ExpressionStatement (8:2,8:4)
- expression: NumericLiteral (8:2,8:3)
- extra:
- raw: '2'
- rawValue: 2
+ expression: Literal (8:2,8:3)
+ raw: '2'
value: 2
- directives: []
expression: false
extra:
parenStart: 64
@@ -113,7 +109,6 @@ FunctionExpression (5:8,5:21)
async: false
body: BlockStatement (5:19,5:21)
body: []
- directives: []
expression: false
generator: false
id: null
diff --git a/src/utils/parser/tests/__snapshots__/getSymbols.js.snap b/src/utils/parser/tests/__snapshots__/getSymbols.js.snap
index cd597746..1dcc65ba 100644
--- a/src/utils/parser/tests/__snapshots__/getSymbols.js.snap
+++ b/src/utils/parser/tests/__snapshots__/getSymbols.js.snap
@@ -83,53 +83,19 @@ variables
exports[`Parser.getSymbols expression 1`] = `
"properties
-[(1, 14), (1, 15)] obj.a a
-[(1, 19), (1, 20)] obj.a.b b
-[(5, 15), (5, 16)] com[a] a
-[(5, 21), (5, 22)] com[a].b b
-[(5, 30), (5, 31)] com[a][d] d
-[(5, 42), (5, 43)] com[b] b
-[(8, 2), (8, 8)] render
-[(12, 12), (12, 13)] obj.foo.a a
-[(12, 17), (12, 18)] obj.foo.a.b b
-[(12, 27), (12, 28)] obj.foo.b b
-[(13, 8), (13, 9)] com.a a
-[(13, 13), (13, 14)] com.a.b b
-[(13, 23), (13, 24)] com.b b
-[(16, 15), (16, 16)] res[0].a a
-[(16, 25), (16, 26)] res[1].b b
-[(17, 15), (17, 16)] res2.a a
-[(17, 21), (17, 22)] res2.a[0].b b
-[(18, 15), (18, 16)] res3.a a
-[(18, 21), (18, 22)] res3.a[0].b b
-[(18, 30), (18, 31)] res3.b b
-[(18, 36), (18, 37)] res3.b[0].c c
-[(19, 17), (19, 18)] res4[0].a a
-[(19, 29), (19, 30)] res4[0].b b
-[(22, 8), (22, 9)] b b
-[(22, 11), (22, 16)] resty resty
-[(25, 18), (25, 19)] a a
-[(25, 21), (25, 22)] b b
-[(26, 22), (26, 23)] a a
-[(26, 25), (26, 26)] b b
+
member expressions
[(2, 19), (2, 33)] [(2, 12), (2, 33)] obj2.c.secondProperty secondProperty
[(2, 17), (2, 18)] [(2, 12), (2, 18)] obj2.c c
[(7, 4), (7, 12)] [(7, 0), (7, 12)] app.TodoView TodoView
[(7, 24), (7, 30)] [(7, 15), (7, 30)] Backbone.extend extend
[(12, 4), (12, 7)] [(12, 0), (12, 7)] obj.foo foo
-[(19, 40), (19, 41)] [(19, 32), (19, 41)] a.b.c.v.d d
-[(19, 38), (19, 39)] [(19, 32), (19, 39)] a.b.c.v v
-[(19, 36), (19, 37)] [(19, 32), (19, 37)] a.b.c c
-[(19, 34), (19, 35)] [(19, 32), (19, 35)] a.b b
[(27, 29), (27, 43)] [(27, 13), (27, 43)] secondProperty
[(27, 27), (27, 28)] [(27, 13), (27, 28)] c
[(27, 18), (27, 24)] [(27, 13), (27, 24)] obj2.doEvil doEvil
identifiers
[(1, 6), (1, 27)] obj obj
[(1, 6), (1, 9)] obj obj
-[(1, 14), (1, 15)] a a
-[(1, 19), (1, 20)] b b
[(2, 6), (2, 33)] foo foo
[(2, 6), (2, 9)] foo foo
[(2, 12), (2, 16)] obj2 obj2
@@ -137,52 +103,22 @@ identifiers
[(2, 19), (2, 33)] secondProperty secondProperty
[(5, 6), (5, 49)] com com
[(5, 6), (5, 9)] com com
-[(5, 15), (5, 16)] a a
-[(5, 21), (5, 22)] b b
-[(5, 30), (5, 31)] d d
-[(5, 42), (5, 43)] b b
[(7, 0), (7, 3)] app app
[(7, 4), (7, 12)] TodoView TodoView
[(7, 15), (7, 23)] Backbone Backbone
[(7, 24), (7, 30)] extend extend
-[(8, 2), (8, 8)] render render
[(12, 0), (12, 3)] obj obj
[(12, 4), (12, 7)] foo foo
-[(12, 12), (12, 13)] a a
-[(12, 17), (12, 18)] b b
-[(12, 27), (12, 28)] b b
[(13, 0), (13, 3)] com com
-[(13, 8), (13, 9)] a a
-[(13, 13), (13, 14)] b b
-[(13, 23), (13, 24)] b b
[(16, 6), (16, 32)] res res
[(16, 6), (16, 9)] res res
-[(16, 15), (16, 16)] a a
-[(16, 25), (16, 26)] b b
[(17, 6), (17, 30)] res2 res2
[(17, 6), (17, 10)] res2 res2
-[(17, 15), (17, 16)] a a
-[(17, 21), (17, 22)] b b
[(18, 6), (18, 45)] res3 res3
[(18, 6), (18, 10)] res3 res3
-[(18, 15), (18, 16)] a a
-[(18, 21), (18, 22)] b b
-[(18, 30), (18, 31)] b b
-[(18, 36), (18, 37)] c c
[(19, 6), (19, 45)] res4 res4
[(19, 6), (19, 10)] res4 res4
-[(19, 17), (19, 18)] a a
-[(19, 29), (19, 30)] b b
-[(19, 32), (19, 33)] a a
-[(19, 34), (19, 35)] b b
-[(19, 36), (19, 37)] c c
-[(19, 38), (19, 39)] v v
-[(19, 40), (19, 41)] d d
[(22, 6), (22, 35)] undefined
-[(22, 8), (22, 9)] b b
-[(22, 8), (22, 9)] b b
-[(22, 11), (22, 16)] resty resty
-[(22, 11), (22, 16)] resty resty
[(22, 21), (22, 28)] compute compute
[(22, 29), (22, 34)] stuff stuff
[(23, 6), (23, 35)] undefined
@@ -191,16 +127,8 @@ identifiers
[(23, 21), (23, 28)] compute compute
[(23, 29), (23, 34)] stuff stuff
[(25, 9), (25, 15)] params params
-[(25, 18), (25, 19)] a a
-[(25, 18), (25, 19)] a a
-[(25, 21), (25, 22)] b b
-[(25, 21), (25, 22)] b b
[(26, 4), (26, 32)] pars pars
[(26, 4), (26, 8)] pars pars
-[(26, 22), (26, 23)] a a
-[(26, 22), (26, 23)] a a
-[(26, 25), (26, 26)] b b
-[(26, 25), (26, 26)] b b
[(27, 6), (27, 43)] evil evil
[(27, 6), (27, 10)] evil evil
[(27, 13), (27, 17)] obj2 obj2
@@ -209,52 +137,23 @@ identifiers
[(27, 29), (27, 43)] secondProperty secondProperty
variables
[(1, 6), (1, 27)] obj
-[(1, 14), (1, 25)] a
-[(1, 19), (1, 23)] b
[(2, 6), (2, 33)] foo
[(5, 6), (5, 49)] com
-[(5, 14), (5, 39)] a
-[(5, 21), (5, 27)] b
-[(5, 29), (5, 37)] d
-[(5, 41), (5, 47)] b
-[(12, 12), (12, 25)] a
-[(12, 17), (12, 23)] b
-[(12, 27), (12, 31)] b
-[(13, 8), (13, 21)] a
-[(13, 13), (13, 19)] b
-[(13, 23), (13, 27)] b
[(16, 6), (16, 32)] res
-[(16, 15), (16, 19)] a
-[(16, 25), (16, 29)] b
[(17, 6), (17, 30)] res2
-[(17, 15), (17, 28)] a
-[(17, 21), (17, 25)] b
[(18, 6), (18, 45)] res3
-[(18, 15), (18, 28)] a
-[(18, 21), (18, 25)] b
-[(18, 30), (18, 43)] b
-[(18, 36), (18, 40)] c
[(19, 6), (19, 45)] res4
-[(19, 17), (19, 21)] a
-[(19, 29), (19, 41)] b
[(22, 6), (22, 35)] undefined
-[(22, 8), (22, 9)] b
-[(22, 11), (22, 16)] resty
[(23, 6), (23, 35)] undefined
[(25, 16), (25, 24)] undefined
-[(25, 18), (25, 19)] a
-[(25, 21), (25, 22)] b
[(26, 4), (26, 32)] pars
[(26, 20), (26, 28)] undefined
-[(26, 22), (26, 23)] a
-[(26, 25), (26, 26)] b
[(27, 6), (27, 43)] evil "
`;
exports[`Parser.getSymbols finds symbols in an html file 1`] = `
"properties
-[(5, 3), (5, 8)] globalObject.first first
-[(6, 3), (6, 7)] globalObject.last last
+
member expressions
[(23, 18), (23, 29)] [(23, 10), (23, 29)] name.undefined.toUpperCase toUpperCase
[(23, 15), (23, 16)] [(23, 10), (23, 17)] name. undefined
@@ -267,8 +166,6 @@ member expressions
identifiers
[(4, 6), (7, 3)] globalObject globalObject
[(4, 6), (4, 18)] globalObject globalObject
-[(5, 3), (5, 8)] first first
-[(6, 3), (6, 7)] last last
[(8, 11), (8, 19)] sayHello sayHello
[(8, 21), (8, 25)] name name
[(9, 20), (9, 24)] name name
@@ -298,8 +195,6 @@ identifiers
[(38, 15), (38, 23)] greeting greeting
variables
[(4, 6), (7, 3)] globalObject
-[(5, 3), (5, 16)] first
-[(6, 3), (6, 16)] last
[(8, 21), (8, 25)] name
[(22, 8), (24, 3)] capitalize
[(22, 21), (22, 25)] name
@@ -355,13 +250,10 @@ variables
exports[`Parser.getSymbols proto 1`] = `
"properties
-[(6, 2), (6, 9)] tagName
-[(7, 2), (7, 12)] initialize
-[(11, 2), (11, 8)] render
+
member expressions
[(5, 31), (5, 37)] [(5, 17), (5, 37)] Backbone.View.extend extend
[(5, 26), (5, 30)] [(5, 17), (5, 30)] Backbone.View View
-[(9, 12), (9, 15)] [(9, 4), (9, 15)] console.log log
identifiers
[(1, 6), (1, 25)] foo foo
[(1, 6), (1, 9)] foo foo
@@ -372,20 +264,10 @@ identifiers
[(5, 17), (5, 25)] Backbone Backbone
[(5, 26), (5, 30)] View View
[(5, 31), (5, 37)] extend extend
-[(6, 2), (6, 9)] tagName tagName
-[(7, 2), (7, 12)] initialize initialize
-[(8, 2), (8, 9)] doThing doThing
-[(8, 10), (8, 11)] b b
-[(9, 4), (9, 11)] console console
-[(9, 12), (9, 15)] log log
-[(9, 22), (9, 23)] b b
-[(11, 2), (11, 8)] render render
variables
[(1, 6), (1, 25)] foo
[(3, 6), (3, 20)] bar
-[(5, 6), (14, 2)] TodoView
-[(6, 2), (6, 15)] tagName
-[(8, 10), (8, 11)] b "
+[(5, 6), (14, 2)] TodoView "
`;
exports[`Parser.getSymbols var 1`] = `
diff --git a/src/utils/parser/tests/fixtures/class.js b/src/utils/parser/tests/fixtures/class.js
index d8b6afd6..2bb5a36d 100644
--- a/src/utils/parser/tests/fixtures/class.js
+++ b/src/utils/parser/tests/fixtures/class.js
@@ -6,6 +6,10 @@ class Test {
bar(a) {
console.log("bar", a);
}
+
+ foo = (z, x, y) => {
+ return z * x * y;
+ };
}
class Test2 {}
diff --git a/src/utils/parser/utils/ast.js b/src/utils/parser/utils/ast.js
index 60f9001b..b08e81e1 100644
--- a/src/utils/parser/utils/ast.js
+++ b/src/utils/parser/utils/ast.js
@@ -15,7 +15,20 @@ function _parse(code, opts) {
code,
Object.assign({}, opts, {
sourceType: "module",
- plugins: ["jsx", "flow"]
+ plugins: [
+ "estree",
+ "jsx",
+ "flow",
+ "doExpressions",
+ "objectRestSpread",
+ "classProperties",
+ "exportExtensions",
+ "asyncGenerators",
+ "functionBind",
+ "functionSent",
+ "dynamicImport",
+ "templateInvalidEscapes"
+ ]
})
);
}
diff --git a/src/utils/parser/utils/helpers.js b/src/utils/parser/utils/helpers.js
index 4eaec404..2ec04975 100644
--- a/src/utils/parser/utils/helpers.js
+++ b/src/utils/parser/utils/helpers.js
@@ -14,7 +14,9 @@ export function isFunction(path: NodePath) {
t.isFunction(path) ||
t.isArrowFunctionExpression(path) ||
t.isObjectMethod(path) ||
- t.isClassMethod(path)
+ t.isClassMethod(path) ||
+ path.type === "MethodDefinition" ||
+ (t.isClassProperty(path) && t.isArrowFunctionExpression(path))
);
}
diff --git a/yarn.lock b/yarn.lock
index 95d9c3f2..49084999 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1373,7 +1373,7 @@ babel-template@^6.16.0, babel-template@^6.24.1, babel-template@^6.25.0, babel-te
babylon "^6.17.2"
lodash "^4.2.0"
-babel-traverse@^6.16.0, babel-traverse@^6.18.0, babel-traverse@^6.22.1, babel-traverse@^6.23.1, babel-traverse@^6.24.1, babel-traverse@^6.25.0:
+babel-traverse@^6.16.0, babel-traverse@^6.18.0, babel-traverse@^6.23.1, babel-traverse@^6.24.1, babel-traverse@^6.25.0, babel-traverse@^6.25.1:
version "6.25.0"
resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.25.0.tgz#2257497e2fcd19b89edc13c4c91381f9512496f1"
dependencies:
@@ -1387,7 +1387,7 @@ babel-traverse@^6.16.0, babel-traverse@^6.18.0, babel-traverse@^6.22.1, babel-tr
invariant "^2.2.0"
lodash "^4.2.0"
-babel-types@^6.14.0, babel-types@^6.16.0, babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.22.0, babel-types@^6.23.0, babel-types@^6.24.1, babel-types@^6.25.0:
+babel-types@^6.14.0, babel-types@^6.16.0, babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.23.0, babel-types@^6.24.1, babel-types@^6.25.0:
version "6.25.0"
resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.25.0.tgz#70afb248d5660e5d18f811d91c8303b54134a18e"
dependencies:
@@ -1403,9 +1403,9 @@ babelify@^7.3.0:
babel-core "^6.0.14"
object-assign "^4.0.0"
-babylon@^6.11.4, babylon@^6.13.0, babylon@^6.15.0, babylon@^6.17.0, babylon@^6.17.2:
- version "6.17.3"
- resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.17.3.tgz#1327d709950b558f204e5352587fd0290f8d8e48"
+babylon@^6.11.4, babylon@^6.13.0, babylon@^6.17.0, babylon@^6.17.2, babylon@^6.17.4:
+ version "6.17.4"
+ resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.17.4.tgz#3e8b7402b88d22c3423e137a1577883b15ff869a"
babylon@~5.8.3:
version "5.8.38"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment