155 lines
33 KiB
JavaScript
155 lines
33 KiB
JavaScript
|
(function() {
|
||
|
var escope, expect, harmony;
|
||
|
|
||
|
expect = require('chai').expect;
|
||
|
|
||
|
harmony = require('../third_party/esprima');
|
||
|
|
||
|
escope = require('..');
|
||
|
|
||
|
describe('ES6 class', function() {
|
||
|
it('declaration name creates class scope', function() {
|
||
|
var ast, scope, scopeManager;
|
||
|
ast = harmony.parse("class Derived extends Base {\n constructor() {\n }\n}\nnew Derived();");
|
||
|
scopeManager = escope.analyze(ast, {
|
||
|
ecmaVersion: 6
|
||
|
});
|
||
|
expect(scopeManager.scopes).to.have.length(3);
|
||
|
scope = scopeManager.scopes[0];
|
||
|
expect(scope.type).to.be.equal('global');
|
||
|
expect(scope.block.type).to.be.equal('Program');
|
||
|
expect(scope.isStrict).to.be["false"];
|
||
|
expect(scope.variables).to.have.length(1);
|
||
|
expect(scope.variables[0].name).to.be.equal('Derived');
|
||
|
expect(scope.references).to.have.length(2);
|
||
|
expect(scope.references[0].identifier.name).to.be.equal('Base');
|
||
|
expect(scope.references[1].identifier.name).to.be.equal('Derived');
|
||
|
scope = scopeManager.scopes[1];
|
||
|
expect(scope.type).to.be.equal('class');
|
||
|
expect(scope.block.type).to.be.equal('ClassDeclaration');
|
||
|
expect(scope.isStrict).to.be["true"];
|
||
|
expect(scope.variables).to.have.length(1);
|
||
|
expect(scope.variables[0].name).to.be.equal('Derived');
|
||
|
expect(scope.references).to.have.length(0);
|
||
|
scope = scopeManager.scopes[2];
|
||
|
expect(scope.type).to.be.equal('function');
|
||
|
expect(scope.block.type).to.be.equal('FunctionExpression');
|
||
|
expect(scope.isStrict).to.be["true"];
|
||
|
expect(scope.variables).to.have.length(1);
|
||
|
expect(scope.variables[0].name).to.be.equal('arguments');
|
||
|
return expect(scope.references).to.have.length(0);
|
||
|
});
|
||
|
it('declaration name creates class scope', function() {
|
||
|
var ast, scope, scopeManager;
|
||
|
ast = harmony.parse("class Base {\n constructor() {\n }\n}\nlet foo = new Base();");
|
||
|
scopeManager = escope.analyze(ast, {
|
||
|
ecmaVersion: 6
|
||
|
});
|
||
|
expect(scopeManager.scopes).to.have.length(3);
|
||
|
scope = scopeManager.scopes[0];
|
||
|
expect(scope.type).to.be.equal('global');
|
||
|
expect(scope.block.type).to.be.equal('Program');
|
||
|
expect(scope.isStrict).to.be["false"];
|
||
|
expect(scope.variables).to.have.length(2);
|
||
|
expect(scope.variables[0].name).to.be.equal('Base');
|
||
|
expect(scope.variables[1].name).to.be.equal('foo');
|
||
|
expect(scope.through).to.have.length(0);
|
||
|
expect(scope.references).to.have.length(2);
|
||
|
expect(scope.references[0].identifier.name).to.be.equal('foo');
|
||
|
expect(scope.references[1].identifier.name).to.be.equal('Base');
|
||
|
scope = scopeManager.scopes[1];
|
||
|
expect(scope.type).to.be.equal('class');
|
||
|
expect(scope.block.type).to.be.equal('ClassDeclaration');
|
||
|
expect(scope.isStrict).to.be["true"];
|
||
|
expect(scope.variables).to.have.length(1);
|
||
|
console.dir(scope.variables);
|
||
|
expect(scope.variables[0].name).to.be.equal('Base');
|
||
|
expect(scope.references).to.have.length(0);
|
||
|
scope = scopeManager.scopes[2];
|
||
|
expect(scope.type).to.be.equal('function');
|
||
|
expect(scope.block.type).to.be.equal('FunctionExpression');
|
||
|
expect(scope.isStrict).to.be["true"];
|
||
|
expect(scope.variables).to.have.length(1);
|
||
|
expect(scope.variables[0].name).to.be.equal('arguments');
|
||
|
return expect(scope.references).to.have.length(0);
|
||
|
});
|
||
|
it('expression name creates class scope#1', function() {
|
||
|
var ast, scope, scopeManager;
|
||
|
ast = harmony.parse("(class Derived extends Base {\n constructor() {\n }\n});");
|
||
|
scopeManager = escope.analyze(ast, {
|
||
|
ecmaVersion: 6
|
||
|
});
|
||
|
expect(scopeManager.scopes).to.have.length(3);
|
||
|
scope = scopeManager.scopes[0];
|
||
|
expect(scope.type).to.be.equal('global');
|
||
|
expect(scope.block.type).to.be.equal('Program');
|
||
|
expect(scope.isStrict).to.be["false"];
|
||
|
expect(scope.variables).to.have.length(0);
|
||
|
expect(scope.references).to.have.length(1);
|
||
|
expect(scope.references[0].identifier.name).to.be.equal('Base');
|
||
|
scope = scopeManager.scopes[1];
|
||
|
expect(scope.type).to.be.equal('class');
|
||
|
expect(scope.block.type).to.be.equal('ClassExpression');
|
||
|
expect(scope.isStrict).to.be["true"];
|
||
|
expect(scope.variables).to.have.length(1);
|
||
|
expect(scope.variables[0].name).to.be.equal('Derived');
|
||
|
expect(scope.references).to.have.length(0);
|
||
|
scope = scopeManager.scopes[2];
|
||
|
expect(scope.type).to.be.equal('function');
|
||
|
return expect(scope.block.type).to.be.equal('FunctionExpression');
|
||
|
});
|
||
|
it('expression name creates class scope#2', function() {
|
||
|
var ast, scope, scopeManager;
|
||
|
ast = harmony.parse("(class extends Base {\n constructor() {\n }\n});");
|
||
|
scopeManager = escope.analyze(ast, {
|
||
|
ecmaVersion: 6
|
||
|
});
|
||
|
expect(scopeManager.scopes).to.have.length(3);
|
||
|
scope = scopeManager.scopes[0];
|
||
|
expect(scope.type).to.be.equal('global');
|
||
|
expect(scope.block.type).to.be.equal('Program');
|
||
|
expect(scope.isStrict).to.be["false"];
|
||
|
expect(scope.variables).to.have.length(0);
|
||
|
expect(scope.references).to.have.length(1);
|
||
|
expect(scope.references[0].identifier.name).to.be.equal('Base');
|
||
|
scope = scopeManager.scopes[1];
|
||
|
expect(scope.type).to.be.equal('class');
|
||
|
expect(scope.block.type).to.be.equal('ClassExpression');
|
||
|
scope = scopeManager.scopes[2];
|
||
|
expect(scope.type).to.be.equal('function');
|
||
|
return expect(scope.block.type).to.be.equal('FunctionExpression');
|
||
|
});
|
||
|
return it('computed property key may refer variables', function() {
|
||
|
var ast, scope, scopeManager;
|
||
|
ast = harmony.parse("(function () {\n var yuyushiki = 42;\n (class {\n [yuyushiki]() {\n }\n\n [yuyushiki + 40]() {\n }\n });\n}());");
|
||
|
scopeManager = escope.analyze(ast, {
|
||
|
ecmaVersion: 6
|
||
|
});
|
||
|
expect(scopeManager.scopes).to.have.length(5);
|
||
|
scope = scopeManager.scopes[0];
|
||
|
expect(scope.type).to.be.equal('global');
|
||
|
expect(scope.block.type).to.be.equal('Program');
|
||
|
expect(scope.isStrict).to.be["false"];
|
||
|
scope = scopeManager.scopes[1];
|
||
|
expect(scope.type).to.be.equal('function');
|
||
|
expect(scope.block.type).to.be.equal('FunctionExpression');
|
||
|
expect(scope.isStrict).to.be["false"];
|
||
|
expect(scope.variables).to.have.length(2);
|
||
|
expect(scope.variables[0].name).to.be.equal('arguments');
|
||
|
expect(scope.variables[1].name).to.be.equal('yuyushiki');
|
||
|
expect(scope.references).to.have.length(1);
|
||
|
expect(scope.references[0].identifier.name).to.be.equal('yuyushiki');
|
||
|
scope = scopeManager.scopes[2];
|
||
|
expect(scope.type).to.be.equal('class');
|
||
|
expect(scope.block.type).to.be.equal('ClassExpression');
|
||
|
expect(scope.isStrict).to.be["true"];
|
||
|
expect(scope.variables).to.have.length(0);
|
||
|
expect(scope.references).to.have.length(2);
|
||
|
expect(scope.references[0].identifier.name).to.be.equal('yuyushiki');
|
||
|
return expect(scope.references[1].identifier.name).to.be.equal('yuyushiki');
|
||
|
});
|
||
|
});
|
||
|
|
||
|
}).call(this);
|
||
|
|
||
|
//# sourceMappingURL=data:application/json;base64,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
|