diff --git a/src/editor/CodeHintManager.js b/src/editor/CodeHintManager.js index 6e34c510eea..51270da1159 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; diff --git a/src/extensions/default/JavaScriptCodeHints/main.js b/src/extensions/default/JavaScriptCodeHints/main.js index bc188c56192..11706a09624 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,26 @@ 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", 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 = _areHintsEnabled(); + }); + + PreferencesManager.on("change", "showCodeHints", function () { + jsHintsEnabled = _areHintsEnabled(); + }); + /** * Sets the configuration, generally for testing/debugging use. * Configuration keys are merged into the current configuration. @@ -586,6 +608,10 @@ define(function (require, exports, module) { // always clean up cached scope and hint info resetCachedHintContext(); + if (!jsHintsEnabled) { + return; + } + if (editor && HintUtils.isSupportedLanguage(LanguageManager.getLanguageForPath(editor.document.file.fullPath).getId())) { initializeSession(editor, previousEditor); $(editor)