2323
2424
2525/*jslint vars: true, plusplus: true, devel: true, nomen: true, indent: 4, maxerr: 50 */
26- /*global define, $, brackets, CodeMirror, PathUtils, window */
26+ /*global define, $, CodeMirror, PathUtils */
2727
2828/**
2929 * LanguageManager provides access to the languages supported by Brackets
7979 * language.modeReady.done(function () {
8080 * // ...
8181 * });
82- * Note that this will never fire for languages without a mode.
82+ * Note that this will never resolve for languages without a mode.
8383 */
8484define ( function ( require , exports , module ) {
8585 "use strict" ;
@@ -90,37 +90,14 @@ define(function (require, exports, module) {
9090
9191
9292 // State
93- var _fallbackLanguage = null ,
94- _languages = { } ,
95- _fileExtensionsMap = { } ,
96- _modeMap = { } ;
93+ var _fallbackLanguage = null ,
94+ _languages = { } ,
95+ _fileExtensionsToLanguageMap = { } ,
96+ _modeToLanguageMap = { } ;
9797
9898
9999 // Helper functions
100100
101- /**
102- * Checks whether value is an array. Optionally checks its contents, too.
103- * Throws an exception in case of a validation error.
104- * @param {* } value The value to validate
105- * @param {!string } description A helpful identifier for value
106- * @param {function(*, !string) validateEntry A function to validate the array's entries with
107- */
108- function _validateArray ( value , description , validateEntry ) {
109- var i , entry ;
110- if ( ! $ . isArray ( value ) ) {
111- throw new Error ( description + " must be an array" ) ;
112- }
113- if ( value . length === 0 ) {
114- throw new Error ( description + " must not be empty" ) ;
115- }
116- if ( validateEntry ) {
117- for ( i = 0 ; i < value . length ; i ++ ) {
118- entry = value [ i ] ;
119- validateEntry ( entry , description + "[" + i + "]" ) ;
120- }
121- }
122- }
123-
124101 /**
125102 * Checks whether value is a string. Throws an exception otherwise.
126103 * @param {* } value The value to validate
@@ -167,12 +144,12 @@ define(function (require, exports, module) {
167144 * @private
168145 */
169146 function _setLanguageForMode ( mode , language ) {
170- if ( _modeMap [ mode ] ) {
171- console . warn ( "CodeMirror mode \"" + mode + "\" is already used by language " + _modeMap [ mode ] . name + ", won't register for " + language . name ) ;
147+ if ( _modeToLanguageMap [ mode ] ) {
148+ console . warn ( "CodeMirror mode \"" + mode + "\" is already used by language " + _modeToLanguageMap [ mode ] . name + ", won't register for " + language . name ) ;
172149 return ;
173150 }
174151
175- _modeMap [ mode ] = language ;
152+ _modeToLanguageMap [ mode ] = language ;
176153 }
177154
178155 /**
@@ -199,7 +176,7 @@ define(function (require, exports, module) {
199176 // Make checks below case-INsensitive
200177 extension = extension . toLowerCase ( ) ;
201178
202- var language = _fileExtensionsMap [ extension ] ;
179+ var language = _fileExtensionsToLanguageMap [ extension ] ;
203180 if ( ! language ) {
204181 console . log ( "Called LanguageManager.getLanguageForFileExtension with an unhandled file extension: " + extension ) ;
205182 }
@@ -212,14 +189,14 @@ define(function (require, exports, module) {
212189 * @param {!string } mode CodeMirror mode
213190 * @return {Language } The language for the provided mode or the fallback language
214191 */
215- function getLanguageForMode ( mode ) {
216- var language = _modeMap [ mode ] ;
192+ function _getLanguageForMode ( mode ) {
193+ var language = _modeToLanguageMap [ mode ] ;
217194 if ( language ) {
218195 return language ;
219196 }
220197
221198 // In case of unsupported languages
222- console . log ( "Called LanguageManager.getLanguageForMode with a mode for which no language has been registered:" , mode ) ;
199+ console . log ( "Called LanguageManager._getLanguageForMode with a mode for which no language has been registered:" , mode ) ;
223200 return _fallbackLanguage ;
224201 }
225202
@@ -246,8 +223,8 @@ define(function (require, exports, module) {
246223 this . id = id ;
247224 this . name = name ;
248225
249- this . _fileExtensions = [ ] ;
250- this . _modeMap = { } ;
226+ this . _fileExtensions = [ ] ;
227+ this . _modeToLanguageMap = { } ;
251228
252229 // Since setting the mode is asynchronous when the mode hasn't been loaded yet, offer a reliable way to wait until it is ready
253230 this . _modeReady = new $ . Deferred ( ) ;
@@ -332,6 +309,9 @@ define(function (require, exports, module) {
332309
333310 /**
334311 * Adds a file extension to this language.
312+ * Private for now since dependent code would need to by kept in sync with such changes.
313+ * In case we ever open this up, we should think about whether we want to make this
314+ * configurable by the user. If so, the user has to be able to override these calls.
335315 * @param {!string } extension A file extension used by this language
336316 * @return {Language } This language
337317 * @private
@@ -341,11 +321,11 @@ define(function (require, exports, module) {
341321 if ( this . _fileExtensions . indexOf ( extension ) === - 1 ) {
342322 this . _fileExtensions . push ( extension ) ;
343323
344- var language = _fileExtensionsMap [ extension ] ;
324+ var language = _fileExtensionsToLanguageMap [ extension ] ;
345325 if ( language ) {
346326 console . warn ( "Cannot register file extension \"" + extension + "\" for " + this . name + ", it already belongs to " + language . name ) ;
347327 } else {
348- _fileExtensionsMap [ extension ] = this ;
328+ _fileExtensionsToLanguageMap [ extension ] = this ;
349329 }
350330 }
351331
@@ -386,14 +366,14 @@ define(function (require, exports, module) {
386366 * Returns either a language associated with the mode or the fallback language.
387367 * Used to disambiguate modes used by multiple languages.
388368 * @param {!string } mode The mode to associate the language with
389- * @return {Language } This language if it uses the mode, or whatever {@link LanguageManager#getLanguageForMode } returns
369+ * @return {Language } This language if it uses the mode, or whatever {@link LanguageManager#_getLanguageForMode } returns
390370 */
391371 Language . prototype . getLanguageForMode = function ( mode ) {
392372 if ( mode === this . mode ) {
393373 return this ;
394374 }
395375
396- return this . _modeMap [ mode ] || getLanguageForMode ( mode ) ;
376+ return this . _modeToLanguageMap [ mode ] || _getLanguageForMode ( mode ) ;
397377 } ;
398378
399379 /**
@@ -408,7 +388,7 @@ define(function (require, exports, module) {
408388 if ( mode === this . mode && language !== this ) {
409389 throw new Error ( "A language must always map its mode to itself" ) ;
410390 }
411- this . _modeMap [ mode ] = language ;
391+ this . _modeToLanguageMap [ mode ] = language ;
412392
413393 return this ;
414394 } ;
@@ -425,6 +405,8 @@ define(function (require, exports, module) {
425405 * @param {string } definition.lineComment Line comment prefix (i.e. "//")
426406 * @param {string|Array.<string> } definition.mode CodeMirror mode (i.e. "htmlmixed"), optionally with a MIME mode defined by that mode ["clike", "text/x-c++src"]
427407 * Unless the mode is located in thirdparty/CodeMirror2/mode/<name>/<name>.js, you need to first load it yourself.
408+ * {@link Language#modeReady} is a promise that resolves when a mode has been loaded and set.
409+ * It will not resolve when no mode is specified.
428410 *
429411 * @return {Language } The new language
430412 **/
@@ -492,7 +474,6 @@ define(function (require, exports, module) {
492474 module . exports = {
493475 defineLanguage : defineLanguage ,
494476 getLanguage : getLanguage ,
495- getLanguageForFileExtension : getLanguageForFileExtension ,
496- getLanguageForMode : getLanguageForMode
477+ getLanguageForFileExtension : getLanguageForFileExtension
497478 } ;
498479} ) ;
0 commit comments