Update xqlint with code completion
This commit is contained in:
parent
4e23984ddb
commit
ea532e41bf
5 changed files with 77415 additions and 77120 deletions
|
|
@ -72,7 +72,7 @@ oop.inherits(Mode, TextMode);
|
|||
if (! /^\s+$/.test(line))
|
||||
return false;
|
||||
|
||||
return /^\s*[\}\)]/.test(input);
|
||||
return (/^\s*[\}\)]/).test(input);
|
||||
};
|
||||
|
||||
this.autoOutdent = function(state, doc, row) {
|
||||
|
|
|
|||
|
|
@ -188,7 +188,7 @@ exports.VarRefHandler = function(translator, sctx, node){
|
|||
}
|
||||
};
|
||||
};
|
||||
},{"../tree_ops":9,"./errors":1}],3:[function(_dereq_,module,exports){
|
||||
},{"../tree_ops":10,"./errors":1}],3:[function(_dereq_,module,exports){
|
||||
exports.StaticContext = function (parent, pos) {
|
||||
'use strict';
|
||||
|
||||
|
|
@ -265,6 +265,7 @@ exports.StaticContext = function (parent, pos) {
|
|||
|
||||
var s = {
|
||||
parent: parent,
|
||||
children: [],
|
||||
pos: pos,
|
||||
setModuleResolver: function(resolver){
|
||||
this.root.moduleResolver = resolver;
|
||||
|
|
@ -274,6 +275,7 @@ exports.StaticContext = function (parent, pos) {
|
|||
defaultFunctionNamespace: '',
|
||||
defaultElementNamespace: '',
|
||||
namespaces: namespaces,
|
||||
availableModuleNamespaces: [],
|
||||
importModule: function(uri, prefix, pos) {
|
||||
this.root.addNamespace(uri, prefix, pos, 'module');
|
||||
if(this.root.moduleResolver) {
|
||||
|
|
@ -287,6 +289,12 @@ exports.StaticContext = function (parent, pos) {
|
|||
}
|
||||
return this;
|
||||
},
|
||||
getAvailableModuleNamespaces: function(){
|
||||
return this.root.availableModuleNamespaces;
|
||||
},
|
||||
getPrefixByNamespace: function(uri){
|
||||
return this.root.namespaces[uri].prefix;
|
||||
},
|
||||
addNamespace: function (uri, prefix, pos, type) {
|
||||
if(prefix === '' && type === 'module') {
|
||||
throw new StaticWarning('W01', 'Avoid this type of import. Use import module namespace instead');
|
||||
|
|
@ -320,6 +328,11 @@ exports.StaticContext = function (parent, pos) {
|
|||
}
|
||||
|
||||
},
|
||||
|
||||
getNamespaces: function(){
|
||||
return this.root.namespaces;
|
||||
},
|
||||
|
||||
getNamespace: function (uri) {
|
||||
var that = this;
|
||||
while (that) {
|
||||
|
|
@ -382,7 +395,10 @@ exports.StaticContext = function (parent, pos) {
|
|||
varRefs: {},
|
||||
|
||||
addVariable: function(qname, type, pos){
|
||||
if(type === 'VarDecl' && qname.uri !== this.moduleNamespace && this.moduleNamespace !== '') {
|
||||
if(
|
||||
type === 'VarDecl' && this.moduleNamespace !== '' &&
|
||||
!(this.moduleNamespace === qname.uri || (qname.uri === '' && this.defaultFunctionNamespace === this.moduleNamespace))
|
||||
) {
|
||||
throw new StaticError('XQST0048', '"' + qname.prefix + ':' + qname.name + '": Qname not library namespace', pos);
|
||||
}
|
||||
var key = getVarKey(qname);
|
||||
|
|
@ -397,6 +413,21 @@ exports.StaticContext = function (parent, pos) {
|
|||
return this;
|
||||
},
|
||||
|
||||
getVariables: function(){
|
||||
var variables = {};
|
||||
var that = this;
|
||||
var handler = function(key){
|
||||
if(!variables[key]){
|
||||
variables[key] = that.variables[key];
|
||||
}
|
||||
};
|
||||
while(that){
|
||||
Object.keys(that.variables).forEach(handler);
|
||||
that = that.parent;
|
||||
}
|
||||
return variables;
|
||||
},
|
||||
|
||||
getVariable: function(qname) {
|
||||
var key = getVarKey(qname);
|
||||
var that = this;
|
||||
|
|
@ -420,6 +451,10 @@ exports.StaticContext = function (parent, pos) {
|
|||
|
||||
functions: {},
|
||||
|
||||
getFunctions: function(){
|
||||
return this.root.functions;
|
||||
},
|
||||
|
||||
getFunction: function(qname, arity){
|
||||
var key = getFnKey(qname, arity);
|
||||
var that = this;
|
||||
|
|
@ -431,8 +466,12 @@ exports.StaticContext = function (parent, pos) {
|
|||
}
|
||||
},
|
||||
|
||||
addFunction: function(qname, arity, pos) {
|
||||
if(qname.uri !== this.moduleNamespace && this.moduleNamespace !== '') {
|
||||
addFunction: function(qname, pos, params) {
|
||||
var arity = params.length;
|
||||
if(
|
||||
this.moduleNamespace !== '' &&
|
||||
!(this.moduleNamespace === qname.uri || (qname.uri === '' && this.defaultFunctionNamespace === this.moduleNamespace))
|
||||
) {
|
||||
throw new StaticError('XQST0048', '"' + qname.prefix + ':' + qname.name + '": Qname not library namespace', pos);
|
||||
}
|
||||
var key = getFnKey(qname, arity);
|
||||
|
|
@ -440,7 +479,8 @@ exports.StaticContext = function (parent, pos) {
|
|||
throw new StaticError('XQST0034', '"' + qname.name + '": duplicate function declaration', pos);
|
||||
}
|
||||
this.functions[key] = {
|
||||
pos: pos
|
||||
pos: pos,
|
||||
params: params
|
||||
};
|
||||
return this;
|
||||
}
|
||||
|
|
@ -449,7 +489,7 @@ exports.StaticContext = function (parent, pos) {
|
|||
s.root = parent ? parent.root : s;
|
||||
return s;
|
||||
};
|
||||
},{"../tree_ops":9,"./errors":1}],4:[function(_dereq_,module,exports){
|
||||
},{"../tree_ops":10,"./errors":1}],4:[function(_dereq_,module,exports){
|
||||
exports.Translator = function(rootStcx, ast){
|
||||
'use strict';
|
||||
|
||||
|
|
@ -461,20 +501,6 @@ exports.Translator = function(rootStcx, ast){
|
|||
var StaticContext = _dereq_('./static_context').StaticContext;
|
||||
var Handlers = _dereq_('./handlers');
|
||||
|
||||
var astAsXML = function(node, indent){
|
||||
var result = '';
|
||||
indent = indent ? indent : '';
|
||||
if(node.value) {
|
||||
result += (indent + '<' + node.name + '>' + node.value + '</' + node.name + '>\n');
|
||||
}
|
||||
result += indent + '<' + node.name + '>\n';
|
||||
node.children.forEach(function(child){
|
||||
result += astAsXML(child, indent + ' ');
|
||||
});
|
||||
result += indent + '</' + node.name + '>\n';
|
||||
return result;
|
||||
};
|
||||
|
||||
var get = function(node, path){
|
||||
var result;
|
||||
if(path.length === 0){
|
||||
|
|
@ -527,12 +553,11 @@ exports.Translator = function(rootStcx, ast){
|
|||
|
||||
var translator = this;
|
||||
|
||||
rootStcx = rootStcx ? rootStcx : new StaticContext();
|
||||
rootStcx.pos = ast.pos;
|
||||
var sctx = rootStcx;
|
||||
|
||||
var pushSctx = function(pos){
|
||||
sctx = new StaticContext(sctx, pos);
|
||||
sctx.parent.children.push(sctx);
|
||||
};
|
||||
|
||||
var popSctx = function(pos){
|
||||
|
|
@ -540,6 +565,7 @@ exports.Translator = function(rootStcx, ast){
|
|||
sctx.pos.el = pos.el;
|
||||
sctx.pos.ec = pos.ec;
|
||||
}
|
||||
|
||||
Object.keys(sctx.varRefs).forEach(function(key){
|
||||
if(!sctx.variables[key]) {
|
||||
sctx.parent.varRefs[key] = true;
|
||||
|
|
@ -593,7 +619,7 @@ exports.Translator = function(rootStcx, ast){
|
|||
}
|
||||
});
|
||||
} else if(node.name === 'FunctionDecl') {
|
||||
var qname, arity = 0, pos;
|
||||
var qname, pos, params = [];
|
||||
node.children.forEach(function(child){
|
||||
if(child.name === 'EQName') {
|
||||
qname = child;
|
||||
|
|
@ -601,7 +627,7 @@ exports.Translator = function(rootStcx, ast){
|
|||
} else if(child.name === 'ParamList'){
|
||||
child.children.forEach(function(c){
|
||||
if(c.name === 'Param') {
|
||||
arity++;
|
||||
params.push(TreeOps.flatten(c));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
|
@ -609,7 +635,7 @@ exports.Translator = function(rootStcx, ast){
|
|||
translator.apply(function(){
|
||||
qname = TreeOps.flatten(qname);
|
||||
qname = rootStcx.resolveQName(qname, pos);
|
||||
rootStcx.addFunction(qname, arity, pos);
|
||||
rootStcx.addFunction(qname, pos, params);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
|
@ -954,7 +980,212 @@ exports.Translator = function(rootStcx, ast){
|
|||
});
|
||||
};
|
||||
|
||||
},{"../tree_ops":9,"./errors":1,"./handlers":2,"./static_context":3}],5:[function(_dereq_,module,exports){
|
||||
},{"../tree_ops":10,"./errors":1,"./handlers":2,"./static_context":3}],5:[function(_dereq_,module,exports){
|
||||
'use strict';
|
||||
|
||||
var TreeOps = _dereq_('../tree_ops').TreeOps;
|
||||
|
||||
var ID_REGEX = /[a-zA-Z_0-9\$]/;
|
||||
|
||||
function retrievePrecedingIdentifier(text, pos, regex) {
|
||||
console.log(text);
|
||||
console.log(pos);
|
||||
regex = regex || ID_REGEX;
|
||||
var buf = [];
|
||||
for (var i = pos-1; i >= 0; i--) {
|
||||
if (regex.test(text[i])) {
|
||||
buf.push(text[i]);
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
return buf.reverse().join('');
|
||||
}
|
||||
/*
|
||||
function retrieveFollowingIdentifier(text, pos, regex) {
|
||||
regex = regex || ID_REGEX;
|
||||
var buf = [];
|
||||
for (var i = pos; i < text.length; i++) {
|
||||
if (regex.test(text[i])) {
|
||||
buf.push(text[i]);
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
return buf;
|
||||
}
|
||||
*/
|
||||
function prefixBinarySearch(items, prefix) {
|
||||
var startIndex = 0;
|
||||
var stopIndex = items.length - 1;
|
||||
var middle = Math.floor((stopIndex + startIndex) / 2);
|
||||
|
||||
while (stopIndex > startIndex && middle >= 0 && items[middle].indexOf(prefix) !== 0) {
|
||||
if (prefix < items[middle]) {
|
||||
stopIndex = middle - 1;
|
||||
} else if (prefix > items[middle]) {
|
||||
startIndex = middle + 1;
|
||||
}
|
||||
middle = Math.floor((stopIndex + stopIndex) / 2);
|
||||
}
|
||||
while (middle > 0 && items[middle-1].indexOf(prefix) === 0) {
|
||||
middle--;
|
||||
}
|
||||
return middle >= 0 ? middle : 0; // ensure we're not returning a negative index
|
||||
}
|
||||
|
||||
var uriRegex = /[a-zA-Z_0-9\/\.:\-#]/;
|
||||
var char = '-._A-Za-z0-9:\u00B7\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02ff\u0300-\u037D\u037F-\u1FFF\u200C\u200D\u203f\u2040\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD';
|
||||
var nameChar = '[' + char + ']';
|
||||
//var varChar = '[' + char + '\\$]';
|
||||
var nameCharRegExp = new RegExp(nameChar);
|
||||
//var varCharRegExp = new RegExp(varChar);
|
||||
|
||||
var findCompletions = function(prefix, allIdentifiers) {
|
||||
allIdentifiers.sort();
|
||||
var startIdx = prefixBinarySearch(allIdentifiers, prefix);
|
||||
var matches = [];
|
||||
for (var i = startIdx; i < allIdentifiers.length && allIdentifiers[i].indexOf(prefix) === 0; i++) {
|
||||
matches.push(allIdentifiers[i]);
|
||||
}
|
||||
return matches;
|
||||
};
|
||||
|
||||
|
||||
var completePrefix = function(identifier, pos, sctx){
|
||||
var idx = identifier.indexOf(':');
|
||||
if(idx === -1) {
|
||||
var prefixes = [];
|
||||
var namespaces = sctx.getNamespaces();
|
||||
Object.keys(namespaces).forEach(function(key){
|
||||
if(namespaces[key].type === 'module') {
|
||||
prefixes.push(namespaces[key].prefix);
|
||||
}
|
||||
});
|
||||
var matches = findCompletions(identifier, prefixes);
|
||||
var match = function(name) {
|
||||
return {
|
||||
name: name + ':',
|
||||
score: 8,
|
||||
value: name + ':'
|
||||
};
|
||||
};
|
||||
return matches.map(match);
|
||||
} else {
|
||||
return [];
|
||||
}
|
||||
};
|
||||
|
||||
var completeFunction = function(identifier, pos, sctx){
|
||||
var names = [];
|
||||
var functions = sctx.getFunctions();
|
||||
var uri = '';
|
||||
var prefix = '';
|
||||
var name = identifier;
|
||||
var idx = identifier.indexOf(':');
|
||||
if(idx !== -1){
|
||||
prefix = identifier.substring(0, idx);
|
||||
name = identifier.substring(idx + 1);
|
||||
uri = sctx.getNamespaceByPrefix(prefix).uri;
|
||||
}
|
||||
Object.keys(functions).forEach(function(key){
|
||||
var fn = functions[key];
|
||||
var ns = key.substring(0, key.indexOf('#'));
|
||||
var name = key.substring(key.indexOf('#') + 1);
|
||||
name = name.substring(0, name.indexOf('#'));
|
||||
if(ns !== ''){
|
||||
name = sctx.getNamespaces()[ns].prefix + ':' + name;
|
||||
}
|
||||
name += '(';
|
||||
name += fn.params.join(', ');
|
||||
name += ')';
|
||||
names.push(name);
|
||||
});
|
||||
var matches = findCompletions(identifier, names);
|
||||
var match = function(name) {
|
||||
return {
|
||||
name: name,
|
||||
score: 4,
|
||||
value: name
|
||||
};
|
||||
};
|
||||
return matches.map(match);
|
||||
};
|
||||
|
||||
var completeVariable = function(identifier, pos, sctx){
|
||||
var uri = '';
|
||||
var prefix = '';
|
||||
var idx = identifier.indexOf(':');
|
||||
//Does the identifier has a prefix?
|
||||
if(idx !== -1){
|
||||
prefix = identifier.substring(0, idx);
|
||||
uri = sctx.getNamespaceByPrefix(prefix).uri;
|
||||
}
|
||||
var decls = sctx.getVariables();
|
||||
var names = [];
|
||||
Object.keys(decls).forEach(function(key){
|
||||
var i = key.indexOf('#');
|
||||
var ns = key.substring(0, i);
|
||||
var name = key.substring(i+1);
|
||||
if(ns !== ''){
|
||||
names.push(sctx.getPrefixByNamespace(ns) + ':' + name);
|
||||
} else {
|
||||
names.push(name);
|
||||
}
|
||||
});
|
||||
|
||||
var matches = findCompletions(identifier, names);
|
||||
var match = function(name) {
|
||||
return {
|
||||
name: '$' + name,
|
||||
score: 4,
|
||||
value: '$' + name
|
||||
};
|
||||
};
|
||||
return matches.map(match);
|
||||
};
|
||||
|
||||
var completeExpr = function(line, pos, sctx){
|
||||
console.log('line');
|
||||
console.log(line);
|
||||
console.log('=');
|
||||
var identifier = retrievePrecedingIdentifier(line, pos.col, nameCharRegExp);
|
||||
var before = line.substring(0, pos.col - (identifier.length === 0 ? 0 : identifier.length));
|
||||
var isVar = before[before.length - 1] === '$';
|
||||
if(isVar) {
|
||||
return completeVariable(identifier, pos, sctx);
|
||||
} else if(identifier !== '') {
|
||||
return completeFunction(identifier, pos, sctx).concat(completePrefix(identifier, pos, sctx));
|
||||
} else {
|
||||
return completeVariable(identifier, pos, sctx).concat(completeFunction(identifier, pos, sctx)).concat(completePrefix(identifier, pos, sctx));
|
||||
}
|
||||
};
|
||||
|
||||
var completeModuleUri = function(line, pos, sctx){
|
||||
var identifier = retrievePrecedingIdentifier(line, pos.col, uriRegex);
|
||||
var matches = findCompletions(identifier, sctx.getAvailableModuleNamespaces());
|
||||
var match = function(name) {
|
||||
return {
|
||||
name: name,
|
||||
score: 4,
|
||||
value: name
|
||||
};
|
||||
};
|
||||
return matches.map(match);
|
||||
};
|
||||
|
||||
exports.complete = function(source, ast, rootSctx, pos){
|
||||
var line = source.split('\n')[pos.line];
|
||||
var node = TreeOps.findNode(ast, pos);
|
||||
var sctx = TreeOps.findNode(rootSctx, pos);
|
||||
sctx = sctx ? sctx : rootSctx;
|
||||
if(node && node.name === 'URILiteral' && node.getParent && node.getParent.name === 'ModuleImport'){
|
||||
return completeModuleUri(line, pos, sctx);
|
||||
} else {
|
||||
return completeExpr(line, pos, sctx);
|
||||
}
|
||||
};
|
||||
},{"../tree_ops":10}],6:[function(_dereq_,module,exports){
|
||||
exports.StyleChecker = function (ast, source) {
|
||||
'use strict';
|
||||
|
||||
|
|
@ -1081,7 +1312,7 @@ exports.StyleChecker = function (ast, source) {
|
|||
});
|
||||
this.visit(ast);
|
||||
};
|
||||
},{}],6:[function(_dereq_,module,exports){
|
||||
},{}],7:[function(_dereq_,module,exports){
|
||||
//TODO: don't copy string
|
||||
exports.JSONParseTreeHandler = function (code) {
|
||||
'use strict';
|
||||
|
|
@ -1246,7 +1477,7 @@ exports.JSONParseTreeHandler = function (code) {
|
|||
ptr.pos.ec = ec;
|
||||
}
|
||||
};
|
||||
},{}],7:[function(_dereq_,module,exports){
|
||||
},{}],8:[function(_dereq_,module,exports){
|
||||
// This file was generated on Mon Mar 24, 2014 11:18 (UTC+01) by REx v5.30 which is Copyright (c) 1979-2014 by Gunther Rademacher <grd@gmx.net>
|
||||
// REx command line: JSONiqParser.ebnf -ll 2 -backtrack -tree -javascript -a xqlint
|
||||
|
||||
|
|
@ -43647,7 +43878,7 @@ JSONiqParser.TOKEN =
|
|||
|
||||
// End
|
||||
|
||||
},{}],8:[function(_dereq_,module,exports){
|
||||
},{}],9:[function(_dereq_,module,exports){
|
||||
// This file was generated on Mon Mar 24, 2014 11:18 (UTC+01) by REx v5.30 which is Copyright (c) 1979-2014 by Gunther Rademacher <grd@gmx.net>
|
||||
// REx command line: XQueryParser.ebnf -ll 2 -backtrack -tree -javascript -a xqlint
|
||||
|
||||
|
|
@ -78297,7 +78528,7 @@ XQueryParser.TOKEN =
|
|||
|
||||
// End
|
||||
|
||||
},{}],9:[function(_dereq_,module,exports){
|
||||
},{}],10:[function(_dereq_,module,exports){
|
||||
'use strict';
|
||||
|
||||
exports.TreeOps = {
|
||||
|
|
@ -78336,17 +78567,69 @@ exports.TreeOps = {
|
|||
var child = ast.children[i];
|
||||
this.removeParentPtr(child);
|
||||
}
|
||||
},
|
||||
|
||||
inRange: function(p, pos, exclusive){
|
||||
if(p && p.sl <= pos.line && pos.line <= p.el) {
|
||||
if(p.sl < pos.line && pos.line < p.el) {
|
||||
return true;
|
||||
} else if(p.sl === pos.line && pos.line < p.el) {
|
||||
return p.sc <= pos.col;
|
||||
} else if(p.sl === pos.line && p.el === pos.line) {
|
||||
return p.sc <= pos.col && pos.col <= p.ec + (exclusive ? 1 : 0);
|
||||
} else if(p.sl < pos.line && p.el === pos.line) {
|
||||
return pos.col <= p.ec + (exclusive ? 1 : 0);
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
findNode: function(ast, pos) {
|
||||
if(!ast) {
|
||||
return;
|
||||
}
|
||||
var p = ast.pos;
|
||||
if(this.inRange(p, pos) === true) {
|
||||
for(var i in ast.children) {
|
||||
var child = ast.children[i];
|
||||
var n = this.findNode(child, pos);
|
||||
if(n !== undefined) {
|
||||
return n;
|
||||
}
|
||||
}
|
||||
return ast;
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
},
|
||||
|
||||
astAsXML: function(node, indent){
|
||||
var result = '';
|
||||
indent = indent ? indent : '';
|
||||
if(node.value) {
|
||||
result += (indent + '<' + node.name + '>' + node.value + '</' + node.name + '>\n');
|
||||
}
|
||||
result += indent + '<' + node.name + '>\n';
|
||||
var that = this;
|
||||
node.children.forEach(function(child){
|
||||
result += that.astAsXML(child, indent + ' ');
|
||||
});
|
||||
result += indent + '</' + node.name + '>\n';
|
||||
return result;
|
||||
}
|
||||
};
|
||||
},{}],10:[function(_dereq_,module,exports){
|
||||
exports.XQLint = function (file, source, sctx, opts) {
|
||||
},{}],11:[function(_dereq_,module,exports){
|
||||
exports.XQLint = function (source, opts) {
|
||||
'use strict';
|
||||
|
||||
opts = opts ? opts : {};
|
||||
|
||||
var JSONiqParser = _dereq_('./parsers/JSONiqParser').JSONiqParser;
|
||||
var XQueryParser = _dereq_('./parsers/XQueryParser').XQueryParser;
|
||||
var JSONParseTreeHandler = _dereq_('./parsers/JSONParseTreeHandler').JSONParseTreeHandler;
|
||||
var Translator = _dereq_('./compiler/translator').Translator;
|
||||
var StyleChecker = _dereq_('./formatter/style_checker').StyleChecker;
|
||||
var StaticContext = _dereq_('./compiler/static_context').StaticContext;
|
||||
var completer = _dereq_('../lib/completion/completer');
|
||||
|
||||
var defaults = function(current, def){
|
||||
if(!current) {
|
||||
|
|
@ -78392,6 +78675,10 @@ exports.XQLint = function (file, source, sctx, opts) {
|
|||
return warnings;
|
||||
};
|
||||
|
||||
this.getCompletions = function(pos){
|
||||
return completer.complete(source, ast, sctx, pos);
|
||||
};
|
||||
|
||||
var syntaxError = false;
|
||||
this.hasSyntaxError = function () {
|
||||
return syntaxError;
|
||||
|
|
@ -78413,17 +78700,13 @@ exports.XQLint = function (file, source, sctx, opts) {
|
|||
return pos;
|
||||
};
|
||||
|
||||
var sctx = opts.staticContext ? opts.staticContext : new StaticContext();
|
||||
var file = opts.fileName ? opts.fileName : '';
|
||||
var isJSONiq = ((file.substring(file.length - '.jq'.length).indexOf('.jq') !== -1) && source.indexOf('xquery version') !== 0) || source.indexOf('jsoniq version') === 0;
|
||||
var h = new JSONParseTreeHandler(source);
|
||||
var parser = isJSONiq ? new JSONiqParser(source, h) : new XQueryParser(source, h);
|
||||
try {
|
||||
parser.parse_XQuery();
|
||||
ast = h.getParseTree();
|
||||
if(opts.styleCheck) {
|
||||
markers = markers.concat(new StyleChecker(ast, source).getMarkers());
|
||||
}
|
||||
var translator = new Translator(sctx, ast);
|
||||
markers = markers.concat(translator.getMarkers());
|
||||
} catch (e) {
|
||||
if (e instanceof parser.ParseException) {
|
||||
syntaxError = true;
|
||||
|
|
@ -78439,13 +78722,18 @@ exports.XQLint = function (file, source, sctx, opts) {
|
|||
level: 'error',
|
||||
message: message
|
||||
});
|
||||
//ast = h.getParseTree();
|
||||
} else {
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
ast = h.getParseTree();
|
||||
if(opts.styleCheck) {
|
||||
markers = markers.concat(new StyleChecker(ast, source).getMarkers());
|
||||
}
|
||||
var translator = new Translator(sctx, ast);
|
||||
markers = markers.concat(translator.getMarkers());
|
||||
};
|
||||
|
||||
},{"./compiler/translator":4,"./formatter/style_checker":5,"./parsers/JSONParseTreeHandler":6,"./parsers/JSONiqParser":7,"./parsers/XQueryParser":8}]},{},[10])
|
||||
(10)
|
||||
},{"../lib/completion/completer":5,"./compiler/static_context":3,"./compiler/translator":4,"./formatter/style_checker":6,"./parsers/JSONParseTreeHandler":7,"./parsers/JSONiqParser":8,"./parsers/XQueryParser":9}]},{},[11])
|
||||
(11)
|
||||
});
|
||||
|
|
@ -38,18 +38,25 @@ var XQLint = require("./xquery/xqlint").XQLint;
|
|||
var XQueryWorker = exports.XQueryWorker = function(sender) {
|
||||
Mirror.call(this, sender);
|
||||
this.setTimeout(200);
|
||||
var that = this;
|
||||
this.sender.on("complete", function(e){
|
||||
that.sender.emit("markers", that.xqlint.getMarkers());
|
||||
var pos = { line: e.data.pos.row, col: e.data.pos.column };
|
||||
var proposals = that.xqlint.getCompletions(pos);
|
||||
that.sender.emit("complete", proposals);
|
||||
});
|
||||
};
|
||||
|
||||
oop.inherits(XQueryWorker, Mirror);
|
||||
|
||||
(function() {
|
||||
|
||||
this.onUpdate = function() {
|
||||
this.sender.emit("start");
|
||||
var value = this.doc.getValue();
|
||||
var xqlint = new XQLint('test', value);
|
||||
this.sender.emit("markers", xqlint.getMarkers());
|
||||
};
|
||||
this.onUpdate = function() {
|
||||
this.sender.emit("start");
|
||||
var value = this.doc.getValue();
|
||||
this.xqlint = new XQLint(value);
|
||||
this.sender.emit("markers", this.xqlint.getMarkers());
|
||||
};
|
||||
}).call(XQueryWorker.prototype);
|
||||
|
||||
});
|
||||
|
|
|
|||
|
|
@ -12,21 +12,21 @@ snippet if
|
|||
if(${1:true}) then ${2:expr} else ${3:true}
|
||||
snippet switch
|
||||
switch(${1:"foo"})
|
||||
case ${2:"foo"}
|
||||
return ${3:true}
|
||||
default return ${4:false}
|
||||
case ${2:"foo"}
|
||||
return ${3:true}
|
||||
default return ${4:false}
|
||||
snippet try
|
||||
try { ${1:expr} } catch ${2:*} { ${3:expr} }
|
||||
snippet tumbling
|
||||
for tumbling window $${1:varname} in ${2:expr}
|
||||
start at $${3:start} when ${4:expr}
|
||||
end at $${5:end} when ${6:expr}
|
||||
return ${7:expr}
|
||||
start at $${3:start} when ${4:expr}
|
||||
end at $${5:end} when ${6:expr}
|
||||
return ${7:expr}
|
||||
snippet sliding
|
||||
for sliding window $${1:varname} in ${2:expr}
|
||||
start at $${3:start} when ${4:expr}
|
||||
end at $${5:end} when ${6:expr}
|
||||
return ${7:expr}
|
||||
start at $${3:start} when ${4:expr}
|
||||
end at $${5:end} when ${6:expr}
|
||||
return ${7:expr}
|
||||
snippet let
|
||||
let $${1:varname} := ${2:expr}
|
||||
snippet group
|
||||
|
|
@ -49,13 +49,13 @@ snippet cast
|
|||
cast as ${1:atomicType}
|
||||
snippet typeswitch
|
||||
typeswitch(${1:expr})
|
||||
case ${2:type} return ${3:expr}
|
||||
default return ${4:expr}
|
||||
case ${2:type} return ${3:expr}
|
||||
default return ${4:expr}
|
||||
snippet var
|
||||
declare variable $${1:varname} := ${2:expr};
|
||||
snippet fn
|
||||
declare function ${1:ns}:${2:name}(){
|
||||
${3:expr}
|
||||
};
|
||||
${3:expr}
|
||||
};
|
||||
snippet module
|
||||
module namespace ${1:ns} = "${2:http://www.example.com}";
|
||||
|
|
@ -12,21 +12,21 @@ snippet if
|
|||
if(${1:true}) then ${2:expr} else ${3:true}
|
||||
snippet switch
|
||||
switch(${1:"foo"})
|
||||
case ${2:"foo"}
|
||||
return ${3:true}
|
||||
default return ${4:false}
|
||||
case ${2:"foo"}
|
||||
return ${3:true}
|
||||
default return ${4:false}
|
||||
snippet try
|
||||
try { ${1:expr} } catch ${2:*} { ${3:expr} }
|
||||
snippet tumbling
|
||||
for tumbling window $${1:varname} in ${2:expr}
|
||||
start at $${3:start} when ${4:expr}
|
||||
end at $${5:end} when ${6:expr}
|
||||
return ${7:expr}
|
||||
start at $${3:start} when ${4:expr}
|
||||
end at $${5:end} when ${6:expr}
|
||||
return ${7:expr}
|
||||
snippet sliding
|
||||
for sliding window $${1:varname} in ${2:expr}
|
||||
start at $${3:start} when ${4:expr}
|
||||
end at $${5:end} when ${6:expr}
|
||||
return ${7:expr}
|
||||
start at $${3:start} when ${4:expr}
|
||||
end at $${5:end} when ${6:expr}
|
||||
return ${7:expr}
|
||||
snippet let
|
||||
let $${1:varname} := ${2:expr}
|
||||
snippet group
|
||||
|
|
@ -49,13 +49,13 @@ snippet cast
|
|||
cast as ${1:atomicType}
|
||||
snippet typeswitch
|
||||
typeswitch(${1:expr})
|
||||
case ${2:type} return ${3:expr}
|
||||
default return ${4:expr}
|
||||
case ${2:type} return ${3:expr}
|
||||
default return ${4:expr}
|
||||
snippet var
|
||||
declare variable $${1:varname} := ${2:expr};
|
||||
snippet fn
|
||||
declare function ${1:ns}:${2:name}(){
|
||||
${3:expr}
|
||||
};
|
||||
${3:expr}
|
||||
};
|
||||
snippet module
|
||||
module namespace ${1:ns} = "${2:http://www.example.com}";
|
||||
Loading…
Add table
Add a link
Reference in a new issue