1
0
mirror of https://github.com/gryf/pentadactyl-pm.git synced 2026-02-04 02:25:48 +01:00

Experimentally move more modules to global modules.

--HG--
rename : common/content/completion.js => common/modules/completion.jsm
rename : common/content/javascript.js => common/modules/javascript.jsm
This commit is contained in:
Kris Maglione
2011-01-03 23:41:48 -05:00
parent d661d60cb6
commit ee2bba53ca
5 changed files with 152 additions and 103 deletions

View File

@@ -6,7 +6,13 @@
// given in the LICENSE.txt file included with this file.
"use strict";
/** @scope modules */
try {
Components.utils.import("resource://dactyl/base.jsm");
defineModule("completion", {
exports: ["CompletionContext", "Completion", "completion"],
use: ["config", "template", "util"]
});
/**
* Creates a new completion context.
@@ -36,9 +42,9 @@ var CompletionContext = Class("CompletionContext", {
let parent = editor;
name = parent.name + "/" + name;
this.autoComplete = options.get("autocomplete").getKey(name);
this.sortResults = options.get("wildsort").getKey(name);
this.wildcase = options.get("wildcase").getKey(name);
this.autoComplete = this.options.get("autocomplete").getKey(name);
this.sortResults = this.options.get("wildsort").getKey(name);
this.wildcase = this.options.get("wildcase").getKey(name);
this.contexts = parent.contexts;
if (name in this.contexts)
@@ -237,7 +243,7 @@ var CompletionContext = Class("CompletionContext", {
return this.cache.allItemsResult;
}
catch (e) {
dactyl.reportError(e);
util.reportError(e);
return { start: 0, items: [], longestAllSubstring: "" };
}
},
@@ -385,7 +391,7 @@ var CompletionContext = Class("CompletionContext", {
this.itemCache[this.key] = res;
}
catch (e) {
dactyl.reportError(e);
util.reportError(e);
this.message = "Error: " + e;
}
}
@@ -446,7 +452,7 @@ var CompletionContext = Class("CompletionContext", {
delete this._substrings;
if (!this.forceAnchored)
this.anchored = options.get("wildanchor").getKey(this.name, this.anchored);
this.anchored = this.options.get("wildanchor").getKey(this.name, this.anchored);
// Item matchers
if (this.ignoreCase)
@@ -484,7 +490,7 @@ var CompletionContext = Class("CompletionContext", {
}
catch (e) {
this.message = "Error: " + e;
dactyl.reportError(e);
util.reportError(e);
return [];
}
},
@@ -645,7 +651,7 @@ var CompletionContext = Class("CompletionContext", {
fork: function fork(name, offset, self, completer) {
if (isString(completer))
completer = self[completer];
let context = CompletionContext(this, name, offset);
let context = this.constructor(this, name, offset);
if (this.contextList.indexOf(context) < 0)
this.contextList.push(context);
@@ -833,40 +839,44 @@ var Completion = Module("completion", {
get setFunctionCompleter() JavaScript.setCompleter, // Backward compatibility
// FIXME
_runCompleter: function _runCompleter(name, filter, maxItems) {
let context = CompletionContext(filter);
context.maxItems = maxItems;
let res = context.fork.apply(context, ["run", 0, this, name].concat(Array.slice(arguments, 3)));
if (res) {
if (Components.stack.caller.name === "runCompleter") // FIXME
return { items: res.map(function (i) ({ item: i })) };
context.contexts["/run"].completions = res;
}
context.wait(true);
return context.allItems;
},
Local: function (dactyl, modules, window) ({
options: modules.options,
runCompleter: function runCompleter(name, filter, maxItems) {
return this._runCompleter.apply(this, Array.slice(arguments))
.items.map(function (i) i.item);
},
// FIXME
_runCompleter: function _runCompleter(name, filter, maxItems) {
let context = modules.CompletionContext(filter);
context.maxItems = maxItems;
let res = context.fork.apply(context, ["run", 0, this, name].concat(Array.slice(arguments, 3)));
if (res) {
if (Components.stack.caller.name === "runCompleter") // FIXME
return { items: res.map(function (i) ({ item: i })) };
context.contexts["/run"].completions = res;
}
context.wait(true);
return context.allItems;
},
listCompleter: function listCompleter(name, filter, maxItems) {
let context = CompletionContext(filter || "");
context.maxItems = maxItems;
context.fork.apply(context, ["list", 0, completion, name].concat(Array.slice(arguments, 3)));
context = context.contexts["/list"];
context.wait();
runCompleter: function runCompleter(name, filter, maxItems) {
return this._runCompleter.apply(this, Array.slice(arguments))
.items.map(function (i) i.item);
},
commandline.commandOutput(
<div highlight="Completions">
{ template.map(context.contextList.filter(function (c) c.hasItems && c.items.length),
function (context)
template.completionRow(context.title, "CompTitle") +
template.map(context.items, function (item) context.createRow(item), null, 100)) }
</div>);
},
listCompleter: function listCompleter(name, filter, maxItems) {
let context = modules.CompletionContext(filter || "");
context.maxItems = maxItems;
context.fork.apply(context, ["list", 0, completion, name].concat(Array.slice(arguments, 3)));
context = context.contexts["/list"];
context.wait();
modules.commandline.commandOutput(
<div highlight="Completions">
{ template.map(context.contextList.filter(function (c) c.hasItems && c.items.length),
function (context)
template.completionRow(context.title, "CompTitle") +
template.map(context.items, function (item) context.createRow(item), null, 100)) }
</div>);
},
}),
////////////////////////////////////////////////////////////////////////////////
////////////////////// COMPLETION TYPES ////////////////////////////////////////
@@ -882,14 +892,14 @@ var Completion = Module("completion", {
let start = 0;
let skip = 0;
if (options["urlseparator"])
skip = context.filter.match("^.*" + options["urlseparator"]); // start after the last 'urlseparator'
if (this.options["urlseparator"])
skip = context.filter.match("^.*" + this.options["urlseparator"]); // start after the last 'urlseparator'
if (skip)
context.advance(skip[0].length);
if (complete == null)
complete = options["complete"];
complete = this.options["complete"];
if (/^about:/.test(context.filter)) {
context.fork("about", 6, this, function (context) {
@@ -960,11 +970,22 @@ var Completion = Module("completion", {
}, {
UrlCompleter: Struct("name", "description", "completer")
}, {
commands: function () {
init: function init(dactyl, modules, window) {
init.superapply(this, arguments);
modules.CompletionContext = Class("CompletionContext", CompletionContext, {
init: function init() {
this.options = modules.options;
return init.superapply(this, arguments);
}
});
},
commands: function (dactyl, modules, window) {
const { commands, completion } = modules;
commands.add(["contexts"],
"List the completion contexts used during completion of an Ex command",
function (args) {
commandline.commandOutput(
modules.commandline.commandOutput(
<div highlight="Completions">
{ template.completionRow(["Context", "Title"], "CompTitle") }
{ template.map(completion.contextList || [], function (item) template.completionRow(item, "CompItem")) }
@@ -980,7 +1001,8 @@ var Completion = Module("completion", {
literal: 0
});
},
options: function () {
options: function (dactyl, modules, window) {
const { completion, options } = modules;
let wildmode = {
completer: function (context) [
// Why do we need ""?
@@ -1042,4 +1064,8 @@ var Completion = Module("completion", {
}
});
endModule();
} catch(e){ if (!e.stack) e = Error(e); dump(e.fileName+":"+e.lineNumber+": "+e+"\n" + e.stack); }
// vim: set fdm=marker sw=4 ts=4 et:

View File

@@ -28,7 +28,7 @@ var IO = Module("io", {
this._oldcwd = null;
},
Local: function (dactyl, modules, window) let ({ Script, plugins } = modules) ({
Local: function (dactyl, modules, window) let ({ Script, io, plugins } = modules) ({
init: function init() {
this._processDir = services.directory.get("CurWorkD", Ci.nsIFile);

View File

@@ -4,24 +4,39 @@
// given in the LICENSE.txt file included with this file.
"use strict";
try {
Components.utils.import("resource://dactyl/base.jsm");
defineModule("javascript", {
exports: ["JavaScript", "javascript"],
use: ["services", "template", "util"],
});
// TODO: Clean this up.
var JavaScript = Module("javascript", {
init: function () {
this._stack = [];
this._functions = [];
this._top = {}; // The element on the top of the stack.
this._last = ""; // The last opening char pushed onto the stack.
this._lastNonwhite = ""; // Last non-whitespace character we saw.
this._lastChar = ""; // Last character we saw, used for \ escaping quotes.
this._str = "";
Local: function (dactyl, modules, window) ({
init: function () {
this.modules = modules;
this.window = window
this._lastIdx = 0;
this._stack = [];
this._functions = [];
this._top = {}; // The element on the top of the stack.
this._last = ""; // The last opening char pushed onto the stack.
this._lastNonwhite = ""; // Last non-whitespace character we saw.
this._lastChar = ""; // Last character we saw, used for \ escaping quotes.
this._str = "";
this._cacheKey = null;
this._lastIdx = 0;
this._nullSandbox = Cu.Sandbox("about:blank");
},
this._cacheKey = null;
this._nullSandbox = Cu.Sandbox("about:blank");
},
}),
newContext: function () this.modules.newContext(this.modules.userContext),
get completers() JavaScript.completers, // For backward compatibility
@@ -39,7 +54,7 @@ var JavaScript = Module("javascript", {
return;
let seen = isinstance(obj, ["Sandbox"]) ? set(JavaScript.magicalNames) : {};
let globals = values(toplevel && window === obj ? JavaScript.globalNames : []);
let globals = values(toplevel && this.window === obj ? this.globalNames : []);
for (let key in iter(globals, properties(obj, !toplevel, true)))
if (!set.add(seen, key))
yield key;
@@ -60,12 +75,12 @@ var JavaScript = Module("javascript", {
return [];
if (isinstance(obj, ["Sandbox"]) && !toplevel) // Temporary hack.
return [];
if (jsmodules.isPrototypeOf(obj) && !toplevel)
if (this.modules.jsmodules.isPrototypeOf(obj) && !toplevel)
return [];
let completions = [k for (k in this.iter(obj, toplevel))];
if (obj === modules) // Hack.
completions = completions.concat([k for (k in this.iter(jsmodules, toplevel))]);
if (obj === this.modules) // Hack.
completions = completions.concat([k for (k in this.iter(this.modules.jsmodules, toplevel))]);
return completions;
},
@@ -82,9 +97,9 @@ var JavaScript = Module("javascript", {
context[JavaScript.EVAL_EXPORT] = function export(obj) cache[key] = obj;
try {
if (tmp != null) // Temporary hack until bug 609949 is fixed.
dactyl.userEval(JavaScript.EVAL_EXPORT + "(" + arg + ")", context, "[Command Line Completion]", 1);
this.modules.dactyl.userEval(JavaScript.EVAL_EXPORT + "(" + arg + ")", context, "[Command Line Completion]", 1);
else
cache[key] = dactyl.userEval(arg, context, "[Command Line Completion]", 1);
cache[key] = this.modules.dactyl.userEval(arg, context, "[Command Line Completion]", 1);
return cache[key];
}
@@ -254,7 +269,7 @@ var JavaScript = Module("javascript", {
_getObj: function (frame, stop) {
let statement = this._get(frame, 0, "statements") || 0; // Current statement.
let prev = statement;
let obj = window;
let obj = this.window;
let cacheKey;
for (let [, dot] in Iterator(this._get(frame).dots.concat(stop))) {
if (dot < statement)
@@ -287,9 +302,9 @@ var JavaScript = Module("javascript", {
this._cacheKey = null;
let obj = [[this.cache.evalContext, "Local Variables"],
[userContext, "Global Variables"],
[modules, "modules"],
[window, "window"]]; // Default objects;
[this.modules.userContext, "Global Variables"],
[this.modules, "modules"],
[this.window, "window"]]; // Default objects;
// Is this an object dereference?
if (dot < statement) // No.
dot = statement - 1;
@@ -322,7 +337,7 @@ var JavaScript = Module("javascript", {
_complete: function (objects, key, compl, string, last) {
const self = this;
if (!window.Object.getOwnPropertyNames && !options["jsdebugger"] && !this.context.message)
if (!this.window.Object.getOwnPropertyNames && !services.debugger.isOn && !this.context.message)
this.context.message = "For better completion data, please enable the JavaScript debugger (:set jsdebugger)";
let orig = compl;
@@ -430,14 +445,13 @@ var JavaScript = Module("javascript", {
this._buildStack.call(this, context.filter);
}
catch (e) {
if (e.message != "Invalid JS")
dactyl.reportError(e);
this._lastIdx = 0;
util.assert(!e.message, e.message);
return null;
}
this.context.getCache("evalled", Object);
this.context.getCache("evalContext", function () newContext(userContext));
this.context.getCache("evalContext", this.closure.newContext);
// Okay, have parse stack. Figure out what we're completing.
@@ -586,27 +600,15 @@ var JavaScript = Module("javascript", {
this._top.offset = o;
}
return null;
}
}, {
EVAL_TMP: "__dactyl_eval_tmp",
EVAL_EXPORT: "__dactyl_eval_export",
},
/**
* A map of argument completion functions for named methods. The
* signature and specification of the completion function
* are fairly complex and yet undocumented.
*
* @see JavaScript.setCompleter
*/
completers: {},
magicalNames: Class.memoize(function () Object.getOwnPropertyNames(Cu.Sandbox(window), true).sort()),
magicalNames: Class.memoize(function () Object.getOwnPropertyNames(Cu.Sandbox(this.window), true).sort()),
/**
* A list of properties of the global object which are not
* enumerable by any standard method.
*/
globalNames: Class.memoize(function () array.uniq([
globalNames: Class.memoize(function () let (self = this) array.uniq([
"Array", "ArrayBuffer", "AttributeName", "Boolean", "Components",
"CSSFontFaceStyleDecl", "CSSGroupRuleRuleList", "CSSNameSpaceRule",
"CSSRGBColor", "CSSRect", "ComputedCSSStyleDeclaration", "Date",
@@ -624,8 +626,21 @@ var JavaScript = Module("javascript", {
"isXMLName", "parseFloat", "parseInt", "undefined", "uneval"
].concat([k.substr(6) for (k in keys(Ci)) if (/^nsIDOM/.test(k))])
.concat([k.substr(3) for (k in keys(Ci)) if (/^nsI/.test(k))])
.concat(JavaScript.magicalNames)
.filter(function (k) k in window))),
.concat(this.magicalNames)
.filter(function (k) k in self.window))),
}, {
EVAL_TMP: "__dactyl_eval_tmp",
EVAL_EXPORT: "__dactyl_eval_export",
/**
* A map of argument completion functions for named methods. The
* signature and specification of the completion function
* are fairly complex and yet undocumented.
*
* @see JavaScript.setCompleter
*/
completers: {},
/**
* Installs argument string completers for a set of functions.
@@ -658,12 +673,16 @@ var JavaScript = Module("javascript", {
return arguments[0];
}
}, {
completion: function () {
completion.javascript = this.closure.complete;
init: function init(dactyl, modules, window) {
init.superapply(this, arguments);
},
completion: function (dactyl, modules, window) {
const { completion, javascript } = modules;
completion.javascript = javascript.closure.complete;
completion.javascriptCompleter = JavaScript; // Backwards compatibility.
},
options: function () {
options.add(["jsdebugger", "jsd"],
options: function (dactyl, modules, window) {
modules.options.add(["jsdebugger", "jsd"],
"Enable the JavaScript debugger service for use in JavaScript completion",
"boolean", false, {
setter: function (value) {
@@ -678,4 +697,8 @@ var JavaScript = Module("javascript", {
}
});
endModule();
} catch(e){ if (!e.stack) e = Error(e); dump(e.fileName+":"+e.lineNumber+": "+e+"\n" + e.stack); }
// vim: set fdm=marker sw=4 ts=4 et:

View File

@@ -146,24 +146,24 @@ var Overlay = Module("Overlay", {
let prefix = [BASE];
["base",
"completion",
"config",
"util",
"services",
"javascript",
"overlay",
"prefs",
"storage"
"services",
"storage",
"util"
].forEach(function (name) require(jsmodules, name));
prefix.unshift("chrome://" + config.name + "/content/");
["javascript",
"dactyl",
["dactyl",
"modes",
"abbreviations",
"autocommands",
"buffer",
"commandline",
"commands",
"completion",
"editor",
"events",
"finder",
@@ -212,6 +212,8 @@ var Overlay = Module("Overlay", {
deferredInit[mod].push(init(func, mod));
}
}
for (let [, fn] in iter(deferredInit[module.constructor.className] || []))
fn();
}
function load(module, prereq, frame) {
@@ -239,8 +241,6 @@ var Overlay = Module("Overlay", {
modules[module.className] = defineModule.time(module.className, "init", module);
init(modules[module.className]);
for (let [, fn] in iter(deferredInit[module.className] || []))
fn();
}
catch (e) {
util.dump("Loading " + (module && module.className) + ":");

View File

@@ -1501,6 +1501,6 @@ var Math = update(Object.create(GlobalMath), {
endModule();
} catch(e){ if (isString(e)) e = Error(e); dump(e.fileName+":"+e.lineNumber+": "+e+"\n" + e.stack); }
} catch(e){ if (!e.stack) e = Error(e); dump(e.fileName+":"+e.lineNumber+": "+e+"\n" + e.stack); }
// vim: set fdm=marker sw=4 ts=4 et ft=javascript: