xquery_worker.js 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. /* ***** BEGIN LICENSE BLOCK *****
  2. * Distributed under the BSD license:
  3. *
  4. * Copyright (c) 2010, Ajax.org B.V.
  5. * All rights reserved.
  6. *
  7. * Redistribution and use in source and binary forms, with or without
  8. * modification, are permitted provided that the following conditions are met:
  9. * * Redistributions of source code must retain the above copyright
  10. * notice, this list of conditions and the following disclaimer.
  11. * * Redistributions in binary form must reproduce the above copyright
  12. * notice, this list of conditions and the following disclaimer in the
  13. * documentation and/or other materials provided with the distribution.
  14. * * Neither the name of Ajax.org B.V. nor the
  15. * names of its contributors may be used to endorse or promote products
  16. * derived from this software without specific prior written permission.
  17. *
  18. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
  19. * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
  20. * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  21. * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY
  22. * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
  23. * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  24. * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  25. * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  26. * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  27. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  28. *
  29. * ***** END LICENSE BLOCK ***** */
  30. define(function(require, exports, module) {
  31. "use strict";
  32. var oop = require("../lib/oop");
  33. var Mirror = require("../worker/mirror").Mirror;
  34. var XQLintLib = require("./xquery/xqlint");
  35. var XQLint = XQLintLib.XQLint;
  36. var getModuleResolverFromModules = function(modules){
  37. return function(uri){
  38. var index = modules;
  39. var mod = index[uri];
  40. var variables = {};
  41. var functions = {};
  42. mod.functions.forEach(function(fn){
  43. functions[uri + '#' + fn.name + '#' + fn.arity] = {
  44. params: []
  45. };
  46. fn.parameters.forEach(function(param){
  47. functions[uri + '#' + fn.name + '#' + fn.arity].params.push('$' + param.name);
  48. });
  49. });
  50. mod.variables.forEach(function(variable){
  51. var name = variable.name.substring(variable.name.indexOf(':') + 1);
  52. variables[uri + '#' + name] = { type: 'VarDecl', annotations: [] };
  53. });
  54. return {
  55. variables: variables,
  56. functions: functions
  57. };
  58. };
  59. };
  60. var XQueryWorker = exports.XQueryWorker = function(sender) {
  61. Mirror.call(this, sender);
  62. this.setTimeout(200);
  63. this.opts = {
  64. styleCheck: false
  65. };
  66. //this.availableModuleNamespaces = Object.keys(Modules);
  67. //this.moduleResolver; = getModuleResolverFromModules(Modules);
  68. var that = this;
  69. this.sender.on("complete", function(e){
  70. if(that.xqlint) {
  71. var pos = { line: e.data.pos.row, col: e.data.pos.column };
  72. var proposals = that.xqlint.getCompletions(pos);
  73. that.sender.emit("complete", proposals);
  74. }
  75. });
  76. this.sender.on("setAvailableModuleNamespaces", function(e){
  77. that.availableModuleNamespaces = e.data;
  78. });
  79. this.sender.on("setModuleResolver", function(e){
  80. that.moduleResolver = getModuleResolverFromModules(e.data);
  81. });
  82. };
  83. oop.inherits(XQueryWorker, Mirror);
  84. (function() {
  85. this.onUpdate = function() {
  86. this.sender.emit("start");
  87. var value = this.doc.getValue();
  88. var sctx = XQLintLib.createStaticContext();
  89. if(this.moduleResolver) {
  90. sctx.setModuleResolver(this.moduleResolver);
  91. }
  92. if(this.availableModuleNamespaces) {
  93. sctx.availableModuleNamespaces = this.availableModuleNamespaces;
  94. }
  95. var opts = {
  96. styleCheck: this.styleCheck,
  97. staticContext: sctx
  98. };
  99. this.xqlint = new XQLint(value, opts);
  100. this.sender.emit("markers", this.xqlint.getMarkers());
  101. };
  102. }).call(XQueryWorker.prototype);
  103. });