@quodatum/xqlint
Version:
XQuery Quality Checker
154 lines (137 loc) • 4.38 kB
JavaScript
;
var TreeOps = require('../tree_ops').TreeOps;
var Errors = require('./errors');
var StaticWarning = Errors.StaticWarning;
//
// Prolog Handlers
//
exports.ModuleDecl = function(translator, rootSctx, node){
var prefix = '';
return {
NCName: function(ncname){
prefix = TreeOps.flatten(ncname);
},
URILiteral: function(uri) {
uri = TreeOps.flatten(uri);
uri = uri.substring(1, uri.length - 1);
translator.apply(function(){
rootSctx.moduleNamespace = uri;
rootSctx.addNamespace(uri, prefix, node.pos, 'moduleDecl');
});
}
};
};
exports.ModuleImport = function(translator, rootSctx, node,ats) {
var prefix = '';
var moduleURI;
//location hints
return {
NCName: function(ncname){
prefix = TreeOps.flatten(ncname);
},
URILiteral: function(node) {
let uri = TreeOps.flatten(node);
uri = uri.substring(1, uri.length - 1);
if(moduleURI !== undefined) {return; } //location hints
moduleURI = uri;
translator.apply(function(){
rootSctx.importModule(uri, prefix, node.pos,ats);
});
}
};
};
exports.SchemaImport = function(translator, rootSctx, node) {
var prefix = '';
var schemaURI;
return {
SchemaPrefix: function(schemaPrefix) {
var SchemaPrefixHandler = function () {
this.NCName = function (ncname) {
prefix = TreeOps.flatten(ncname);
};
};
translator.visitChildren(schemaPrefix, new SchemaPrefixHandler());
},
URILiteral: function(uri) {
if(schemaURI !== undefined) {
//location hints
return;
}
uri = TreeOps.flatten(uri);
uri = uri.substring(1, uri.length - 1);
schemaURI = uri;
translator.apply(function(){
rootSctx.addNamespace(uri, prefix, node.pos, 'schema');
});
}
};
};
exports.DefaultNamespaceDecl = function(translator, rootSctx, node) {
var fn = false;
var ns = '';
return {
TOKEN: function(token){
fn = fn ? true : (token.value === 'function');
},
URILiteral: function(uri){
ns = TreeOps.flatten(uri);
ns = ns.substring(1, ns.length - 1);
if(!fn) {
translator.apply(function(){
throw new StaticWarning('W06', 'Avoid default element namespace declarations.', node.pos);
});
rootSctx.defaultElementNamespace = ns;
} else {
rootSctx.defaultFunctionNamespace = ns;
}
}
};
};
exports.NamespaceDecl = function(translator, rootSctx, node) {
var prefix = '';
return {
NCName: function(ncname) {
prefix = TreeOps.flatten(ncname);
},
URILiteral: function(uri) {
uri = TreeOps.flatten(uri);
uri = uri.substring(1, uri.length - 1);
translator.apply(function(){
rootSctx.addNamespace(uri, prefix, node.pos, 'declare');
});
}
};
};
//
//
//
exports.VarHandler = function(translator, sctx, node){
var EQNameHandler = function(eqname){
var value = TreeOps.flatten(eqname);
translator.apply(function(){
var qname = sctx.resolveQName(value, eqname.pos);
sctx.addVariable(qname, node.name, eqname.pos);
});
};
return {
ExprSingle: function(){ return true; },
VarValue: function(){ return true; },
VarDefaultValue: function(){ return true; },
VarName: EQNameHandler,
EQName: EQNameHandler
};
};
exports.VarRefHandler = function(translator, sctx, node){
return {
VarName: function(eqname){
var value = TreeOps.flatten(eqname);
translator.apply(function(){
var qname = sctx.resolveQName(value, node.pos);
if(qname.uri !== '') {
sctx.root.namespaces[qname.uri].used = true;
}
sctx.addVarRef(qname, eqname.pos);
});
}
};
};