From 52e49ab7d3e58f8f57fe9be8c6a79c2efb6fedd2 Mon Sep 17 00:00:00 2001 From: RaymondLim Date: Fri, 27 Jun 2014 12:44:50 -0700 Subject: [PATCH 1/3] Provide simple code hints preferences to enable/disable individual/all code hints providers. --- src/editor/CodeHintManager.js | 38 ++++++++++++++++++++++++++--------- 1 file changed, 29 insertions(+), 9 deletions(-) diff --git a/src/editor/CodeHintManager.js b/src/editor/CodeHintManager.js index 6e34c510eea..9af5469f4fc 100644 --- a/src/editor/CodeHintManager.js +++ b/src/editor/CodeHintManager.js @@ -242,18 +242,23 @@ define(function (require, exports, module) { CodeHintList = require("editor/CodeHintList").CodeHintList, PreferencesManager = require("preferences/PreferencesManager"); - var hintProviders = { "all" : [] }, - lastChar = null, - sessionProvider = null, - sessionEditor = null, - hintList = null, - deferredHints = null, - keyDownEditor = null; + var hintProviders = { "all" : [] }, + lastChar = null, + sessionProvider = null, + sessionEditor = null, + hintList = null, + deferredHints = null, + keyDownEditor = null, + codeHintsEnabled = true; + PreferencesManager.definePreference("showCodeHints", "boolean", true); PreferencesManager.definePreference("insertHintOnTab", "boolean", false); - + PreferencesManager.on("change", "showCodeHints", function () { + codeHintsEnabled = PreferencesManager.get("showCodeHints"); + }); + /** * Comparator to sort providers from high to low priority */ @@ -347,7 +352,15 @@ define(function (require, exports, module) { * @return {?Array.<{provider: Object, priority: number}>} */ function _getProvidersForLanguageId(languageId) { - return hintProviders[languageId] || hintProviders.all; + var providers = hintProviders[languageId] || hintProviders.all; + + // Exclude providers that are explicitly disabled in the preferences. + // All code hint providers that do not have their constructor + // names listed in the preferences are enabled by default. + return providers.filter(function (provider) { + var prefKey = "codehint." + provider.provider.constructor.name; + return PreferencesManager.get(prefKey) !== false; + }); } var _beginSession; @@ -451,6 +464,10 @@ define(function (require, exports, module) { * @param {Editor} editor */ _beginSession = function (editor) { + if (!codeHintsEnabled) { + return; + } + // Don't start a session if we have a multiple selection. if (editor.getSelections().length > 1) { return; @@ -501,6 +518,9 @@ define(function (require, exports, module) { * @param {Editor} editor */ function _startNewSession(editor) { + if (!codeHintsEnabled) { + return; + } if (!editor) { editor = EditorManager.getFocusedEditor(); } From 1e4d8e135a90e4f81622529b7bf1e1a5149d6dba Mon Sep 17 00:00:00 2001 From: RaymondLim Date: Tue, 15 Jul 2014 21:57:40 -0700 Subject: [PATCH 2/3] Explicitly control JS Hints provider with preferences for performance improvement. --- src/editor/CodeHintManager.js | 5 +-- .../default/JavaScriptCodeHints/main.js | 37 +++++++++++++++---- 2 files changed, 31 insertions(+), 11 deletions(-) diff --git a/src/editor/CodeHintManager.js b/src/editor/CodeHintManager.js index 9af5469f4fc..6ce46524534 100644 --- a/src/editor/CodeHintManager.js +++ b/src/editor/CodeHintManager.js @@ -252,7 +252,7 @@ define(function (require, exports, module) { codeHintsEnabled = true; - PreferencesManager.definePreference("showCodeHints", "boolean", true); + PreferencesManager.definePreference("showCodeHints", "boolean", codeHintsEnabled); PreferencesManager.definePreference("insertHintOnTab", "boolean", false); PreferencesManager.on("change", "showCodeHints", function () { @@ -518,9 +518,6 @@ define(function (require, exports, module) { * @param {Editor} editor */ function _startNewSession(editor) { - if (!codeHintsEnabled) { - return; - } if (!editor) { editor = EditorManager.getFocusedEditor(); } diff --git a/src/extensions/default/JavaScriptCodeHints/main.js b/src/extensions/default/JavaScriptCodeHints/main.js index bc188c56192..62585e602a2 100644 --- a/src/extensions/default/JavaScriptCodeHints/main.js +++ b/src/extensions/default/JavaScriptCodeHints/main.js @@ -48,13 +48,15 @@ define(function (require, exports, module) { Session = require("Session"), Acorn = require("thirdparty/acorn/acorn"); - var session = null, // object that encapsulates the current session state - cachedCursor = null, // last cursor of the current hinting session - cachedHints = null, // sorted hints for the current hinting session - cachedType = null, // describes the lookup type and the object context - cachedToken = null, // the token used in the current hinting session - matcher = null, // string matcher for hints - ignoreChange; // can ignore next "change" event if true; + var session = null, // object that encapsulates the current session state + cachedCursor = null, // last cursor of the current hinting session + cachedHints = null, // sorted hints for the current hinting session + cachedType = null, // describes the lookup type and the object context + cachedToken = null, // the token used in the current hinting session + matcher = null, // string matcher for hints + jsHintsEnabled = true, // preference setting to enable/disable the hint session + ignoreChange; // can ignore next "change" event if true; + // Define the defaultExclusions which are files that are known to cause Tern to run out of control. PreferencesManager.definePreference("jscodehints.defaultExclusions", "array", []); @@ -62,6 +64,23 @@ define(function (require, exports, module) { // This preference controls when Tern will time out when trying to understand files PreferencesManager.definePreference("jscodehints.inferenceTimeout", "number", 5000); + // This preference controls whether to create a session and process all JS files or not. + PreferencesManager.definePreference("codehint.JSHints", "boolean", jsHintsEnabled); + + PreferencesManager.on("change", "codehint.JSHints", function () { + jsHintsEnabled = PreferencesManager.get("codehint.JSHints"); + }); + + PreferencesManager.on("change", "showCodeHints", function () { + var showHintsEnabled = PreferencesManager.get("showCodeHints"); + + if (jsHintsEnabled && !showHintsEnabled) { + jsHintsEnabled = showHintsEnabled; + } else if (!jsHintsEnabled && showHintsEnabled) { + jsHintsEnabled = PreferencesManager.get("codehint.JSHints"); + } + }); + /** * Sets the configuration, generally for testing/debugging use. * Configuration keys are merged into the current configuration. @@ -583,6 +602,10 @@ define(function (require, exports, module) { * @param {Editor} previousEditor - the previous editor */ function installEditorListeners(editor, previousEditor) { + if (!jsHintsEnabled) { + return; + } + // always clean up cached scope and hint info resetCachedHintContext(); From 07f241b8158f2751493fdeae1c373f3af4bed49c Mon Sep 17 00:00:00 2001 From: RaymondLim Date: Fri, 18 Jul 2014 15:04:53 -0700 Subject: [PATCH 3/3] Making some changes for review feedbacks. --- src/editor/CodeHintManager.js | 2 +- .../default/JavaScriptCodeHints/main.js | 27 ++++++++++--------- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/src/editor/CodeHintManager.js b/src/editor/CodeHintManager.js index 6ce46524534..51270da1159 100644 --- a/src/editor/CodeHintManager.js +++ b/src/editor/CodeHintManager.js @@ -252,7 +252,7 @@ define(function (require, exports, module) { codeHintsEnabled = true; - PreferencesManager.definePreference("showCodeHints", "boolean", codeHintsEnabled); + PreferencesManager.definePreference("showCodeHints", "boolean", true); PreferencesManager.definePreference("insertHintOnTab", "boolean", false); PreferencesManager.on("change", "showCodeHints", function () { diff --git a/src/extensions/default/JavaScriptCodeHints/main.js b/src/extensions/default/JavaScriptCodeHints/main.js index 62585e602a2..11706a09624 100644 --- a/src/extensions/default/JavaScriptCodeHints/main.js +++ b/src/extensions/default/JavaScriptCodeHints/main.js @@ -65,20 +65,23 @@ define(function (require, exports, module) { PreferencesManager.definePreference("jscodehints.inferenceTimeout", "number", 5000); // This preference controls whether to create a session and process all JS files or not. - PreferencesManager.definePreference("codehint.JSHints", "boolean", jsHintsEnabled); + PreferencesManager.definePreference("codehint.JSHints", "boolean", true); + + /** + * Check whether any of code hints preferences for JS Code Hints is disabled + * @return {boolean} enabled/disabled + */ + function _areHintsEnabled() { + return (PreferencesManager.get("codehint.JSHints") !== false) && + (PreferencesManager.get("showCodeHints") !== false); + } PreferencesManager.on("change", "codehint.JSHints", function () { - jsHintsEnabled = PreferencesManager.get("codehint.JSHints"); + jsHintsEnabled = _areHintsEnabled(); }); PreferencesManager.on("change", "showCodeHints", function () { - var showHintsEnabled = PreferencesManager.get("showCodeHints"); - - if (jsHintsEnabled && !showHintsEnabled) { - jsHintsEnabled = showHintsEnabled; - } else if (!jsHintsEnabled && showHintsEnabled) { - jsHintsEnabled = PreferencesManager.get("codehint.JSHints"); - } + jsHintsEnabled = _areHintsEnabled(); }); /** @@ -602,13 +605,13 @@ define(function (require, exports, module) { * @param {Editor} previousEditor - the previous editor */ function installEditorListeners(editor, previousEditor) { + // always clean up cached scope and hint info + resetCachedHintContext(); + if (!jsHintsEnabled) { return; } - // always clean up cached scope and hint info - resetCachedHintContext(); - if (editor && HintUtils.isSupportedLanguage(LanguageManager.getLanguageForPath(editor.document.file.fullPath).getId())) { initializeSession(editor, previousEditor); $(editor)