From 3f4a0d5370ae6c34afe180df96add3b8522f4af1 Mon Sep 17 00:00:00 2001 From: mattkae Date: Wed, 11 May 2022 09:23:58 -0400 Subject: initial commit --- elpa/ac-js2-20190101.933/skewer-addon.js | 116 +++++++++++++++++++++++++++++++ 1 file changed, 116 insertions(+) create mode 100644 elpa/ac-js2-20190101.933/skewer-addon.js (limited to 'elpa/ac-js2-20190101.933/skewer-addon.js') diff --git a/elpa/ac-js2-20190101.933/skewer-addon.js b/elpa/ac-js2-20190101.933/skewer-addon.js new file mode 100644 index 0000000..8e2b5a1 --- /dev/null +++ b/elpa/ac-js2-20190101.933/skewer-addon.js @@ -0,0 +1,116 @@ +/** + * @fileOverview Completion request handler for skewer.js + * @requires skewer + * @version 1.0 + */ + +/** + * Handles a completion request from Emacs. + * @param request The request object sent by Emacs + * @returns The completions and init values to be returned to Emacs + */ +skewer.fn.complete = function(request) { + var result = { + type : request.type, + id : request.id, + strict : request.strict, + status : "success" + }, + + /** + * Methods for generating candidates + */ + METHOD = { + EVAL : 0, + GLOBAL : 1 + }, + + /** + * Add the properties from object to extendObject. Properties + * may be from the prototype but we still want to add them. + */ + extend = function(extendObject, object) { + for(var key in object) { + extendObject[key] = object[key]; + } + }, + + globalCompletion = function() { + var global = Function('return this')(), + keys = Object.keys(global); + candidates = buildCandidates(global, keys); + }, + + evalCompletion = function(evalObject) { + var obj = (eval, eval)(evalObject); + if (typeof obj === "object") { + candidates = buildCandidates(obj) || {}; + while (request.prototypes && (obj = Object.getPrototypeOf(obj)) !== null) { + extend(candidates, buildCandidates(obj)); + } + } else if (typeof obj === "function"){ + candidates = buildCandidates(obj) || {}; + extend(candidates, buildCandidates(Object.getPrototypeOf(obj))); + if (request.prototypes) { + var protoObject = Object.getPrototypeOf(obj.prototype); + if (protoObject !== null) { + extend(candidates, buildCandidates(protoObject)); + } else { + extend(candidates, buildCandidates(obj.prototype)); + } + } + } + }, + + /** + * Completion candidates sent back to Emacs. Keys are + * completion candidates the values are the inital items or + * function interfaces. + */ + candidates = {}, + + /** + * Build the candiates to return to Emacs. + * @param obj The object to get candidates from + * @param items The selected keys from obj to create candidates for + * @return object containing completion candidates and documentation strings + */ + buildCandidates = function(obj, items) { + var keys = items || Object.getOwnPropertyNames(obj), values = {}; + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + if (key === "callee" || key === "caller" || key === "arguments") continue; + if (Object.prototype.toString.call(obj[key]) === "[object Function]") { + values[key] = obj[key].toString(); + } else if (typeof obj[key] === "object"){ + values[key] = "[object Object]"; + } else if (typeof obj[key] === "number") { + if (!(obj instanceof Array)) { + values[key] = obj[key].toString(); + } + } else if (typeof obj[key] === "string") { + values[key] = obj[key].toString(); + } else if(obj[key] === true) { + values[key] = "true"; + } else if (obj[key] === false) { + values[key] = "false"; + } else { + values[key] = ""; + } + } + return values; + }; + try { + switch (request.method) { + case METHOD.GLOBAL: + globalCompletion(); + break; + default: + evalCompletion(request.eval); + } + result.value = candidates; + } catch (error){ + skewer.errorResult(error, result, request); + } + return result; +}; -- cgit v1.2.1