From 16324f1b89c52583615067729f15cf666f2489fb Mon Sep 17 00:00:00 2001 From: Lukas Taegert-Atkinson Date: Wed, 5 Jun 2019 17:12:47 +0200 Subject: [PATCH] Handle early bind for member expressions (#2900) --- src/ast/nodes/MemberExpression.ts | 2 ++ test/form/samples/early-bind-member-expressions/_config.js | 4 ++++ test/form/samples/early-bind-member-expressions/_expected.js | 3 +++ test/form/samples/early-bind-member-expressions/main.js | 3 +++ 4 files changed, 12 insertions(+) create mode 100644 test/form/samples/early-bind-member-expressions/_config.js create mode 100644 test/form/samples/early-bind-member-expressions/_expected.js create mode 100644 test/form/samples/early-bind-member-expressions/main.js diff --git a/src/ast/nodes/MemberExpression.ts b/src/ast/nodes/MemberExpression.ts index 85e73f4b761..8d240f6d3d8 100644 --- a/src/ast/nodes/MemberExpression.ts +++ b/src/ast/nodes/MemberExpression.ts @@ -136,6 +136,7 @@ export default class MemberExpression extends NodeBase implements DeoptimizableE recursionTracker: ImmutableEntityPathTracker, origin: DeoptimizableEntity ): LiteralValueOrUnknown { + if (!this.bound) this.bind(); if (this.variable !== null) { return this.variable.getLiteralValueAtPath(path, recursionTracker, origin); } @@ -153,6 +154,7 @@ export default class MemberExpression extends NodeBase implements DeoptimizableE recursionTracker: ImmutableEntityPathTracker, origin: DeoptimizableEntity ) { + if (!this.bound) this.bind(); if (this.variable !== null) { return this.variable.getReturnExpressionWhenCalledAtPath(path, recursionTracker, origin); } diff --git a/test/form/samples/early-bind-member-expressions/_config.js b/test/form/samples/early-bind-member-expressions/_config.js new file mode 100644 index 00000000000..bfd03baa8d6 --- /dev/null +++ b/test/form/samples/early-bind-member-expressions/_config.js @@ -0,0 +1,4 @@ +module.exports = { + description: 'correctly resolves namespace members when accessed early (#2895)', + options: { external: 'external' } +}; diff --git a/test/form/samples/early-bind-member-expressions/_expected.js b/test/form/samples/early-bind-member-expressions/_expected.js new file mode 100644 index 00000000000..b97ab2d0f75 --- /dev/null +++ b/test/form/samples/early-bind-member-expressions/_expected.js @@ -0,0 +1,3 @@ +import { y } from 'external'; + +const {x} = y(); diff --git a/test/form/samples/early-bind-member-expressions/main.js b/test/form/samples/early-bind-member-expressions/main.js new file mode 100644 index 00000000000..782e2000993 --- /dev/null +++ b/test/form/samples/early-bind-member-expressions/main.js @@ -0,0 +1,3 @@ +import * as stuff from 'external' + +const {x} = stuff.y();