summaryrefslogtreecommitdiffstats
path: root/devtools/client/debugger/src/workers/parser/tests
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-19 00:47:55 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-19 00:47:55 +0000
commit26a029d407be480d791972afb5975cf62c9360a6 (patch)
treef435a8308119effd964b339f76abb83a57c29483 /devtools/client/debugger/src/workers/parser/tests
parentInitial commit. (diff)
downloadfirefox-26a029d407be480d791972afb5975cf62c9360a6.tar.xz
firefox-26a029d407be480d791972afb5975cf62c9360a6.zip
Adding upstream version 124.0.1.upstream/124.0.1
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'devtools/client/debugger/src/workers/parser/tests')
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/__snapshots__/findOutOfScopeLocations.spec.js.snap47
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/__snapshots__/getScopes.spec.js.snap18895
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/__snapshots__/getSymbols.spec.js.snap169
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/__snapshots__/validate.spec.js.snap3
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/contains.spec.js250
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/findOutOfScopeLocations.spec.js80
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/allSymbols.js33
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/async.js10
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/call-sites.js4
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/callExpressions.js7
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/calls.js21
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/class.js28
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/component.js84
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/computed-props.js8
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/control-flow.js39
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/decorators.js2
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/destructuring.js16
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/es6.js1
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/expression.js25
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/flow.js5
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/frameworks/angular1FalsePositive.js11
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/frameworks/angular1Module.js4
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/frameworks/plainJavascript.js8
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/frameworks/reactComponent.js3
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/frameworks/reactComponentEs5.js3
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/frameworks/reactLibrary.js19
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/frameworks/reduxLibrary.js39
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/frameworks/vueFileComponent.js3
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/frameworks/vueFileDeclarative.js6
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/func.js50
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/functionNames.js50
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/generators.js4
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/jsx.js5
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/math.js15
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/modules.js10
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/object-expressions.js6
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/optional-chaining.js3
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/outOfScope.js62
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/outOfScopeComment.js4
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/parseScriptTags.html42
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/private-fields.js24
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/proto.js14
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/regexp.js1
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/resolveToken.js40
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/arrow-function.js11
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/binding-types.js24
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/block-statement.js13
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/class-declaration.js14
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/class-expression.js11
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/class-property.js10
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/complex-nesting.js29
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/expressions.js6
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/flowtype-bindings.js11
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/fn-body-lex-and-nonlex.js23
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/for-loops.js13
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/function-declaration.js11
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/function-expression.js7
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/jsx-component.js6
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/out-of-order-declarations.js21
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/pattern-declarations.js2
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/simple-module.js11
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/switch-statement.js22
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/try-catch.js9
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/ts-sample.ts41
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/tsx-sample.tsx41
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/vue-sample.vue26
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/statements.js40
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/thisExpression.js11
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/var.js21
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/framework.spec.js63
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/getScopes.spec.js227
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/getSymbols.spec.js51
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/helpers/index.js86
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/mapBindings.spec.js161
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/mapExpression.spec.js796
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/mapOriginalExpression.spec.js93
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/sources.spec.js14
77 files changed, 22078 insertions, 0 deletions
diff --git a/devtools/client/debugger/src/workers/parser/tests/__snapshots__/findOutOfScopeLocations.spec.js.snap b/devtools/client/debugger/src/workers/parser/tests/__snapshots__/findOutOfScopeLocations.spec.js.snap
new file mode 100644
index 0000000000..4689f0c824
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/__snapshots__/findOutOfScopeLocations.spec.js.snap
@@ -0,0 +1,47 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`Parser.findOutOfScopeLocations should exclude function for locations on declaration 1`] = `
+"(1, 0) -> (1, 16)
+(3, 14) -> (27, 1)
+(29, 16) -> (33, 1)
+(35, 20) -> (37, 1)
+(39, 26) -> (41, 1)
+(43, 20) -> (45, 1)
+(47, 31) -> (49, 1)
+(51, 19) -> (62, 1)"
+`;
+
+exports[`Parser.findOutOfScopeLocations should exclude non-enclosing function blocks 1`] = `
+"(1, 0) -> (1, 16)
+(8, 16) -> (10, 3)
+(12, 22) -> (14, 3)
+(16, 16) -> (18, 3)
+(20, 27) -> (22, 3)
+(24, 9) -> (26, 3)
+(29, 16) -> (33, 1)
+(35, 20) -> (37, 1)
+(39, 26) -> (41, 1)
+(43, 20) -> (45, 1)
+(47, 31) -> (49, 1)
+(51, 19) -> (62, 1)"
+`;
+
+exports[`Parser.findOutOfScopeLocations should not exclude in-scope inner locations 1`] = `
+"(1, 0) -> (1, 16)
+(3, 14) -> (27, 1)
+(29, 16) -> (33, 1)
+(35, 20) -> (37, 1)
+(39, 26) -> (41, 1)
+(43, 20) -> (45, 1)
+(47, 31) -> (49, 1)"
+`;
+
+exports[`Parser.findOutOfScopeLocations should roll up function blocks 1`] = `
+"(1, 0) -> (1, 16)
+(29, 16) -> (33, 1)
+(35, 20) -> (37, 1)
+(39, 26) -> (41, 1)
+(43, 20) -> (45, 1)
+(47, 31) -> (49, 1)
+(51, 19) -> (62, 1)"
+`;
diff --git a/devtools/client/debugger/src/workers/parser/tests/__snapshots__/getScopes.spec.js.snap b/devtools/client/debugger/src/workers/parser/tests/__snapshots__/getScopes.spec.js.snap
new file mode 100644
index 0000000000..b579b89587
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/__snapshots__/getScopes.spec.js.snap
@@ -0,0 +1,18895 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`Parser.getScopes finds scope bindings and exclude Flowtype: getScopes finds scope bindings and exclude Flowtype at line 8 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "aConst": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 39,
+ "line": 7,
+ "sourceId": "scopes/flowtype-bindings/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 7,
+ "sourceId": "scopes/flowtype-bindings/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 12,
+ "line": 7,
+ "sourceId": "scopes/flowtype-bindings/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 7,
+ "sourceId": "scopes/flowtype-bindings/originalSource-1",
+ },
+ "type": "const",
+ },
+ ],
+ "type": "const",
+ },
+ "root": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 11,
+ "sourceId": "scopes/flowtype-bindings/originalSource-1",
+ },
+ "start": Object {
+ "column": 15,
+ "line": 9,
+ "sourceId": "scopes/flowtype-bindings/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 28,
+ "line": 9,
+ "sourceId": "scopes/flowtype-bindings/originalSource-1",
+ },
+ "start": Object {
+ "column": 24,
+ "line": 9,
+ "sourceId": "scopes/flowtype-bindings/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 12,
+ "sourceId": "scopes/flowtype-bindings/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/flowtype-bindings/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 12,
+ "sourceId": "scopes/flowtype-bindings/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/flowtype-bindings/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "window": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 22,
+ "line": 7,
+ "sourceId": "scopes/flowtype-bindings/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 16,
+ "line": 7,
+ "sourceId": "scopes/flowtype-bindings/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 12,
+ "sourceId": "scopes/flowtype-bindings/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/flowtype-bindings/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings and exclude Flowtype: getScopes finds scope bindings and exclude Flowtype at line 10 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "arguments": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "root",
+ "end": Object {
+ "column": 1,
+ "line": 11,
+ "sourceId": "scopes/flowtype-bindings/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 15,
+ "line": 9,
+ "sourceId": "scopes/flowtype-bindings/originalSource-1",
+ },
+ "type": "function",
+ },
+ Object {
+ "bindings": Object {
+ "aConst": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 39,
+ "line": 7,
+ "sourceId": "scopes/flowtype-bindings/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 7,
+ "sourceId": "scopes/flowtype-bindings/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 12,
+ "line": 7,
+ "sourceId": "scopes/flowtype-bindings/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 7,
+ "sourceId": "scopes/flowtype-bindings/originalSource-1",
+ },
+ "type": "const",
+ },
+ ],
+ "type": "const",
+ },
+ "root": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 11,
+ "sourceId": "scopes/flowtype-bindings/originalSource-1",
+ },
+ "start": Object {
+ "column": 15,
+ "line": 9,
+ "sourceId": "scopes/flowtype-bindings/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 28,
+ "line": 9,
+ "sourceId": "scopes/flowtype-bindings/originalSource-1",
+ },
+ "start": Object {
+ "column": 24,
+ "line": 9,
+ "sourceId": "scopes/flowtype-bindings/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 12,
+ "sourceId": "scopes/flowtype-bindings/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/flowtype-bindings/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 12,
+ "sourceId": "scopes/flowtype-bindings/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/flowtype-bindings/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "window": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 22,
+ "line": 7,
+ "sourceId": "scopes/flowtype-bindings/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 16,
+ "line": 7,
+ "sourceId": "scopes/flowtype-bindings/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 12,
+ "sourceId": "scopes/flowtype-bindings/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/flowtype-bindings/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for arrow functions: getScopes finds scope bindings for arrow functions at line 2 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "outer": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 2,
+ "line": 11,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 9,
+ "line": 3,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 3,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "let",
+ },
+ ],
+ "type": "let",
+ },
+ "this": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 18,
+ "line": 4,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 14,
+ "line": 4,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 12,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 12,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "console": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 9,
+ "line": 4,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 13,
+ "line": 4,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "parent": null,
+ "property": "log",
+ "start": Object {
+ "column": 2,
+ "line": 4,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 4,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 13,
+ "line": 8,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 17,
+ "line": 8,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "parent": null,
+ "property": "log",
+ "start": Object {
+ "column": 6,
+ "line": 8,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 8,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 12,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for arrow functions: getScopes finds scope bindings for arrow functions at line 4 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "p1": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 11,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "start": Object {
+ "column": 12,
+ "line": 3,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 15,
+ "line": 3,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "start": Object {
+ "column": 13,
+ "line": 3,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "fn-param",
+ },
+ ],
+ "type": "var",
+ },
+ },
+ "displayName": "outer",
+ "end": Object {
+ "column": 1,
+ "line": 11,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 13,
+ "line": 3,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "function",
+ },
+ Object {
+ "bindings": Object {
+ "outer": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 2,
+ "line": 11,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 9,
+ "line": 3,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 3,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "let",
+ },
+ ],
+ "type": "let",
+ },
+ "this": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 18,
+ "line": 4,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 14,
+ "line": 4,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 12,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 12,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "console": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 9,
+ "line": 4,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 13,
+ "line": 4,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "parent": null,
+ "property": "log",
+ "start": Object {
+ "column": 2,
+ "line": 4,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 4,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 13,
+ "line": 8,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 17,
+ "line": 8,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "parent": null,
+ "property": "log",
+ "start": Object {
+ "column": 6,
+ "line": 8,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 8,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 12,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for arrow functions: getScopes finds scope bindings for arrow functions at line 7 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "arguments": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "inner": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 6,
+ "line": 9,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 7,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 13,
+ "line": 7,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "start": Object {
+ "column": 8,
+ "line": 7,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 22,
+ "line": 8,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 18,
+ "line": 8,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "implicit",
+ },
+ },
+ "displayName": "anonymous",
+ "end": Object {
+ "column": 3,
+ "line": 10,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 3,
+ "line": 6,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "function",
+ },
+ Object {
+ "bindings": Object {
+ "p1": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 11,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "start": Object {
+ "column": 12,
+ "line": 3,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 15,
+ "line": 3,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "start": Object {
+ "column": 13,
+ "line": 3,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "fn-param",
+ },
+ ],
+ "type": "var",
+ },
+ },
+ "displayName": "outer",
+ "end": Object {
+ "column": 1,
+ "line": 11,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 13,
+ "line": 3,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "function",
+ },
+ Object {
+ "bindings": Object {
+ "outer": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 2,
+ "line": 11,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 9,
+ "line": 3,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 3,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "let",
+ },
+ ],
+ "type": "let",
+ },
+ "this": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 18,
+ "line": 4,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 14,
+ "line": 4,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 12,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 12,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "console": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 9,
+ "line": 4,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 13,
+ "line": 4,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "parent": null,
+ "property": "log",
+ "start": Object {
+ "column": 2,
+ "line": 4,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 4,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 13,
+ "line": 8,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 17,
+ "line": 8,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "parent": null,
+ "property": "log",
+ "start": Object {
+ "column": 6,
+ "line": 8,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 8,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 12,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for arrow functions: getScopes finds scope bindings for arrow functions at line 8 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "p2": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 5,
+ "line": 9,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "start": Object {
+ "column": 16,
+ "line": 7,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 19,
+ "line": 7,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "start": Object {
+ "column": 17,
+ "line": 7,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "fn-param",
+ },
+ ],
+ "type": "var",
+ },
+ },
+ "displayName": "inner",
+ "end": Object {
+ "column": 5,
+ "line": 9,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 17,
+ "line": 7,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "function",
+ },
+ Object {
+ "bindings": Object {
+ "arguments": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "inner": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 6,
+ "line": 9,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 7,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 13,
+ "line": 7,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "start": Object {
+ "column": 8,
+ "line": 7,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 22,
+ "line": 8,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 18,
+ "line": 8,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "implicit",
+ },
+ },
+ "displayName": "anonymous",
+ "end": Object {
+ "column": 3,
+ "line": 10,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 3,
+ "line": 6,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "function",
+ },
+ Object {
+ "bindings": Object {
+ "p1": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 11,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "start": Object {
+ "column": 12,
+ "line": 3,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 15,
+ "line": 3,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "start": Object {
+ "column": 13,
+ "line": 3,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "fn-param",
+ },
+ ],
+ "type": "var",
+ },
+ },
+ "displayName": "outer",
+ "end": Object {
+ "column": 1,
+ "line": 11,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 13,
+ "line": 3,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "function",
+ },
+ Object {
+ "bindings": Object {
+ "outer": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 2,
+ "line": 11,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 9,
+ "line": 3,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 3,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "let",
+ },
+ ],
+ "type": "let",
+ },
+ "this": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 18,
+ "line": 4,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 14,
+ "line": 4,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 12,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 12,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "console": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 9,
+ "line": 4,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 13,
+ "line": 4,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "parent": null,
+ "property": "log",
+ "start": Object {
+ "column": 2,
+ "line": 4,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 4,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 13,
+ "line": 8,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 17,
+ "line": 8,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "parent": null,
+ "property": "log",
+ "start": Object {
+ "column": 6,
+ "line": 8,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 8,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 12,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for block statements: getScopes finds scope bindings for block statements at line 2 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "first": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 10,
+ "line": 3,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 9,
+ "line": 3,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 3,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ "type": "let",
+ },
+ ],
+ "type": "let",
+ },
+ "second": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 13,
+ "line": 6,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 6,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 12,
+ "line": 6,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 6,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "seventh": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 12,
+ "line": 13,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 13,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 11,
+ "line": 13,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 13,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 14,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 14,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 14,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for block statements: getScopes finds scope bindings for block statements at line 6 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "Fourth": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 17,
+ "line": 8,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 8,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 14,
+ "line": 8,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 8,
+ "line": 8,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ "type": "class-decl",
+ },
+ ],
+ "type": "let",
+ },
+ "fifth": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 12,
+ "line": 9,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 9,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 11,
+ "line": 9,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 9,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ "type": "let",
+ },
+ ],
+ "type": "let",
+ },
+ "sixth": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 18,
+ "line": 10,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 10,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 13,
+ "line": 10,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 8,
+ "line": 10,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ "type": "const",
+ },
+ ],
+ "type": "const",
+ },
+ "third": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 21,
+ "line": 7,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 7,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 16,
+ "line": 7,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 11,
+ "line": 7,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ ],
+ "type": "let",
+ },
+ },
+ "displayName": "Block",
+ "end": Object {
+ "column": 1,
+ "line": 11,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 5,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "first": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 10,
+ "line": 3,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 9,
+ "line": 3,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 3,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ "type": "let",
+ },
+ ],
+ "type": "let",
+ },
+ "second": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 13,
+ "line": 6,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 6,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 12,
+ "line": 6,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 6,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "seventh": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 12,
+ "line": 13,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 13,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 11,
+ "line": 13,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 13,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 14,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 14,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 14,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for class declarations: getScopes finds scope bindings for class declarations at line 2 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "Outer": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 11,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 11,
+ "line": 3,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 3,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "type": "class-decl",
+ },
+ ],
+ "type": "let",
+ },
+ "Second": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 15,
+ "line": 14,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 14,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 12,
+ "line": 14,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 14,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "type": "class-decl",
+ },
+ ],
+ "type": "let",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 15,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 15,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "console": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 15,
+ "line": 7,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 19,
+ "line": 7,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "parent": null,
+ "property": "log",
+ "start": Object {
+ "column": 8,
+ "line": 7,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 8,
+ "line": 7,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ "decorator": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 10,
+ "line": 13,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 1,
+ "line": 13,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 15,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for class declarations: getScopes finds scope bindings for class declarations at line 5 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "Inner": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 5,
+ "line": 9,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 5,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 15,
+ "line": 5,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "start": Object {
+ "column": 10,
+ "line": 5,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "type": "class-decl",
+ },
+ ],
+ "type": "let",
+ },
+ },
+ "displayName": "Function Body",
+ "end": Object {
+ "column": 3,
+ "line": 10,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 11,
+ "line": 4,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "arguments": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "method",
+ "end": Object {
+ "column": 3,
+ "line": 10,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 2,
+ "line": 4,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "type": "function",
+ },
+ Object {
+ "bindings": Object {
+ "Outer": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 11,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 11,
+ "line": 3,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 3,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "type": "class-inner",
+ },
+ ],
+ "type": "const",
+ },
+ },
+ "displayName": "Class",
+ "end": Object {
+ "column": 1,
+ "line": 11,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "Outer": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 11,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 11,
+ "line": 3,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 3,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "type": "class-decl",
+ },
+ ],
+ "type": "let",
+ },
+ "Second": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 15,
+ "line": 14,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 14,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 12,
+ "line": 14,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 14,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "type": "class-decl",
+ },
+ ],
+ "type": "let",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 15,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 15,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "console": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 15,
+ "line": 7,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 19,
+ "line": 7,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "parent": null,
+ "property": "log",
+ "start": Object {
+ "column": 8,
+ "line": 7,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 8,
+ "line": 7,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ "decorator": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 10,
+ "line": 13,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 1,
+ "line": 13,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 15,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for class declarations: getScopes finds scope bindings for class declarations at line 7 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "arguments": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "this": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 24,
+ "line": 7,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 20,
+ "line": 7,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "implicit",
+ },
+ },
+ "displayName": "m",
+ "end": Object {
+ "column": 7,
+ "line": 8,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 6,
+ "line": 6,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "type": "function",
+ },
+ Object {
+ "bindings": Object {
+ "Inner": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 5,
+ "line": 9,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 5,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 15,
+ "line": 5,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "start": Object {
+ "column": 10,
+ "line": 5,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "type": "class-inner",
+ },
+ ],
+ "type": "const",
+ },
+ },
+ "displayName": "Class",
+ "end": Object {
+ "column": 5,
+ "line": 9,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 4,
+ "line": 5,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "Inner": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 5,
+ "line": 9,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 5,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 15,
+ "line": 5,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "start": Object {
+ "column": 10,
+ "line": 5,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "type": "class-decl",
+ },
+ ],
+ "type": "let",
+ },
+ },
+ "displayName": "Function Body",
+ "end": Object {
+ "column": 3,
+ "line": 10,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 11,
+ "line": 4,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "arguments": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "method",
+ "end": Object {
+ "column": 3,
+ "line": 10,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 2,
+ "line": 4,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "type": "function",
+ },
+ Object {
+ "bindings": Object {
+ "Outer": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 11,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 11,
+ "line": 3,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 3,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "type": "class-inner",
+ },
+ ],
+ "type": "const",
+ },
+ },
+ "displayName": "Class",
+ "end": Object {
+ "column": 1,
+ "line": 11,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "Outer": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 11,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 11,
+ "line": 3,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 3,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "type": "class-decl",
+ },
+ ],
+ "type": "let",
+ },
+ "Second": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 15,
+ "line": 14,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 14,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 12,
+ "line": 14,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 14,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "type": "class-decl",
+ },
+ ],
+ "type": "let",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 15,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 15,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "console": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 15,
+ "line": 7,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 19,
+ "line": 7,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "parent": null,
+ "property": "log",
+ "start": Object {
+ "column": 8,
+ "line": 7,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 8,
+ "line": 7,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ "decorator": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 10,
+ "line": 13,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 1,
+ "line": 13,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 15,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for class expressions: getScopes finds scope bindings for class expressions at line 2 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "Outer": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 2,
+ "line": 11,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 9,
+ "line": 3,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 3,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 12,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 12,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "console": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 15,
+ "line": 7,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 19,
+ "line": 7,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "parent": null,
+ "property": "log",
+ "start": Object {
+ "column": 8,
+ "line": 7,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 8,
+ "line": 7,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 12,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for class expressions: getScopes finds scope bindings for class expressions at line 5 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "Inner": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 6,
+ "line": 9,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 5,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 13,
+ "line": 5,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "start": Object {
+ "column": 8,
+ "line": 5,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "arguments": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "method",
+ "end": Object {
+ "column": 3,
+ "line": 10,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 2,
+ "line": 4,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "type": "function",
+ },
+ Object {
+ "bindings": Object {
+ "Outer": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 11,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "start": Object {
+ "column": 12,
+ "line": 3,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 23,
+ "line": 3,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "start": Object {
+ "column": 18,
+ "line": 3,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "type": "class-inner",
+ },
+ ],
+ "type": "const",
+ },
+ },
+ "displayName": "Class",
+ "end": Object {
+ "column": 1,
+ "line": 11,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 12,
+ "line": 3,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "Outer": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 2,
+ "line": 11,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 9,
+ "line": 3,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 3,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 12,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 12,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "console": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 15,
+ "line": 7,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 19,
+ "line": 7,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "parent": null,
+ "property": "log",
+ "start": Object {
+ "column": 8,
+ "line": 7,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 8,
+ "line": 7,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 12,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for class expressions: getScopes finds scope bindings for class expressions at line 7 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "arguments": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "this": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 24,
+ "line": 7,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 20,
+ "line": 7,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "implicit",
+ },
+ },
+ "displayName": "m",
+ "end": Object {
+ "column": 7,
+ "line": 8,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 6,
+ "line": 6,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "type": "function",
+ },
+ Object {
+ "bindings": Object {
+ "Inner": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 6,
+ "line": 9,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 5,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 13,
+ "line": 5,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "start": Object {
+ "column": 8,
+ "line": 5,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "arguments": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "method",
+ "end": Object {
+ "column": 3,
+ "line": 10,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 2,
+ "line": 4,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "type": "function",
+ },
+ Object {
+ "bindings": Object {
+ "Outer": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 11,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "start": Object {
+ "column": 12,
+ "line": 3,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 23,
+ "line": 3,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "start": Object {
+ "column": 18,
+ "line": 3,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "type": "class-inner",
+ },
+ ],
+ "type": "const",
+ },
+ },
+ "displayName": "Class",
+ "end": Object {
+ "column": 1,
+ "line": 11,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 12,
+ "line": 3,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "Outer": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 2,
+ "line": 11,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 9,
+ "line": 3,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 3,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 12,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 12,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "console": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 15,
+ "line": 7,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 19,
+ "line": 7,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "parent": null,
+ "property": "log",
+ "start": Object {
+ "column": 8,
+ "line": 7,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 8,
+ "line": 7,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 12,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for class properties: getScopes finds scope bindings for class properties at line 2 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "Foo": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 10,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 9,
+ "line": 3,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 3,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "type": "class-decl",
+ },
+ ],
+ "type": "let",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 11,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 11,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 11,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for class properties: getScopes finds scope bindings for class properties at line 4 column 16 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "arguments": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "this": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 13,
+ "line": 4,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 18,
+ "line": 4,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "parent": Object {
+ "end": Object {
+ "column": 20,
+ "line": 4,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "parent": null,
+ "start": Object {
+ "column": 9,
+ "line": 4,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "type": "call",
+ },
+ "property": "init",
+ "start": Object {
+ "column": 9,
+ "line": 4,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 4,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Class Field",
+ "end": Object {
+ "column": 20,
+ "line": 4,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 9,
+ "line": 4,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "type": "function",
+ },
+ Object {
+ "bindings": Object {
+ "Foo": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 10,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 9,
+ "line": 3,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 3,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "type": "class-inner",
+ },
+ ],
+ "type": "const",
+ },
+ },
+ "displayName": "Class",
+ "end": Object {
+ "column": 1,
+ "line": 10,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "Foo": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 10,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 9,
+ "line": 3,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 3,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "type": "class-decl",
+ },
+ ],
+ "type": "let",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 11,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 11,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 11,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for class properties: getScopes finds scope bindings for class properties at line 6 column 12 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "arguments": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "one": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 12,
+ "line": 7,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 7,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 11,
+ "line": 7,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "start": Object {
+ "column": 8,
+ "line": 7,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Class Field",
+ "end": Object {
+ "column": 3,
+ "line": 9,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 10,
+ "line": 6,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "type": "function",
+ },
+ Object {
+ "bindings": Object {
+ "Foo": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 10,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 9,
+ "line": 3,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 3,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "type": "class-inner",
+ },
+ ],
+ "type": "const",
+ },
+ },
+ "displayName": "Class",
+ "end": Object {
+ "column": 1,
+ "line": 10,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "Foo": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 10,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 9,
+ "line": 3,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 3,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "type": "class-decl",
+ },
+ ],
+ "type": "let",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 11,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 11,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 11,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for class properties: getScopes finds scope bindings for class properties at line 7 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "two": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 12,
+ "line": 8,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 8,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 11,
+ "line": 8,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "start": Object {
+ "column": 8,
+ "line": 8,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "type": "let",
+ },
+ ],
+ "type": "let",
+ },
+ },
+ "displayName": "Block",
+ "end": Object {
+ "column": 3,
+ "line": 9,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 13,
+ "line": 6,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "arguments": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "one": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 12,
+ "line": 7,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 7,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 11,
+ "line": 7,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "start": Object {
+ "column": 8,
+ "line": 7,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Class Field",
+ "end": Object {
+ "column": 3,
+ "line": 9,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 10,
+ "line": 6,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "type": "function",
+ },
+ Object {
+ "bindings": Object {
+ "Foo": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 10,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 9,
+ "line": 3,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 3,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "type": "class-inner",
+ },
+ ],
+ "type": "const",
+ },
+ },
+ "displayName": "Class",
+ "end": Object {
+ "column": 1,
+ "line": 10,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "Foo": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 10,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 9,
+ "line": 3,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 3,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "type": "class-decl",
+ },
+ ],
+ "type": "let",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 11,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 11,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 11,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for complex binding nesting: getScopes finds scope bindings for complex binding nesting at line 16 column 4 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "_arguments": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 31,
+ "line": 13,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 12,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 18,
+ "line": 13,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "start": Object {
+ "column": 8,
+ "line": 13,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "var",
+ },
+ Object {
+ "end": Object {
+ "column": 35,
+ "line": 19,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 25,
+ "line": 19,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "var",
+ },
+ "_this": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 31,
+ "line": 13,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 12,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 13,
+ "line": 12,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "start": Object {
+ "column": 8,
+ "line": 12,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "var",
+ },
+ Object {
+ "end": Object {
+ "column": 23,
+ "line": 19,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 18,
+ "line": 19,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "var",
+ },
+ "arg": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 3,
+ "line": 23,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 11,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 17,
+ "line": 11,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "start": Object {
+ "column": 14,
+ "line": 11,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "fn-param",
+ },
+ ],
+ "type": "var",
+ },
+ "arguments": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 30,
+ "line": 13,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 21,
+ "line": 13,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 31,
+ "line": 15,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 22,
+ "line": 15,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "implicit",
+ },
+ "arrow": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 6,
+ "line": 21,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 18,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 13,
+ "line": 18,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "start": Object {
+ "column": 8,
+ "line": 18,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "var",
+ },
+ Object {
+ "end": Object {
+ "column": 9,
+ "line": 22,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 4,
+ "line": 22,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 20,
+ "line": 12,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 16,
+ "line": 12,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 20,
+ "line": 15,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 16,
+ "line": 15,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "implicit",
+ },
+ },
+ "displayName": "fn",
+ "end": Object {
+ "column": 3,
+ "line": 23,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 14,
+ "line": 11,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "function",
+ },
+ Object {
+ "bindings": Object {
+ "arguments": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "fn": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 3,
+ "line": 23,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 11,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 13,
+ "line": 11,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "start": Object {
+ "column": 11,
+ "line": 11,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ Object {
+ "end": Object {
+ "column": 32,
+ "line": 16,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 30,
+ "line": 16,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 34,
+ "line": 20,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 32,
+ "line": 20,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 4,
+ "line": 25,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 9,
+ "line": 25,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "parent": null,
+ "property": "call",
+ "start": Object {
+ "column": 2,
+ "line": 25,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 25,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "root",
+ "end": Object {
+ "column": 1,
+ "line": 26,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 10,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "function",
+ },
+ Object {
+ "bindings": Object {
+ "__webpack_require__": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 29,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 51,
+ "line": 1,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "start": Object {
+ "column": 32,
+ "line": 1,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "fn-param",
+ },
+ ],
+ "type": "var",
+ },
+ "arguments": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "exports": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 29,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 30,
+ "line": 1,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "start": Object {
+ "column": 23,
+ "line": 1,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "fn-param",
+ },
+ Object {
+ "end": Object {
+ "column": 29,
+ "line": 6,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 22,
+ "line": 6,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 7,
+ "line": 9,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 15,
+ "line": 9,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "parent": null,
+ "property": "default",
+ "start": Object {
+ "column": 0,
+ "line": 9,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 9,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 24,
+ "line": 27,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 35,
+ "line": 27,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "parent": null,
+ "property": "default",
+ "start": Object {
+ "column": 17,
+ "line": 27,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 17,
+ "line": 27,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "var",
+ },
+ "module": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 29,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 21,
+ "line": 1,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "start": Object {
+ "column": 15,
+ "line": 1,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "fn-param",
+ },
+ Object {
+ "end": Object {
+ "column": 6,
+ "line": 27,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 14,
+ "line": 27,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "parent": null,
+ "property": "exports",
+ "start": Object {
+ "column": 0,
+ "line": 27,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 27,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "var",
+ },
+ "root": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 26,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 10,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 13,
+ "line": 10,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 10,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ Object {
+ "end": Object {
+ "column": 22,
+ "line": 9,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 18,
+ "line": 9,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 38,
+ "line": 16,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 34,
+ "line": 16,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 40,
+ "line": 20,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 36,
+ "line": 20,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "named",
+ "end": Object {
+ "column": 1,
+ "line": 29,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 15,
+ "line": 1,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "function",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 30,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "Object": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 6,
+ "line": 6,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 21,
+ "line": 6,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "parent": null,
+ "property": "defineProperty",
+ "start": Object {
+ "column": 0,
+ "line": 6,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 6,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ "console": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 11,
+ "line": 15,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 15,
+ "line": 15,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "parent": null,
+ "property": "log",
+ "start": Object {
+ "column": 4,
+ "line": 15,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 15,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 11,
+ "line": 16,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 15,
+ "line": 16,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "parent": null,
+ "property": "log",
+ "start": Object {
+ "column": 4,
+ "line": 16,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 16,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 13,
+ "line": 19,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 17,
+ "line": 19,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "parent": null,
+ "property": "log",
+ "start": Object {
+ "column": 6,
+ "line": 19,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 19,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 13,
+ "line": 20,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 17,
+ "line": 20,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "parent": null,
+ "property": "log",
+ "start": Object {
+ "column": 6,
+ "line": 20,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 20,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ "named": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 29,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 14,
+ "line": 1,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 1,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 30,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for complex binding nesting: getScopes finds scope bindings for complex binding nesting at line 20 column 6 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "argArrow": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 5,
+ "line": 21,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "start": Object {
+ "column": 16,
+ "line": 18,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 39,
+ "line": 18,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "start": Object {
+ "column": 31,
+ "line": 18,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "fn-param",
+ },
+ ],
+ "type": "var",
+ },
+ "arguments": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "arrow",
+ "end": Object {
+ "column": 5,
+ "line": 21,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 31,
+ "line": 18,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "function",
+ },
+ Object {
+ "bindings": Object {
+ "arrow": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 5,
+ "line": 21,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "start": Object {
+ "column": 16,
+ "line": 18,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 30,
+ "line": 18,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "start": Object {
+ "column": 25,
+ "line": 18,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "fn-expr",
+ },
+ ],
+ "type": "const",
+ },
+ },
+ "displayName": "Function Expression",
+ "end": Object {
+ "column": 5,
+ "line": 21,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 16,
+ "line": 18,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "_arguments": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 31,
+ "line": 13,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 12,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 18,
+ "line": 13,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "start": Object {
+ "column": 8,
+ "line": 13,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "var",
+ },
+ Object {
+ "end": Object {
+ "column": 35,
+ "line": 19,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 25,
+ "line": 19,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "var",
+ },
+ "_this": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 31,
+ "line": 13,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 12,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 13,
+ "line": 12,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "start": Object {
+ "column": 8,
+ "line": 12,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "var",
+ },
+ Object {
+ "end": Object {
+ "column": 23,
+ "line": 19,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 18,
+ "line": 19,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "var",
+ },
+ "arg": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 3,
+ "line": 23,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 11,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 17,
+ "line": 11,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "start": Object {
+ "column": 14,
+ "line": 11,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "fn-param",
+ },
+ ],
+ "type": "var",
+ },
+ "arguments": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 30,
+ "line": 13,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 21,
+ "line": 13,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 31,
+ "line": 15,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 22,
+ "line": 15,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "implicit",
+ },
+ "arrow": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 6,
+ "line": 21,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 18,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 13,
+ "line": 18,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "start": Object {
+ "column": 8,
+ "line": 18,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "var",
+ },
+ Object {
+ "end": Object {
+ "column": 9,
+ "line": 22,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 4,
+ "line": 22,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 20,
+ "line": 12,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 16,
+ "line": 12,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 20,
+ "line": 15,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 16,
+ "line": 15,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "implicit",
+ },
+ },
+ "displayName": "fn",
+ "end": Object {
+ "column": 3,
+ "line": 23,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 14,
+ "line": 11,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "function",
+ },
+ Object {
+ "bindings": Object {
+ "arguments": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "fn": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 3,
+ "line": 23,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 11,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 13,
+ "line": 11,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "start": Object {
+ "column": 11,
+ "line": 11,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ Object {
+ "end": Object {
+ "column": 32,
+ "line": 16,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 30,
+ "line": 16,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 34,
+ "line": 20,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 32,
+ "line": 20,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 4,
+ "line": 25,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 9,
+ "line": 25,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "parent": null,
+ "property": "call",
+ "start": Object {
+ "column": 2,
+ "line": 25,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 25,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "root",
+ "end": Object {
+ "column": 1,
+ "line": 26,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 10,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "function",
+ },
+ Object {
+ "bindings": Object {
+ "__webpack_require__": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 29,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 51,
+ "line": 1,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "start": Object {
+ "column": 32,
+ "line": 1,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "fn-param",
+ },
+ ],
+ "type": "var",
+ },
+ "arguments": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "exports": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 29,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 30,
+ "line": 1,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "start": Object {
+ "column": 23,
+ "line": 1,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "fn-param",
+ },
+ Object {
+ "end": Object {
+ "column": 29,
+ "line": 6,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 22,
+ "line": 6,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 7,
+ "line": 9,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 15,
+ "line": 9,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "parent": null,
+ "property": "default",
+ "start": Object {
+ "column": 0,
+ "line": 9,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 9,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 24,
+ "line": 27,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 35,
+ "line": 27,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "parent": null,
+ "property": "default",
+ "start": Object {
+ "column": 17,
+ "line": 27,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 17,
+ "line": 27,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "var",
+ },
+ "module": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 29,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 21,
+ "line": 1,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "start": Object {
+ "column": 15,
+ "line": 1,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "fn-param",
+ },
+ Object {
+ "end": Object {
+ "column": 6,
+ "line": 27,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 14,
+ "line": 27,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "parent": null,
+ "property": "exports",
+ "start": Object {
+ "column": 0,
+ "line": 27,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 27,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "var",
+ },
+ "root": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 26,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 10,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 13,
+ "line": 10,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 10,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ Object {
+ "end": Object {
+ "column": 22,
+ "line": 9,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 18,
+ "line": 9,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 38,
+ "line": 16,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 34,
+ "line": 16,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 40,
+ "line": 20,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 36,
+ "line": 20,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "named",
+ "end": Object {
+ "column": 1,
+ "line": 29,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 15,
+ "line": 1,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "function",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 30,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "Object": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 6,
+ "line": 6,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 21,
+ "line": 6,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "parent": null,
+ "property": "defineProperty",
+ "start": Object {
+ "column": 0,
+ "line": 6,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 6,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ "console": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 11,
+ "line": 15,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 15,
+ "line": 15,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "parent": null,
+ "property": "log",
+ "start": Object {
+ "column": 4,
+ "line": 15,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 15,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 11,
+ "line": 16,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 15,
+ "line": 16,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "parent": null,
+ "property": "log",
+ "start": Object {
+ "column": 4,
+ "line": 16,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 16,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 13,
+ "line": 19,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 17,
+ "line": 19,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "parent": null,
+ "property": "log",
+ "start": Object {
+ "column": 6,
+ "line": 19,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 19,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 13,
+ "line": 20,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 17,
+ "line": 20,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "parent": null,
+ "property": "log",
+ "start": Object {
+ "column": 6,
+ "line": 20,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 20,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ "named": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 29,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 14,
+ "line": 1,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 1,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 30,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for declarations with patterns: getScopes finds scope bindings for declarations with patterns at line 1 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/pattern-declarations/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/pattern-declarations/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "one": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 23,
+ "line": 1,
+ "sourceId": "scopes/pattern-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/pattern-declarations/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 15,
+ "line": 1,
+ "sourceId": "scopes/pattern-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 12,
+ "line": 1,
+ "sourceId": "scopes/pattern-declarations/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "two": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 17,
+ "line": 2,
+ "sourceId": "scopes/pattern-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 2,
+ "sourceId": "scopes/pattern-declarations/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 9,
+ "line": 2,
+ "sourceId": "scopes/pattern-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 2,
+ "sourceId": "scopes/pattern-declarations/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/pattern-declarations/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/pattern-declarations/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for for loops: getScopes finds scope bindings for for loops at line 2 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "four": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 13,
+ "line": 7,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 5,
+ "line": 7,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 13,
+ "line": 7,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 7,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "one": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 12,
+ "line": 3,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 5,
+ "line": 3,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 12,
+ "line": 3,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 3,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "seven": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 14,
+ "line": 11,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 5,
+ "line": 11,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 14,
+ "line": 11,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 11,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 14,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 14,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 14,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for for loops: getScopes finds scope bindings for for loops at line 3 column 17 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "four": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 13,
+ "line": 7,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 5,
+ "line": 7,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 13,
+ "line": 7,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 7,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "one": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 12,
+ "line": 3,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 5,
+ "line": 3,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 12,
+ "line": 3,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 3,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "seven": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 14,
+ "line": 11,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 5,
+ "line": 11,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 14,
+ "line": 11,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 11,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 14,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 14,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 14,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for for loops: getScopes finds scope bindings for for loops at line 4 column 17 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "two": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 12,
+ "line": 4,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 5,
+ "line": 4,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 12,
+ "line": 4,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 4,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "let",
+ },
+ ],
+ "type": "let",
+ },
+ },
+ "displayName": "For",
+ "end": Object {
+ "column": 18,
+ "line": 4,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 5,
+ "line": 4,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "four": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 13,
+ "line": 7,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 5,
+ "line": 7,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 13,
+ "line": 7,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 7,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "one": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 12,
+ "line": 3,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 5,
+ "line": 3,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 12,
+ "line": 3,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 3,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "seven": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 14,
+ "line": 11,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 5,
+ "line": 11,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 14,
+ "line": 11,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 11,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 14,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 14,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 14,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for for loops: getScopes finds scope bindings for for loops at line 5 column 25 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "three": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 20,
+ "line": 5,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 5,
+ "line": 5,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 16,
+ "line": 5,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 11,
+ "line": 5,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "const",
+ },
+ ],
+ "type": "const",
+ },
+ },
+ "displayName": "For",
+ "end": Object {
+ "column": 26,
+ "line": 5,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 5,
+ "line": 5,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "four": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 13,
+ "line": 7,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 5,
+ "line": 7,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 13,
+ "line": 7,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 7,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "one": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 12,
+ "line": 3,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 5,
+ "line": 3,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 12,
+ "line": 3,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 3,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "seven": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 14,
+ "line": 11,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 5,
+ "line": 11,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 14,
+ "line": 11,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 11,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 14,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 14,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 14,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for for loops: getScopes finds scope bindings for for loops at line 7 column 22 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "four": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 13,
+ "line": 7,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 5,
+ "line": 7,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 13,
+ "line": 7,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 7,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "one": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 12,
+ "line": 3,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 5,
+ "line": 3,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 12,
+ "line": 3,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 3,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "seven": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 14,
+ "line": 11,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 5,
+ "line": 11,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 14,
+ "line": 11,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 11,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 14,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 14,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 14,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for for loops: getScopes finds scope bindings for for loops at line 8 column 22 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "five": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 13,
+ "line": 8,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 5,
+ "line": 8,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 13,
+ "line": 8,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 8,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "let",
+ },
+ ],
+ "type": "let",
+ },
+ },
+ "displayName": "For",
+ "end": Object {
+ "column": 23,
+ "line": 8,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 5,
+ "line": 8,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "four": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 13,
+ "line": 7,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 5,
+ "line": 7,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 13,
+ "line": 7,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 7,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "one": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 12,
+ "line": 3,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 5,
+ "line": 3,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 12,
+ "line": 3,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 3,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "seven": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 14,
+ "line": 11,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 5,
+ "line": 11,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 14,
+ "line": 11,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 11,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 14,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 14,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 14,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for for loops: getScopes finds scope bindings for for loops at line 9 column 23 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "six": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 14,
+ "line": 9,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 5,
+ "line": 9,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 14,
+ "line": 9,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 11,
+ "line": 9,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "const",
+ },
+ ],
+ "type": "const",
+ },
+ },
+ "displayName": "For",
+ "end": Object {
+ "column": 24,
+ "line": 9,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 5,
+ "line": 9,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "four": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 13,
+ "line": 7,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 5,
+ "line": 7,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 13,
+ "line": 7,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 7,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "one": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 12,
+ "line": 3,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 5,
+ "line": 3,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 12,
+ "line": 3,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 3,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "seven": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 14,
+ "line": 11,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 5,
+ "line": 11,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 14,
+ "line": 11,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 11,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 14,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 14,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 14,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for for loops: getScopes finds scope bindings for for loops at line 11 column 23 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "four": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 13,
+ "line": 7,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 5,
+ "line": 7,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 13,
+ "line": 7,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 7,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "one": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 12,
+ "line": 3,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 5,
+ "line": 3,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 12,
+ "line": 3,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 3,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "seven": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 14,
+ "line": 11,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 5,
+ "line": 11,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 14,
+ "line": 11,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 11,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 14,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 14,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 14,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for for loops: getScopes finds scope bindings for for loops at line 12 column 23 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "eight": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 14,
+ "line": 12,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 5,
+ "line": 12,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 14,
+ "line": 12,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 12,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "let",
+ },
+ ],
+ "type": "let",
+ },
+ },
+ "displayName": "For",
+ "end": Object {
+ "column": 24,
+ "line": 12,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 5,
+ "line": 12,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "four": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 13,
+ "line": 7,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 5,
+ "line": 7,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 13,
+ "line": 7,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 7,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "one": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 12,
+ "line": 3,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 5,
+ "line": 3,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 12,
+ "line": 3,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 3,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "seven": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 14,
+ "line": 11,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 5,
+ "line": 11,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 14,
+ "line": 11,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 11,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 14,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 14,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 14,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for for loops: getScopes finds scope bindings for for loops at line 13 column 24 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "nine": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 15,
+ "line": 13,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 5,
+ "line": 13,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 15,
+ "line": 13,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 11,
+ "line": 13,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "const",
+ },
+ ],
+ "type": "const",
+ },
+ },
+ "displayName": "For",
+ "end": Object {
+ "column": 25,
+ "line": 13,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 5,
+ "line": 13,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "four": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 13,
+ "line": 7,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 5,
+ "line": 7,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 13,
+ "line": 7,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 7,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "one": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 12,
+ "line": 3,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 5,
+ "line": 3,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 12,
+ "line": 3,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 3,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "seven": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 14,
+ "line": 11,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 5,
+ "line": 11,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 14,
+ "line": 11,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 11,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 14,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 14,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 14,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for function declarations: getScopes finds scope bindings for function declarations at line 2 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "outer": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 21,
+ "line": 3,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 14,
+ "line": 3,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 3,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 12,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 12,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "console": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 11,
+ "line": 9,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 15,
+ "line": 9,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "parent": null,
+ "property": "log",
+ "start": Object {
+ "column": 4,
+ "line": 9,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 9,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 12,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for function declarations: getScopes finds scope bindings for function declarations at line 3 column 20 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "arguments": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "p1": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 21,
+ "line": 3,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 17,
+ "line": 3,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "start": Object {
+ "column": 15,
+ "line": 3,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "type": "fn-param",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "outer",
+ "end": Object {
+ "column": 21,
+ "line": 3,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 15,
+ "line": 3,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "type": "function",
+ },
+ Object {
+ "bindings": Object {
+ "outer": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 21,
+ "line": 3,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 14,
+ "line": 3,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 3,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 12,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 12,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "console": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 11,
+ "line": 9,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 15,
+ "line": 9,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "parent": null,
+ "property": "log",
+ "start": Object {
+ "column": 4,
+ "line": 9,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 9,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 12,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for function declarations: getScopes finds scope bindings for function declarations at line 5 column 1 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "middle": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 3,
+ "line": 10,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 6,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 17,
+ "line": 6,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "start": Object {
+ "column": 11,
+ "line": 6,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ ],
+ "type": "let",
+ },
+ },
+ "displayName": "Block",
+ "end": Object {
+ "column": 1,
+ "line": 11,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 5,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "outer": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 21,
+ "line": 3,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 14,
+ "line": 3,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 3,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 12,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 12,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "console": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 11,
+ "line": 9,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 15,
+ "line": 9,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "parent": null,
+ "property": "log",
+ "start": Object {
+ "column": 4,
+ "line": 9,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 9,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 12,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for function declarations: getScopes finds scope bindings for function declarations at line 9 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "arguments": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "inner": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 25,
+ "line": 7,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 7,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 18,
+ "line": 7,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "start": Object {
+ "column": 13,
+ "line": 7,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ ],
+ "type": "var",
+ },
+ "p2": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 3,
+ "line": 10,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 6,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 20,
+ "line": 6,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "start": Object {
+ "column": 18,
+ "line": 6,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "type": "fn-param",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 20,
+ "line": 9,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 16,
+ "line": 9,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "implicit",
+ },
+ },
+ "displayName": "middle",
+ "end": Object {
+ "column": 3,
+ "line": 10,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 18,
+ "line": 6,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "type": "function",
+ },
+ Object {
+ "bindings": Object {
+ "middle": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 3,
+ "line": 10,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 6,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 17,
+ "line": 6,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "start": Object {
+ "column": 11,
+ "line": 6,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ ],
+ "type": "let",
+ },
+ },
+ "displayName": "Block",
+ "end": Object {
+ "column": 1,
+ "line": 11,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 5,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "outer": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 21,
+ "line": 3,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 14,
+ "line": 3,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 3,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 12,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 12,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "console": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 11,
+ "line": 9,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 15,
+ "line": 9,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "parent": null,
+ "property": "log",
+ "start": Object {
+ "column": 4,
+ "line": 9,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 9,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 12,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for function expressions: getScopes finds scope bindings for function expressions at line 2 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "fn": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 25,
+ "line": 3,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 6,
+ "line": 3,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 3,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "type": "let",
+ },
+ ],
+ "type": "let",
+ },
+ "fn2": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 2,
+ "line": 7,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 5,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 7,
+ "line": 5,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 5,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "type": "let",
+ },
+ ],
+ "type": "let",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 8,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 8,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "console": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 9,
+ "line": 6,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 13,
+ "line": 6,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "parent": null,
+ "property": "log",
+ "start": Object {
+ "column": 2,
+ "line": 6,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 6,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 8,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for function expressions: getScopes finds scope bindings for function expressions at line 3 column 23 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "arguments": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "p1": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 24,
+ "line": 3,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 3,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 20,
+ "line": 3,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "start": Object {
+ "column": 18,
+ "line": 3,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "type": "fn-param",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "fn",
+ "end": Object {
+ "column": 24,
+ "line": 3,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 18,
+ "line": 3,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "type": "function",
+ },
+ Object {
+ "bindings": Object {
+ "fn": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 25,
+ "line": 3,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 6,
+ "line": 3,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 3,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "type": "let",
+ },
+ ],
+ "type": "let",
+ },
+ "fn2": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 2,
+ "line": 7,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 5,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 7,
+ "line": 5,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 5,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "type": "let",
+ },
+ ],
+ "type": "let",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 8,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 8,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "console": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 9,
+ "line": 6,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 13,
+ "line": 6,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "parent": null,
+ "property": "log",
+ "start": Object {
+ "column": 2,
+ "line": 6,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 6,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 8,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for function expressions: getScopes finds scope bindings for function expressions at line 6 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "arguments": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "p2": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 7,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "start": Object {
+ "column": 10,
+ "line": 5,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 30,
+ "line": 5,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "start": Object {
+ "column": 28,
+ "line": 5,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "type": "fn-param",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 18,
+ "line": 6,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 14,
+ "line": 6,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "implicit",
+ },
+ },
+ "displayName": "withName",
+ "end": Object {
+ "column": 1,
+ "line": 7,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 28,
+ "line": 5,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "type": "function",
+ },
+ Object {
+ "bindings": Object {
+ "withName": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 7,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "start": Object {
+ "column": 10,
+ "line": 5,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 27,
+ "line": 5,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "start": Object {
+ "column": 19,
+ "line": 5,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "type": "fn-expr",
+ },
+ ],
+ "type": "const",
+ },
+ },
+ "displayName": "Function Expression",
+ "end": Object {
+ "column": 1,
+ "line": 7,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 10,
+ "line": 5,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "fn": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 25,
+ "line": 3,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 6,
+ "line": 3,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 3,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "type": "let",
+ },
+ ],
+ "type": "let",
+ },
+ "fn2": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 2,
+ "line": 7,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 5,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 7,
+ "line": 5,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 5,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "type": "let",
+ },
+ ],
+ "type": "let",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 8,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 8,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "console": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 9,
+ "line": 6,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 13,
+ "line": 6,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "parent": null,
+ "property": "log",
+ "start": Object {
+ "column": 2,
+ "line": 6,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 6,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 8,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for out of order declarations: getScopes finds scope bindings for out of order declarations at line 2 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "aDefault": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 33,
+ "line": 21,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 21,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 15,
+ "line": 21,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "importName": "default",
+ "start": Object {
+ "column": 7,
+ "line": 21,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "import-decl",
+ },
+ ],
+ "type": "import",
+ },
+ "root": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 19,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 15,
+ "line": 3,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 28,
+ "line": 3,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 24,
+ "line": 3,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ Object {
+ "end": Object {
+ "column": 39,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 35,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "val": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 8,
+ "line": 1,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 7,
+ "line": 1,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 1,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 22,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 22,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "console": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 11,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 15,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "parent": null,
+ "property": "log",
+ "start": Object {
+ "column": 4,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 22,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for out of order declarations: getScopes finds scope bindings for out of order declarations at line 5 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "arguments": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "callback": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 3,
+ "line": 16,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 10,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 19,
+ "line": 10,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 11,
+ "line": 10,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ Object {
+ "end": Object {
+ "column": 33,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 25,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 10,
+ "line": 18,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 12,
+ "line": 18,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "parent": null,
+ "start": Object {
+ "column": 2,
+ "line": 18,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "call",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 18,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "var",
+ },
+ "fn": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 9,
+ "line": 6,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 6,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 8,
+ "line": 6,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 6,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 6,
+ "line": 8,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 2,
+ "line": 8,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "implicit",
+ },
+ "val": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 10,
+ "line": 4,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 4,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 9,
+ "line": 4,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 4,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ },
+ "displayName": "root",
+ "end": Object {
+ "column": 1,
+ "line": 19,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 15,
+ "line": 3,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "function",
+ },
+ Object {
+ "bindings": Object {
+ "aDefault": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 33,
+ "line": 21,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 21,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 15,
+ "line": 21,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "importName": "default",
+ "start": Object {
+ "column": 7,
+ "line": 21,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "import-decl",
+ },
+ ],
+ "type": "import",
+ },
+ "root": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 19,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 15,
+ "line": 3,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 28,
+ "line": 3,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 24,
+ "line": 3,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ Object {
+ "end": Object {
+ "column": 39,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 35,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "val": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 8,
+ "line": 1,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 7,
+ "line": 1,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 1,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 22,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 22,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "console": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 11,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 15,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "parent": null,
+ "property": "log",
+ "start": Object {
+ "column": 4,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 22,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for out of order declarations: getScopes finds scope bindings for out of order declarations at line 11 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "arguments": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "fn": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 19,
+ "line": 15,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 15,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 15,
+ "line": 15,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 13,
+ "line": 15,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ Object {
+ "end": Object {
+ "column": 23,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 21,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 45,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 41,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "implicit",
+ },
+ "val": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 12,
+ "line": 13,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 13,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 11,
+ "line": 13,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 8,
+ "line": 13,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "var",
+ },
+ Object {
+ "end": Object {
+ "column": 19,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 16,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "var",
+ },
+ },
+ "displayName": "callback",
+ "end": Object {
+ "column": 3,
+ "line": 16,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 2,
+ "line": 10,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "function",
+ },
+ Object {
+ "bindings": Object {
+ "arguments": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "callback": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 3,
+ "line": 16,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 10,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 19,
+ "line": 10,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 11,
+ "line": 10,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ Object {
+ "end": Object {
+ "column": 33,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 25,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 10,
+ "line": 18,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 12,
+ "line": 18,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "parent": null,
+ "start": Object {
+ "column": 2,
+ "line": 18,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "call",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 18,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "var",
+ },
+ "fn": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 9,
+ "line": 6,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 6,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 8,
+ "line": 6,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 6,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 6,
+ "line": 8,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 2,
+ "line": 8,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "implicit",
+ },
+ "val": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 10,
+ "line": 4,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 4,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 9,
+ "line": 4,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 4,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ },
+ "displayName": "root",
+ "end": Object {
+ "column": 1,
+ "line": 19,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 15,
+ "line": 3,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "function",
+ },
+ Object {
+ "bindings": Object {
+ "aDefault": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 33,
+ "line": 21,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 21,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 15,
+ "line": 21,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "importName": "default",
+ "start": Object {
+ "column": 7,
+ "line": 21,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "import-decl",
+ },
+ ],
+ "type": "import",
+ },
+ "root": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 19,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 15,
+ "line": 3,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 28,
+ "line": 3,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 24,
+ "line": 3,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ Object {
+ "end": Object {
+ "column": 39,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 35,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "val": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 8,
+ "line": 1,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 7,
+ "line": 1,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 1,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 22,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 22,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "console": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 11,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 15,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "parent": null,
+ "property": "log",
+ "start": Object {
+ "column": 4,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 22,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for out of order declarations: getScopes finds scope bindings for out of order declarations at line 14 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "arguments": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "fn": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 19,
+ "line": 15,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 15,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 15,
+ "line": 15,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 13,
+ "line": 15,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ Object {
+ "end": Object {
+ "column": 23,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 21,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 45,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 41,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "implicit",
+ },
+ "val": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 12,
+ "line": 13,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 13,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 11,
+ "line": 13,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 8,
+ "line": 13,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "var",
+ },
+ Object {
+ "end": Object {
+ "column": 19,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 16,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "var",
+ },
+ },
+ "displayName": "callback",
+ "end": Object {
+ "column": 3,
+ "line": 16,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 2,
+ "line": 10,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "function",
+ },
+ Object {
+ "bindings": Object {
+ "arguments": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "callback": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 3,
+ "line": 16,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 10,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 19,
+ "line": 10,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 11,
+ "line": 10,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ Object {
+ "end": Object {
+ "column": 33,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 25,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 10,
+ "line": 18,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 12,
+ "line": 18,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "parent": null,
+ "start": Object {
+ "column": 2,
+ "line": 18,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "call",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 18,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "var",
+ },
+ "fn": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 9,
+ "line": 6,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 6,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 8,
+ "line": 6,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 6,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 6,
+ "line": 8,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 2,
+ "line": 8,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "implicit",
+ },
+ "val": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 10,
+ "line": 4,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 4,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 9,
+ "line": 4,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 4,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ },
+ "displayName": "root",
+ "end": Object {
+ "column": 1,
+ "line": 19,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 15,
+ "line": 3,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "function",
+ },
+ Object {
+ "bindings": Object {
+ "aDefault": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 33,
+ "line": 21,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 21,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 15,
+ "line": 21,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "importName": "default",
+ "start": Object {
+ "column": 7,
+ "line": 21,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "import-decl",
+ },
+ ],
+ "type": "import",
+ },
+ "root": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 19,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 15,
+ "line": 3,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 28,
+ "line": 3,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 24,
+ "line": 3,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ Object {
+ "end": Object {
+ "column": 39,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 35,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "val": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 8,
+ "line": 1,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 7,
+ "line": 1,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 1,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 22,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 22,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "console": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 11,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 15,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "parent": null,
+ "property": "log",
+ "start": Object {
+ "column": 4,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 22,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for out of order declarations: getScopes finds scope bindings for out of order declarations at line 17 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "arguments": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "callback": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 3,
+ "line": 16,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 10,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 19,
+ "line": 10,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 11,
+ "line": 10,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ Object {
+ "end": Object {
+ "column": 33,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 25,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 10,
+ "line": 18,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 12,
+ "line": 18,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "parent": null,
+ "start": Object {
+ "column": 2,
+ "line": 18,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "call",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 18,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "var",
+ },
+ "fn": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 9,
+ "line": 6,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 6,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 8,
+ "line": 6,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 6,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 6,
+ "line": 8,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 2,
+ "line": 8,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "implicit",
+ },
+ "val": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 10,
+ "line": 4,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 4,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 9,
+ "line": 4,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 4,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ },
+ "displayName": "root",
+ "end": Object {
+ "column": 1,
+ "line": 19,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 15,
+ "line": 3,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "function",
+ },
+ Object {
+ "bindings": Object {
+ "aDefault": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 33,
+ "line": 21,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 21,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 15,
+ "line": 21,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "importName": "default",
+ "start": Object {
+ "column": 7,
+ "line": 21,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "import-decl",
+ },
+ ],
+ "type": "import",
+ },
+ "root": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 19,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 15,
+ "line": 3,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 28,
+ "line": 3,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 24,
+ "line": 3,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ Object {
+ "end": Object {
+ "column": 39,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 35,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "val": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 8,
+ "line": 1,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 7,
+ "line": 1,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 1,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 22,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 22,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "console": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 11,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 15,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "parent": null,
+ "property": "log",
+ "start": Object {
+ "column": 4,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 22,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for switch statements: getScopes finds scope bindings for switch statements at line 2 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "zero": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 13,
+ "line": 5,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 5,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 12,
+ "line": 5,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 8,
+ "line": 5,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 23,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 23,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "foo": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 11,
+ "line": 3,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 8,
+ "line": 3,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 11,
+ "line": 15,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 8,
+ "line": 15,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 11,
+ "line": 19,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 8,
+ "line": 19,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 23,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for switch statements: getScopes finds scope bindings for switch statements at line 5 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "one": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 12,
+ "line": 7,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 7,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 11,
+ "line": 7,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 8,
+ "line": 7,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "let",
+ },
+ ],
+ "type": "let",
+ },
+ "two": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 12,
+ "line": 9,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 9,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 11,
+ "line": 9,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 8,
+ "line": 9,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "let",
+ },
+ ],
+ "type": "let",
+ },
+ },
+ "displayName": "Switch",
+ "end": Object {
+ "column": 1,
+ "line": 13,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "zero": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 13,
+ "line": 5,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 5,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 12,
+ "line": 5,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 8,
+ "line": 5,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 23,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 23,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "foo": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 11,
+ "line": 3,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 8,
+ "line": 3,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 11,
+ "line": 15,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 8,
+ "line": 15,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 11,
+ "line": 19,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 8,
+ "line": 19,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 23,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for switch statements: getScopes finds scope bindings for switch statements at line 7 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "one": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 12,
+ "line": 7,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 7,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 11,
+ "line": 7,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 8,
+ "line": 7,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "let",
+ },
+ ],
+ "type": "let",
+ },
+ "two": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 12,
+ "line": 9,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 9,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 11,
+ "line": 9,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 8,
+ "line": 9,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "let",
+ },
+ ],
+ "type": "let",
+ },
+ },
+ "displayName": "Switch",
+ "end": Object {
+ "column": 1,
+ "line": 13,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "zero": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 13,
+ "line": 5,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 5,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 12,
+ "line": 5,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 8,
+ "line": 5,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 23,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 23,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "foo": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 11,
+ "line": 3,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 8,
+ "line": 3,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 11,
+ "line": 15,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 8,
+ "line": 15,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 11,
+ "line": 19,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 8,
+ "line": 19,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 23,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for switch statements: getScopes finds scope bindings for switch statements at line 9 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "one": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 12,
+ "line": 7,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 7,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 11,
+ "line": 7,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 8,
+ "line": 7,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "let",
+ },
+ ],
+ "type": "let",
+ },
+ "two": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 12,
+ "line": 9,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 9,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 11,
+ "line": 9,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 8,
+ "line": 9,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "let",
+ },
+ ],
+ "type": "let",
+ },
+ },
+ "displayName": "Switch",
+ "end": Object {
+ "column": 1,
+ "line": 13,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "zero": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 13,
+ "line": 5,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 5,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 12,
+ "line": 5,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 8,
+ "line": 5,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 23,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 23,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "foo": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 11,
+ "line": 3,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 8,
+ "line": 3,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 11,
+ "line": 15,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 8,
+ "line": 15,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 11,
+ "line": 19,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 8,
+ "line": 19,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 23,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for switch statements: getScopes finds scope bindings for switch statements at line 11 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "three": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 14,
+ "line": 11,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 11,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 13,
+ "line": 11,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 8,
+ "line": 11,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "let",
+ },
+ ],
+ "type": "let",
+ },
+ },
+ "displayName": "Block",
+ "end": Object {
+ "column": 3,
+ "line": 12,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 16,
+ "line": 10,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "one": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 12,
+ "line": 7,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 7,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 11,
+ "line": 7,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 8,
+ "line": 7,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "let",
+ },
+ ],
+ "type": "let",
+ },
+ "two": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 12,
+ "line": 9,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 9,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 11,
+ "line": 9,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 8,
+ "line": 9,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "let",
+ },
+ ],
+ "type": "let",
+ },
+ },
+ "displayName": "Switch",
+ "end": Object {
+ "column": 1,
+ "line": 13,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "zero": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 13,
+ "line": 5,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 5,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 12,
+ "line": 5,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 8,
+ "line": 5,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 23,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 23,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "foo": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 11,
+ "line": 3,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 8,
+ "line": 3,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 11,
+ "line": 15,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 8,
+ "line": 15,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 11,
+ "line": 19,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 8,
+ "line": 19,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 23,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for switch statements: getScopes finds scope bindings for switch statements at line 17 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "two": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 20,
+ "line": 17,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 17,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 16,
+ "line": 17,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 13,
+ "line": 17,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ ],
+ "type": "let",
+ },
+ },
+ "displayName": "Switch",
+ "end": Object {
+ "column": 1,
+ "line": 18,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 15,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "zero": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 13,
+ "line": 5,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 5,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 12,
+ "line": 5,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 8,
+ "line": 5,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 23,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 23,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "foo": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 11,
+ "line": 3,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 8,
+ "line": 3,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 11,
+ "line": 15,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 8,
+ "line": 15,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 11,
+ "line": 19,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 8,
+ "line": 19,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 23,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for switch statements: getScopes finds scope bindings for switch statements at line 21 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "three": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 18,
+ "line": 21,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 21,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 15,
+ "line": 21,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 10,
+ "line": 21,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "class-decl",
+ },
+ ],
+ "type": "let",
+ },
+ },
+ "displayName": "Switch",
+ "end": Object {
+ "column": 1,
+ "line": 22,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 19,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "zero": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 13,
+ "line": 5,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 5,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 12,
+ "line": 5,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 8,
+ "line": 5,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 23,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 23,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "foo": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 11,
+ "line": 3,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 8,
+ "line": 3,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 11,
+ "line": 15,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 8,
+ "line": 15,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 11,
+ "line": 19,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 8,
+ "line": 19,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 23,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for try..catch: getScopes finds scope bindings for try..catch at line 2 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "first": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 12,
+ "line": 4,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 4,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 11,
+ "line": 4,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 4,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "third": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 12,
+ "line": 7,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 7,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 11,
+ "line": 7,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 7,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 10,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 10,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 10,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for try..catch: getScopes finds scope bindings for try..catch at line 4 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "second": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 13,
+ "line": 5,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 5,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 12,
+ "line": 5,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 5,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "type": "let",
+ },
+ ],
+ "type": "let",
+ },
+ },
+ "displayName": "Block",
+ "end": Object {
+ "column": 1,
+ "line": 6,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 4,
+ "line": 3,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "first": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 12,
+ "line": 4,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 4,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 11,
+ "line": 4,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 4,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "third": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 12,
+ "line": 7,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 7,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 11,
+ "line": 7,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 7,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 10,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 10,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 10,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for try..catch: getScopes finds scope bindings for try..catch at line 7 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "fourth": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 13,
+ "line": 8,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 8,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 12,
+ "line": 8,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 8,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "type": "let",
+ },
+ ],
+ "type": "let",
+ },
+ },
+ "displayName": "Block",
+ "end": Object {
+ "column": 1,
+ "line": 9,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 14,
+ "line": 6,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "err": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 9,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 6,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 12,
+ "line": 6,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 6,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "type": "catch",
+ },
+ ],
+ "type": "var",
+ },
+ },
+ "displayName": "Catch",
+ "end": Object {
+ "column": 1,
+ "line": 9,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 2,
+ "line": 6,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "first": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 12,
+ "line": 4,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 4,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 11,
+ "line": 4,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 4,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "third": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 12,
+ "line": 7,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 7,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 11,
+ "line": 7,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 7,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 10,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 10,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 10,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings in a JSX element: getScopes finds scope bindings in a JSX element at line 2 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "SomeComponent": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 29,
+ "line": 1,
+ "sourceId": "scopes/jsx-component/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/jsx-component/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 20,
+ "line": 1,
+ "sourceId": "scopes/jsx-component/originalSource-1",
+ },
+ "importName": "default",
+ "start": Object {
+ "column": 7,
+ "line": 1,
+ "sourceId": "scopes/jsx-component/originalSource-1",
+ },
+ "type": "import-decl",
+ },
+ Object {
+ "end": Object {
+ "column": 14,
+ "line": 3,
+ "sourceId": "scopes/jsx-component/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 1,
+ "line": 3,
+ "sourceId": "scopes/jsx-component/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 14,
+ "line": 4,
+ "sourceId": "scopes/jsx-component/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 1,
+ "line": 4,
+ "sourceId": "scopes/jsx-component/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 14,
+ "line": 5,
+ "sourceId": "scopes/jsx-component/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 1,
+ "line": 5,
+ "sourceId": "scopes/jsx-component/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 14,
+ "line": 6,
+ "sourceId": "scopes/jsx-component/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 1,
+ "line": 6,
+ "sourceId": "scopes/jsx-component/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "import",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 7,
+ "sourceId": "scopes/jsx-component/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/jsx-component/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 7,
+ "sourceId": "scopes/jsx-component/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/jsx-component/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 7,
+ "sourceId": "scopes/jsx-component/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/jsx-component/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings in a module: getScopes finds scope bindings in a module at line 7 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "fn": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 16,
+ "line": 9,
+ "sourceId": "scopes/simple-module/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 9,
+ "sourceId": "scopes/simple-module/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 11,
+ "line": 9,
+ "sourceId": "scopes/simple-module/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 9,
+ "sourceId": "scopes/simple-module/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ ],
+ "type": "var",
+ },
+ "foo": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 22,
+ "line": 1,
+ "sourceId": "scopes/simple-module/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/simple-module/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 10,
+ "line": 1,
+ "sourceId": "scopes/simple-module/originalSource-1",
+ },
+ "importName": "default",
+ "start": Object {
+ "column": 7,
+ "line": 1,
+ "sourceId": "scopes/simple-module/originalSource-1",
+ },
+ "type": "import-decl",
+ },
+ Object {
+ "end": Object {
+ "column": 15,
+ "line": 3,
+ "sourceId": "scopes/simple-module/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 12,
+ "line": 3,
+ "sourceId": "scopes/simple-module/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "import",
+ },
+ "one": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 12,
+ "line": 5,
+ "sourceId": "scopes/simple-module/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 5,
+ "sourceId": "scopes/simple-module/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 7,
+ "line": 5,
+ "sourceId": "scopes/simple-module/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 5,
+ "sourceId": "scopes/simple-module/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 4,
+ "line": 11,
+ "sourceId": "scopes/simple-module/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 0,
+ "line": 11,
+ "sourceId": "scopes/simple-module/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "implicit",
+ },
+ "three": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 16,
+ "line": 7,
+ "sourceId": "scopes/simple-module/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 7,
+ "sourceId": "scopes/simple-module/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 11,
+ "line": 7,
+ "sourceId": "scopes/simple-module/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 7,
+ "sourceId": "scopes/simple-module/originalSource-1",
+ },
+ "type": "const",
+ },
+ ],
+ "type": "const",
+ },
+ "two": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 12,
+ "line": 6,
+ "sourceId": "scopes/simple-module/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 6,
+ "sourceId": "scopes/simple-module/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 7,
+ "line": 6,
+ "sourceId": "scopes/simple-module/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 6,
+ "sourceId": "scopes/simple-module/originalSource-1",
+ },
+ "type": "let",
+ },
+ ],
+ "type": "let",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 12,
+ "sourceId": "scopes/simple-module/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/simple-module/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 12,
+ "sourceId": "scopes/simple-module/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/simple-module/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "console": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 7,
+ "line": 3,
+ "sourceId": "scopes/simple-module/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 11,
+ "line": 3,
+ "sourceId": "scopes/simple-module/originalSource-1",
+ },
+ "parent": null,
+ "property": "log",
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/simple-module/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/simple-module/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 12,
+ "sourceId": "scopes/simple-module/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/simple-module/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings in a typescript file: getScopes finds scope bindings in a typescript file at line 9 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "Color": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 8,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 10,
+ "line": 3,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 5,
+ "line": 3,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "ts-enum-decl",
+ },
+ ],
+ "type": "const",
+ },
+ "Example": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 19,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 10,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 13,
+ "line": 10,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 10,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "class-decl",
+ },
+ Object {
+ "end": Object {
+ "column": 16,
+ "line": 41,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 9,
+ "line": 41,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "let",
+ },
+ "TheSpace": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 35,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 31,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 18,
+ "line": 31,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 10,
+ "line": 31,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "ts-namespace-decl",
+ },
+ ],
+ "type": "const",
+ },
+ "foo": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 22,
+ "line": 22,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 22,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 7,
+ "line": 22,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 22,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 42,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 42,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "Error": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 19,
+ "line": 17,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 14,
+ "line": 17,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ "window": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 21,
+ "line": 22,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 15,
+ "line": 22,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 7,
+ "line": 25,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 1,
+ "line": 25,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 7,
+ "line": 28,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 1,
+ "line": 28,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 42,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings in a typescript file: getScopes finds scope bindings in a typescript file at line 13 column 4 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "arguments": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "foo": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 3,
+ "line": 14,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 12,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 24,
+ "line": 12,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 21,
+ "line": 12,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "fn-param",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "constructor",
+ "end": Object {
+ "column": 3,
+ "line": 14,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 14,
+ "line": 12,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "function",
+ },
+ Object {
+ "bindings": Object {
+ "Example": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 19,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 10,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 13,
+ "line": 10,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 10,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "class-inner",
+ },
+ ],
+ "type": "const",
+ },
+ },
+ "displayName": "Class",
+ "end": Object {
+ "column": 1,
+ "line": 19,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 10,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "Color": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 8,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 10,
+ "line": 3,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 5,
+ "line": 3,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "ts-enum-decl",
+ },
+ ],
+ "type": "const",
+ },
+ "Example": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 19,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 10,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 13,
+ "line": 10,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 10,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "class-decl",
+ },
+ Object {
+ "end": Object {
+ "column": 16,
+ "line": 41,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 9,
+ "line": 41,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "let",
+ },
+ "TheSpace": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 35,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 31,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 18,
+ "line": 31,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 10,
+ "line": 31,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "ts-namespace-decl",
+ },
+ ],
+ "type": "const",
+ },
+ "foo": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 22,
+ "line": 22,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 22,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 7,
+ "line": 22,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 22,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 42,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 42,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "Error": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 19,
+ "line": 17,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 14,
+ "line": 17,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ "window": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 21,
+ "line": 22,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 15,
+ "line": 22,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 7,
+ "line": 25,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 1,
+ "line": 25,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 7,
+ "line": 28,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 1,
+ "line": 28,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 42,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings in a typescript file: getScopes finds scope bindings in a typescript file at line 17 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "arguments": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "method",
+ "end": Object {
+ "column": 3,
+ "line": 18,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 2,
+ "line": 16,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "function",
+ },
+ Object {
+ "bindings": Object {
+ "Example": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 19,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 10,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 13,
+ "line": 10,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 10,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "class-inner",
+ },
+ ],
+ "type": "const",
+ },
+ },
+ "displayName": "Class",
+ "end": Object {
+ "column": 1,
+ "line": 19,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 10,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "Color": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 8,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 10,
+ "line": 3,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 5,
+ "line": 3,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "ts-enum-decl",
+ },
+ ],
+ "type": "const",
+ },
+ "Example": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 19,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 10,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 13,
+ "line": 10,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 10,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "class-decl",
+ },
+ Object {
+ "end": Object {
+ "column": 16,
+ "line": 41,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 9,
+ "line": 41,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "let",
+ },
+ "TheSpace": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 35,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 31,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 18,
+ "line": 31,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 10,
+ "line": 31,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "ts-namespace-decl",
+ },
+ ],
+ "type": "const",
+ },
+ "foo": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 22,
+ "line": 22,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 22,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 7,
+ "line": 22,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 22,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 42,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 42,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "Error": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 19,
+ "line": 17,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 14,
+ "line": 17,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ "window": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 21,
+ "line": 22,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 15,
+ "line": 22,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 7,
+ "line": 25,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 1,
+ "line": 25,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 7,
+ "line": 28,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 1,
+ "line": 28,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 42,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings in a typescript file: getScopes finds scope bindings in a typescript file at line 33 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "arguments": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "fn",
+ "end": Object {
+ "column": 3,
+ "line": 34,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 2,
+ "line": 32,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "function",
+ },
+ Object {
+ "bindings": Object {
+ "fn": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 3,
+ "line": 34,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 32,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 13,
+ "line": 32,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 11,
+ "line": 32,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ ],
+ "type": "let",
+ },
+ },
+ "displayName": "TypeScript Namespace",
+ "end": Object {
+ "column": 1,
+ "line": 35,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 19,
+ "line": 31,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "Color": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 8,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 10,
+ "line": 3,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 5,
+ "line": 3,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "ts-enum-decl",
+ },
+ ],
+ "type": "const",
+ },
+ "Example": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 19,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 10,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 13,
+ "line": 10,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 10,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "class-decl",
+ },
+ Object {
+ "end": Object {
+ "column": 16,
+ "line": 41,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 9,
+ "line": 41,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "let",
+ },
+ "TheSpace": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 35,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 31,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 18,
+ "line": 31,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 10,
+ "line": 31,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "ts-namespace-decl",
+ },
+ ],
+ "type": "const",
+ },
+ "foo": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 22,
+ "line": 22,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 22,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 7,
+ "line": 22,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 22,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 42,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 42,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "Error": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 19,
+ "line": 17,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 14,
+ "line": 17,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ "window": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 21,
+ "line": 22,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 15,
+ "line": 22,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 7,
+ "line": 25,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 1,
+ "line": 25,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 7,
+ "line": 28,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 1,
+ "line": 28,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 42,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings in a typescript-jsx file: getScopes finds scope bindings in a typescript-jsx file at line 9 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "Color": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 8,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 10,
+ "line": 3,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 5,
+ "line": 3,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "ts-enum-decl",
+ },
+ ],
+ "type": "const",
+ },
+ "Example": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 19,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 10,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 13,
+ "line": 10,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 10,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "class-decl",
+ },
+ Object {
+ "end": Object {
+ "column": 16,
+ "line": 41,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 9,
+ "line": 41,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "let",
+ },
+ "TheSpace": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 35,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 31,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 18,
+ "line": 31,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 10,
+ "line": 31,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "ts-namespace-decl",
+ },
+ ],
+ "type": "const",
+ },
+ "foo": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 28,
+ "line": 22,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 22,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 7,
+ "line": 22,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 22,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 42,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 42,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "Error": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 19,
+ "line": 17,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 14,
+ "line": 17,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ "any": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 14,
+ "line": 22,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 11,
+ "line": 22,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ "window": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 7,
+ "line": 25,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 1,
+ "line": 25,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 7,
+ "line": 28,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 1,
+ "line": 28,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 42,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings in a typescript-jsx file: getScopes finds scope bindings in a typescript-jsx file at line 13 column 4 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "arguments": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "foo": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 3,
+ "line": 14,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 12,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 24,
+ "line": 12,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 21,
+ "line": 12,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "fn-param",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "constructor",
+ "end": Object {
+ "column": 3,
+ "line": 14,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 14,
+ "line": 12,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "function",
+ },
+ Object {
+ "bindings": Object {
+ "Example": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 19,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 10,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 13,
+ "line": 10,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 10,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "class-inner",
+ },
+ ],
+ "type": "const",
+ },
+ },
+ "displayName": "Class",
+ "end": Object {
+ "column": 1,
+ "line": 19,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 10,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "Color": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 8,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 10,
+ "line": 3,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 5,
+ "line": 3,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "ts-enum-decl",
+ },
+ ],
+ "type": "const",
+ },
+ "Example": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 19,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 10,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 13,
+ "line": 10,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 10,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "class-decl",
+ },
+ Object {
+ "end": Object {
+ "column": 16,
+ "line": 41,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 9,
+ "line": 41,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "let",
+ },
+ "TheSpace": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 35,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 31,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 18,
+ "line": 31,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 10,
+ "line": 31,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "ts-namespace-decl",
+ },
+ ],
+ "type": "const",
+ },
+ "foo": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 28,
+ "line": 22,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 22,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 7,
+ "line": 22,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 22,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 42,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 42,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "Error": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 19,
+ "line": 17,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 14,
+ "line": 17,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ "any": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 14,
+ "line": 22,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 11,
+ "line": 22,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ "window": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 7,
+ "line": 25,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 1,
+ "line": 25,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 7,
+ "line": 28,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 1,
+ "line": 28,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 42,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings in a typescript-jsx file: getScopes finds scope bindings in a typescript-jsx file at line 17 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "arguments": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "method",
+ "end": Object {
+ "column": 3,
+ "line": 18,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 2,
+ "line": 16,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "function",
+ },
+ Object {
+ "bindings": Object {
+ "Example": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 19,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 10,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 13,
+ "line": 10,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 10,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "class-inner",
+ },
+ ],
+ "type": "const",
+ },
+ },
+ "displayName": "Class",
+ "end": Object {
+ "column": 1,
+ "line": 19,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 10,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "Color": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 8,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 10,
+ "line": 3,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 5,
+ "line": 3,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "ts-enum-decl",
+ },
+ ],
+ "type": "const",
+ },
+ "Example": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 19,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 10,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 13,
+ "line": 10,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 10,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "class-decl",
+ },
+ Object {
+ "end": Object {
+ "column": 16,
+ "line": 41,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 9,
+ "line": 41,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "let",
+ },
+ "TheSpace": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 35,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 31,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 18,
+ "line": 31,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 10,
+ "line": 31,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "ts-namespace-decl",
+ },
+ ],
+ "type": "const",
+ },
+ "foo": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 28,
+ "line": 22,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 22,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 7,
+ "line": 22,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 22,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 42,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 42,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "Error": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 19,
+ "line": 17,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 14,
+ "line": 17,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ "any": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 14,
+ "line": 22,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 11,
+ "line": 22,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ "window": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 7,
+ "line": 25,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 1,
+ "line": 25,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 7,
+ "line": 28,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 1,
+ "line": 28,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 42,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings in a typescript-jsx file: getScopes finds scope bindings in a typescript-jsx file at line 33 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "arguments": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "fn",
+ "end": Object {
+ "column": 3,
+ "line": 34,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 2,
+ "line": 32,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "function",
+ },
+ Object {
+ "bindings": Object {
+ "fn": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 3,
+ "line": 34,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 32,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 13,
+ "line": 32,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 11,
+ "line": 32,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ ],
+ "type": "let",
+ },
+ },
+ "displayName": "TypeScript Namespace",
+ "end": Object {
+ "column": 1,
+ "line": 35,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 19,
+ "line": 31,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "Color": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 8,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 10,
+ "line": 3,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 5,
+ "line": 3,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "ts-enum-decl",
+ },
+ ],
+ "type": "const",
+ },
+ "Example": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 19,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 10,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 13,
+ "line": 10,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 10,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "class-decl",
+ },
+ Object {
+ "end": Object {
+ "column": 16,
+ "line": 41,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 9,
+ "line": 41,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "let",
+ },
+ "TheSpace": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 35,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 31,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 18,
+ "line": 31,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 10,
+ "line": 31,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "ts-namespace-decl",
+ },
+ ],
+ "type": "const",
+ },
+ "foo": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 28,
+ "line": 22,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 22,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 7,
+ "line": 22,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 22,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 42,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 42,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "Error": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 19,
+ "line": 17,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 14,
+ "line": 17,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ "any": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 14,
+ "line": 22,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 11,
+ "line": 22,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ "window": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 7,
+ "line": 25,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 1,
+ "line": 25,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 7,
+ "line": 28,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 1,
+ "line": 28,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 42,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings in a vue file: getScopes finds scope bindings in a vue file at line 14 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "arguments": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "fnVar": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 18,
+ "line": 13,
+ "sourceId": "scopes/vue-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 13,
+ "sourceId": "scopes/vue-sample/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 13,
+ "line": 13,
+ "sourceId": "scopes/vue-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 8,
+ "line": 13,
+ "sourceId": "scopes/vue-sample/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "data",
+ "end": Object {
+ "column": 3,
+ "line": 18,
+ "sourceId": "scopes/vue-sample/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 2,
+ "line": 12,
+ "sourceId": "scopes/vue-sample/originalSource-1",
+ },
+ "type": "function",
+ },
+ Object {
+ "bindings": Object {
+ "moduleVar": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 23,
+ "line": 8,
+ "sourceId": "scopes/vue-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 8,
+ "sourceId": "scopes/vue-sample/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 13,
+ "line": 8,
+ "sourceId": "scopes/vue-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 8,
+ "sourceId": "scopes/vue-sample/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 1,
+ "line": 27,
+ "sourceId": "scopes/vue-sample/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/vue-sample/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 1,
+ "line": 27,
+ "sourceId": "scopes/vue-sample/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/vue-sample/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Global",
+ "end": Object {
+ "column": 1,
+ "line": 27,
+ "sourceId": "scopes/vue-sample/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/vue-sample/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings in fn body with both lex and non-lex items: getScopes finds scope bindings in fn body with both lex and non-lex items at line 4 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "lex": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 10,
+ "line": 3,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 3,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 9,
+ "line": 3,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 3,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "type": "let",
+ },
+ ],
+ "type": "let",
+ },
+ },
+ "displayName": "Function Body",
+ "end": Object {
+ "column": 1,
+ "line": 5,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 14,
+ "line": 1,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "arguments": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "nonlex": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 13,
+ "line": 2,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 2,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 12,
+ "line": 2,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 2,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "fn",
+ "end": Object {
+ "column": 1,
+ "line": 5,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "type": "function",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 24,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "fn": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 5,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 11,
+ "line": 1,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 1,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ ],
+ "type": "var",
+ },
+ "fn2": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 11,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 7,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 12,
+ "line": 7,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 7,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ ],
+ "type": "var",
+ },
+ "fn3": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 17,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 13,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 12,
+ "line": 13,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 13,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ ],
+ "type": "var",
+ },
+ "fn4": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 23,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 19,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 12,
+ "line": 19,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 19,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 24,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings in fn body with both lex and non-lex items: getScopes finds scope bindings in fn body with both lex and non-lex items at line 10 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "lex": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 10,
+ "line": 9,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 9,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 9,
+ "line": 9,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 9,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "type": "let",
+ },
+ ],
+ "type": "let",
+ },
+ },
+ "displayName": "Function Body",
+ "end": Object {
+ "column": 1,
+ "line": 11,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 15,
+ "line": 7,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "arguments": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "nonlex": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 21,
+ "line": 8,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 8,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 17,
+ "line": 8,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 11,
+ "line": 8,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "fn2",
+ "end": Object {
+ "column": 1,
+ "line": 11,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 7,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "type": "function",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 24,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "fn": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 5,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 11,
+ "line": 1,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 1,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ ],
+ "type": "var",
+ },
+ "fn2": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 11,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 7,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 12,
+ "line": 7,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 7,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ ],
+ "type": "var",
+ },
+ "fn3": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 17,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 13,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 12,
+ "line": 13,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 13,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ ],
+ "type": "var",
+ },
+ "fn4": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 23,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 19,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 12,
+ "line": 19,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 19,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 24,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings in fn body with both lex and non-lex items: getScopes finds scope bindings in fn body with both lex and non-lex items at line 16 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "Thing": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 16,
+ "line": 15,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 15,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 13,
+ "line": 15,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 8,
+ "line": 15,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "type": "class-decl",
+ },
+ ],
+ "type": "let",
+ },
+ },
+ "displayName": "Function Body",
+ "end": Object {
+ "column": 1,
+ "line": 17,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 15,
+ "line": 13,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "arguments": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "nonlex": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 13,
+ "line": 14,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 14,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 12,
+ "line": 14,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 14,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "fn3",
+ "end": Object {
+ "column": 1,
+ "line": 17,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 13,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "type": "function",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 24,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "fn": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 5,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 11,
+ "line": 1,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 1,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ ],
+ "type": "var",
+ },
+ "fn2": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 11,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 7,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 12,
+ "line": 7,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 7,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ ],
+ "type": "var",
+ },
+ "fn3": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 17,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 13,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 12,
+ "line": 13,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 13,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ ],
+ "type": "var",
+ },
+ "fn4": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 23,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 19,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 12,
+ "line": 19,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 19,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 24,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings in fn body with both lex and non-lex items: getScopes finds scope bindings in fn body with both lex and non-lex items at line 22 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "Thing": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 16,
+ "line": 21,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 21,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 13,
+ "line": 21,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 8,
+ "line": 21,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "type": "class-decl",
+ },
+ ],
+ "type": "let",
+ },
+ },
+ "displayName": "Function Body",
+ "end": Object {
+ "column": 1,
+ "line": 23,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 15,
+ "line": 19,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "arguments": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "nonlex": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 21,
+ "line": 20,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 20,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 17,
+ "line": 20,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 11,
+ "line": 20,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "fn4",
+ "end": Object {
+ "column": 1,
+ "line": 23,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 19,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "type": "function",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 24,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "fn": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 5,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 11,
+ "line": 1,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 1,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ ],
+ "type": "var",
+ },
+ "fn2": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 11,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 7,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 12,
+ "line": 7,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 7,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ ],
+ "type": "var",
+ },
+ "fn3": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 17,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 13,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 12,
+ "line": 13,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 13,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ ],
+ "type": "var",
+ },
+ "fn4": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 23,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 19,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 12,
+ "line": 19,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 19,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 24,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings with expression metadata: getScopes finds scope bindings with expression metadata at line 2 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "foo": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 15,
+ "line": 1,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 9,
+ "line": 1,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 1,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "type": "const",
+ },
+ Object {
+ "end": Object {
+ "column": 3,
+ "line": 3,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 7,
+ "line": 3,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "parent": Object {
+ "end": Object {
+ "column": 9,
+ "line": 3,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "parent": Object {
+ "end": Object {
+ "column": 13,
+ "line": 3,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "parent": null,
+ "property": "baz",
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "type": "call",
+ },
+ "property": "bar",
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 7,
+ "line": 4,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 11,
+ "line": 4,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "parent": Object {
+ "end": Object {
+ "column": 12,
+ "line": 4,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "parent": Object {
+ "end": Object {
+ "column": 14,
+ "line": 4,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "parent": Object {
+ "end": Object {
+ "column": 18,
+ "line": 4,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "parent": null,
+ "property": "baz",
+ "start": Object {
+ "column": 0,
+ "line": 4,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 4,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "type": "call",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 4,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "type": "inherit",
+ },
+ "property": "bar",
+ "start": Object {
+ "column": 4,
+ "line": 4,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 4,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 10,
+ "line": 5,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 14,
+ "line": 5,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "parent": Object {
+ "end": Object {
+ "column": 15,
+ "line": 5,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "parent": Object {
+ "end": Object {
+ "column": 17,
+ "line": 5,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "parent": Object {
+ "end": Object {
+ "column": 21,
+ "line": 5,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "parent": null,
+ "property": "baz",
+ "start": Object {
+ "column": 0,
+ "line": 5,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 5,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "type": "call",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 5,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "type": "inherit",
+ },
+ "property": "bar",
+ "start": Object {
+ "column": 7,
+ "line": 5,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 7,
+ "line": 5,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 25,
+ "line": 6,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 29,
+ "line": 6,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "parent": Object {
+ "end": Object {
+ "column": 30,
+ "line": 6,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "parent": Object {
+ "end": Object {
+ "column": 32,
+ "line": 6,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "parent": Object {
+ "end": Object {
+ "column": 36,
+ "line": 6,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "parent": null,
+ "property": "baz",
+ "start": Object {
+ "column": 0,
+ "line": 6,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 6,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "type": "call",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 6,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "type": "inherit",
+ },
+ "property": "bar",
+ "start": Object {
+ "column": 22,
+ "line": 6,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 22,
+ "line": 6,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "const",
+ },
+ },
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 7,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "Object": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 6,
+ "line": 5,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 0,
+ "line": 5,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ "__webpack_require__": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 19,
+ "line": 6,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 21,
+ "line": 6,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "parent": null,
+ "property": "i",
+ "start": Object {
+ "column": 0,
+ "line": 6,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 6,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 7,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings with proper types: getScopes finds scope bindings with proper types at line 5 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "aConst": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 18,
+ "line": 15,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 15,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 12,
+ "line": 15,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 15,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "const",
+ },
+ ],
+ "type": "const",
+ },
+ "aLet": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 9,
+ "line": 14,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 14,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 8,
+ "line": 14,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 14,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "let",
+ },
+ ],
+ "type": "let",
+ },
+ "aVar": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 9,
+ "line": 13,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 13,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 8,
+ "line": 13,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 13,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "cls": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 11,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 7,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 9,
+ "line": 7,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 7,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "class-decl",
+ },
+ ],
+ "type": "let",
+ },
+ "def": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 19,
+ "line": 1,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 10,
+ "line": 1,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "importName": "default",
+ "start": Object {
+ "column": 7,
+ "line": 1,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "import-decl",
+ },
+ ],
+ "type": "import",
+ },
+ "fn": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 16,
+ "line": 6,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 6,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 11,
+ "line": 6,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 6,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ ],
+ "type": "var",
+ },
+ "named": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 25,
+ "line": 2,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 2,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 14,
+ "line": 2,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "importName": "named",
+ "start": Object {
+ "column": 9,
+ "line": 2,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "import-decl",
+ },
+ ],
+ "type": "import",
+ },
+ "namespace": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 30,
+ "line": 4,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 4,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 21,
+ "line": 4,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 12,
+ "line": 4,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "import-ns-decl",
+ },
+ ],
+ "type": "const",
+ },
+ "otherNamed": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 39,
+ "line": 3,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 28,
+ "line": 3,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "importName": "thing",
+ "start": Object {
+ "column": 18,
+ "line": 3,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "import-decl",
+ },
+ ],
+ "type": "import",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 25,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 25,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 25,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings with proper types: getScopes finds scope bindings with proper types at line 9 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "arguments": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "method",
+ "end": Object {
+ "column": 3,
+ "line": 10,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 2,
+ "line": 8,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "function",
+ },
+ Object {
+ "bindings": Object {
+ "cls": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 11,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 7,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 9,
+ "line": 7,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 7,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "class-inner",
+ },
+ ],
+ "type": "const",
+ },
+ },
+ "displayName": "Class",
+ "end": Object {
+ "column": 1,
+ "line": 11,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 7,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "aConst": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 18,
+ "line": 15,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 15,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 12,
+ "line": 15,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 15,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "const",
+ },
+ ],
+ "type": "const",
+ },
+ "aLet": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 9,
+ "line": 14,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 14,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 8,
+ "line": 14,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 14,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "let",
+ },
+ ],
+ "type": "let",
+ },
+ "aVar": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 9,
+ "line": 13,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 13,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 8,
+ "line": 13,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 13,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "cls": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 11,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 7,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 9,
+ "line": 7,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 7,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "class-decl",
+ },
+ ],
+ "type": "let",
+ },
+ "def": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 19,
+ "line": 1,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 10,
+ "line": 1,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "importName": "default",
+ "start": Object {
+ "column": 7,
+ "line": 1,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "import-decl",
+ },
+ ],
+ "type": "import",
+ },
+ "fn": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 16,
+ "line": 6,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 6,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 11,
+ "line": 6,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 6,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ ],
+ "type": "var",
+ },
+ "named": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 25,
+ "line": 2,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 2,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 14,
+ "line": 2,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "importName": "named",
+ "start": Object {
+ "column": 9,
+ "line": 2,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "import-decl",
+ },
+ ],
+ "type": "import",
+ },
+ "namespace": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 30,
+ "line": 4,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 4,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 21,
+ "line": 4,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 12,
+ "line": 4,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "import-ns-decl",
+ },
+ ],
+ "type": "const",
+ },
+ "otherNamed": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 39,
+ "line": 3,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 28,
+ "line": 3,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "importName": "thing",
+ "start": Object {
+ "column": 18,
+ "line": 3,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "import-decl",
+ },
+ ],
+ "type": "import",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 25,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 25,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 25,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings with proper types: getScopes finds scope bindings with proper types at line 18 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "arguments": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 11,
+ "line": 19,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 2,
+ "line": 19,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "implicit",
+ },
+ "this": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 6,
+ "line": 18,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 2,
+ "line": 18,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "implicit",
+ },
+ },
+ "displayName": "inner",
+ "end": Object {
+ "column": 1,
+ "line": 20,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 1,
+ "line": 17,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "function",
+ },
+ Object {
+ "bindings": Object {
+ "inner": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 20,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 1,
+ "line": 17,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 15,
+ "line": 17,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 10,
+ "line": 17,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "fn-expr",
+ },
+ ],
+ "type": "const",
+ },
+ },
+ "displayName": "Function Expression",
+ "end": Object {
+ "column": 1,
+ "line": 20,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 1,
+ "line": 17,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "aConst": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 18,
+ "line": 15,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 15,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 12,
+ "line": 15,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 15,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "const",
+ },
+ ],
+ "type": "const",
+ },
+ "aLet": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 9,
+ "line": 14,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 14,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 8,
+ "line": 14,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 14,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "let",
+ },
+ ],
+ "type": "let",
+ },
+ "aVar": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 9,
+ "line": 13,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 13,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 8,
+ "line": 13,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 13,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "cls": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 11,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 7,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 9,
+ "line": 7,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 7,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "class-decl",
+ },
+ ],
+ "type": "let",
+ },
+ "def": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 19,
+ "line": 1,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 10,
+ "line": 1,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "importName": "default",
+ "start": Object {
+ "column": 7,
+ "line": 1,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "import-decl",
+ },
+ ],
+ "type": "import",
+ },
+ "fn": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 16,
+ "line": 6,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 6,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 11,
+ "line": 6,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 6,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ ],
+ "type": "var",
+ },
+ "named": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 25,
+ "line": 2,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 2,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 14,
+ "line": 2,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "importName": "named",
+ "start": Object {
+ "column": 9,
+ "line": 2,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "import-decl",
+ },
+ ],
+ "type": "import",
+ },
+ "namespace": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 30,
+ "line": 4,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 4,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 21,
+ "line": 4,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 12,
+ "line": 4,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "import-ns-decl",
+ },
+ ],
+ "type": "const",
+ },
+ "otherNamed": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 39,
+ "line": 3,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 28,
+ "line": 3,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "importName": "thing",
+ "start": Object {
+ "column": 18,
+ "line": 3,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "import-decl",
+ },
+ ],
+ "type": "import",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 25,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 25,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 25,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings with proper types: getScopes finds scope bindings with proper types at line 23 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "blockFn": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 22,
+ "line": 23,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 23,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 18,
+ "line": 23,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 11,
+ "line": 23,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ ],
+ "type": "let",
+ },
+ },
+ "displayName": "Block",
+ "end": Object {
+ "column": 1,
+ "line": 24,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 22,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "aConst": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 18,
+ "line": 15,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 15,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 12,
+ "line": 15,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 15,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "const",
+ },
+ ],
+ "type": "const",
+ },
+ "aLet": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 9,
+ "line": 14,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 14,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 8,
+ "line": 14,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 14,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "let",
+ },
+ ],
+ "type": "let",
+ },
+ "aVar": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 9,
+ "line": 13,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 13,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 8,
+ "line": 13,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 13,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "cls": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 11,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 7,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 9,
+ "line": 7,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 7,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "class-decl",
+ },
+ ],
+ "type": "let",
+ },
+ "def": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 19,
+ "line": 1,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 10,
+ "line": 1,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "importName": "default",
+ "start": Object {
+ "column": 7,
+ "line": 1,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "import-decl",
+ },
+ ],
+ "type": "import",
+ },
+ "fn": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 16,
+ "line": 6,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 6,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 11,
+ "line": 6,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 6,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ ],
+ "type": "var",
+ },
+ "named": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 25,
+ "line": 2,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 2,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 14,
+ "line": 2,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "importName": "named",
+ "start": Object {
+ "column": 9,
+ "line": 2,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "import-decl",
+ },
+ ],
+ "type": "import",
+ },
+ "namespace": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 30,
+ "line": 4,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 4,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 21,
+ "line": 4,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 12,
+ "line": 4,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "import-ns-decl",
+ },
+ ],
+ "type": "const",
+ },
+ "otherNamed": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 39,
+ "line": 3,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 28,
+ "line": 3,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "importName": "thing",
+ "start": Object {
+ "column": 18,
+ "line": 3,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "import-decl",
+ },
+ ],
+ "type": "import",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 25,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 25,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 25,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
diff --git a/devtools/client/debugger/src/workers/parser/tests/__snapshots__/getSymbols.spec.js.snap b/devtools/client/debugger/src/workers/parser/tests/__snapshots__/getSymbols.spec.js.snap
new file mode 100644
index 0000000000..d1fd35376d
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/__snapshots__/getSymbols.spec.js.snap
@@ -0,0 +1,169 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`Parser.getSymbols allSymbols 1`] = `
+"hasJsx: false
+
+hasTypes: false
+
+framework: null"
+`;
+
+exports[`Parser.getSymbols call expression 1`] = `
+"hasJsx: false
+
+hasTypes: false
+
+framework: null"
+`;
+
+exports[`Parser.getSymbols call sites 1`] = `
+"hasJsx: false
+
+hasTypes: false
+
+framework: null"
+`;
+
+exports[`Parser.getSymbols class 1`] = `
+"hasJsx: false
+
+hasTypes: false
+
+framework: null"
+`;
+
+exports[`Parser.getSymbols component 1`] = `
+"hasJsx: true
+
+hasTypes: false
+
+framework: null"
+`;
+
+exports[`Parser.getSymbols destruct 1`] = `
+"hasJsx: false
+
+hasTypes: false
+
+framework: null"
+`;
+
+exports[`Parser.getSymbols es6 1`] = `
+"hasJsx: false
+
+hasTypes: false
+
+framework: null"
+`;
+
+exports[`Parser.getSymbols expression 1`] = `
+"hasJsx: false
+
+hasTypes: false
+
+framework: null"
+`;
+
+exports[`Parser.getSymbols finds symbols in an html file 1`] = `
+"hasJsx: false
+
+hasTypes: false
+
+framework: null"
+`;
+
+exports[`Parser.getSymbols flow 1`] = `
+"hasJsx: false
+
+hasTypes: true
+
+framework: null"
+`;
+
+exports[`Parser.getSymbols func 1`] = `
+"hasJsx: false
+
+hasTypes: false
+
+framework: null"
+`;
+
+exports[`Parser.getSymbols function names 1`] = `
+"hasJsx: false
+
+hasTypes: false
+
+framework: null"
+`;
+
+exports[`Parser.getSymbols jsx 1`] = `
+"hasJsx: true
+
+hasTypes: false
+
+framework: null"
+`;
+
+exports[`Parser.getSymbols math 1`] = `
+"hasJsx: false
+
+hasTypes: false
+
+framework: null"
+`;
+
+exports[`Parser.getSymbols object expressions 1`] = `
+"hasJsx: false
+
+hasTypes: false
+
+framework: null"
+`;
+
+exports[`Parser.getSymbols optional chaining 1`] = `
+"hasJsx: false
+
+hasTypes: false
+
+framework: null"
+`;
+
+exports[`Parser.getSymbols private fields 1`] = `
+"hasJsx: false
+
+hasTypes: false
+
+framework: null"
+`;
+
+exports[`Parser.getSymbols proto 1`] = `
+"hasJsx: false
+
+hasTypes: false
+
+framework: null"
+`;
+
+exports[`Parser.getSymbols react component 1`] = `
+"hasJsx: false
+
+hasTypes: false
+
+framework: React"
+`;
+
+exports[`Parser.getSymbols regexp 1`] = `
+"hasJsx: false
+
+hasTypes: false
+
+framework: null"
+`;
+
+exports[`Parser.getSymbols var 1`] = `
+"hasJsx: false
+
+hasTypes: false
+
+framework: null"
+`;
diff --git a/devtools/client/debugger/src/workers/parser/tests/__snapshots__/validate.spec.js.snap b/devtools/client/debugger/src/workers/parser/tests/__snapshots__/validate.spec.js.snap
new file mode 100644
index 0000000000..a341538a5d
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/__snapshots__/validate.spec.js.snap
@@ -0,0 +1,3 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`has syntax error should return the error object for the invalid expression 1`] = `"SyntaxError : Missing semicolon. (1:3)"`;
diff --git a/devtools/client/debugger/src/workers/parser/tests/contains.spec.js b/devtools/client/debugger/src/workers/parser/tests/contains.spec.js
new file mode 100644
index 0000000000..741f1a29fc
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/contains.spec.js
@@ -0,0 +1,250 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { containsPosition, containsLocation } from "../utils/contains";
+
+function getTestLoc() {
+ return {
+ start: {
+ line: 10,
+ column: 2,
+ },
+ end: {
+ line: 12,
+ column: 10,
+ },
+ };
+}
+
+// AstPosition.column is typed as a number, but many parts of this test set it
+// to undefined. Using zero instead causes test failures, and allowing it to be
+// undefined causes many flow errors in code manipulating AstPosition.
+// Fake a coercion of undefined to number as a workaround for now.
+function undefinedColumn() {
+ return undefined;
+}
+
+function startPos(lineOffset, columnOffset) {
+ const { start } = getTestLoc();
+ return {
+ line: start.line + lineOffset,
+ column: start.column + columnOffset,
+ };
+}
+
+function endPos(lineOffset, columnOffset) {
+ const { end } = getTestLoc();
+ return {
+ line: end.line + lineOffset,
+ column: end.column + columnOffset,
+ };
+}
+
+function startLine(lineOffset = 0) {
+ const { start } = getTestLoc();
+ return {
+ line: start.line + lineOffset,
+ column: undefinedColumn(),
+ };
+}
+
+function endLine(lineOffset = 0) {
+ const { end } = getTestLoc();
+ return {
+ line: end.line + lineOffset,
+ column: undefinedColumn(),
+ };
+}
+
+function testContains(pos, bool) {
+ const loc = getTestLoc();
+ expect(containsPosition(loc, pos)).toEqual(bool);
+}
+
+describe("containsPosition", () => {
+ describe("location and postion both with the column criteria", () => {
+ /* eslint-disable jest/expect-expect */
+ it("should contain position within the location range", () =>
+ testContains(startPos(1, 1), true));
+
+ it("should not contain position out of the start line", () =>
+ testContains(startPos(-1, 0), false));
+
+ it("should not contain position out of the start column", () =>
+ testContains(startPos(0, -1), false));
+
+ it(`should contain position on the same start line and
+ within the start column`, () => testContains(startPos(0, 1), true));
+
+ it("should not contain position out of the end line", () =>
+ testContains(endPos(1, 0), false));
+
+ it("should not contain position out of the end column", () =>
+ testContains(endPos(0, 1), false));
+
+ // eslint-disable-next-line max-len
+ it("should contain position on the same end line and within the end column", () =>
+ testContains(endPos(0, -1), true));
+ /* eslint-enable jest/expect-expect */
+ });
+
+ describe("position without the column criterion", () => {
+ /* eslint-disable jest/expect-expect */
+ it("should contain position on the same start line", () =>
+ testContains(startLine(0), true));
+
+ it("should contain position on the same end line", () =>
+ testContains(endLine(0), true));
+ /* eslint-enable jest/expect-expect */
+ });
+
+ describe("location without the column criterion", () => {
+ it("should contain position on the same start line", () => {
+ const loc = getTestLoc();
+ loc.start.column = undefinedColumn();
+ const pos = {
+ line: loc.start.line,
+ column: 1,
+ };
+ expect(containsPosition(loc, pos)).toEqual(true);
+ });
+
+ it("should contain position on the same end line", () => {
+ const loc = getTestLoc();
+ loc.end.column = undefinedColumn();
+ const pos = {
+ line: loc.end.line,
+ column: 1,
+ };
+ expect(containsPosition(loc, pos)).toEqual(true);
+ });
+ });
+
+ describe("location and postion both without the column criterion", () => {
+ it("should contain position on the same start line", () => {
+ const loc = getTestLoc();
+ loc.start.column = undefinedColumn();
+ const pos = startLine();
+ expect(containsPosition(loc, pos)).toEqual(true);
+ });
+
+ it("should contain position on the same end line", () => {
+ const loc = getTestLoc();
+ loc.end.column = undefinedColumn();
+ const pos = endLine();
+ expect(containsPosition(loc, pos)).toEqual(true);
+ });
+ });
+});
+
+describe("containsLocation", () => {
+ describe("locations both with the column criteria", () => {
+ it("should contian location within the range", () => {
+ const locA = getTestLoc();
+ const locB = {
+ start: startPos(1, 1),
+ end: endPos(-1, -1),
+ };
+ expect(containsLocation(locA, locB)).toEqual(true);
+ });
+
+ it("should not contian location out of the start line", () => {
+ const locA = getTestLoc();
+ const locB = getTestLoc();
+ locB.start.line--;
+ expect(containsLocation(locA, locB)).toEqual(false);
+ });
+
+ it("should not contian location out of the start column", () => {
+ const locA = getTestLoc();
+ const locB = getTestLoc();
+ locB.start.column--;
+ expect(containsLocation(locA, locB)).toEqual(false);
+ });
+
+ it("should not contian location out of the end line", () => {
+ const locA = getTestLoc();
+ const locB = getTestLoc();
+ locB.end.line++;
+ expect(containsLocation(locA, locB)).toEqual(false);
+ });
+
+ it("should not contian location out of the end column", () => {
+ const locA = getTestLoc();
+ const locB = getTestLoc();
+ locB.end.column++;
+ expect(containsLocation(locA, locB)).toEqual(false);
+ });
+
+ it(`should contain location on the same start line and
+ within the start column`, () => {
+ const locA = getTestLoc();
+ const locB = {
+ start: startPos(0, 1),
+ end: endPos(-1, -1),
+ };
+ expect(containsLocation(locA, locB)).toEqual(true);
+ });
+
+ it(`should contain location on the same end line and
+ within the end column`, () => {
+ const locA = getTestLoc();
+ const locB = {
+ start: startPos(1, 1),
+ end: endPos(0, -1),
+ };
+ expect(containsLocation(locA, locB)).toEqual(true);
+ });
+ });
+
+ describe("location A without the column criterion", () => {
+ it("should contain location on the same start line", () => {
+ const locA = getTestLoc();
+ locA.start.column = undefinedColumn();
+ const locB = getTestLoc();
+ expect(containsLocation(locA, locB)).toEqual(true);
+ });
+
+ it("should contain location on the same end line", () => {
+ const locA = getTestLoc();
+ locA.end.column = undefinedColumn();
+ const locB = getTestLoc();
+ expect(containsLocation(locA, locB)).toEqual(true);
+ });
+ });
+
+ describe("location B without the column criterion", () => {
+ it("should contain location on the same start line", () => {
+ const locA = getTestLoc();
+ const locB = getTestLoc();
+ locB.start.column = undefinedColumn();
+ expect(containsLocation(locA, locB)).toEqual(true);
+ });
+
+ it("should contain location on the same end line", () => {
+ const locA = getTestLoc();
+ const locB = getTestLoc();
+ locB.end.column = undefinedColumn();
+ expect(containsLocation(locA, locB)).toEqual(true);
+ });
+ });
+
+ describe("locations both without the column criteria", () => {
+ it("should contain location on the same start line", () => {
+ const locA = getTestLoc();
+ const locB = getTestLoc();
+ locA.start.column = undefinedColumn();
+ locB.start.column = undefinedColumn();
+ expect(containsLocation(locA, locB)).toEqual(true);
+ });
+
+ it("should contain location on the same end line", () => {
+ const locA = getTestLoc();
+ const locB = getTestLoc();
+ locA.end.column = undefinedColumn();
+ locB.end.column = undefinedColumn();
+ expect(containsLocation(locA, locB)).toEqual(true);
+ });
+ });
+});
diff --git a/devtools/client/debugger/src/workers/parser/tests/findOutOfScopeLocations.spec.js b/devtools/client/debugger/src/workers/parser/tests/findOutOfScopeLocations.spec.js
new file mode 100644
index 0000000000..a2177c22eb
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/findOutOfScopeLocations.spec.js
@@ -0,0 +1,80 @@
+/* eslint max-nested-callbacks: ["error", 4]*/
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import findOutOfScopeLocations from "../findOutOfScopeLocations";
+
+import { populateSource } from "./helpers";
+
+function formatLines(actual) {
+ return actual
+ .map(
+ ({ start, end }) =>
+ `(${start.line}, ${start.column}) -> (${end.line}, ${end.column})`
+ )
+ .join("\n");
+}
+
+describe("Parser.findOutOfScopeLocations", () => {
+ it("should exclude non-enclosing function blocks", () => {
+ const source = populateSource("outOfScope");
+ const actual = findOutOfScopeLocations({
+ source,
+ line: 5,
+ column: 5,
+ });
+
+ expect(formatLines(actual)).toMatchSnapshot();
+ });
+
+ it("should roll up function blocks", () => {
+ const source = populateSource("outOfScope");
+ const actual = findOutOfScopeLocations({
+ source,
+ line: 24,
+ column: 0,
+ });
+
+ expect(formatLines(actual)).toMatchSnapshot();
+ });
+
+ it("should exclude function for locations on declaration", () => {
+ const source = populateSource("outOfScope");
+ const actual = findOutOfScopeLocations({
+ source,
+ line: 3,
+ column: 12,
+ });
+
+ expect(formatLines(actual)).toMatchSnapshot();
+ });
+
+ it("should treat comments as out of scope", () => {
+ const source = populateSource("outOfScopeComment");
+ const actual = findOutOfScopeLocations({
+ source,
+ line: 3,
+ column: 2,
+ });
+
+ expect(actual.length).toBe(1);
+
+ const location = actual[0];
+ expect(location.start.line).toBe(1);
+ expect(location.start.column).toBe(0);
+
+ expect(location.end.line).toBe(1);
+ expect(location.end.column).toBe(15);
+ });
+
+ it("should not exclude in-scope inner locations", () => {
+ const source = populateSource("outOfScope");
+ const actual = findOutOfScopeLocations({
+ source,
+ line: 61,
+ column: 0,
+ });
+ expect(formatLines(actual)).toMatchSnapshot();
+ });
+});
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/allSymbols.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/allSymbols.js
new file mode 100644
index 0000000000..bebda9f36a
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/allSymbols.js
@@ -0,0 +1,33 @@
+const TIME = 60;
+let count = 0;
+
+function incrementCounter(counter) {
+ return counter++;
+}
+
+const sum = (a, b) => a + b;
+
+const Obj = {
+ foo: 1,
+ doThing() {
+ console.log("hey");
+ },
+ doOtherThing: function() {
+ return 42;
+ }
+};
+
+Obj.property = () => {};
+Obj.otherProperty = 1;
+
+class Ultra {
+ constructor() {
+ this.awesome = true;
+ }
+
+ beAwesome(person) {
+ console.log(`${person} is Awesome!`);
+ }
+}
+
+this.props.history.push(`/dacs/${this.props.dac.id}`);
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/async.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/async.js
new file mode 100644
index 0000000000..43216be635
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/async.js
@@ -0,0 +1,10 @@
+async function foo() {
+ return new Promise(resolve => {
+ setTimeout(resolve, 10);
+ });
+}
+
+async function stuff() {
+ await foo(1);
+ await foo(2);
+}
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/call-sites.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/call-sites.js
new file mode 100644
index 0000000000..aa73700d93
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/call-sites.js
@@ -0,0 +1,4 @@
+aaa(bbb(), ccc());
+dddd()
+ .eee()
+ .ffff();
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/callExpressions.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/callExpressions.js
new file mode 100644
index 0000000000..2771dede6a
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/callExpressions.js
@@ -0,0 +1,7 @@
+dispatch({ d });
+function evaluate(script, { frameId } = {frameId: 3}, {c} = {c: 2}) {}
+
+a(b(c()));
+
+a.b().c();
+a.b.c.d();
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/calls.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/calls.js
new file mode 100644
index 0000000000..f05d445db7
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/calls.js
@@ -0,0 +1,21 @@
+foo(1, '2', bar())
+
+foo()
+ .bar()
+ .bazz()
+
+console.log('yo')
+
+foo(
+ 1,
+ bar()
+)
+
+var a = 3;
+
+// set a step point at the first call expression in step expressions
+var x = { a: a(), b: b(), c: c() };
+var b = [ foo() ];
+[ a(), b(), c() ];
+(1, a(), b());
+x(1, a(), b());
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/class.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/class.js
new file mode 100644
index 0000000000..59d612ebfe
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/class.js
@@ -0,0 +1,28 @@
+class Test {
+ publicProperty;
+ #privateProperty = "default";
+ static myStatic = "static";
+ static hello() {
+ return "Hello " + this.myStatic
+ }
+ static {
+ const x = this.myStatic;
+ }
+
+ constructor() {
+ this.publicProperty = "foo";
+ this.#privateProperty = "bar";
+ }
+
+ bar(a) {
+ console.log("bar", a);
+ }
+
+ baz = b => {
+ return b * 2;
+ };
+}
+
+class Test2 {}
+
+let expressiveClass = class {};
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/component.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/component.js
new file mode 100644
index 0000000000..38d9b00096
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/component.js
@@ -0,0 +1,84 @@
+/*
+ * class
+ */
+
+class Punny extends Component {
+ constructor(props) {
+ super();
+ this.onClick = this.onClick.bind(this);
+ }
+
+ componentDidMount() {}
+
+ onClick() {}
+
+ renderMe() {
+ return <div onClick={this.onClick} />;
+ }
+
+ render() {}
+}
+
+/*
+ * CALL EXPRESSIONS - createClass, extend
+ */
+
+const TodoView = Backbone.View.extend({
+ tagName: "li",
+
+ render: function() {
+ console.log("yo");
+ }
+});
+
+const TodoClass = createClass({
+ tagName: "li",
+
+ render: function() {
+ console.log("yo");
+ }
+});
+
+TodoClass = createClass({
+ tagName: "li",
+
+ render: function() {
+ console.log("yo");
+ }
+});
+
+app.TodoClass = createClass({
+ tagName: "li",
+
+ render: function() {
+ console.log("yo");
+ }
+});
+
+/*
+ * PROTOTYPE
+ */
+
+function Button() {
+ if (!(this instanceof Button)) return new Button();
+ this.color = null;
+ Nanocomponent.call(this);
+}
+
+Button.prototype = Object.create(Nanocomponent.prototype);
+
+var x = function() {};
+
+Button.prototype.createElement = function(color) {
+ this.color = color;
+ return html`
+ <button style="background-color: ${color}">
+ Click Me
+ </button>
+ `;
+};
+
+// Implement conditional rendering
+Button.prototype.update = function(newColor) {
+ return newColor !== this.color;
+};
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/computed-props.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/computed-props.js
new file mode 100644
index 0000000000..4c0f182f33
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/computed-props.js
@@ -0,0 +1,8 @@
+(function(key) {
+ let obj = {
+ b: 5
+ };
+ obj[key] = 0;
+ const c = obj.b;
+ return obj;
+})("a");
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/control-flow.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/control-flow.js
new file mode 100644
index 0000000000..b9e859ff74
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/control-flow.js
@@ -0,0 +1,39 @@
+
+if (x) {
+ foo();
+}
+else if (y) {
+ foo();
+}
+else {
+ foo();
+}
+
+for (var i=0; i< 5; i++ ) {
+ foo();
+}
+
+while (x) {
+ foo();
+}
+
+switch (c) {
+ case a:
+ console.log('hi')
+}
+
+var a = 3;
+
+for (const val of [1, 2]) {
+ console.log("pause again", val);
+}
+
+for (const val of vals) {
+ console.log("pause again", val);
+}
+
+try {
+} catch (e) {
+}
+
+with (e) {}
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/decorators.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/decorators.js
new file mode 100644
index 0000000000..22c0a1398d
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/decorators.js
@@ -0,0 +1,2 @@
+@annotation
+class MyClass { }
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/destructuring.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/destructuring.js
new file mode 100644
index 0000000000..52686e6573
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/destructuring.js
@@ -0,0 +1,16 @@
+const { b, resty } = compute(stuff);
+const { first: f, last: l } = obj;
+
+const [a, ...rest] = compute(stuff);
+const [x] = ["a"];
+
+for (const [index, element] of arr.entries()) {
+ console.log(index, element);
+}
+
+const { a: aa = 10, b: bb = 5 } = { a: 3 };
+const { temp: [{ foo: foooo }] } = obj;
+
+let { [key]: foo } = { z: "bar" };
+
+let [, prefName] = prefsBlueprint[accessorName];
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/es6.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/es6.js
new file mode 100644
index 0000000000..90b53141f4
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/es6.js
@@ -0,0 +1 @@
+dispatch({ ...action, [PROMISE]: promise });
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/expression.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/expression.js
new file mode 100644
index 0000000000..fa80b68add
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/expression.js
@@ -0,0 +1,25 @@
+const obj = { a: { b: 2 } }; // e.g. obj.a.b
+const foo = obj2.c.secondProperty; // e.g. foo.obj2.c.secondProperty
+
+// computed properties
+const com = { [a]: { b: "c", [d]: "e" }, [b]: 3 }; // e.g. com[a].b
+const firstAuthor = collection.books[1].author;
+const firstActionDirector = collection.genres["sci-fi"].movies[0].director;
+
+app.TodoView = Backbone.extend({
+ render: function() {}
+});
+
+// assignments
+obj.foo = { a: { b: "c" }, b: 3 }; // e.g. obj.foo.a.b
+com = { a: { b: "c" }, b: 3 }; // e.g. com.a.b
+
+// arrays
+const res = [{ a: 2 }, { b: 3 }]; // e.g. res[1].b
+const res2 = { a: [{ b: 2 }] }; // e.g. res.a[0].b
+const res3 = { a: [{ b: 2 }], b: [{ c: 3 }] }; // e.g. res.a[0].b
+const res4 = [[{ a: 3 }], [{ b: a.b.c.v.d }]]; // e.g. res[1][0].b
+
+function params({ a, b }) {} // e.g. a
+var pars = function({ a, b }) {};
+const evil = obj2.doEvil().c.secondProperty; // e.g. obj2.doEvil or ""
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/flow.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/flow.js
new file mode 100644
index 0000000000..1135bd62a4
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/flow.js
@@ -0,0 +1,5 @@
+class App extends Component {
+ renderHello(name: string, action: ReduxAction, { todos }: Props) {
+ return `howdy ${name}`;
+ }
+}
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/frameworks/angular1FalsePositive.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/frameworks/angular1FalsePositive.js
new file mode 100644
index 0000000000..5220f26c8c
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/frameworks/angular1FalsePositive.js
@@ -0,0 +1,11 @@
+const frameworkStars = {
+ angular: 40779,
+ react: 111576,
+ vue: 114358,
+};
+
+const container = new Container();
+container.module("sum", (...args) => args.reduce((s, c) => s + c, 0));
+
+container.get("sum",
+ (sum) => sum(Object.values(frameworkStars)));
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/frameworks/angular1Module.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/frameworks/angular1Module.js
new file mode 100644
index 0000000000..f0e8c381ef
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/frameworks/angular1Module.js
@@ -0,0 +1,4 @@
+angular.module('something', ['ngRoute', 'ngResource'])
+ .config(function ($routeProvider) {
+ 'use strict';
+ });
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/frameworks/plainJavascript.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/frameworks/plainJavascript.js
new file mode 100644
index 0000000000..41609f8715
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/frameworks/plainJavascript.js
@@ -0,0 +1,8 @@
+"use strict"
+
+const a = 2;
+
+function test(a) {
+ return a;
+}
+
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/frameworks/reactComponent.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/frameworks/reactComponent.js
new file mode 100644
index 0000000000..37f3ac49e5
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/frameworks/reactComponent.js
@@ -0,0 +1,3 @@
+import React, { Component } from "react";
+
+class PrimaryPanes extends Component {}
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/frameworks/reactComponentEs5.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/frameworks/reactComponentEs5.js
new file mode 100644
index 0000000000..a4370b5369
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/frameworks/reactComponentEs5.js
@@ -0,0 +1,3 @@
+var React = require("react");
+
+class PrimaryPanes extends React.Component {}
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/frameworks/reactLibrary.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/frameworks/reactLibrary.js
new file mode 100644
index 0000000000..9ca048e77f
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/frameworks/reactLibrary.js
@@ -0,0 +1,19 @@
+/**
+ * Base class helpers for the updating state of a component.
+ */
+function Component(props, context, updater) {
+ this.props = props;
+ this.context = context;
+ // If a component has string refs, we will assign a different object later.
+ this.refs = emptyObject;
+ // We initialize the default updater but the real one gets injected by the
+ // renderer.
+ this.updater = updater || ReactNoopUpdateQueue;
+}
+
+Component.prototype.isReactComponent = {};
+Component.prototype.setState = function (partialState, callback) {
+ !(typeof partialState === 'object' || typeof partialState === 'function' || partialState == null)
+ ? invariant(false, 'setState(...): takes an object of state variables to update or a function which returns an object of state variables.') : void 0;
+ this.updater.enqueueSetState(this, partialState, callback, 'setState');
+};
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/frameworks/reduxLibrary.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/frameworks/reduxLibrary.js
new file mode 100644
index 0000000000..b86c8fb0cf
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/frameworks/reduxLibrary.js
@@ -0,0 +1,39 @@
+(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
+ typeof define === 'function' && define.amd ? define(['exports'], factory) :
+ (factory((global.Redux = {})));
+ }(this, (function (exports) { 'use strict';
+
+ function symbolObservablePonyfill(root) {
+ var result;
+ var Symbol = root.Symbol;
+
+ if (typeof Symbol === 'function') {
+ if (Symbol.observable) {
+ result = Symbol.observable;
+ } else {
+ result = Symbol('observable');
+ Symbol.observable = result;
+ }
+ } else {
+ result = '@@observable';
+ }
+
+ return result;
+ }
+
+ /* global window */
+
+ var root;
+
+ if (typeof self !== 'undefined') {
+ root = self;
+ } else if (typeof window !== 'undefined') {
+ root = window;
+ } else if (typeof global !== 'undefined') {
+ root = global;
+ } else if (typeof module !== 'undefined') {
+ root = module;
+ } else {
+ root = Function('return this')();
+ } \ No newline at end of file
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/frameworks/vueFileComponent.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/frameworks/vueFileComponent.js
new file mode 100644
index 0000000000..d41e55b72b
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/frameworks/vueFileComponent.js
@@ -0,0 +1,3 @@
+Vue.component('test-item', {
+ template: '<li>This is a test item</li>'
+}) \ No newline at end of file
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/frameworks/vueFileDeclarative.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/frameworks/vueFileDeclarative.js
new file mode 100644
index 0000000000..844fce1451
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/frameworks/vueFileDeclarative.js
@@ -0,0 +1,6 @@
+var app = new Vue({
+ el: '#app',
+ data: {
+ message: 'Hello Vue!'
+ }
+}) \ No newline at end of file
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/func.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/func.js
new file mode 100644
index 0000000000..bb0d4c1b05
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/func.js
@@ -0,0 +1,50 @@
+function square(n) {
+ return n * n;
+}
+
+export function exFoo() {
+ return "yay";
+}
+
+async function slowFoo() {
+ return "meh";
+}
+
+export async function exSlowFoo() {
+ return "yay in a bit";
+}
+
+function ret() {
+ return foo();
+}
+
+child = function() {};
+
+(function() {
+ 2;
+})();
+
+const obj = {
+ foo: function name() {
+ 2 + 2;
+ },
+
+ bar() {
+ 2 + 2;
+ }
+};
+
+export default function root() {
+}
+
+function test(a1, a2 = 45, { a3, a4, a5: { a6: a7 } = {} } = {}) {
+ console.log("pause next here");
+}
+
+() => (x = 4);
+
+function ret2() {
+ return (
+ foo()
+ );
+}
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/functionNames.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/functionNames.js
new file mode 100644
index 0000000000..2ae38fc548
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/functionNames.js
@@ -0,0 +1,50 @@
+/* eslint-disable */
+
+({
+ foo: function() {},
+ "foo": function() {},
+ 42: function() {},
+
+ foo() {},
+ "foo"() {},
+ 42() {},
+});
+
+foo = function() {};
+obj.foo = function() {};
+
+var foo = function(){};
+var [foo = function(){}] = [];
+var {foo = function(){}} = {};
+
+[foo = function(){}] = [];
+({foo = function(){}} = {});
+({bar: foo = function(){}} = {});
+
+function fn([foo = function(){}]){}
+function f2({foo = function(){}} = {}){}
+function f3({bar: foo = function(){}} = {}){}
+
+class Cls {
+ foo = function() {};
+ "foo" = function() {};
+ 42 = function() {};
+
+ foo() {}
+ "foo"() {}
+ 42() {}
+}
+
+(function(){});
+
+export default function (){}
+
+const defaultObj = {a: 1};
+const defaultArr = ['smthng'];
+function a(first, second){}
+function b(first = 'bla', second){}
+function c(first = {}, second){}
+function d(first = [], second){}
+function e(first = defaultObj, second){}
+function f(first = defaultArr, second){}
+function g(first = null, second){}
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/generators.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/generators.js
new file mode 100644
index 0000000000..7c71838827
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/generators.js
@@ -0,0 +1,4 @@
+function* foo() {
+ yield 1;
+ yield 2;
+}
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/jsx.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/jsx.js
new file mode 100644
index 0000000000..c781f7666f
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/jsx.js
@@ -0,0 +1,5 @@
+const jsxElement = <h1> Hi ! I'm here ! </h1>;
+
+<div id="3" res={foo()}>
+ <Item>{foo()}</Item>
+</div>
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/math.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/math.js
new file mode 100644
index 0000000000..508d28ca99
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/math.js
@@ -0,0 +1,15 @@
+function math(n) {
+ function square(n) {
+ // inline comment
+ n * n;
+ }
+
+ // document some lines
+ const two = square(2);
+
+ const four = squaare(4);
+ return two * four;
+}
+
+var child = function() {};
+child2 = function() {};
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/modules.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/modules.js
new file mode 100644
index 0000000000..8ba351497e
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/modules.js
@@ -0,0 +1,10 @@
+import {x} from "y"
+import z from "y";
+
+export class AppComponent {
+ title = 'app'
+}
+
+export default class AppComponent {
+ title = 'app'
+}
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/object-expressions.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/object-expressions.js
new file mode 100644
index 0000000000..b7f4806e04
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/object-expressions.js
@@ -0,0 +1,6 @@
+const y = ({ params });
+const foo = ({ b });
+const bar = { x: 3, y: "434", z: true, a: null, s: c * 2, d : getValue(2) }
+const params = frameId ? { frameActor: frameId } : {}
+
+const collection = {genres: {"sci-fi": {movies: [{director: "yo"}]}}}
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/optional-chaining.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/optional-chaining.js
new file mode 100644
index 0000000000..757335f78b
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/optional-chaining.js
@@ -0,0 +1,3 @@
+const obj = {};
+obj?.a;
+obj?.a?.b ?? [];
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/outOfScope.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/outOfScope.js
new file mode 100644
index 0000000000..30218f546b
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/outOfScope.js
@@ -0,0 +1,62 @@
+// Program Scope
+
+function outer() {
+ function inner() {
+ const x = 1;
+ }
+
+ const arrow = () => {
+ const x = 1;
+ };
+
+ const declaration = function() {
+ const x = 1;
+ };
+
+ assignment = (function() {
+ const x = 1;
+ })();
+
+ const iifeDeclaration = (function() {
+ const x = 1;
+ })();
+
+ return function() {
+ const x = 1;
+ };
+}
+
+function exclude() {
+ function another() {
+ const x = 1;
+ }
+}
+
+const globalArrow = () => {
+ const x = 1;
+};
+
+const globalDeclaration = function() {
+ const x = 1;
+};
+
+globalAssignment = (function() {
+ const x = 1;
+})();
+
+const globalIifeDeclaration = (function() {
+ const x = 1;
+})();
+
+function parentFunc() {
+ let MAX = 3;
+ let nums = [0, 1, 2, 3];
+ let x = 1;
+ let y = nums.find(function(n) {
+ return n == x;
+ });
+ function innerFunc(a) {
+ return Math.max(a, MAX);
+ }
+ return innerFunc(y);
+}
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/outOfScopeComment.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/outOfScopeComment.js
new file mode 100644
index 0000000000..bc02f94671
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/outOfScopeComment.js
@@ -0,0 +1,4 @@
+// Some comment
+(function() {
+ const x = 1;
+})();
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/parseScriptTags.html b/devtools/client/debugger/src/workers/parser/tests/fixtures/parseScriptTags.html
new file mode 100644
index 0000000000..6283f0ee98
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/parseScriptTags.html
@@ -0,0 +1,42 @@
+<html>
+<head>
+ <script type="text/javascript">
+ var globalObject = {
+ first: "name",
+ last: "words"
+ };
+ function sayHello (name) {
+ return `Hello, ${name}!`;
+ }
+ </script>
+ <style>
+ BODY {
+ font-size: 48px;
+ color: rebeccapurple;
+ }
+ </style>
+</head>
+<body>
+ <h1>Testing Script Tags in HTML</h1>
+ <script>
+ const capitalize = name => {
+ return name[0].toUpperCase() + name.substring(1)
+ };
+ const greetAll = ["my friend", "buddy", "world"]
+ .map(capitalize)
+ .map(sayHello)
+ .join("\n");
+
+ globalObject.greetings = greetAll;
+ </script>
+ <p>
+ Some arbitrary intermediate content to affect the offsets of the scripts
+ </p>
+ <script>
+ (function iife() {
+ const greeting = sayHello("Ryan");
+ console.log(greeting);
+ })();
+ </script>
+</body>
+</html>
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/private-fields.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/private-fields.js
new file mode 100644
index 0000000000..ca9abc8f1d
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/private-fields.js
@@ -0,0 +1,24 @@
+class MyClass {
+ constructor(secret, ...rest) {
+ const self = this;
+ this.#secret = secret;
+ self.#restParams = rest;
+ }
+
+ #secret;
+ #restParams;
+ #salt = "bloup";
+ creationDate = new Date();
+
+ #getSalt() {
+ return this.#salt;
+ }
+
+ debug() {
+ const self = this;
+ const creationDate = this.creationDate;
+ const secret = this.#secret;
+ const salt = self.#getSalt();
+ return `${creationDate}|${salt}|${secret}`;
+ }
+}
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/proto.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/proto.js
new file mode 100644
index 0000000000..38c3b63ac7
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/proto.js
@@ -0,0 +1,14 @@
+const foo = function() {};
+
+const bar = () => {};
+
+const TodoView = Backbone.View.extend({
+ tagName: "li",
+ initialize: function() {},
+ doThing(b) {
+ console.log("hi", b);
+ },
+ render: function() {
+ return this;
+ }
+});
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/regexp.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/regexp.js
new file mode 100644
index 0000000000..fb0f13b0d0
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/regexp.js
@@ -0,0 +1 @@
+const re = /^\p{RGI_Emoji}$/v; \ No newline at end of file
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/resolveToken.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/resolveToken.js
new file mode 100644
index 0000000000..4660f0f568
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/resolveToken.js
@@ -0,0 +1,40 @@
+const a = 1;
+let b = 0;
+
+function getA() {
+ return a;
+}
+
+function setB(newB) {
+ b = newB;
+}
+
+const plusAB = (function(x, y) {
+ const obj = { x, y };
+ function insideClosure(alpha, beta) {
+ return alpha + beta + obj.x + obj.y;
+ }
+
+ return insideClosure;
+})(a, b);
+
+function withMultipleScopes() {
+ var outer = 1;
+ function innerScope() {
+ var inner = outer + 1;
+ return inner;
+ }
+
+ const fromIIFE = (function(toIIFE) {
+ return innerScope() + toIIFE;
+ })(1);
+
+ {
+ // random block
+ let x = outer + fromIIFE;
+ if (x) {
+ const y = x * x;
+ console.log(y);
+ }
+ }
+}
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/arrow-function.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/arrow-function.js
new file mode 100644
index 0000000000..4ec72fd450
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/arrow-function.js
@@ -0,0 +1,11 @@
+export {};
+
+let outer = (p1) => {
+ console.log(this);
+
+ (function() {
+ var inner = (p2) => {
+ console.log(this);
+ };
+ })();
+};
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/binding-types.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/binding-types.js
new file mode 100644
index 0000000000..8c9cc05d1d
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/binding-types.js
@@ -0,0 +1,24 @@
+import def from "";
+import { named } from "";
+import { thing as otherNamed } from "";
+import * as namespace from "";
+
+function fn() {}
+class cls {
+ method(){
+
+ }
+}
+
+var aVar;
+let aLet;
+const aConst = "";
+
+(function inner() {
+ this;
+ arguments;
+});
+
+{
+ function blockFn(){}
+}
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/block-statement.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/block-statement.js
new file mode 100644
index 0000000000..5e64d1180f
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/block-statement.js
@@ -0,0 +1,13 @@
+export {};
+
+let first;
+
+{
+ var second;
+ function third() {}
+ class Fourth {}
+ let fifth;
+ const sixth = 6;
+}
+
+var seventh;
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/class-declaration.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/class-declaration.js
new file mode 100644
index 0000000000..1c2c74dcbc
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/class-declaration.js
@@ -0,0 +1,14 @@
+export {};
+
+class Outer {
+ method() {
+ class Inner {
+ m() {
+ console.log(this);
+ }
+ }
+ }
+}
+
+@decorator
+class Second {}
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/class-expression.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/class-expression.js
new file mode 100644
index 0000000000..16b6841d71
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/class-expression.js
@@ -0,0 +1,11 @@
+export {};
+
+var Outer = class Outer {
+ method() {
+ var Inner = class {
+ m() {
+ console.log(this);
+ }
+ };
+ }
+};
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/class-property.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/class-property.js
new file mode 100644
index 0000000000..a80cad3a87
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/class-property.js
@@ -0,0 +1,10 @@
+export {};
+
+class Foo {
+ prop = this.init();
+
+ other = do {
+ var one;
+ let two;
+ };
+}
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/complex-nesting.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/complex-nesting.js
new file mode 100644
index 0000000000..40763f556f
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/complex-nesting.js
@@ -0,0 +1,29 @@
+function named(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = root;
+function root() {
+ function fn(arg) {
+ var _this = this,
+ _arguments = arguments;
+
+ console.log(this, arguments);
+ console.log("pause here", fn, root);
+
+ var arrow = function arrow(argArrow) {
+ console.log(_this, _arguments);
+ console.log("pause here", fn, root);
+ };
+ arrow("arrow-arg");
+ }
+
+ fn.call("this-value", "arg-value");
+}
+module.exports = exports["default"];
+
+}
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/expressions.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/expressions.js
new file mode 100644
index 0000000000..6698acd8e8
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/expressions.js
@@ -0,0 +1,6 @@
+const foo = {};
+
+foo.bar().baz;
+(0, foo.bar)().baz;
+Object(foo.bar)().baz;
+__webpack_require__.i(foo.bar)().baz;
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/flowtype-bindings.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/flowtype-bindings.js
new file mode 100644
index 0000000000..385797c044
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/flowtype-bindings.js
@@ -0,0 +1,11 @@
+import type { One, Two, Three } from "./src/mod";
+
+type Other = {
+ root: typeof root,
+};
+
+const aConst = (window: Array<string>);
+
+export default function root() {
+
+}
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/fn-body-lex-and-nonlex.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/fn-body-lex-and-nonlex.js
new file mode 100644
index 0000000000..a7f6d7670a
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/fn-body-lex-and-nonlex.js
@@ -0,0 +1,23 @@
+function fn() {
+ var nonlex;
+ let lex;
+
+}
+
+function fn2() {
+ function nonlex(){}
+ let lex;
+
+}
+
+function fn3() {
+ var nonlex;
+ class Thing {}
+
+}
+
+function fn4() {
+ function nonlex(){}
+ class Thing {}
+
+}
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/for-loops.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/for-loops.js
new file mode 100644
index 0000000000..747eeeae7d
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/for-loops.js
@@ -0,0 +1,13 @@
+export {};
+
+for (var one;;) {}
+for (let two;;) {}
+for (const three = 3;;) {}
+
+for (var four in {}) {}
+for (let five in {}) {}
+for (const six in {}) {}
+
+for (var seven of {}) {}
+for (let eight of {}) {}
+for (const nine of {}) {}
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/function-declaration.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/function-declaration.js
new file mode 100644
index 0000000000..759374b437
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/function-declaration.js
@@ -0,0 +1,11 @@
+export {};
+
+function outer(p1) {}
+
+{
+ function middle(p2) {
+ function inner(p3) {}
+
+ console.log(this);
+ }
+}
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/function-expression.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/function-expression.js
new file mode 100644
index 0000000000..436413533e
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/function-expression.js
@@ -0,0 +1,7 @@
+export {};
+
+let fn = function(p1) {};
+
+let fn2 = function withName(p2) {
+ console.log(this);
+};
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/jsx-component.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/jsx-component.js
new file mode 100644
index 0000000000..ffe1c1dfce
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/jsx-component.js
@@ -0,0 +1,6 @@
+import SomeComponent from "";
+
+<SomeComponent attr="value" />;
+<SomeComponent attr="value"></SomeComponent>;
+<SomeComponent.prop attr="value" />;
+<SomeComponent.prop.child attr="value" />;
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/out-of-order-declarations.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/out-of-order-declarations.js
new file mode 100644
index 0000000000..4f36d9fc38
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/out-of-order-declarations.js
@@ -0,0 +1,21 @@
+var val;
+
+export default function root() {
+ var val;
+
+ var fn;
+
+ this;
+
+ function callback() {
+ console.log(val, fn, callback, root, this);
+
+ var val;
+
+ function fn(){};
+ }
+
+ callback();
+}
+
+import aDefault from "./src/mod";
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/pattern-declarations.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/pattern-declarations.js
new file mode 100644
index 0000000000..6810ef4614
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/pattern-declarations.js
@@ -0,0 +1,2 @@
+var { prop: one } = {};
+var [ two ] = [];
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/simple-module.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/simple-module.js
new file mode 100644
index 0000000000..b25cc7a863
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/simple-module.js
@@ -0,0 +1,11 @@
+import foo from "foo";
+
+console.log(foo);
+
+var one = 1;
+let two = 2;
+const three = 3;
+
+function fn() {}
+
+this;
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/switch-statement.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/switch-statement.js
new file mode 100644
index 0000000000..7163c3811d
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/switch-statement.js
@@ -0,0 +1,22 @@
+export {};
+
+switch (foo) {
+ case "zero":
+ var zero;
+ case "one":
+ let one;
+ case "two":
+ let two;
+ case "three": {
+ let three;
+ }
+}
+
+switch (foo) {
+ case "":
+ function two(){}
+}
+switch (foo) {
+ case "":
+ class three {}
+}
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/try-catch.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/try-catch.js
new file mode 100644
index 0000000000..8ccf4db592
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/try-catch.js
@@ -0,0 +1,9 @@
+export {};
+
+try {
+ var first;
+ let second;
+} catch (err) {
+ var third;
+ let fourth;
+}
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/ts-sample.ts b/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/ts-sample.ts
new file mode 100644
index 0000000000..e23ff83754
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/ts-sample.ts
@@ -0,0 +1,41 @@
+
+// TSEnumDeclaration
+enum Color {
+ // TSEnumMember
+ Red,
+ Green,
+ Blue,
+}
+
+class Example<T> {
+ // TSParameterProperty
+ constructor(public foo) {
+
+ }
+
+ method(): never {
+ throw new Error();
+ }
+}
+
+// TSTypeAssertion
+var foo = <any>window;
+
+// TSAsExpression
+(window as any);
+
+// TSNonNullExpression
+(window!);
+
+// TSModuleDeclaration
+namespace TheSpace {
+ function fn() {
+
+ }
+}
+
+// TSImportEqualsDeclaration
+import ImportedClass = require("mod");
+
+// TSExportAssignment
+export = Example;
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/tsx-sample.tsx b/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/tsx-sample.tsx
new file mode 100644
index 0000000000..9e2b9faf8b
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/tsx-sample.tsx
@@ -0,0 +1,41 @@
+
+// TSEnumDeclaration
+enum Color {
+ // TSEnumMember
+ Red,
+ Green,
+ Blue,
+}
+
+class Example<T> {
+ // TSParameterProperty
+ constructor(public foo) {
+
+ }
+
+ method(): never {
+ throw new Error();
+ }
+}
+
+// JSXElement
+var foo = <any>window</any>;
+
+// TSAsExpression
+(window as any);
+
+// TSNonNullExpression
+(window!);
+
+// TSModuleDeclaration
+namespace TheSpace {
+ function fn() {
+
+ }
+}
+
+// TSImportEqualsDeclaration
+import ImportedClass = require("mod");
+
+// TSExportAssignment
+export = Example;
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/vue-sample.vue b/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/vue-sample.vue
new file mode 100644
index 0000000000..0fceee99d1
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/vue-sample.vue
@@ -0,0 +1,26 @@
+<template>
+ <div class="hello">
+ <h1>{{ msg }}</h1>
+ </div>
+</template>
+
+<script>
+var moduleVar = "data";
+
+export default {
+ name: 'HelloWorld',
+ data () {
+ var fnVar = 4;
+
+ return {
+ msg: 'Welcome to Your Vue.js App'
+ };
+ }
+};
+</script>
+
+<style scoped>
+a {
+ color: red;
+}
+</style>
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/statements.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/statements.js
new file mode 100644
index 0000000000..f2c113570e
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/statements.js
@@ -0,0 +1,40 @@
+debugger; debugger;
+console.log("a"); console.log("a");
+
+// assignments with valid pause locations
+this.x = 3;
+var a = 4;
+var d = [foo()]
+var f = 3, e = 4;
+var g = [], h = {};
+
+// assignments with invalid pause locations
+var b = foo();
+c = foo();
+
+
+const arr = [
+ '1',
+ 2,
+ foo()
+]
+
+const obj = {
+ a: '1',
+ b: 2,
+ c: foo(),
+}
+
+foo(
+ 1,
+ foo(
+ 1
+ ),
+ 3
+)
+
+throw new Error("3");
+3;
+
+while (i < 6) { break }
+while (i < 6) { continue;}
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/thisExpression.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/thisExpression.js
new file mode 100644
index 0000000000..dd398db426
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/thisExpression.js
@@ -0,0 +1,11 @@
+class Test {
+ constructor() {
+ this.foo = {
+ a: "foobar"
+ };
+ }
+
+ bar() {
+ console.log(this.foo.a);
+ }
+}
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/var.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/var.js
new file mode 100644
index 0000000000..509ad368e8
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/var.js
@@ -0,0 +1,21 @@
+var foo = 1;
+let bar = 2;
+const baz = 3;
+const a = 4,
+ b = 5;
+a = 5;
+
+var { foo: { baw } } = {}
+var {bap} = {}
+var {ll = 3} = {}
+
+
+var [first] = [1]
+
+var { a: _a } = 3
+
+var [oh, {my: god}] = [{},{}]
+
+var [[oj], [{oy, vey: _vey, mitzvot: _mitz = 4}]] = [{},{}]
+
+var [one, ...stuff] = []
diff --git a/devtools/client/debugger/src/workers/parser/tests/framework.spec.js b/devtools/client/debugger/src/workers/parser/tests/framework.spec.js
new file mode 100644
index 0000000000..d41f45b71c
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/framework.spec.js
@@ -0,0 +1,63 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { getSymbols } from "../getSymbols";
+import { populateOriginalSource } from "./helpers";
+import cases from "jest-in-case";
+
+cases(
+ "Parser.getFramework",
+ ({ name, file, value }) => {
+ const source = populateOriginalSource("frameworks/plainJavascript");
+ const symbols = getSymbols(source.id);
+ expect(symbols.framework).toBeNull();
+ },
+ [
+ {
+ name: "is undefined when no framework",
+ file: "frameworks/plainJavascript",
+ value: null,
+ },
+ {
+ name: "does not get confused with angular (#6833)",
+ file: "frameworks/angular1FalsePositive",
+ value: null,
+ },
+ {
+ name: "recognizes ES6 React component",
+ file: "frameworks/reactComponent",
+ value: "React",
+ },
+ {
+ name: "recognizes ES5 React component",
+ file: "frameworks/reactComponentEs5",
+ value: "React",
+ },
+ {
+ name: "recognizes Angular 1 module",
+ file: "frameworks/angular1Module",
+ value: "Angular",
+ },
+ {
+ name: "recognizes declarative Vue file",
+ file: "frameworks/vueFileDeclarative",
+ value: "Vue",
+ },
+ {
+ name: "recognizes component Vue file",
+ file: "frameworks/vueFileComponent",
+ value: "Vue",
+ },
+ {
+ name: "recognizes the react library file",
+ file: "framework/reactLibrary",
+ value: "React",
+ },
+ {
+ name: "recognizes the redux library file",
+ file: "framework/reduxLibrary",
+ value: "React",
+ },
+ ]
+);
diff --git a/devtools/client/debugger/src/workers/parser/tests/getScopes.spec.js b/devtools/client/debugger/src/workers/parser/tests/getScopes.spec.js
new file mode 100644
index 0000000000..a2d394ae96
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/getScopes.spec.js
@@ -0,0 +1,227 @@
+/* eslint max-nested-callbacks: ["error", 4]*/
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import getScopes from "../getScopes";
+import { populateOriginalSource } from "./helpers";
+import cases from "jest-in-case";
+
+cases(
+ "Parser.getScopes",
+ ({ name, file, type, locations }) => {
+ const source = populateOriginalSource(file, type);
+
+ locations.forEach(([line, column]) => {
+ const scopes = getScopes({
+ source,
+ line,
+ column,
+ });
+
+ expect(scopes).toMatchSnapshot(
+ `getScopes ${name} at line ${line} column ${column}`
+ );
+ });
+ },
+ [
+ {
+ name: "finds scope bindings in fn body with both lex and non-lex items",
+ file: "scopes/fn-body-lex-and-nonlex",
+ locations: [
+ [4, 0],
+ [10, 0],
+ [16, 0],
+ [22, 0],
+ ],
+ },
+ {
+ name: "finds scope bindings in a vue file",
+ file: "scopes/vue-sample",
+ type: "vue",
+ locations: [[14, 0]],
+ },
+ {
+ name: "finds scope bindings in a typescript file",
+ file: "scopes/ts-sample",
+ type: "ts",
+ locations: [
+ [9, 0],
+ [13, 4],
+ [17, 0],
+ [33, 0],
+ ],
+ },
+ {
+ name: "finds scope bindings in a typescript-jsx file",
+ file: "scopes/tsx-sample",
+ type: "tsx",
+ locations: [
+ [9, 0],
+ [13, 4],
+ [17, 0],
+ [33, 0],
+ ],
+ },
+ {
+ name: "finds scope bindings in a module",
+ file: "scopes/simple-module",
+ locations: [[7, 0]],
+ },
+ {
+ name: "finds scope bindings in a JSX element",
+ file: "scopes/jsx-component",
+ locations: [[2, 0]],
+ },
+ {
+ name: "finds scope bindings for complex binding nesting",
+ file: "scopes/complex-nesting",
+ locations: [
+ [16, 4],
+ [20, 6],
+ ],
+ },
+ {
+ name: "finds scope bindings for function declarations",
+ file: "scopes/function-declaration",
+ locations: [
+ [2, 0],
+ [3, 20],
+ [5, 1],
+ [9, 0],
+ ],
+ },
+ {
+ name: "finds scope bindings for function expressions",
+ file: "scopes/function-expression",
+ locations: [
+ [2, 0],
+ [3, 23],
+ [6, 0],
+ ],
+ },
+ {
+ name: "finds scope bindings for arrow functions",
+ file: "scopes/arrow-function",
+ locations: [
+ [2, 0],
+ [4, 0],
+ [7, 0],
+ [8, 0],
+ ],
+ },
+ {
+ name: "finds scope bindings for class declarations",
+ file: "scopes/class-declaration",
+ locations: [
+ [2, 0],
+ [5, 0],
+ [7, 0],
+ ],
+ },
+ {
+ name: "finds scope bindings for class expressions",
+ file: "scopes/class-expression",
+ locations: [
+ [2, 0],
+ [5, 0],
+ [7, 0],
+ ],
+ },
+ {
+ name: "finds scope bindings for for loops",
+ file: "scopes/for-loops",
+ locations: [
+ [2, 0],
+ [3, 17],
+ [4, 17],
+ [5, 25],
+ [7, 22],
+ [8, 22],
+ [9, 23],
+ [11, 23],
+ [12, 23],
+ [13, 24],
+ ],
+ },
+ {
+ name: "finds scope bindings for try..catch",
+ file: "scopes/try-catch",
+ locations: [
+ [2, 0],
+ [4, 0],
+ [7, 0],
+ ],
+ },
+ {
+ name: "finds scope bindings for out of order declarations",
+ file: "scopes/out-of-order-declarations",
+ locations: [
+ [2, 0],
+ [5, 0],
+ [11, 0],
+ [14, 0],
+ [17, 0],
+ ],
+ },
+ {
+ name: "finds scope bindings for block statements",
+ file: "scopes/block-statement",
+ locations: [
+ [2, 0],
+ [6, 0],
+ ],
+ },
+ {
+ name: "finds scope bindings for class properties",
+ file: "scopes/class-property",
+ locations: [
+ [2, 0],
+ [4, 16],
+ [6, 12],
+ [7, 0],
+ ],
+ },
+ {
+ name: "finds scope bindings and exclude Flowtype",
+ file: "scopes/flowtype-bindings",
+ locations: [
+ [8, 0],
+ [10, 0],
+ ],
+ },
+ {
+ name: "finds scope bindings for declarations with patterns",
+ file: "scopes/pattern-declarations",
+ locations: [[1, 0]],
+ },
+ {
+ name: "finds scope bindings for switch statements",
+ file: "scopes/switch-statement",
+ locations: [
+ [2, 0],
+ [5, 0],
+ [7, 0],
+ [9, 0],
+ [11, 0],
+ [17, 0],
+ [21, 0],
+ ],
+ },
+ {
+ name: "finds scope bindings with proper types",
+ file: "scopes/binding-types",
+ locations: [
+ [5, 0],
+ [9, 0],
+ [18, 0],
+ [23, 0],
+ ],
+ },
+ {
+ name: "finds scope bindings with expression metadata",
+ file: "scopes/expressions",
+ locations: [[2, 0]],
+ },
+ ]
+);
diff --git a/devtools/client/debugger/src/workers/parser/tests/getSymbols.spec.js b/devtools/client/debugger/src/workers/parser/tests/getSymbols.spec.js
new file mode 100644
index 0000000000..723eef1fd9
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/getSymbols.spec.js
@@ -0,0 +1,51 @@
+/* eslint max-nested-callbacks: ["error", 4]*/
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { formatSymbols } from "../utils/formatSymbols";
+import { populateSource, populateOriginalSource } from "./helpers";
+import cases from "jest-in-case";
+
+cases(
+ "Parser.getSymbols",
+ ({ name, file, original, type }) => {
+ const source = original
+ ? populateOriginalSource(file, type)
+ : populateSource(file, type);
+
+ expect(formatSymbols(source.id)).toMatchSnapshot();
+ },
+ [
+ { name: "es6", file: "es6", original: true },
+ { name: "func", file: "func", original: true },
+ { name: "function names", file: "functionNames", original: true },
+ { name: "math", file: "math" },
+ { name: "proto", file: "proto" },
+ { name: "class", file: "class", original: true },
+ { name: "var", file: "var" },
+ { name: "expression", file: "expression" },
+ { name: "allSymbols", file: "allSymbols" },
+ { name: "call sites", file: "call-sites" },
+ { name: "call expression", file: "callExpressions" },
+ { name: "object expressions", file: "object-expressions" },
+ { name: "optional chaining", file: "optional-chaining" },
+ { name: "private fields", file: "private-fields" },
+ {
+ name: "finds symbols in an html file",
+ file: "parseScriptTags",
+ type: "html",
+ },
+ { name: "component", file: "component", original: true },
+ {
+ name: "react component",
+ file: "frameworks/reactComponent",
+ original: true,
+ },
+ { name: "flow", file: "flow", original: true },
+ { name: "jsx", file: "jsx", original: true },
+ { name: "destruct", file: "destructuring" },
+
+ { name: "regexp", file: "regexp" },
+ ]
+);
diff --git a/devtools/client/debugger/src/workers/parser/tests/helpers/index.js b/devtools/client/debugger/src/workers/parser/tests/helpers/index.js
new file mode 100644
index 0000000000..47c358ae66
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/helpers/index.js
@@ -0,0 +1,86 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import fs from "fs";
+import path from "path";
+
+import { makeMockSourceAndContent } from "../../../../utils/test-mockup";
+import { setSource } from "../../sources";
+import * as asyncValue from "../../../../utils/async-value";
+
+export function getFixture(name, type = "js") {
+ return fs.readFileSync(
+ path.join(__dirname, `../fixtures/${name}.${type}`),
+ "utf8"
+ );
+}
+
+function getSourceContent(name, type = "js") {
+ const text = getFixture(name, type);
+ let contentType = "text/javascript";
+ if (type === "html") {
+ contentType = "text/html";
+ } else if (type === "vue") {
+ contentType = "text/vue";
+ } else if (type === "ts") {
+ contentType = "text/typescript";
+ } else if (type === "tsx") {
+ contentType = "text/typescript-jsx";
+ }
+
+ return {
+ type: "text",
+ value: text,
+ contentType,
+ };
+}
+
+export function getSource(name, type) {
+ const { value: text, contentType } = getSourceContent(name, type);
+
+ return makeMockSourceAndContent(undefined, name, contentType, text);
+}
+
+export function populateSource(name, type) {
+ const { content, ...source } = getSource(name, type);
+ setSource({
+ id: source.id,
+ text: content.value,
+ contentType: content.contentType,
+ isWasm: false,
+ });
+ return {
+ ...source,
+ content: asyncValue.fulfilled(content),
+ };
+}
+
+export function getOriginalSource(name, type) {
+ return getOriginalSourceWithContent(name, type);
+}
+
+export function getOriginalSourceWithContent(name, type) {
+ const { value: text, contentType } = getSourceContent(name, type);
+
+ return makeMockSourceAndContent(
+ undefined,
+ `${name}/originalSource-1`,
+ contentType,
+ text
+ );
+}
+
+export function populateOriginalSource(name, type) {
+ const { content, ...source } = getOriginalSourceWithContent(name, type);
+ setSource({
+ id: source.id,
+ text: content.value,
+ contentType: content.contentType,
+ isWasm: false,
+ });
+ return {
+ ...source,
+ content: asyncValue.fulfilled(content),
+ };
+}
diff --git a/devtools/client/debugger/src/workers/parser/tests/mapBindings.spec.js b/devtools/client/debugger/src/workers/parser/tests/mapBindings.spec.js
new file mode 100644
index 0000000000..8c23ab5873
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/mapBindings.spec.js
@@ -0,0 +1,161 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import mapExpressionBindings from "../mapBindings";
+import { parseConsoleScript } from "../utils/ast";
+import cases from "jest-in-case";
+
+const prettier = require("prettier");
+
+function format(code) {
+ return prettier.format(code, { semi: false, parser: "babel" });
+}
+
+function excludedTest({ name, expression, bindings = [] }) {
+ const safeExpression = mapExpressionBindings(
+ expression,
+ parseConsoleScript(expression),
+ bindings
+ );
+ expect(format(safeExpression)).toEqual(format(expression));
+}
+
+function includedTest({ name, expression, newExpression, bindings }) {
+ const safeExpression = mapExpressionBindings(
+ expression,
+ parseConsoleScript(expression),
+ bindings
+ );
+ expect(format(safeExpression)).toEqual(format(newExpression));
+}
+
+describe("mapExpressionBindings", () => {
+ cases("included cases", includedTest, [
+ {
+ name: "single declaration",
+ expression: "const a = 2; let b = 3; var c = 4;",
+ newExpression: "self.a = 2; self.b = 3; self.c = 4;",
+ },
+ {
+ name: "multiple declarations",
+ expression: "const a = 2, b = 3",
+ newExpression: "self.a = 2; self.b = 3",
+ },
+ {
+ name: "declaration with separate assignment",
+ expression: "let a; a = 2;",
+ newExpression: "self.a = void 0; self.a = 2;",
+ },
+ {
+ name: "multiple declarations with no assignment",
+ expression: "let a = 2, b;",
+ newExpression: "self.a = 2; self.b = void 0;",
+ },
+ {
+ name: "local bindings become assignments",
+ bindings: ["a"],
+ expression: "var a = 2;",
+ newExpression: "a = 2;",
+ },
+ {
+ name: "assignments",
+ expression: "a = 2;",
+ newExpression: "self.a = 2;",
+ },
+ {
+ name: "assignments with +=",
+ expression: "a += 2;",
+ newExpression: "self.a += 2;",
+ },
+ {
+ name: "destructuring (objects)",
+ expression: "const { a } = {}; ",
+ newExpression: "({ a: self.a } = {})",
+ },
+ {
+ name: "destructuring (arrays)",
+ expression: " var [a, ...foo] = [];",
+ newExpression: "([self.a, ...self.foo] = [])",
+ },
+ {
+ name: "destructuring (declarations)",
+ expression: "var {d,e} = {}, {f} = {}; ",
+ newExpression: `({ d: self.d, e: self.e } = {});
+ ({ f: self.f } = {})
+ `,
+ },
+ {
+ name: "destructuring & declaration",
+ expression: "const { a } = {}; var b = 3",
+ newExpression: `({ a: self.a } = {});
+ self.b = 3
+ `,
+ },
+ {
+ name: "destructuring assignment",
+ expression: "[a] = [3]",
+ newExpression: "[self.a] = [3]",
+ },
+ {
+ name: "destructuring assignment (declarations)",
+ expression: "[a] = [3]; var b = 4",
+ newExpression: "[self.a] = [3];\n self.b = 4",
+ },
+ ]);
+
+ cases("excluded cases", excludedTest, [
+ { name: "local variables", expression: "function a() { var b = 2}" },
+ { name: "functions", expression: "function a() {}" },
+ { name: "classes", expression: "class a {}" },
+
+ { name: "with", expression: "with (obj) {var a = 2;}" },
+ {
+ name: "with & declaration",
+ expression: "with (obj) {var a = 2;}; ; var b = 3",
+ },
+ {
+ name: "hoisting",
+ expression: "{ const h = 3; }",
+ },
+ {
+ name: "assignments",
+ bindings: ["a"],
+ expression: "a = 2;",
+ },
+ {
+ name: "identifier",
+ expression: "a",
+ },
+ ]);
+
+ cases("cases that we should map in the future", excludedTest, [
+ { name: "blocks (IF)", expression: "if (true) { var a = 3; }" },
+ {
+ name: "hoisting",
+ expression: "{ var g = 5; }",
+ },
+ {
+ name: "for loops bindings",
+ expression: "for (let foo = 4; false;){}",
+ },
+ ]);
+
+ cases("cases that we shouldn't map in the future", includedTest, [
+ {
+ name: "window properties",
+ expression: "var innerHeight = 3; var location = 5;",
+ newExpression: "self.innerHeight = 3; self.location = 5;",
+ },
+ {
+ name: "self declaration",
+ expression: "var self = 3",
+ newExpression: "self.self = 3",
+ },
+ {
+ name: "self assignment",
+ expression: "self = 3",
+ newExpression: "self.self = 3",
+ },
+ ]);
+});
diff --git a/devtools/client/debugger/src/workers/parser/tests/mapExpression.spec.js b/devtools/client/debugger/src/workers/parser/tests/mapExpression.spec.js
new file mode 100644
index 0000000000..6c89231012
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/mapExpression.spec.js
@@ -0,0 +1,796 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import mapExpression from "../mapExpression";
+import { format } from "prettier";
+import cases from "jest-in-case";
+
+function test({
+ expression,
+ newExpression,
+ bindings,
+ mappings,
+ shouldMapBindings,
+ expectedMapped,
+ parseExpression = true,
+}) {
+ const res = mapExpression(expression, mappings, bindings, shouldMapBindings);
+
+ if (parseExpression) {
+ expect(
+ format(res.expression, {
+ parser: "babel",
+ })
+ ).toEqual(format(newExpression, { parser: "babel" }));
+ } else {
+ expect(res.expression).toEqual(newExpression);
+ }
+
+ expect(res.mapped).toEqual(expectedMapped);
+}
+
+function formatAwait(body) {
+ return `(async () => { ${body} })();`;
+}
+
+describe("mapExpression", () => {
+ cases("mapExpressions", test, [
+ {
+ name: "await",
+ expression: "await a()",
+ newExpression: formatAwait("return a()"),
+ bindings: [],
+ mappings: {},
+ shouldMapBindings: true,
+ expectedMapped: {
+ await: true,
+ bindings: false,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "await (multiple statements)",
+ expression: "const x = await a(); x + x",
+ newExpression: formatAwait("self.x = await a(); return x + x;"),
+ bindings: [],
+ mappings: {},
+ shouldMapBindings: true,
+ expectedMapped: {
+ await: true,
+ bindings: true,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "await (inner)",
+ expression: "async () => await a();",
+ newExpression: "async () => await a();",
+ bindings: [],
+ mappings: {},
+ shouldMapBindings: true,
+ expectedMapped: {
+ await: false,
+ bindings: false,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "await (multiple awaits)",
+ expression: "const x = await a(); await b(x)",
+ newExpression: formatAwait("self.x = await a(); return b(x);"),
+ bindings: [],
+ mappings: {},
+ shouldMapBindings: true,
+ expectedMapped: {
+ await: true,
+ bindings: true,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "await (assignment)",
+ expression: "let x = await sleep(100, 2)",
+ newExpression: formatAwait("return (self.x = await sleep(100, 2))"),
+ bindings: [],
+ mappings: {},
+ shouldMapBindings: true,
+ expectedMapped: {
+ await: true,
+ bindings: true,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "await (destructuring)",
+ expression: "const { a, c: y } = await b()",
+ newExpression: formatAwait(
+ "return ({ a: self.a, c: self.y } = await b())"
+ ),
+ bindings: [],
+ mappings: {},
+ shouldMapBindings: true,
+ expectedMapped: {
+ await: true,
+ bindings: true,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "await (array destructuring)",
+ expression: "const [a, y] = await b();",
+ newExpression: formatAwait("return ([self.a, self.y] = await b())"),
+ bindings: [],
+ mappings: {},
+ shouldMapBindings: true,
+ expectedMapped: {
+ await: true,
+ bindings: true,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "await (mixed destructuring)",
+ expression: "const [{ a }] = await b();",
+ newExpression: formatAwait("return ([{ a: self.a }] = await b())"),
+ bindings: [],
+ mappings: {},
+ shouldMapBindings: true,
+ expectedMapped: {
+ await: true,
+ bindings: true,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "await (destructuring, multiple statements)",
+ expression: "const { a, c: y } = await b(), { x } = await y()",
+ newExpression: formatAwait(`
+ ({ a: self.a, c: self.y } = await b())
+ return ({ x: self.x } = await y());
+ `),
+ bindings: [],
+ mappings: {},
+ shouldMapBindings: true,
+ expectedMapped: {
+ await: true,
+ bindings: true,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "await (destructuring, bindings)",
+ expression: "const { a, c: y } = await b();",
+ newExpression: formatAwait("return ({ a, c: y } = await b())"),
+ bindings: ["a", "y"],
+ mappings: {},
+ shouldMapBindings: true,
+ expectedMapped: {
+ await: true,
+ bindings: true,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "await (array destructuring, bindings)",
+ expression: "const [a, y] = await b();",
+ newExpression: formatAwait("return ([a, y] = await b())"),
+ bindings: ["a", "y"],
+ mappings: {},
+ shouldMapBindings: true,
+ expectedMapped: {
+ await: true,
+ bindings: true,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "await (mixed destructuring, bindings)",
+ expression: "const [{ a }] = await b();",
+ newExpression: formatAwait("return ([{ a }] = await b())"),
+ bindings: ["a"],
+ mappings: {},
+ shouldMapBindings: true,
+ expectedMapped: {
+ await: true,
+ bindings: true,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "await (destructuring with defaults, bindings)",
+ expression: "const { c, a = 5 } = await b();",
+ newExpression: formatAwait("return ({ c: self.c, a = 5 } = await b())"),
+ bindings: ["a", "y"],
+ mappings: {},
+ shouldMapBindings: true,
+ expectedMapped: {
+ await: true,
+ bindings: true,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "await (array destructuring with defaults, bindings)",
+ expression: "const [a, y = 10] = await b();",
+ newExpression: formatAwait("return ([a, y = 10] = await b())"),
+ bindings: ["a", "y"],
+ mappings: {},
+ shouldMapBindings: true,
+ expectedMapped: {
+ await: true,
+ bindings: true,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "await (mixed destructuring with defaults, bindings)",
+ expression: "const [{ c = 5 }, a = 5] = await b();",
+ newExpression: formatAwait(
+ "return ([ { c: self.c = 5 }, a = 5] = await b())"
+ ),
+ bindings: ["a"],
+ mappings: {},
+ shouldMapBindings: true,
+ expectedMapped: {
+ await: true,
+ bindings: true,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "await (nested destructuring, bindings)",
+ expression: "const { a, c: { y } } = await b();",
+ newExpression: formatAwait(`
+ return ({
+ a,
+ c: { y }
+ } = await b());
+ `),
+ bindings: ["a", "y"],
+ mappings: {},
+ shouldMapBindings: true,
+ expectedMapped: {
+ await: true,
+ bindings: true,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "await (nested destructuring with defaults)",
+ expression: "const { a, c: { y = 5 } = {} } = await b();",
+ newExpression: formatAwait(`return ({
+ a: self.a,
+ c: { y: self.y = 5 } = {},
+ } = await b());
+ `),
+ bindings: [],
+ mappings: {},
+ shouldMapBindings: true,
+ expectedMapped: {
+ await: true,
+ bindings: true,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "await (very nested destructuring with defaults)",
+ expression:
+ "const { a, c: { y: { z = 10, b } = { b: 5 } } } = await b();",
+ newExpression: formatAwait(`
+ return ({
+ a: self.a,
+ c: {
+ y: { z: self.z = 10, b: self.b } = {
+ b: 5
+ }
+ }
+ } = await b());
+ `),
+ bindings: [],
+ mappings: {},
+ shouldMapBindings: true,
+ expectedMapped: {
+ await: true,
+ bindings: true,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "await (with SyntaxError)",
+ expression: "await new Promise())",
+ newExpression: formatAwait("await new Promise())"),
+ parseExpression: false,
+ bindings: [],
+ mappings: {},
+ shouldMapBindings: true,
+ expectedMapped: {
+ await: true,
+ bindings: false,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "await (no bindings, let assignment)",
+ expression: "let a = await 123;",
+ newExpression: `let a;
+ (async () => {
+ return a = await 123;
+ })()`,
+ shouldMapBindings: false,
+ expectedMapped: {
+ await: true,
+ bindings: false,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "await (no bindings, var assignment)",
+ expression: "var a = await 123;",
+ newExpression: `var a;
+ (async () => {
+ return a = await 123;
+ })()`,
+ shouldMapBindings: false,
+ expectedMapped: {
+ await: true,
+ bindings: false,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "await (no bindings, const assignment)",
+ expression: "const a = await 123;",
+ newExpression: `let a;
+ (async () => {
+ return a = await 123;
+ })()`,
+ shouldMapBindings: false,
+ expectedMapped: {
+ await: true,
+ bindings: false,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "await (no bindings, multiple assignments)",
+ expression: "let a = 1, b, c = 3; b = await 123; a + b + c",
+ newExpression: `let a, b, c;
+ (async () => {
+ a = 1;
+ c = 3;
+ b = await 123;
+ return a + b + c;
+ })()`,
+ shouldMapBindings: false,
+ expectedMapped: {
+ await: true,
+ bindings: false,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "await (no bindings, object destructuring)",
+ expression: "let {a, b, c} = await x;",
+ newExpression: `let a, b, c;
+ (async () => {
+ return ({a, b, c} = await x);
+ })()`,
+ shouldMapBindings: false,
+ expectedMapped: {
+ await: true,
+ bindings: false,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "await (no bindings, object destructuring with rest)",
+ expression: "let {a, ...rest} = await x;",
+ newExpression: `let a, rest;
+ (async () => {
+ return ({a, ...rest} = await x);
+ })()`,
+ shouldMapBindings: false,
+ expectedMapped: {
+ await: true,
+ bindings: false,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "await (no bindings, object destructuring with renaming and default)",
+ expression: "let {a: hello, b, c: world, d: $ = 4} = await x;",
+ newExpression: `let hello, b, world, $;
+ (async () => {
+ return ({a: hello, b, c: world, d: $ = 4} = await x);
+ })()`,
+ shouldMapBindings: false,
+ expectedMapped: {
+ await: true,
+ bindings: false,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "await (no bindings, nested object destructuring + renaming + default)",
+ expression: `let {
+ a: hello, c: { y: { z = 10, b: bill, d: [e, f = 20] }}
+ } = await x; z;`,
+ newExpression: `let hello, z, bill, e, f;
+ (async () => {
+ ({ a: hello, c: { y: { z = 10, b: bill, d: [e, f = 20] }}} = await x);
+ return z;
+ })()`,
+ shouldMapBindings: false,
+ expectedMapped: {
+ await: true,
+ bindings: false,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "await (no bindings, array destructuring)",
+ expression: "let [a, b, c] = await x; c;",
+ newExpression: `let a, b, c;
+ (async () => {
+ [a, b, c] = await x;
+ return c;
+ })()`,
+ shouldMapBindings: false,
+ expectedMapped: {
+ await: true,
+ bindings: false,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "await (no bindings, array destructuring with default)",
+ expression: "let [a, b = 1, c = 2] = await x; c;",
+ newExpression: `let a, b, c;
+ (async () => {
+ [a, b = 1, c = 2] = await x;
+ return c;
+ })()`,
+ shouldMapBindings: false,
+ expectedMapped: {
+ await: true,
+ bindings: false,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "await (no bindings, array destructuring with default and rest)",
+ expression: "let [a, b = 1, c = 2, ...rest] = await x; rest;",
+ newExpression: `let a, b, c, rest;
+ (async () => {
+ [a, b = 1, c = 2, ...rest] = await x;
+ return rest;
+ })()`,
+ shouldMapBindings: false,
+ expectedMapped: {
+ await: true,
+ bindings: false,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "await (no bindings, nested array destructuring with default)",
+ expression: "let [a, b = 1, [c = 2, [d = 3, e = 4]]] = await x; c;",
+ newExpression: `let a, b, c, d, e;
+ (async () => {
+ [a, b = 1, [c = 2, [d = 3, e = 4]]] = await x;
+ return c;
+ })()`,
+ shouldMapBindings: false,
+ expectedMapped: {
+ await: true,
+ bindings: false,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "await (no bindings, dynamic import)",
+ expression: `
+ var {rainbowLog} = await import("./cool-module.js");
+ rainbowLog("dynamic");`,
+ newExpression: `var rainbowLog;
+ (async () => {
+ ({rainbowLog} = await import("./cool-module.js"));
+ return rainbowLog("dynamic");
+ })()`,
+ shouldMapBindings: false,
+ expectedMapped: {
+ await: true,
+ bindings: false,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "await (nullish coalesce operator)",
+ expression: "await x; true ?? false",
+ newExpression: `(async () => {
+ await x;
+ return true ?? false;
+ })()`,
+ shouldMapBindings: false,
+ expectedMapped: {
+ await: true,
+ bindings: false,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "await (optional chaining operator)",
+ expression: "await x; x?.y?.z",
+ newExpression: `(async () => {
+ await x;
+ return x?.y?.z;
+ })()`,
+ shouldMapBindings: false,
+ expectedMapped: {
+ await: true,
+ bindings: false,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "await (async function declaration with nullish coalesce operator)",
+ expression: "async function coalesce(x) { await x; return x ?? false; }",
+ newExpression:
+ "async function coalesce(x) { await x; return x ?? false; }",
+ shouldMapBindings: false,
+ expectedMapped: {
+ await: false,
+ bindings: false,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "await (async function declaration with optional chaining operator)",
+ expression: "async function chain(x) { await x; return x?.y?.z; }",
+ newExpression: "async function chain(x) { await x; return x?.y?.z; }",
+ shouldMapBindings: false,
+ expectedMapped: {
+ await: false,
+ bindings: false,
+ originalExpression: false,
+ },
+ },
+ {
+ // check that variable declaration in for loop is not put outside of the async iife
+ name: "await (for loop)",
+ expression: "for (let i=0;i<2;i++) {}; var b = await 1;",
+ newExpression: `var b;
+ (async () => {
+ for (let i=0;i<2;i++) {}
+ return (b = await 1);
+ })()`,
+ shouldMapBindings: false,
+ expectedMapped: {
+ await: true,
+ bindings: false,
+ originalExpression: false,
+ },
+ },
+ {
+ // check that variable declaration in for-in loop is not put outside of the async iife
+ name: "await (for..in loop)",
+ expression: "for (let i in {}) {}; var b = await 1;",
+ newExpression: `var b;
+ (async () => {
+ for (let i in {}) {}
+ return (b = await 1);
+ })()`,
+ shouldMapBindings: false,
+ expectedMapped: {
+ await: true,
+ bindings: false,
+ originalExpression: false,
+ },
+ },
+ {
+ // check that variable declaration in for-of loop is not put outside of the async iife
+ name: "await (for..of loop)",
+ expression: "for (let i of []) {}; var b = await 1;",
+ newExpression: `var b;
+ (async () => {
+ for (let i of []) {}
+ return (b = await 1);
+ })()`,
+ shouldMapBindings: false,
+ expectedMapped: {
+ await: true,
+ bindings: false,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "await (if condition)",
+ expression: "if (await true) console.log(1);",
+ newExpression: formatAwait("if (await true) console.log(1);"),
+ shouldMapBindings: false,
+ expectedMapped: {
+ await: true,
+ bindings: false,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "await (non-expression final statement: bug 1851759)",
+ expression: `j = { "foo": 1, "bar": 2 }; await 42; for (var k in j) { console.log(k); }`,
+ newExpression: formatAwait(`
+ j = {
+ foo: 1,
+ bar: 2,
+ };
+ await 42;
+ for (var k in j) {
+ console.log(k);
+ }`),
+ shouldMapBindings: false,
+ expectedMapped: {
+ await: true,
+ bindings: false,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "simple",
+ expression: "a",
+ newExpression: "a",
+ bindings: [],
+ mappings: {},
+ shouldMapBindings: true,
+ expectedMapped: {
+ await: false,
+ bindings: false,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "mappings",
+ expression: "a",
+ newExpression: "_a",
+ bindings: [],
+ mappings: {
+ a: "_a",
+ },
+ shouldMapBindings: true,
+ expectedMapped: {
+ await: false,
+ bindings: false,
+ originalExpression: true,
+ },
+ },
+ {
+ name: "declaration",
+ expression: "var a = 3;",
+ newExpression: "self.a = 3",
+ bindings: [],
+ mappings: {},
+ shouldMapBindings: true,
+ expectedMapped: {
+ await: false,
+ bindings: true,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "declaration + destructuring",
+ expression: "var { a } = { a: 3 };",
+ newExpression: "({ a: self.a } = {\n a: 3 \n})",
+ bindings: [],
+ mappings: {},
+ shouldMapBindings: true,
+ expectedMapped: {
+ await: false,
+ bindings: true,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "bindings",
+ expression: "var a = 3;",
+ newExpression: "a = 3",
+ bindings: ["a"],
+ mappings: {},
+ shouldMapBindings: true,
+ expectedMapped: {
+ await: false,
+ bindings: true,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "bindings + destructuring",
+ expression: "var { a } = { a: 3 };",
+ newExpression: "({ a } = { \n a: 3 \n })",
+ bindings: ["a"],
+ mappings: {},
+ shouldMapBindings: true,
+ expectedMapped: {
+ await: false,
+ bindings: true,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "bindings + destructuring + rest",
+ expression: "var { a, ...foo } = {}",
+ newExpression: "({ a, ...self.foo } = {})",
+ bindings: ["a"],
+ mappings: {},
+ shouldMapBindings: true,
+ expectedMapped: {
+ await: false,
+ bindings: true,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "bindings + array destructuring + rest",
+ expression: "var [a, ...foo] = []",
+ newExpression: "([a, ...self.foo] = [])",
+ bindings: ["a"],
+ mappings: {},
+ shouldMapBindings: true,
+ expectedMapped: {
+ await: false,
+ bindings: true,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "bindings + mappings",
+ expression: "a = 3;",
+ newExpression: "self.a = 3",
+ bindings: ["_a"],
+ mappings: { a: "_a" },
+ shouldMapBindings: true,
+ expectedMapped: {
+ await: false,
+ bindings: true,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "bindings + mappings + destructuring",
+ expression: "var { a } = { a: 4 }",
+ newExpression: "({ a: self.a } = {\n a: 4 \n})",
+ bindings: ["_a"],
+ mappings: { a: "_a" },
+ shouldMapBindings: true,
+ expectedMapped: {
+ await: false,
+ bindings: true,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "bindings without mappings",
+ expression: "a = 3;",
+ newExpression: "a = 3",
+ bindings: [],
+ mappings: { a: "_a" },
+ shouldMapBindings: false,
+ expectedMapped: {
+ await: false,
+ bindings: false,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "object destructuring + bindings without mappings",
+ expression: "({ a } = {});",
+ newExpression: "({ a: _a } = {})",
+ bindings: [],
+ mappings: { a: "_a" },
+ shouldMapBindings: false,
+ expectedMapped: {
+ await: false,
+ bindings: false,
+ originalExpression: true,
+ },
+ },
+ ]);
+});
diff --git a/devtools/client/debugger/src/workers/parser/tests/mapOriginalExpression.spec.js b/devtools/client/debugger/src/workers/parser/tests/mapOriginalExpression.spec.js
new file mode 100644
index 0000000000..4949d65cd9
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/mapOriginalExpression.spec.js
@@ -0,0 +1,93 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import mapExpression from "../mapExpression";
+import { format } from "prettier";
+
+const formatOutput = output =>
+ format(output, {
+ parser: "babel",
+ });
+
+const mapOriginalExpression = (expression, mappings) =>
+ mapExpression(expression, mappings, [], false, false).expression;
+
+describe("mapOriginalExpression", () => {
+ it("simple", () => {
+ const generatedExpression = mapOriginalExpression("a + b;", {
+ a: "foo",
+ b: "bar",
+ });
+ expect(generatedExpression).toEqual("foo + bar;");
+ });
+
+ it("this", () => {
+ const generatedExpression = mapOriginalExpression("this.prop;", {
+ this: "_this",
+ });
+ expect(generatedExpression).toEqual("_this.prop;");
+ });
+
+ it("member expressions", () => {
+ const generatedExpression = mapOriginalExpression("a + b", {
+ a: "_mod.foo",
+ b: "_mod.bar",
+ });
+ expect(generatedExpression).toEqual("_mod.foo + _mod.bar;");
+ });
+
+ it("block", () => {
+ // todo: maybe wrap with parens ()
+ const generatedExpression = mapOriginalExpression("{a}", {
+ a: "_mod.foo",
+ b: "_mod.bar",
+ });
+ expect(generatedExpression).toEqual("{\n _mod.foo;\n}");
+ });
+
+ it("skips codegen with no mappings", () => {
+ const generatedExpression = mapOriginalExpression("a + b", {
+ a: "a",
+ c: "_c",
+ });
+ expect(generatedExpression).toEqual("a + b");
+ });
+
+ it("object destructuring", () => {
+ const generatedExpression = mapOriginalExpression("({ a } = { a: 4 })", {
+ a: "_mod.foo",
+ });
+
+ expect(formatOutput(generatedExpression)).toEqual(
+ formatOutput("({ a: _mod.foo } = {\n a: 4 \n})")
+ );
+ });
+
+ it("nested object destructuring", () => {
+ const generatedExpression = mapOriginalExpression(
+ "({ a: { b, c } } = { a: 4 })",
+ {
+ a: "_mod.foo",
+ b: "_mod.bar",
+ }
+ );
+
+ expect(formatOutput(generatedExpression)).toEqual(
+ formatOutput("({ a: { b: _mod.bar, c } } = {\n a: 4 \n})")
+ );
+ });
+
+ it("shadowed bindings", () => {
+ const generatedExpression = mapOriginalExpression(
+ "window.thing = function fn(){ var a; a; b; }; a; b; ",
+ {
+ a: "_a",
+ b: "_b",
+ }
+ );
+ expect(generatedExpression).toEqual(
+ "window.thing = function fn() {\n var a;\n a;\n _b;\n};\n_a;\n_b;"
+ );
+ });
+});
diff --git a/devtools/client/debugger/src/workers/parser/tests/sources.spec.js b/devtools/client/debugger/src/workers/parser/tests/sources.spec.js
new file mode 100644
index 0000000000..e84ae4ad22
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/sources.spec.js
@@ -0,0 +1,14 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { getSource } from "../sources";
+
+describe("sources", () => {
+ it("fail getSource", () => {
+ const sourceId = "some.nonexistent.source.id";
+ expect(() => {
+ getSource(sourceId);
+ }).toThrow();
+ });
+});