diff --git a/lib/ace/mode/xquery.js b/lib/ace/mode/xquery.js index 31284f9c..c66dd043 100644 --- a/lib/ace/mode/xquery.js +++ b/lib/ace/mode/xquery.js @@ -131,12 +131,14 @@ oop.inherits(Mode, TextMode); }); worker.on("ok", function(e) { - session.clearAnnotations(); + session.clearAnnotations(); }); worker.on("highlight", function(tokens) { - if(that.$deltas.length > 0) return; - that.$tokenizer.tokens = tokens.data; + //console.log(that.$deltas); + //if(that.$deltas.length > 0) return; + that.$tokenizer.tokens = tokens.data.tokens; + that.$tokenizer.lines = tokens.data.lines; session.bgTokenizer.lines = []; session.bgTokenizer.states = []; session.bgTokenizer.fireUpdateEvent(0, session.getLength() - 1); diff --git a/lib/ace/mode/xquery/JSONParseTreeHandler.js b/lib/ace/mode/xquery/JSONParseTreeHandler.js index ff98ac3c..7352958d 100644 --- a/lib/ace/mode/xquery/JSONParseTreeHandler.js +++ b/lib/ace/mode/xquery/JSONParseTreeHandler.js @@ -32,8 +32,14 @@ define(function(require, exports, module){ var JSONParseTreeHandler = exports.JSONParseTreeHandler = function(code) { - //List of nodes that are left untouched in the parse tree size optimization. - var blacklist = ["VarDeclStatement"]; + //List of nodes that are not targeted by the parse tree size optimization. + var list = [ + "OrExpr", "AndExpr", "ComparisonExpr", "StringConcatExpr", "RangeExpr" + //, "AdditiveExpr", "MultiplicativeExpr" + , "UnionExpr", "IntersectExceptExpr", "InstanceofExpr", "TreatExpr", "CastableExpr" + , "CastExpr", "UnaryExpr", "ValueExpr", "FTContainsExpr", "SimpleMapExpr", "PathExpr", "RelativePathExpr" + , "PostfixExpr", "StepExpr" + ]; var ast = null; var ptr = null; @@ -63,13 +69,31 @@ define(function(require, exports, module){ if(ptr.children.length > 0) { var s = ptr.children[0]; - var e = ptr.children[ptr.children.length - 1]; + var e = null; + //We want to skip empty non terminals. For instance PredicateList: + // [108] AxisStep ::= (ReverseStep | ForwardStep) PredicateList + // [120] PredicateList ::= Predicate* + for(var i= ptr.children.length - 1; i >= 0;i--) { + e = ptr.children[i]; + if(e.pos.el !== 0 || e.pos.ec !== 0) { + break; + } + } ptr.pos.sl = s.pos.sl; ptr.pos.sc = s.pos.sc; ptr.pos.el = e.pos.el; ptr.pos.ec = e.pos.ec; } + //Normalize EQName && FunctionName + if(ptr.name === "FunctionName") { + ptr.name = "EQName"; + } + if(ptr.name === "EQName" && ptr.value === undefined) { + ptr.value = ptr.children[0].value; + ptr.children.pop(); + } + if(ptr.getParent !== null) { ptr = ptr.getParent; //for(var i in ptr.children) { @@ -80,12 +104,12 @@ define(function(require, exports, module){ } //Parse tree size optimization - //if(ptr.children.length > 0) { - // var lastChild = ptr.children[ptr.children.length - 1]; - // if(lastChild.children.length === 1 && blacklist.indexOf(lastChild.name) !== -1) { - // ptr.children[ptr.children.length - 1] = lastChild.children[0]; - // } - //} + if(ptr.children.length > 0) { + var lastChild = ptr.children[ptr.children.length - 1]; + if(lastChild.children.length === 1 && list.indexOf(lastChild.name) !== -1) { + ptr.children[ptr.children.length - 1] = lastChild.children[0]; + } + } } this.peek = function() { diff --git a/lib/ace/mode/xquery/XQueryLexer.js b/lib/ace/mode/xquery/XQueryLexer.js index e45e3359..5efb377d 100644 --- a/lib/ace/mode/xquery/XQueryLexer.js +++ b/lib/ace/mode/xquery/XQueryLexer.js @@ -242,7 +242,7 @@ exports.XQueryLexer = function() { } catch(e) { if(e instanceof tokenizer.ParseException) { - var message = tokenizer.getErrorMessage(e); + //var message = tokenizer.getErrorMessage(e); //console.log(stack[stack.length - 1]); //console.log(line); //console.log(line.substring(e.getBegin(), e.getEnd())); @@ -264,33 +264,34 @@ exports.XQueryLexer = function() { } } + if(this.tokens[row] !== undefined) { + var cachedLine = this.lines[row]; + var begin = sharedStart([line, cachedLine]); + var diff = cachedLine.length - line.length; var idx = 0; var col = 0; for(var i in tokens) { var token = tokens[i]; - if(token.type === "keyword") { for(var j in this.tokens[row]) { var semanticToken = this.tokens[row][j]; - if(semanticToken.sc === col) { + if( + ((col + token.value.length) <= begin.length && semanticToken.sc === col && semanticToken.ec === (col + token.value.length)) || + (semanticToken.sc === (col + diff) && semanticToken.ec === (col + token.value.length + diff)) + ) { idx = i; - tokens[i].type = "support.function"; + tokens[i].type = semanticToken.type; } } - } col += token.value.length; } - //for(var i = tokens.length - 1; i > idx; i--) { - // var token = tokens[i]; - // if(token.type === "keyword") { - // for(var j in this.tokens[row]) { - // var semanticToken = this.tokens[row][j]; - // if(semanticToken.ec === endCol) { - // tokens[i].type = "support.function"; - // } - // } - // } - //} + console.log("======"); + console.log(sharedStart([line, this.lines[row]])); + console.log(this.lines[row]); + console.log(line); + console.log(line.length - this.lines[row].length); + console.log("======"); + } return { @@ -298,5 +299,16 @@ exports.XQueryLexer = function() { state: JSON.stringify(stack) }; }; + + function sharedStart(A) { + var tem1, tem2, s, A = A.slice(0).sort(); + tem1 = A[0]; + s = tem1.length; + tem2 = A.pop(); + while(s && tem2.indexOf(tem1) == -1) { + tem1 = tem1.substring(0, --s); + } + return tem1; + } }; }); diff --git a/lib/ace/mode/xquery/XQueryParser.js b/lib/ace/mode/xquery/XQueryParser.js index ea17b428..a0a3c86f 100644 --- a/lib/ace/mode/xquery/XQueryParser.js +++ b/lib/ace/mode/xquery/XQueryParser.js @@ -1,4 +1,4 @@ -// This file was generated on Wed Dec 12, 2012 12:21 (UTC+01) by REx v5.20 which is Copyright (c) 1979-2012 by Gunther Rademacher +// This file was generated on Sat Jan 5, 2013 17:36 (UTC+01) by REx v5.21 which is Copyright (c) 1979-2012 by Gunther Rademacher // REx command line: XQueryParser.ebnf -ll 2 -backtrack -tree -javascript -a xqlint // line 2 "XQueryParser.ebnf" @@ -84,6 +84,8 @@ eventHandler.reset(input); } + this.reset = function(l, b, e) {reset(l, b, e);}; + this.getOffendingToken = function(e) { var o = e.getOffending(); @@ -7896,16 +7898,17 @@ // 'union' | 'unordered' | 'updating' | 'validate' | 'value' | 'variable' | // 'version' | 'where' | 'while' | 'with' | 'xquery' | '{' | '{|' try_StepExpr(); - lk = -1; + memoize(2, e0A, -1); + continue; } catch (p1A) { - lk = -2; + b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else { + b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else { + b2 = b2A; e2 = e2A; end = e2A; }} + memoize(2, e0A, -2); + break; } - b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else { - b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else { - b2 = b2A; e2 = e2A; end = e2A; }} - memoize(2, e0, lk); } } if (lk != -1 @@ -9466,16 +9469,17 @@ try { try_PostfixExpr(); - lk = -1; + memoize(3, e0A, -1); + lk = -3; } catch (p1A) { lk = -2; + b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else { + b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else { + b2 = b2A; e2 = e2A; end = e2A; }} + memoize(3, e0A, -2); } - b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else { - b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else { - b2 = b2A; e2 = e2A; end = e2A; }} - memoize(3, e0, lk); } } switch (lk) @@ -10081,6 +10085,8 @@ case 141568: // 'unordered' '{' try_PostfixExpr(); break; + case -3: + break; default: try_AxisStep(); } @@ -12937,16 +12943,17 @@ try { try_KindTest(); - lk = -1; + memoize(4, e0A, -1); + lk = -8; } catch (p1A) { lk = -6; + b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else { + b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else { + b2 = b2A; e2 = e2A; end = e2A; }} + memoize(4, e0A, -6); } - b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else { - b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else { - b2 = b2A; e2 = e2A; end = e2A; }} - memoize(4, e0, lk); } } switch (lk) @@ -12984,6 +12991,8 @@ case 242: // 'structured-item' try_StructuredItemTest(); break; + case -8: + break; default: try_AtomicOrUnionType(); } @@ -14004,22 +14013,25 @@ try { try_AnyFunctionTest(); - lk = -1; + memoize(5, e0A, -1); + lk = -3; } catch (p1A) { lk = -2; + b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else { + b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else { + b2 = b2A; e2 = e2A; end = e2A; }} + memoize(5, e0A, -2); } - b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else { - b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else { - b2 = b2A; e2 = e2A; end = e2A; }} - memoize(5, e0, lk); } switch (lk) { case -1: try_AnyFunctionTest(); break; + case -3: + break; default: try_TypedFunctionTest(); } @@ -22135,16 +22147,17 @@ try { try_Statement(); - lk = -1; + memoize(6, e0A, -1); + continue; } catch (p1A) { - lk = -2; + b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else { + b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else { + b2 = b2A; e2 = e2A; end = e2A; }} + memoize(6, e0A, -2); + break; } - b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else { - b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else { - b2 = b2A; e2 = e2A; end = e2A; }} - memoize(6, e0, lk); } } if (lk != -1 @@ -23499,7 +23512,8 @@ try { try_ApplyStatement(); - lk = -1; + memoize(7, e0A, -1); + lk = -14; } catch (p1A) { @@ -23509,7 +23523,8 @@ b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else { b2 = b2A; e2 = e2A; end = e2A; }} try_AssignStatement(); - lk = -2; + memoize(7, e0A, -2); + lk = -14; } catch (p2A) { @@ -23519,7 +23534,8 @@ b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else { b2 = b2A; e2 = e2A; end = e2A; }} try_BlockStatement(); - lk = -3; + memoize(7, e0A, -3); + lk = -14; } catch (p3A) { @@ -23529,19 +23545,20 @@ b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else { b2 = b2A; e2 = e2A; end = e2A; }} try_VarDeclStatement(); - lk = -12; + memoize(7, e0A, -12); + lk = -14; } catch (p12A) { lk = -13; + b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else { + b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else { + b2 = b2A; e2 = e2A; end = e2A; }} + memoize(7, e0A, -13); } } } } - b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else { - b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else { - b2 = b2A; e2 = e2A; end = e2A; }} - memoize(7, e0, lk); } } switch (lk) @@ -23587,6 +23604,8 @@ case -13: try_WhileStatement(); break; + case -14: + break; default: try_ApplyStatement(); } @@ -24728,11 +24747,9 @@ shiftT(250); // 'try' lookahead1W(87); // S^WS | '(:' | '{' try_BlockStatement(); - for (;;) - { - lookahead1W(36); // S^WS | '(:' | 'catch' - shiftT(91); // 'catch' - lookahead1W(251); // Wildcard | EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' | + lookahead1W(36); // S^WS | '(:' | 'catch' + shiftT(91); // 'catch' + lookahead1W(251); // Wildcard | EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' | // 'ancestor-or-self' | 'and' | 'as' | 'ascending' | 'at' | 'attribute' | // 'base-uri' | 'before' | 'boundary-space' | 'break' | 'case' | 'cast' | // 'castable' | 'catch' | 'child' | 'collation' | 'comment' | 'constraint' | @@ -24753,8 +24770,10 @@ // 'try' | 'tumbling' | 'type' | 'typeswitch' | 'union' | 'unordered' | 'updating' | // 'validate' | 'value' | 'variable' | 'version' | 'where' | 'while' | 'with' | // 'xquery' - try_CatchErrorList(); - try_BlockStatement(); + try_CatchErrorList(); + try_BlockStatement(); + for (;;) + { lookahead1W(278); // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | // StringLiteral | S^WS | EOF | '$' | '%' | '(' | '(#' | '(:' | '+' | '-' | '.' | // '..' | '/' | '//' | '<' | '