Browse Source

optimize ns["foo"] (#841)

gh-1187
Rich-Harris 8 years ago
parent
commit
82b284de1d
  1. 20
      src/ast/nodes/MemberExpression.js
  2. 3
      test/form/namespace-optimization-computed-string/_config.js
  3. 7
      test/form/namespace-optimization-computed-string/_expected/amd.js
  4. 5
      test/form/namespace-optimization-computed-string/_expected/cjs.js
  5. 3
      test/form/namespace-optimization-computed-string/_expected/es.js
  6. 8
      test/form/namespace-optimization-computed-string/_expected/iife.js
  7. 11
      test/form/namespace-optimization-computed-string/_expected/umd.js
  8. 3
      test/form/namespace-optimization-computed-string/bar.js
  9. 3
      test/form/namespace-optimization-computed-string/foo.js
  10. 3
      test/form/namespace-optimization-computed-string/main.js
  11. 1
      test/form/namespace-optimization-computed-string/quux.js

20
src/ast/nodes/MemberExpression.js

@ -1,14 +1,24 @@
import isReference from 'is-reference';
import relativeId from '../../utils/relativeId.js';
import Node from '../Node.js';
import { UNKNOWN } from '../values.js';
const validProp = /^[a-zA-Z_$][a-zA-Z_$0-9]*$/;
class Keypath {
constructor ( node ) {
this.parts = [];
while ( node.type === 'MemberExpression' ) {
this.parts.unshift( node.property );
const prop = node.property;
if ( node.computed ) {
if ( prop.type !== 'Literal' || typeof prop.value !== 'string' || !validProp.test( prop.value ) ) {
this.computed = true;
return;
}
}
this.parts.unshift( prop );
node = node.object;
}
@ -21,21 +31,21 @@ export default class MemberExpression extends Node {
// if this resolves to a namespaced declaration, prepare
// to replace it
// TODO this code is a bit inefficient
if ( isReference( this ) ) { // TODO optimise namespace access like `foo['bar']` as well
const keypath = new Keypath( this );
if ( !keypath.computed ) {
let declaration = scope.findDeclaration( keypath.root.name );
while ( declaration.isNamespace && keypath.parts.length ) {
const exporterId = declaration.module.id;
const part = keypath.parts[0];
declaration = declaration.module.traceExport( part.name );
declaration = declaration.module.traceExport( part.name || part.value );
if ( !declaration ) {
this.module.warn({
code: 'MISSING_EXPORT',
message: `'${part.name}' is not exported by '${relativeId( exporterId )}'`,
message: `'${part.name || part.value}' is not exported by '${relativeId( exporterId )}'`,
url: `https://github.com/rollup/rollup/wiki/Troubleshooting#name-is-not-exported-by-module`
}, part.start );
this.replacement = 'undefined';

3
test/form/namespace-optimization-computed-string/_config.js

@ -0,0 +1,3 @@
module.exports = {
description: 'it does dynamic lookup optimization of internal namespaces for string-literal keys'
};

7
test/form/namespace-optimization-computed-string/_expected/amd.js

@ -0,0 +1,7 @@
define(function () { 'use strict';
function a () {}
a();
});

5
test/form/namespace-optimization-computed-string/_expected/cjs.js

@ -0,0 +1,5 @@
'use strict';
function a () {}
a();

3
test/form/namespace-optimization-computed-string/_expected/es.js

@ -0,0 +1,3 @@
function a () {}
a();

8
test/form/namespace-optimization-computed-string/_expected/iife.js

@ -0,0 +1,8 @@
(function () {
'use strict';
function a () {}
a();
}());

11
test/form/namespace-optimization-computed-string/_expected/umd.js

@ -0,0 +1,11 @@
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory() :
typeof define === 'function' && define.amd ? define(factory) :
(factory());
}(this, (function () { 'use strict';
function a () {}
a();
})));

3
test/form/namespace-optimization-computed-string/bar.js

@ -0,0 +1,3 @@
import * as quux from './quux.js';
export { quux };

3
test/form/namespace-optimization-computed-string/foo.js

@ -0,0 +1,3 @@
import * as bar from './bar.js';
export { bar };

3
test/form/namespace-optimization-computed-string/main.js

@ -0,0 +1,3 @@
import * as foo from './foo.js';
foo['bar']['quux']['a']();

1
test/form/namespace-optimization-computed-string/quux.js

@ -0,0 +1 @@
export function a () {}
Loading…
Cancel
Save