UNPKG

mmir-lib

Version:

MMIR (Mobile Multimodal Interaction and Relay) library

764 lines (722 loc) 29.9 kB
/** * Dependencies: * * * parser.element (parserModule.js) * * OPTIONALLY: ANTLR TokenStream (antlr3-all.js) * (if present, the constructor may be able to automatically derive start/end properties from given argument) * * * @requires antlr3-all.js as <code>org</code> (see comment above) * */ define(['mmirf/parserModule'], //this comment is needed by jsdoc2 [copy of comment for: function ParsingResult(...] /** * ParsingResult represents an element that was detected during parsing. * * <p> * The detected element is referenced by the properties <code>start</code> and <code>end</code> * that refer to the start-index and end-index within the parsed text. * * <p> * The ParsingResult has a <code>type</code> property which refers to the kind of element * that was detected (see constants in {@link mmir.parser.Element}). * * <p> * In addition, the ParsingResult may have several properties that depend of its type. In general, * these properties refer to detected parts of the element (e.g. for a invocation-statement, these * may refer to its arguments). * * * <p> * Properties for <strong>INCLUDE_SCRIPT</strong> type: * <ul> * <li><strong>scriptPath</strong>: the path / URL to the resource</li> * <li><strong>scriptPathType</strong>: the type of the <tt>scriptPath</tt> * field: one of <code>StringLiteral</code>, <code>Identifier</code>, <code>IdentifierNameAmpersatStart</code></li> * </ul> * <p> * Properties for <strong>INCLUDE_STYLE</strong> type: * <ul> * <li><strong>stylePath</strong>: </li> * <li><strong>stylePathType</strong>: the type of the <tt>stylePath</tt> * field: one of <code>StringLiteral</code>, <code>Identifier</code>, <code>IdentifierNameAmpersatStart</code></li> * </ul> * <p> * Properties for <strong>LOCALIZE</strong> type: * <ul> * <li><strong>name</strong>: the name/identifier for the localized String</li> * <li><strong>nameType</strong>: the type of the <tt>name</tt> * field: one of <code>StringLiteral</code>, <code>Identifier</code>, <code>IdentifierNameAmpersatStart</code></li> * </ul> * <p> * Properties for <strong>YIELD_DECLARATION</strong> type: * <ul> * <li><strong>name</strong>: the name/identifier for the yield section</li> * <li><strong>nameType</strong>: the type of the <tt>name</tt> * field: one of <code>StringLiteral</code>, <code>Identifier</code>, <code>IdentifierNameAmpersatStart</code></li> * </ul> * Properties for <strong>BLOCK</strong> type: * <ul> * <li><strong>scriptContent</strong> {String}: <tt>OPTIONALLY</tt> the script code as a String</li> * <li><strong>scriptEval</strong> {Function}: the compiled script code in form of a function. The * function takes one argument: the current data-object.</li> * </ul> * <p> * Properties for <strong>STATEMENT</strong> type: * <ul> * <li><strong>scriptContent</strong> {String}: <tt>OPTIONALLY</tt> the script code as a String</li> * <li><strong>scriptEval</strong> {Function}: the compiled script code in form of a function. The * function takes one argument: the current data-object.</li> * </ul> * <p> * Properties for <strong>HELPER</strong> type: * <ul> * <li><strong>helper</strong>: the name of the helper function</li> * <li><strong>helperType</strong>: the type of the <tt>helper</tt> * field: one of <code>StringLiteral</code>, <code>Identifier</code>, <code>IdentifierNameAmpersatStart</code></li> * <li><strong>argsEval</strong> {Function}: OPTIONALLY compiled getter Function for retrieving the current ARGS * (optional argument) of the helper expression. The function takes one argument: the current data-object.</li> * </ul> * <p> * Properties for <strong>IF</strong> type: * <ul> * <li><strong>ifEval</strong> {Function}: the condition statement, that was compiled into a Function. The * function takes one argument: the current data-object.</li> * <li><strong>content</strong> {ContentElement}: the HTML / template content that should be render, in case the * if-expression evaluates to <code>true</code>.</li> * <li><strong>elseContent</strong> {@link mmir.parser.ParsingResult}: OPTIONALLY a ParsingResult * representing an else-expression, see {@link mmir.parser.Element.ELSE}.</li> * </ul> * <p> * Properties for <strong>ELSE</strong> type: * <ul> * <li><strong>content</strong> {ContentElement}: the HTML / template content that should be render, in case the * if-expression (to which the else-expression belongs) evaluates to <code>false</code>.</li> * </ul> * <p> * Properties for <strong>FOR</strong> type: * <ul> * <li><strong>forControlType</strong> {String}: the type of for-loop, either <code>FORITER</code> or <code>FORSTEP</code></li> * <li><strong>forInitEval</strong> {Function}: the initialization statement of the for-expression, compiled into * a Function. The function takes one argument: the current data-object.</li> * * <li><code>FORITER</code>: <code>@for(PROP in OBJ){ ... }@</code> * <ul> * <li><strong>forIterator</strong> {Object}: an iterator object with functions <code>hasNext() : Boolean</code> and * <code>next() : String</code> (which returns the name of the property currently iterated).</li> * <li><strong>forPropName</strong> {String}: the variable name for the property which is currently iterated over.</li> * </ul> * </li> * <li><code>FORSTEP</code>: <code>@for(INIT; CONDITION; INCREMENT){ ... }@</code> * <ul> * <li><strong>forConditionEval</strong> {Function}: the condition statement of the for-expression, compiled into * a Function. The function takes one argument: the current data-object.</li> * <li><strong>forIncrementEval</strong> {Function}: the increment statement of the for-expression, compiled into * a Function. The function takes one argument: the current data-object.</li> * </ul> * </li> * <li><strong>content</strong> {ContentElement}: the HTML / template content that should be rendered * during each iteration of the for-loop.</li> * </ul> * <p> * Properties for <strong>RENDER</strong> type: * <ul> * <li><strong>partial</strong>: the name of the partial view</li> * <li><strong>partialType</strong>: the type of the <tt>partial</tt> * field: one of <code>StringLiteral</code>, <code>Identifier</code>, <code>IdentifierNameAmpersatStart</code></li> * <li><strong>controller</strong>: the name of the controller, to which the partial view definition belongs</li> * <li><strong>controllerType</strong>: the type of the <tt>controller</tt> * field: one of <code>StringLiteral</code>, <code>Identifier</code>, <code>IdentifierNameAmpersatStart</code></li> * <li><strong>argsEval</strong> {Function}: OPTIONALLY compiled getter Function for retrieving the current ARGS * (optional argument) of the render expression. The function takes one argument: the current data-object.</li> * </ul> * <p> * Properties for <strong>ESCAPE_ENTER</strong> type: * <ul> * <li><strong>text</strong> {String}: the text that will be rendered (i.e. without the escape-character(s) itself).</li> * </ul> * <p> * Properties for <strong>ESCAPE_EXIT</strong> type: * <ul> * <li><strong>text</strong> {String}: the text that will be rendered (i.e. without the escape-character(s) itself).</li> * </ul> * <p> * Properties for <strong>VAR_DECLARATION</strong> type: * <ul> * <li><strong>name</strong>: the name for the variable (without the leading <tt>@</tt> of template variables)</li> * <li><strong>nameType</strong>: the type of the <tt>name</tt> field: <code>StringLiteral</code></li> * </ul> * * <p> * * @param {org.antlr.runtime.CommonTokenStream|org.antlr.runtime.Token} [thetokens] OPTIONAL * if <code>org.antlr.runtime.CommonTokenStream</code>: * the TokenStream that corresponds to this parsed element; * when provided, the TokenStream is used to set the start- and end- * property of the new instance.<br> * if <code>org.antlr.runtime.Token</code>: * if the parameter is a single Token object, then the start- and end- * property for the new instance is set by this token object * @class * @constructor * @name ParsingResult * @memberOf mmir.parser */ function(parser){ var _antrl3; //set to @ignore in order to avoid doc-duplication in jsdoc3 /** * ParsingResult represents an element that was detected during parsing. * * <p> * The detected element is referenced by the properties <code>start</code> and <code>end</code> * that refer to the start-index and end-index within the parsed text. * * <p> * The ParsingResult has a <code>type</code> property which refers to the kind of element * that was detected (see constants in {@link mmir.parser.Element}). * * <p> * In addition, the ParsingResult may have several properties that depend of its type. In general, * these properties refer to detected parts of the element (e.g. for a invocation-statement, these * may refer to its arguments). * * * <p> * Properties for <strong>INCLUDE_SCRIPT</strong> type: * <ul> * <li><strong>scriptPath</strong>: the path / URL to the resource</li> * <li><strong>scriptPathType</strong>: the type of the <tt>scriptPath</tt> * field: one of <code>StringLiteral</code>, <code>Identifier</code>, <code>IdentifierNameAmpersatStart</code></li> * </ul> * <p> * Properties for <strong>INCLUDE_STYLE</strong> type: * <ul> * <li><strong>stylePath</strong>: </li> * <li><strong>stylePathType</strong>: the type of the <tt>stylePath</tt> * field: one of <code>StringLiteral</code>, <code>Identifier</code>, <code>IdentifierNameAmpersatStart</code></li> * </ul> * <p> * Properties for <strong>LOCALIZE</strong> type: * <ul> * <li><strong>name</strong>: the name/identifier for the localized String</li> * <li><strong>nameType</strong>: the type of the <tt>name</tt> * field: one of <code>StringLiteral</code>, <code>Identifier</code>, <code>IdentifierNameAmpersatStart</code></li> * </ul> * <p> * Properties for <strong>YIELD_DECLARATION</strong> type: * <ul> * <li><strong>name</strong>: the name/identifier for the yield section</li> * <li><strong>nameType</strong>: the type of the <tt>name</tt> * field: one of <code>StringLiteral</code>, <code>Identifier</code>, <code>IdentifierNameAmpersatStart</code></li> * </ul> * Properties for <strong>BLOCK</strong> type: * <ul> * <li><strong>scriptContent</strong> {String}: <tt>OPTIONALLY</tt> the script code as a String</li> * <li><strong>scriptEval</strong> {Function}: the compiled script code in form of a function. The * function takes one argument: the current data-object.</li> * </ul> * <p> * Properties for <strong>STATEMENT</strong> type: * <ul> * <li><strong>scriptContent</strong> {String}: <tt>OPTIONALLY</tt> the script code as a String</li> * <li><strong>scriptEval</strong> {Function}: the compiled script code in form of a function. The * function takes one argument: the current data-object.</li> * </ul> * <p> * Properties for <strong>HELPER</strong> type: * <ul> * <li><strong>helper</strong>: the name of the helper function</li> * <li><strong>helperType</strong>: the type of the <tt>helper</tt> * field: one of <code>StringLiteral</code>, <code>Identifier</code>, <code>IdentifierNameAmpersatStart</code></li> * <li><strong>argsEval</strong> {Function}: OPTIONALLY compiled getter Function for retrieving the current ARGS * (optional argument) of the helper expression. The function takes one argument: the current data-object.</li> * </ul> * <p> * Properties for <strong>IF</strong> type: * <ul> * <li><strong>ifEval</strong> {Function}: the condition statement, that was compiled into a Function. The * function takes one argument: the current data-object.</li> * <li><strong>content</strong> {ContentElement}: the HTML / template content that should be render, in case the * if-expression evaluates to <code>true</code>.</li> * <li><strong>elseContent</strong> {@link mmir.parser.ParsingResult}: OPTIONALLY a ParsingResult * representing an else-expression, see {@link mmir.parser.Element.ELSE}.</li> * </ul> * <p> * Properties for <strong>ELSE</strong> type: * <ul> * <li><strong>content</strong> {ContentElement}: the HTML / template content that should be render, in case the * if-expression (to which the else-expression belongs) evaluates to <code>false</code>.</li> * </ul> * <p> * Properties for <strong>FOR</strong> type: * <ul> * <li><strong>forControlType</strong> {String}: the type of for-loop, either <code>FORITER</code> or <code>FORSTEP</code></li> * <li><strong>forInitEval</strong> {Function}: the initialization statement of the for-expression, compiled into * a Function. The function takes one argument: the current data-object.</li> * * <li><code>FORITER</code>: <code>@for(PROP in OBJ){ ... }@</code> * <ul> * <li><strong>forIterator</strong> {Object}: an iterator object with functions <code>hasNext() : Boolean</code> and * <code>next() : String</code> (which returns the name of the property currently iterated).</li> * <li><strong>forPropName</strong> {String}: the variable name for the property which is currently iterated over.</li> * </ul> * </li> * <li><code>FORSTEP</code>: <code>@for(INIT; CONDITION; INCREMENT){ ... }@</code> * <ul> * <li><strong>forConditionEval</strong> {Function}: the condition statement of the for-expression, compiled into * a Function. The function takes one argument: the current data-object.</li> * <li><strong>forIncrementEval</strong> {Function}: the increment statement of the for-expression, compiled into * a Function. The function takes one argument: the current data-object.</li> * </ul> * </li> * <li><strong>content</strong> {ContentElement}: the HTML / template content that should be rendered * during each iteration of the for-loop.</li> * </ul> * <p> * Properties for <strong>RENDER</strong> type: * <ul> * <li><strong>partial</strong>: the name of the partial view</li> * <li><strong>partialType</strong>: the type of the <tt>partial</tt> * field: one of <code>StringLiteral</code>, <code>Identifier</code>, <code>IdentifierNameAmpersatStart</code></li> * <li><strong>controller</strong>: the name of the controller, to which the partial view definition belongs</li> * <li><strong>controllerType</strong>: the type of the <tt>controller</tt> * field: one of <code>StringLiteral</code>, <code>Identifier</code>, <code>IdentifierNameAmpersatStart</code></li> * <li><strong>argsEval</strong> {Function}: OPTIONALLY compiled getter Function for retrieving the current ARGS * (optional argument) of the render expression. The function takes one argument: the current data-object.</li> * </ul> * <p> * Properties for <strong>ESCAPE_ENTER</strong> type: * <ul> * <li><strong>text</strong> {String}: the text that will be rendered (i.e. without the escape-character(s) itself).</li> * </ul> * <p> * Properties for <strong>ESCAPE_EXIT</strong> type: * <ul> * <li><strong>text</strong> {String}: the text that will be rendered (i.e. without the escape-character(s) itself).</li> * </ul> * <p> * Properties for <strong>VAR_DECLARATION</strong> type: * <ul> * <li><strong>name</strong>: the name for the variable (without the leading <tt>@</tt> of template variables)</li> * <li><strong>nameType</strong>: the type of the <tt>name</tt> field: <code>StringLiteral</code></li> * </ul> * * <p> * * @constructs ParsingResult * @param {org.antlr.runtime.CommonTokenStream|org.antlr.runtime.Token} [thetokens] OPTIONAL * if <code>org.antlr.runtime.CommonTokenStream</code>: * the TokenStream that corresponds to this parsed element; * when provided, the TokenStream is used to set the start- and end- * property of the new instance.<br> * if <code>org.antlr.runtime.Token</code>: * if the parameter is a single Token object, then the start- and end- * property for the new instance is set by this token object * * @ignore */ function ParsingResult (thetokens){ var isSet = false; //try to extract start-/end-indexes from the argument: if(thetokens){ if(typeof org !== 'undefined'){ //NOTE: must invoke getTokens() for initializing size() etc.! if(thetokens instanceof org.antlr.runtime.CommonTokenStream && thetokens.getTokens() && thetokens.size() > 0){ this.start = thetokens.getTokens()[0].getStartIndex(); this.end = thetokens.getTokens()[thetokens.size()-1].getStopIndex(); isSet = true; } else if(thetokens instanceof org.antlr.runtime.CommonToken || thetokens instanceof org.antlr.runtime.Token){ this.start = thetokens.getStartIndex(); this.end = thetokens.getStopIndex(); isSet = true; } } //if not already set, try... if( isSet === false && typeof thetokens.getToken !== 'undefined' && (typeof thetokens.getToken().getStartIndex !== 'undefined' && typeof thetokens.getToken().getStopIndex !== 'undefined')){ this.start = thetokens.getToken().getStartIndex(); this.end = thetokens.getToken().getStopIndex(); isSet = true; } else if(typeof thetokens.getStartIndex !== 'undefined' && typeof thetokens.getStopIndex !== 'undefined'){ this.start = thetokens.getStartIndex(); this.end = thetokens.getStopIndex(); isSet = true; } else if(isSet === false) { var type = Object.prototype.toString.call(thetokens);//.match(/^\[object (.*)\]$/)[1]; console.warn('unknown argument type: '+type);//debug } } if(isSet === false) { this.start = -1; this.end = -1; } }; /** * Set the start position (index) for this parsed element with regard to the TokenStream of the complete input. * * @function * @param {org.antlr.runtime.CommonTokenStream} thetokens (optional) the TokenStream that corresponds to this parsed element; * when provided, the TokenStream is used to set the start-property of this object. * * @public * @memberOf mmir.parser.ParsingResult */ ParsingResult.prototype.setStartFrom = function(thetokens){ //NOTE: must invoke getTokens() for initializing size() etc.! if(thetokens.getTokens() && thetokens.size() > 0){ this.start = thetokens.getTokens()[0].getStartIndex(); } else { this.start = -1; } }; /** * Set the end position (index) for this parsed element with regard to the TokenStream of the complete input. * * @function * @param {org.antlr.runtime.CommonTokenStream} thetokens (optional) the TokenStream that corresponds to this parsed element; * when provided, the TokenStream is used to set the end-property of this object. * * @public * @memberOf mmir.parser.ParsingResult */ ParsingResult.prototype.setEndFrom = function(thetokens){ //NOTE: must invoke getTokens() for initializing size() etc.! if(thetokens.getTokens() && thetokens.size() > 0){ this.end = thetokens.getTokens()[thetokens.size()-1].getStopIndex(); } else { this.end = -1; } }; /** @memberOf mmir.parser.ParsingResult */ ParsingResult.prototype.getStart = function(){ return this.start; }; /** @memberOf mmir.parser.ParsingResult */ ParsingResult.prototype.getEnd = function(){ return this.end; }; /** * Get the type of this parsed element, i.e. as which type this element was parsed. * * The type corresponds to one of the type defined in {mmir.parser.Element}. * * @function * @return {mmir.parser.Element} the type for this ParsingResult * * @public * @memberOf mmir.parser.ParsingResult */ ParsingResult.prototype.getType = function(){ return this.type; }; /** * helper function for converting properties to the correct value. * By default, the ParsingResult only contains "raw" property values. * Which properties are available, depends on the type of the ParsingResult (see templateProcessor.js) * * @memberOf mmir.parser.ParsingResult */ ParsingResult.prototype.getValue = function(rawPropertyValue, proptertyType, data){ if(proptertyType === 'StringLiteral'){ return rawPropertyValue.substring(1, rawPropertyValue.length-1); } else if(proptertyType === 'Identifier'){ if(data){ return data['@' + rawPropertyValue]; } else { //just return variable name return rawPropertyValue; } } else if(proptertyType === 'IdentifierNameAmpersatStart'){ if(data){ return data[rawPropertyValue]; } else { //just return variable name, but remove leading @: return rawPropertyValue.substring(1); } } else if(proptertyType === 'OBJECT'){ return rawPropertyValue;//TODO } else if(proptertyType === 'DecimalLiteral'){ return parseFloat(rawPropertyValue); } // else if(typeof proptertyType === 'undefined'){ // return rawPropertyValue; // } else return rawPropertyValue; }; /** @memberOf mmir.parser.ParsingResult */ ParsingResult.prototype.hasVarReferences = function(){ return false;//TODO implement this }; /** @memberOf mmir.parser.ParsingResult */ ParsingResult.prototype.isScriptTag = function(){ if( parser.element.INCLUDE_SCRIPT === this.getType() ){ return true; } return false; }; /** @memberOf mmir.parser.ParsingResult */ ParsingResult.prototype.isStyleTag = function(){ if( parser.element.INCLUDE_STYLE === this.getType() ){ return true; } return false; }; /** @memberOf mmir.parser.ParsingResult */ ParsingResult.prototype.isLocalize = function(){ if( parser.element.LOCALIZE === this.getType() ){ return true; } return false; }; /** @memberOf mmir.parser.ParsingResult */ ParsingResult.prototype.isYield = function(){ if( parser.element.YIELD_DECLARATION === this.getType() ){ return true; } return false; }; /** @memberOf mmir.parser.ParsingResult */ ParsingResult.prototype.isYieldContent = function(){ if( parser.element.YIELD_CONTENT === this.getType() ){ return true; } return false; }; /** @memberOf mmir.parser.ParsingResult */ ParsingResult.prototype.isScriptBlock = function(){ if( parser.element.BLOCK === this.getType() ){ return true; } return false; }; /** @memberOf mmir.parser.ParsingResult */ ParsingResult.prototype.isScriptStatement = function(){ if( parser.element.STATEMENT === this.getType() ){ return true; } return false; }; /** @memberOf mmir.parser.ParsingResult */ ParsingResult.prototype.isHelper = function(){ if( parser.element.HELPER === this.getType() ){ return true; } return false; }; /** @memberOf mmir.parser.ParsingResult */ ParsingResult.prototype.isIf = function(){ if( parser.element.IF === this.getType() ){ return true; } return false; }; /** @memberOf mmir.parser.ParsingResult */ ParsingResult.prototype.hasElse = function(){ if(this.isIf() && typeof this.elseContent != 'undefined'){ return true; } return false; }; /** @memberOf mmir.parser.ParsingResult */ ParsingResult.prototype.isElse = function(){ if( parser.element.ELSE === this.getType() ){ return true; } return false; }; /** @memberOf mmir.parser.ParsingResult */ ParsingResult.prototype.isFor = function(){ if( parser.element.FOR === this.getType() ){ return true; } return false; }; /** @memberOf mmir.parser.ParsingResult */ ParsingResult.prototype.isRender = function(){ if( parser.element.RENDER === this.getType() ){ return true; } return false; }; /** @memberOf mmir.parser.ParsingResult */ ParsingResult.prototype.isEscapeEnter = function(){ if( parser.element.ESCAPE_ENTER === this.getType() ){ return true; } return false; }; /** @memberOf mmir.parser.ParsingResult */ ParsingResult.prototype.isEscapeExit = function(){ if( parser.element.ESCAPE_EXIT === this.getType() ){ return true; } return false; }; /** @memberOf mmir.parser.ParsingResult */ ParsingResult.prototype.isEscape = function(){ return this.isEscapeEnter() || this.isEscapeExit(); }; /** * WARNING: do use sparingly -- an invocation triggers a list evaluation. * * @returns {String} a String representation (name) for this ParsingResult's type * * @memberOf mmir.parser.ParsingResult */ ParsingResult.prototype.getTypeName = function(){ if(this.typeName){ return this.typeName;/////////////////// EARLY EXIT ////////////////////////// } for(var prop in parser.element){ if(parser.element.hasOwnProperty(prop) && parser.element[prop] === this.getType()){ this.typeName = prop; return prop;/////////////////// EARLY EXIT ////////////////////////// } } return void(0); }; /** @memberOf mmir.parser.ParsingResult */ ParsingResult.prototype.hasCallData = function(){ return typeof this.dataPos !== 'undefined'; }; /** @memberOf mmir.parser.ParsingResult */ ParsingResult.prototype.getCallDataStart = function(){ return this.dataPos.start; }; /** @memberOf mmir.parser.ParsingResult */ ParsingResult.prototype.getCallDataEnd = function(){ return this.dataPos.end; }; /** @memberOf mmir.parser.ParsingResult */ ParsingResult.prototype.getCallDataType = function(){ return this.dataType; }; /** @memberOf mmir.parser.ParsingResult */ ParsingResult.prototype.stringify = function(disableStrictMode){ //TODO use constants for lists //typed properties: // for each typed properties '<prop>' there is an additional property with name '<prop>Type' // (both of these properties are Strings themselves) var typedPropList = [ 'scriptPath', 'stylePath', 'name', 'helper', 'partial', 'controller' ]; //primitive-type properties: // write values 'as is' for these properties var propList = [ 'start', 'end', 'type', 'dataType', 'text', 'forControlType', 'forPropName' ]; //"stringify-able" object properties: var strPropList = [ 'content', 'elseContent' ]; //function properties: var funcPropList = [ //DISABLED these are now generated/initialized in the owning ContentElment's initEvalFunctions() function (NOTE that this may include the forInitEval too, which then will overwrite this function, that may be exported due to this list) // 'scriptEval', // 'argsEval', // 'ifEval', // 'forConditionEval', // 'forIncrementEval', 'forInitEval',//TODO include this in ContentElement.initEvalFunctions 'forIterator'//TODO include this in ContentElement.initEvalFunctions ]; //default function properties: // these functions from the prototype may have been overwritten // -> if one is overwritten, i.e. not the default implementation, then store that one too var overwrittenFuncPropList = [ 'getEnd', 'getStart', 'getType', 'getValue', 'getTypeName', 'getCallDataStart', 'getCallDataEnd', 'getCallDataType' ]; //function for iterating over the property-list and generating JSON-like entries in the string-buffer var appendStringified = parser.appendStringified; var sb = ['require("mmirf/storageUtils").restoreObject({ classConstructor: "mmirf/parsingResult"', ',']; //TODO property dataPos: {start: Number, end: Number} if(this['dataPos']){ sb.push( 'dataPos:{start:' ); sb.push( this.dataPos.start ); sb.push( ',end:' ); sb.push( this.dataPos.end ); sb.push( '}' ); //NOTE: need to add comma in a separate entry // (-> in order to not break the removal method of last comma, see below) sb.push( ',' ); } appendStringified(this, typedPropList, sb); appendStringified(this, typedPropList, sb, 'Type'); appendStringified(this, propList, sb); //non-primitives with stringify() function: appendStringified(this, strPropList, sb, null, function stringifyableExtractor(name, value){ return value.stringify(disableStrictMode); }); //function definitions appendStringified(this, funcPropList, sb, null, function functionExtractor(name, value){ return value.toString(); }); //add "overwritten" function definitions appendStringified(this, overwrittenFuncPropList, sb, null, function nonDefaultFunctionExtractor(name, value){ var instanceImpl = value.toString(); var defaultImpl = ParsingResult.prototype[name].toString(); if(instanceImpl !== defaultImpl){ return instanceImpl; } //DEFAULT: return void (will omit this from storage -> use default impl. of the prototype) return; }); //if last element is a comma, remove it if(sb[sb.length - 1] === ','){ sb.splice( sb.length - 1, 1); } sb.push(' })'); return sb.join(''); }; /** * HELPER for making the namespace of the core-parser (i.e. ANTLR3) available * * This is necessary in environments where the namespace is not automatically * exported into the global namespace, e.g. when runnin in nodejs. * * @static * @private * @param {String} parserNamerspace * the namespace object of the ANTLR parser (should be the object org which is exported by antlr3 module/shim) */ ParsingResult._nsParserInit = function(parserNamerspace){ _antrl3 = parserNamerspace; if(typeof org === 'undefined'){ org = parserNamerspace; } }; parser.ParsingResult = ParsingResult; return parser.ParsingResult; });//END: define(..., function(){