120120 * isBinary: true
121121 * });
122122 *
123+ *
124+ * LanguageManager dispatches two events:
125+ *
126+ * - languageAdded -- When any new Language is added. 2nd arg is the new Language.
127+ * - languageModified -- When the attributes of a Language change, or when the Language gains or loses
128+ * file extension / filename mappings. 2nd arg is the modified Language.
123129 */
124130define ( function ( require , exports , module ) {
125131 "use strict" ;
@@ -227,28 +233,6 @@ define(function (require, exports, module) {
227233 _modeToLanguageMap [ mode ] = language ;
228234 }
229235
230- /**
231- * Adds a language mapping for the specified fullPath. If language is falsy (null or undefined), the mapping
232- * is removed.
233- *
234- * @param {!fullPath } fullPath absolute path of the file
235- * @param {?object } language language to associate the file with or falsy value to remove the existing mapping
236- */
237- function _setLanguageOverrideForPath ( fullPath , language ) {
238- if ( ! language ) {
239- delete _filePathToLanguageMap [ fullPath ] ;
240- } else {
241- _filePathToLanguageMap [ fullPath ] = language ;
242- }
243- }
244-
245- /**
246- * Resets all the language overrides for file paths. Used by unit tests only.
247- */
248- function _resetLanguageOverrides ( ) {
249- _filePathToLanguageMap = { } ;
250- }
251-
252236 /**
253237 * Resolves a language ID to a Language object.
254238 * File names have a higher priority than file extensions.
@@ -260,7 +244,9 @@ define(function (require, exports, module) {
260244 }
261245
262246 /**
263- * Resolves a language to a file extension
247+ * Resolves a file extension to a Language object.
248+ * *Warning:* it is almost always better to use getLanguageForPath(), since Language can depend
249+ * on file name and even full path. Use this API only if no relevant file/path exists.
264250 * @param {!string } extension Extension that language should be resolved for
265251 * @return {?Language } The language for the provided extension or null if none exists
266252 */
@@ -383,6 +369,37 @@ define(function (require, exports, module) {
383369 $ ( exports ) . triggerHandler ( "languageModified" , [ language ] ) ;
384370 }
385371
372+ /**
373+ * Adds a language mapping for the specified fullPath. If language is falsy (null or undefined), the mapping
374+ * is removed. The override is NOT persisted across Brackets sessions.
375+ *
376+ * @param {!fullPath } fullPath absolute path of the file
377+ * @param {?object } language language to associate the file with or falsy value to remove any existing override
378+ */
379+ function setLanguageOverrideForPath ( fullPath , language ) {
380+ var oldLang = getLanguageForPath ( fullPath ) ;
381+ if ( ! language ) {
382+ delete _filePathToLanguageMap [ fullPath ] ;
383+ } else {
384+ _filePathToLanguageMap [ fullPath ] = language ;
385+ }
386+ var newLang = getLanguageForPath ( fullPath ) ;
387+
388+ // Old language changed since this path is no longer mapped to it
389+ _triggerLanguageModified ( oldLang ) ;
390+ // New language changed since a path is now mapped to it that wasn't before
391+ _triggerLanguageModified ( newLang ) ;
392+ }
393+
394+ /**
395+ * Resets all the language overrides for file paths. Used by unit tests only.
396+ */
397+ function _resetPathLanguageOverrides ( ) {
398+ _filePathToLanguageMap = { } ;
399+ }
400+
401+
402+
386403
387404 /**
388405 * Model for a language.
@@ -989,7 +1006,7 @@ define(function (require, exports, module) {
9891006 * }
9901007 */
9911008 function _updateFromPrefs ( pref ) {
992- var newMapping = PreferencesManager . get ( pref ) || { } ,
1009+ var newMapping = PreferencesManager . get ( pref ) ,
9931010 newNames = Object . keys ( newMapping ) ,
9941011 state = _prefState [ pref ] ,
9951012 last = state . last ,
@@ -1086,25 +1103,21 @@ define(function (require, exports, module) {
10861103 // depends on FileUtils) here. Using the async form of require fixes this.
10871104 require ( [ "preferences/PreferencesManager" ] , function ( pm ) {
10881105 PreferencesManager = pm ;
1089- _updateFromPrefs ( _EXTENSION_MAP_PREF ) ;
1090- _updateFromPrefs ( _NAME_MAP_PREF ) ;
1091- pm . definePreference ( _EXTENSION_MAP_PREF , "object" ) . on ( "change" , function ( ) {
1106+ pm . definePreference ( _EXTENSION_MAP_PREF , "object" , { } ) . on ( "change" , function ( ) {
10921107 _updateFromPrefs ( _EXTENSION_MAP_PREF ) ;
10931108 } ) ;
1094- pm . definePreference ( _NAME_MAP_PREF , "object" ) . on ( "change" , function ( ) {
1109+ pm . definePreference ( _NAME_MAP_PREF , "object" , { } ) . on ( "change" , function ( ) {
10951110 _updateFromPrefs ( _NAME_MAP_PREF ) ;
10961111 } ) ;
1112+ _updateFromPrefs ( _EXTENSION_MAP_PREF ) ;
1113+ _updateFromPrefs ( _NAME_MAP_PREF ) ;
10971114 } ) ;
10981115 } ) ;
10991116
11001117 // Private for unit tests
11011118 exports . _EXTENSION_MAP_PREF = _EXTENSION_MAP_PREF ;
11021119 exports . _NAME_MAP_PREF = _NAME_MAP_PREF ;
1103- exports . _resetLanguageOverrides = _resetLanguageOverrides ;
1104- // Internal use only
1105- // _setLanguageOverrideForPath is used by Document to help LanguageManager keeping track of
1106- // in-document language overrides
1107- exports . _setLanguageOverrideForPath = _setLanguageOverrideForPath ;
1120+ exports . _resetPathLanguageOverrides = _resetPathLanguageOverrides ;
11081121
11091122 // Public methods
11101123 exports . ready = _ready ;
@@ -1113,4 +1126,5 @@ define(function (require, exports, module) {
11131126 exports . getLanguageForExtension = getLanguageForExtension ;
11141127 exports . getLanguageForPath = getLanguageForPath ;
11151128 exports . getLanguages = getLanguages ;
1129+ exports . setLanguageOverrideForPath = setLanguageOverrideForPath ;
11161130} ) ;
0 commit comments