X-Git-Url: http://git.roojs.org/?p=gnome.introspection-doc-generator;a=blobdiff_plain;f=JSDOC%2FTokenStream.vala;h=6c6f8adc087eb3b5bedfba16f74803eb2f658328;hp=fb2f8841c76a8555e6ff37eb3fa68e28730a0fbe;hb=76403eff4ef6e64d68f22883edf1c32d9059d4e5;hpb=5094a2463991cdac5d319412b18f5a0694b92b7a diff --git a/JSDOC/TokenStream.vala b/JSDOC/TokenStream.vala index fb2f884..6c6f8ad 100644 --- a/JSDOC/TokenStream.vala +++ b/JSDOC/TokenStream.vala @@ -12,11 +12,14 @@ namespace JSDOC { + public errordomain TokenStreamError { + ArgumentError + } public class TokenStream : Object { - Gee.ArrayList tokens; - int cursor; // where are we in the stream. + protected Gee.ArrayList tokens; + public int cursor; // where are we in the stream. public TokenStream(Gee.ArrayList tokens) { @@ -25,7 +28,10 @@ namespace JSDOC { this.rewind(); } - + public Gee.ArrayList toArray() + { + return this.tokens; + } public void rewind() { @@ -55,7 +61,7 @@ namespace JSDOC { if (i < 0) { return new Token("", "VOID", "START_OF_STREAM"); } - if (i > this.tokens.size) { + if (i >= this.tokens.size) { return new Token("", "VOID", "END_OF_STREAM"); } @@ -71,7 +77,7 @@ namespace JSDOC { i += (n < 0) ? -1 : 1; } - return new Token("", "VOID", "STREAM_ERROR"); // because null isn't an object and caller always expects an object + // return new Token("", "VOID", "STREAM_ERROR"); // because null isn't an object and caller always expects an object } @@ -91,7 +97,7 @@ namespace JSDOC { } // should not get here! - return -1; + // return -1; } @@ -118,7 +124,7 @@ namespace JSDOC { } return new Token("", "VOID", "END_OF_STREAM"); } - if (i > this.tokens.length) { + if (i >= this.tokens.size) { return new Token("", "VOID", "END_OF_STREAM"); } @@ -134,7 +140,7 @@ namespace JSDOC { i += (n < 0) ? -1 : 1; } // should never get here.. - return new Token("", "VOID", "END_OF_STREAM");; // because null isn't an object and caller always expects an object; + // return new Token("", "VOID", "END_OF_STREAM");; // because null isn't an object and caller always expects an object; } @@ -158,11 +164,12 @@ namespace JSDOC { } - public Gee.ArrayList nextM(uint howMany) { + public Gee.ArrayList? nextM(int howMany) throws TokenStreamError { //if (typeof howMany == "undefined") howMany = 1; - // if (howMany < 1) { return null; } - + if (howMany < 2) { + throw new TokenStreamError.ArgumentError("nextM called with wrong number : %d", howMany); + } var got = new Gee.ArrayList(); for (var i = 1; i <= howMany; i++) { @@ -172,11 +179,8 @@ namespace JSDOC { got.add(this.tokens.get(this.cursor+i)); } this.cursor += howMany; - - if (howMany == 1) { - return got - } - else return got; + + return got; } @@ -184,41 +188,55 @@ namespace JSDOC { // what about comments after 'function'... // is this used ??? - nextTok : function() { + public Token? nextTok() { return this.nextNonSpace(); - }, - nextNonSpace : function () + } + + public Token? nextNonSpace () { while (true) { - tok = this.next(1); - if (!tok) { - return false; + var tok = this.next(); + if (tok == null) { + return null; } - if (tok.is('WHIT') || tok.is('COMM')) { + if (tok.is("WHIT") || tok.is("COMM")) { continue; } return tok; } - }, + } + /** - * @type JSDOC.Token[] + * balance + * -- returns all the tokens betweeen and including stop token eg.. from {... to } * @param start {String} token name or data (eg. '{' * @param stop {String} (Optional) token name or data (eg. '}' */ - balance : function(/**String*/start, /**String*/stop) { - - - start = typeof(Lang.punc(start)) == 'undefined' ? start : Lang.punc(start); + public Gee.ArrayList balance (string start, string in_stop = "") throws TokenStreamError + { - if (!stop) stop = Lang.matching(start); + // accepts names or "{" etc.. + var stop = in_stop; + start = Lang.punc(start) == null ? start : Lang.punc(start); + if (stop=="") { + var newstop = Lang.matching(start); + stop = newstop; + } + if (stop == null) { + throw new TokenStreamError.ArgumentError("balance called with invalid start/stop : %s",start); + } + debug("START=%s, STOP=%s \n", start,stop); var depth = 0; - var got = []; + var got = new Gee.ArrayList(); var started = false; //Seed.print("START:" + start); //Seed.print("STOP:" + stop); - while ((token = this.look())) { + Token token; + + while (null != (token = this.look(1,false))) { + debug("BALANCE: " + token.asString()); if (token.is(start)) { // Seed.print("balance: START : " + depth + " " + token.data); depth++; @@ -226,59 +244,84 @@ namespace JSDOC { } if (started) { - got.push(token); + got.add(token); } if (token.is(stop)) { depth--; // Seed.print("balance: STOP: " + depth + " " + token.data); - if (depth < 1) return got; + if (depth < 1) { + return got; + } } - if (!this.next()) break; + if (null == this.next()) { + break; + } } - return false; - }, + return new Gee.ArrayList(); + } - getMatchingToken : function(/**String*/start, /**String*/stop) { + public Token? getMatchingToken(string start, string stop) + { var depth = 0; var cursor = this.cursor; - if (!start) { - start = Lang.matching(stop); + if (start.length < 1) { + var ns = Lang.matching(stop); + start = ns; depth = 1; } - if (!stop) stop = Lang.matching(start); + if (stop.length < 1) { + var ns = Lang.matching(start); + stop = ns; + } + Token token; - while ((token = this.tokens[cursor])) { + while (null != (token = this.tokens[cursor])) { if (token.is(start)) { depth++; } - if (token.is(stop) && cursor) { + if (token.is(stop) && cursor != 0) { depth--; - if (depth == 0) return this.tokens[cursor]; + if (depth == 0) { + return this.tokens[cursor]; + } } cursor++; } - return false; - }, - - insertAhead : function(/**JSDOC.Token*/token) { - this.tokens.splice(this.cursor+1, 0, token); - }, + return null; + } + /* + public Gee.ArrayList insertAhead(Token token) + { + this.tokens.splice(this.cursor+1, 0, token); // fixme... + } + */ - remaining : function() { - var ret = []; + public Gee.ArrayList remaining() { + var ret = new Gee.ArrayList(); while (true) { var tok = this.look(1,true); - if (!tok || !tok.is || tok.is('VOID')) { + if (tok.is("VOID")) { return ret; } - ret.push(this.next(1)); + var nt = this.next(); + if (nt != null) { + ret.add(nt); + } } - }, + } - + + public void printRange(int start, int end) { + + for(var i = start; i < end +1; i++) { + print(this.tokens.get(i).asString()); + } + } + + /* arrayToString : function(ar) { console.log(typeof(ar)); var ret = []; @@ -287,16 +330,29 @@ namespace JSDOC { }) return ret.join(''); }, - dump: function(start, end) + */ + public void dump(int start, int end) { - start = Math.max(start || 0, 0); - end = Math.min(end || this.tokens.length, this.tokens.length); - var out=''; + start = int.max(start , 0); + end = int.min(end, this.tokens.size); + var outs = "";; for (var i =start;i < end; i++) { - out += (this.tokens[i].outData == false) ? this.tokens[i].data : this.tokens[i].outData; - }; - print(out); + outs += (this.tokens[i].outData == "") ? this.tokens[i].data : this.tokens[i].outData; + } + print(outs); + } + + public void dumpAll(string indent) + { + for (var i = 0;i < this.tokens.size; i++) { + + this.tokens[i].dump(""); + } + } -}); + + + } +}