From cf2eb9469f1aa1079c0882f5741def53260f269b Mon Sep 17 00:00:00 2001 From: Ioan CHIRIAC Date: Sun, 8 Jan 2017 17:44:35 +0100 Subject: [PATCH] implement the variable reader --- src/lexer.js | 2 +- src/parser.js | 26 +++++++++++++++++++++----- test/parser.js | 21 +++++++++++++++++++++ 3 files changed, 43 insertions(+), 6 deletions(-) diff --git a/src/lexer.js b/src/lexer.js index c5cb0b7..bac6e9e 100644 --- a/src/lexer.js +++ b/src/lexer.js @@ -17,7 +17,7 @@ var Lexer = function (tokens) { // breaking symbols var lexerSymbols = [ - ',', '=', ':', '(', ')', '[', ']', '{', '}', '@', '"', '\'', '\\', '<', '>' + ',', '=', ':', '(', ')', '[', ']', '{', '}', '@', '"', '\'', '\\', '<', '>', '$' ]; // whitespace chars diff --git a/src/parser.js b/src/parser.js index 1417109..2776c51 100644 --- a/src/parser.js +++ b/src/parser.js @@ -38,7 +38,6 @@ var Parser = function (lexer, grammar) { this.parsers = { type: this.parseType, variable: this.parseVarName, - name: this.parseVarName, // alias of variable text: this.parseText, version: this.parseVersion, array: this.parseArray, @@ -58,7 +57,7 @@ var Parser = function (lexer, grammar) { }, { property: 'name', - parser: 'name', + parser: 'variable', optional: true }, { @@ -71,7 +70,7 @@ var Parser = function (lexer, grammar) { property: 'what', parser: 'type', optional: true, - default: 'void' + default: false }, { property: 'description', @@ -94,7 +93,12 @@ var Parser = function (lexer, grammar) { property: 'version', parser: 'version', optional: true, - default: 'latest' + default: { + major: 0, + minor: 0, + patch: 0, + label: null + } }, { property: 'description', @@ -299,6 +303,7 @@ Parser.prototype.parseRule = function (rule) { var result = this.parsers[rule.parser].apply(this, []); if (result === null) { this.lexer.unlex(backup); + this.lexer.backup = backup; if (typeof rule.default !== 'undefined') { return rule.default; } @@ -395,8 +400,19 @@ Parser.prototype.parseListOfTypes = function (charEnd) { return result; }; +/** + * Reads a variable name + */ Parser.prototype.parseVarName = function () { - + if (this.token === '$') { + this.token = this.lexer.lex(); // eat && continue + if (this.token === this.lexer._t.T_STRING) { + var result = this.lexer.text; + this.token = this.lexer.lex(); // eat && continue + return result; + } + } + return null; }; /** diff --git a/test/parser.js b/test/parser.js index d82596a..62bd259 100644 --- a/test/parser.js +++ b/test/parser.js @@ -78,6 +78,7 @@ describe('Test parser', function () { ast.body[0].what.name.should.be.exactly('void'); ast.body[0].description.should.be.exactly('Some extra informations'); }); + it('test return optional values', function () { var ast = doc.parse('/* @return \\Foo\\Bar[] */'); ast.body[0].kind.should.be.exactly('return'); @@ -87,4 +88,24 @@ describe('Test parser', function () { ast.body[0].what.value.fqn.should.be.exactly(true); ast.body[0].description.should.be.exactly(''); }); + + it('test return defaults', function () { + var ast = doc.parse('/* @return */'); + ast.body[0].kind.should.be.exactly('return'); + ast.body[0].what.should.be.exactly(false); + ast.body[0].description.should.be.exactly(''); + }); + + it('test param', function () { + var ast = doc.parse([ + '/**', + ' * Description', + ' * @param String $var Foo is Bar', + ' */' + ].join('\n')); + ast.body[0].kind.should.be.exactly('param'); + ast.body[0].type.name.should.be.exactly('String'); + ast.body[0].name.should.be.exactly('var'); + ast.body[0].description.should.be.exactly('Foo is Bar'); + }); });