Skip to content

Commit

Permalink
fix setter/getter
Browse files Browse the repository at this point in the history
  • Loading branch information
army8735 committed Jun 8, 2014
1 parent c039697 commit 6398d14
Show file tree
Hide file tree
Showing 5 changed files with 188 additions and 33 deletions.
22 changes: 9 additions & 13 deletions dist/parser/es6/Parser.js
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@
this.length = 0;
this.ignores = {};
this.hasMoveLine = false;
this.module = false;
this.tree = {};
if(lexer) {
this.lexer = lexer;
Expand All @@ -70,15 +71,10 @@
var node = new Node(Node.SCRIPT);
if(this.look) {
node.add(this.modulebody());
//未出现export时,此script不是一个模块
var leaves = node.leaf(0).leaves();
for(i = 0; i < leaves.length; i++) {
if(leaves[i].name() == Node.EXPORTDECL) {
return node;
}
//未出现module,import,export时,此script不是一个模块
if(!this.module) {
node.leaf(0).name(Node.SCRIPTBODY);
}
node.leaf(0).name(Node.SCRIPTBODY);
return node;
}
return node;
},
Expand All @@ -91,12 +87,15 @@
},
moduleitem: function() {
if(this.look.content() == 'module') {
this.module = true;
return this.moduleimport();
}
else if(this.look.content() == 'import') {
this.module = true;
return this.importdecl();
}
else if(this.look.content() == 'export') {
this.module = true;
return this.exportdecl();
}
else {
Expand Down Expand Up @@ -2001,10 +2000,7 @@
if(!this.look) {
this.error();
}
if(['get', 'set'].indexOf(this.look.content()) > -1) {
node.add(this.method(noIn, noOf));
}
else if(this.look.content() == '[') {
if(this.look.content() == '[') {
var cmpt = this.cmptpropt(noIn, noOf);
if(!this.look) {
this.error();
Expand All @@ -2028,7 +2024,7 @@
for(var i = this.index; i < this.length; i++) {
var next = this.tokens[i];
if(!S[next.type()]) {
if(next.content() == '(') {
if([Token.KEYWORD, Token.ID].indexOf(next.type()) > -1 || next.content() == '(') {
node.add(this.method(noIn, noOf));
end = true;
}
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "homunculus",
"version": "0.2.5",
"version": "0.2.6",
"description": "A lexer&parser by Javascript",
"maintainers": [
{
Expand Down
22 changes: 9 additions & 13 deletions src/parser/es6/Parser.js
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ var Parser = IParser.extend(function(lexer) {
this.length = 0;
this.ignores = {};
this.hasMoveLine = false;
this.module = false;
this.tree = {};
if(lexer) {
this.lexer = lexer;
Expand All @@ -62,15 +63,10 @@ var Parser = IParser.extend(function(lexer) {
var node = new Node(Node.SCRIPT);
if(this.look) {
node.add(this.modulebody());
//未出现export时,此script不是一个模块
var leaves = node.leaf(0).leaves();
for(i = 0; i < leaves.length; i++) {
if(leaves[i].name() == Node.EXPORTDECL) {
return node;
}
//未出现module,import,export时,此script不是一个模块
if(!this.module) {
node.leaf(0).name(Node.SCRIPTBODY);
}
node.leaf(0).name(Node.SCRIPTBODY);
return node;
}
return node;
},
Expand All @@ -83,12 +79,15 @@ var Parser = IParser.extend(function(lexer) {
},
moduleitem: function() {
if(this.look.content() == 'module') {
this.module = true;
return this.moduleimport();
}
else if(this.look.content() == 'import') {
this.module = true;
return this.importdecl();
}
else if(this.look.content() == 'export') {
this.module = true;
return this.exportdecl();
}
else {
Expand Down Expand Up @@ -1993,10 +1992,7 @@ var Parser = IParser.extend(function(lexer) {
if(!this.look) {
this.error();
}
if(['get', 'set'].indexOf(this.look.content()) > -1) {
node.add(this.method(noIn, noOf));
}
else if(this.look.content() == '[') {
if(this.look.content() == '[') {
var cmpt = this.cmptpropt(noIn, noOf);
if(!this.look) {
this.error();
Expand All @@ -2020,7 +2016,7 @@ var Parser = IParser.extend(function(lexer) {
for(var i = this.index; i < this.length; i++) {
var next = this.tokens[i];
if(!S[next.type()]) {
if(next.content() == '(') {
if([Token.KEYWORD, Token.ID].indexOf(next.type()) > -1 || next.content() == '(') {
node.add(this.method(noIn, noOf));
end = true;
}
Expand Down
153 changes: 147 additions & 6 deletions tests/es6parser.js
Original file line number Diff line number Diff line change
Expand Up @@ -1393,32 +1393,32 @@ describe('es6parser', function() {
it('module from', function() {
var parser = homunculus.getParser('es6');
var node = parser.parse('module a from "a"');
expect(tree(node)).to.eql([JsNode.SCRIPT,[JsNode.SCRIPTBODY,[JsNode.MODULEIMPORT,["module",JsNode.BINDID,["a"],JsNode.FROMCAULSE,["from","\"a\""]]]]]);
expect(tree(node)).to.eql([JsNode.SCRIPT,[JsNode.MODULEBODY,[JsNode.MODULEIMPORT,["module",JsNode.BINDID,["a"],JsNode.FROMCAULSE,["from","\"a\""]]]]]);
});
it('module import', function() {
var parser = homunculus.getParser('es6');
var node = parser.parse('import "a"');
expect(tree(node)).to.eql([JsNode.SCRIPT,[JsNode.SCRIPTBODY,[JsNode.IMPORTDECL,["import","\"a\""]]]]);
expect(tree(node)).to.eql([JsNode.SCRIPT,[JsNode.MODULEBODY,[JsNode.IMPORTDECL,["import","\"a\""]]]]);
});
it('module import from 1', function() {
var parser = homunculus.getParser('es6');
var node = parser.parse('import {} from "a"');
expect(tree(node)).to.eql([JsNode.SCRIPT,[JsNode.SCRIPTBODY,[JsNode.IMPORTDECL,["import",JsNode.IMPORTCAULSE,[JsNode.NAMEIMPORT,["{","}"]],JsNode.FROMCAULSE,["from","\"a\""]]]]]);
expect(tree(node)).to.eql([JsNode.SCRIPT,[JsNode.MODULEBODY,[JsNode.IMPORTDECL,["import",JsNode.IMPORTCAULSE,[JsNode.NAMEIMPORT,["{","}"]],JsNode.FROMCAULSE,["from","\"a\""]]]]]);
});
it('module import from 2', function() {
var parser = homunculus.getParser('es6');
var node = parser.parse('import {x} from "a"');
expect(tree(node)).to.eql([JsNode.SCRIPT,[JsNode.SCRIPTBODY,[JsNode.IMPORTDECL,["import",JsNode.IMPORTCAULSE,[JsNode.NAMEIMPORT,["{",JsNode.IMPORTSPEC,["x"],"}"]],JsNode.FROMCAULSE,["from","\"a\""]]]]]);
expect(tree(node)).to.eql([JsNode.SCRIPT,[JsNode.MODULEBODY,[JsNode.IMPORTDECL,["import",JsNode.IMPORTCAULSE,[JsNode.NAMEIMPORT,["{",JsNode.IMPORTSPEC,["x"],"}"]],JsNode.FROMCAULSE,["from","\"a\""]]]]]);
});
it('module import from 3', function() {
var parser = homunculus.getParser('es6');
var node = parser.parse('import x from "a"');
expect(tree(node)).to.eql([JsNode.SCRIPT,[JsNode.SCRIPTBODY,[JsNode.IMPORTDECL,["import",JsNode.IMPORTCAULSE,["x"],JsNode.FROMCAULSE,["from","\"a\""]]]]]);
expect(tree(node)).to.eql([JsNode.SCRIPT,[JsNode.MODULEBODY,[JsNode.IMPORTDECL,["import",JsNode.IMPORTCAULSE,["x"],JsNode.FROMCAULSE,["from","\"a\""]]]]]);
});
it('module import from as', function() {
var parser = homunculus.getParser('es6');
var node = parser.parse('import x,{y as z,} from "a"');
expect(tree(node)).to.eql([JsNode.SCRIPT,[JsNode.SCRIPTBODY,[JsNode.IMPORTDECL,["import",JsNode.IMPORTCAULSE,["x",",",JsNode.NAMEIMPORT,["{",JsNode.IMPORTSPEC,["y","as",JsNode.BINDID,["z"]],",","}"]],JsNode.FROMCAULSE,["from","\"a\""]]]]]);
expect(tree(node)).to.eql([JsNode.SCRIPT,[JsNode.MODULEBODY,[JsNode.IMPORTDECL,["import",JsNode.IMPORTCAULSE,["x",",",JsNode.NAMEIMPORT,["{",JsNode.IMPORTSPEC,["y","as",JsNode.BINDID,["z"]],",","}"]],JsNode.FROMCAULSE,["from","\"a\""]]]]]);
});
it('module export *', function() {
var parser = homunculus.getParser('es6');
Expand Down Expand Up @@ -1504,11 +1504,152 @@ describe('es6parser', function() {
parser.parse('export x from');
}).to.throwError();
});
it('module not in global env', function() {
var parser = homunculus.getParser('es6');
expect(function() {
parser.parse('function a() { export * from "xxx" }');
}).to.throwError();
});
it('export module import be property name', function() {
var parser = homunculus.getParser('es6');
var node = parser.parse('a.export = 1');
expect(tree(node)).to.eql([JsNode.SCRIPT,[JsNode.SCRIPTBODY,[JsNode.EXPRSTMT,[JsNode.ASSIGNEXPR,[JsNode.MMBEXPR,[JsNode.PRMREXPR,["a"],".","export"],"=",JsNode.PRMREXPR,["1"]]]]]]);
});
it('getter', function() {
var parser = homunculus.getParser('es6');
var node = parser.parse('var o = {get a(){}}');
expect(tree(node)).to.eql(
[JsNode.SCRIPT,[JsNode.SCRIPTBODY,[JsNode.VARSTMT,["var",JsNode.VARDECL,[JsNode.BINDID,["o"],JsNode.INITLZ,["=",JsNode.PRMREXPR,[JsNode.OBJLTR,["{",JsNode.PROPTDEF,[JsNode.METHOD,["get",JsNode.PROPTNAME,[JsNode.LTRPROPT,["a"]],"(",")","{",JsNode.FNBODY,[],"}"]],"}"]]]]]]]]);
});
it('get be an property', function() {
var parser = homunculus.getParser('es6');
var node = parser.parse('var o = {get:1}');
expect(tree(node)).to.eql([JsNode.SCRIPT,[JsNode.SCRIPTBODY,[JsNode.VARSTMT,["var",JsNode.VARDECL,[JsNode.BINDID,["o"],JsNode.INITLZ,["=",JsNode.PRMREXPR,[JsNode.OBJLTR,["{",JsNode.PROPTDEF,[JsNode.PROPTNAME,[JsNode.LTRPROPT,["get"]],":",JsNode.PRMREXPR,["1"]],"}"]]]]]]]]);
});
it('getter error 1', function() {
var parser = homunculus.getParser('es6');
expect(function() {
parser.parse('var o = {get a}');
}).to.throwError();
});
it('getter error 2', function() {
var parser = homunculus.getParser('es6');
expect(function() {
parser.parse('var o = {get a(}');
}).to.throwError();
});
it('getter error 3', function() {
var parser = homunculus.getParser('es6');
expect(function() {
parser.parse('var o = {get a()}');
}).to.throwError();
});
it('getter error 4', function() {
var parser = homunculus.getParser('es6');
expect(function() {
parser.parse('var o = {get 3}');
}).to.throwError();
});
it('setter', function() {
var parser = homunculus.getParser('es6');
var node = parser.parse('var o = {set a(b){}}');
expect(tree(node)).to.eql([JsNode.SCRIPT,[JsNode.SCRIPTBODY,[JsNode.VARSTMT,["var",JsNode.VARDECL,[JsNode.BINDID,["o"],JsNode.INITLZ,["=",JsNode.PRMREXPR,[JsNode.OBJLTR,["{",JsNode.PROPTDEF,[JsNode.METHOD,["set",JsNode.PROPTNAME,[JsNode.LTRPROPT,["a"]],"(",JsNode.FMPARAMS,[JsNode.SINGLENAME,[JsNode.BINDID,["b"]]],")","{",JsNode.FNBODY,[],"}"]],"}"]]]]]]]]);
});
it('set be an property', function() {
var parser = homunculus.getParser('es6');
var node = parser.parse('var o = {set:1}');
expect(tree(node)).to.eql([JsNode.SCRIPT,[JsNode.SCRIPTBODY,[JsNode.VARSTMT,["var",JsNode.VARDECL,[JsNode.BINDID,["o"],JsNode.INITLZ,["=",JsNode.PRMREXPR,[JsNode.OBJLTR,["{",JsNode.PROPTDEF,[JsNode.PROPTNAME,[JsNode.LTRPROPT,["set"]],":",JsNode.PRMREXPR,["1"]],"}"]]]]]]]]);
});
it('setter error 1', function() {
var parser = homunculus.getParser('es6');
expect(function() {
parser.parse('var o = {set a}');
}).to.throwError();
});
it('setter error 2', function() {
var parser = homunculus.getParser('es6');
expect(function() {
parser.parse('var o = {set a(}');
}).to.throwError();
});
it('setter error 3', function() {
var parser = homunculus.getParser('es6');
expect(function() {
parser.parse('var o = {set a()}');
}).to.throwError();
});
it('setter error 4', function() {
var parser = homunculus.getParser('es6');
expect(function() {
parser.parse('var o = {set 3(){}}');
}).to.throwError();
});
});
describe('js lib exec test', function() {
it('jquery 1.11.0', function() {
var parser = homunculus.getParser('es6');
var code = fs.readFileSync(path.join(__dirname, './lib/jquery-1.11.0.js'), { encoding: 'utf-8' });
var node = parser.parse(code);
var ignore = parser.ignore();
var str = jion(node, ignore);
expect(str).to.eql(code);
});
it('jquery 1.11.0 min', function() {
var parser = homunculus.getParser('es6');
var code = fs.readFileSync(path.join(__dirname, './lib/jquery-1.11.0.min.js'), { encoding: 'utf-8' });
var node = parser.parse(code);
var ignore = parser.ignore();
var str = jion(node, ignore);
expect(str).to.eql(code);
});
it('backbone 1.1.0', function() {
var parser = homunculus.getParser('es6');
var code = fs.readFileSync(path.join(__dirname, './lib/backbone.js'), { encoding: 'utf-8' });
var node = parser.parse(code);
var ignore = parser.ignore();
var str = jion(node, ignore);
expect(str).to.eql(code);
});
it('handlebars', function() {
var parser = homunculus.getParser('es6');
var code = fs.readFileSync(path.join(__dirname, './lib/handlebars.js'), { encoding: 'utf-8' });
var node = parser.parse(code);
var ignore = parser.ignore();
var str = jion(node, ignore);
expect(str).to.eql(code);
});
it('bootstrap 3.0.0', function() {
var parser = homunculus.getParser('es6');
var code = fs.readFileSync(path.join(__dirname, './lib/bootstrap.js'), { encoding: 'utf-8' });
var node = parser.parse(code);
var ignore = parser.ignore();
var str = jion(node, ignore);
expect(str).to.eql(code);
});
it('expect 0.1.2', function() {
var parser = homunculus.getParser('es6');
var code = fs.readFileSync(path.join(__dirname, './lib/expect.js'), { encoding: 'utf-8' });
var node = parser.parse(code);
var ignore = parser.ignore();
var str = jion(node, ignore);
expect(str).to.eql(code);
});
it('html5shiv 3.6.1', function() {
var parser = homunculus.getParser('es6');
var code = fs.readFileSync(path.join(__dirname, './lib/html5shiv.js'), { encoding: 'utf-8' });
var node = parser.parse(code);
var ignore = parser.ignore();
var str = jion(node, ignore);
expect(str).to.eql(code);
});
it('formatter', function() {
var parser = homunculus.getParser('es6');
var code = fs.readFileSync(path.join(__dirname, './lib/formatter.js'), { encoding: 'utf-8' });
var node = parser.parse(code);
var ignore = parser.ignore();
var str = jion(node, ignore);
expect(str).to.eql(code);
});
});
describe('other test', function() {
it('node #parent,#prev,#next', function () {
Expand Down
22 changes: 22 additions & 0 deletions tests/jsparser.js
Original file line number Diff line number Diff line change
Expand Up @@ -335,6 +335,11 @@ describe('jsparser', function() {
var node = parser.parse('var o = {get a(){}}');
expect(tree(node)).to.eql([JsNode.PROGRAM,[JsNode.VARSTMT,["var",JsNode.VARDECL,["o",JsNode.ASSIGN,["=",JsNode.PRMREXPR,[JsNode.OBJLTR,["{",JsNode.PROPTASSIGN,["get","a","(",")","{",JsNode.FNBODY,[],"}"],"}"]]]]]]]);
});
it('get be an property', function() {
var parser = homunculus.getParser('js');
var node = parser.parse('var o = {get:1}');
expect(tree(node)).to.eql([JsNode.PROGRAM,[JsNode.VARSTMT,["var",JsNode.VARDECL,["o",JsNode.ASSIGN,["=",JsNode.PRMREXPR,[JsNode.OBJLTR,["{",JsNode.PROPTASSIGN,["get",":",JsNode.PRMREXPR,["1"]],"}"]]]]]]]);
});
it('getter error 1', function() {
var parser = homunculus.getParser('js');
expect(function() {
Expand All @@ -359,11 +364,22 @@ describe('jsparser', function() {
parser.parse('var o = {get 3}');
}).to.throwError();
});
it('getter error 5', function() {
var parser = homunculus.getParser('js');
expect(function() {
parser.parse('var o = {get 3(){}}');
}).to.throwError();
});
it('setter', function() {
var parser = homunculus.getParser('js');
var node = parser.parse('var o = {set a(b){}}');
expect(tree(node)).to.eql([JsNode.PROGRAM,[JsNode.VARSTMT,["var",JsNode.VARDECL,["o",JsNode.ASSIGN,["=",JsNode.PRMREXPR,[JsNode.OBJLTR,["{",JsNode.PROPTASSIGN,["set","a","(","b",")","{",JsNode.FNBODY,[],"}"],"}"]]]]]]]);
});
it('set be an property', function() {
var parser = homunculus.getParser('js');
var node = parser.parse('var o = {set:1}');
expect(tree(node)).to.eql([JsNode.PROGRAM,[JsNode.VARSTMT,["var",JsNode.VARDECL,["o",JsNode.ASSIGN,["=",JsNode.PRMREXPR,[JsNode.OBJLTR,["{",JsNode.PROPTASSIGN,["set",":",JsNode.PRMREXPR,["1"]],"}"]]]]]]]);
});
it('setter error 1', function() {
var parser = homunculus.getParser('js');
expect(function() {
Expand All @@ -383,6 +399,12 @@ describe('jsparser', function() {
}).to.throwError();
});
it('setter error 4', function() {
var parser = homunculus.getParser('js');
expect(function() {
parser.parse('var o = {set 4}');
}).to.throwError();
});
it('setter error 5', function() {
var parser = homunculus.getParser('js');
expect(function() {
parser.parse('var o = {set a(){}}');
Expand Down

0 comments on commit 6398d14

Please sign in to comment.