Skip to content
This repository was archived by the owner on Sep 6, 2021. It is now read-only.

Commit 81ec7d6

Browse files
committed
Merge pull request #7290 from adobe/pflynn/language-tweaks
Avoid searching binary files; tweaks to language mappings; APIs to unregister file extension mapping
2 parents 4776a53 + e013ca4 commit 81ec7d6

4 files changed

Lines changed: 178 additions & 19 deletions

File tree

src/language/LanguageManager.js

Lines changed: 79 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -475,11 +475,17 @@ define(function (require, exports, module) {
475475
};
476476

477477
/**
478-
* Adds a file extension to this language.
479-
* @param {!string} extension A file extension used by this language
480-
* @return {boolean} Whether adding the file extension was successful or not
478+
* Adds one or more file extensions to this language.
479+
* @param {!string|Array.<string>} extension A file extension (or array thereof) used by this language
481480
*/
482481
Language.prototype.addFileExtension = function (extension) {
482+
if (Array.isArray(extension)) {
483+
extension.forEach(this._addFileExtension.bind(this));
484+
} else {
485+
this._addFileExtension(extension);
486+
}
487+
};
488+
Language.prototype._addFileExtension = function (extension) {
483489
// Remove a leading dot if present
484490
if (extension.charAt(0) === ".") {
485491
extension = extension.substr(1);
@@ -503,11 +509,47 @@ define(function (require, exports, module) {
503509
};
504510

505511
/**
506-
* Adds a file name to the language which is used to match files that don't have extensions like "Makefile" for example.
507-
* @param {!string} extension An extensionless file name used by this language
508-
* @return {boolean} Whether adding the file name was successful or not
512+
* Unregisters one or more file extensions from this language.
513+
* @param {!string|Array.<string>} extension File extension (or array thereof) to stop using for this language
514+
*/
515+
Language.prototype.removeFileExtension = function (extension) {
516+
if (Array.isArray(extension)) {
517+
extension.forEach(this._removeFileExtension.bind(this));
518+
} else {
519+
this._removeFileExtension(extension);
520+
}
521+
};
522+
Language.prototype._removeFileExtension = function (extension) {
523+
// Remove a leading dot if present
524+
if (extension.charAt(0) === ".") {
525+
extension = extension.substr(1);
526+
}
527+
528+
// Make checks below case-INsensitive
529+
extension = extension.toLowerCase();
530+
531+
var index = this._fileExtensions.indexOf(extension);
532+
if (index !== -1) {
533+
this._fileExtensions.splice(index, 1);
534+
535+
delete _fileExtensionToLanguageMap[extension];
536+
537+
this._wasModified();
538+
}
539+
};
540+
541+
/**
542+
* Adds one or more file names to the language which is used to match files that don't have extensions like "Makefile" for example.
543+
* @param {!string|Array.<string>} extension An extensionless file name (or array thereof) used by this language
509544
*/
510545
Language.prototype.addFileName = function (name) {
546+
if (Array.isArray(name)) {
547+
name.forEach(this._addFileName.bind(this));
548+
} else {
549+
this._addFileName(name);
550+
}
551+
};
552+
Language.prototype._addFileName = function (name) {
511553
// Make checks below case-INsensitive
512554
name = name.toLowerCase();
513555

@@ -523,7 +565,31 @@ define(function (require, exports, module) {
523565

524566
this._wasModified();
525567
}
526-
return true;
568+
};
569+
570+
/**
571+
* Unregisters one or more file names from this language.
572+
* @param {!string|Array.<string>} extension An extensionless file name (or array thereof) used by this language
573+
*/
574+
Language.prototype.removeFileName = function (name) {
575+
if (Array.isArray(name)) {
576+
name.forEach(this._removeFileName.bind(this));
577+
} else {
578+
this._removeFileName(name);
579+
}
580+
};
581+
Language.prototype._removeFileName = function (name) {
582+
// Make checks below case-INsensitive
583+
name = name.toLowerCase();
584+
585+
var index = this._fileNames.indexOf(name);
586+
if (index !== -1) {
587+
this._fileNames.splice(index, 1);
588+
589+
delete _fileNameToLanguageMap[name];
590+
591+
this._wasModified();
592+
}
527593
};
528594

529595
/**
@@ -779,11 +845,11 @@ define(function (require, exports, module) {
779845
_patchCodeMirror();
780846

781847
// Define a custom MIME mode here instead of putting it directly into languages.json
782-
// because JSON files must not contain regular expressions. Also, all other modes so
848+
// because JSON files can't contain regular expressions. Also, all other modes so
783849
// far were strings, so we spare us the trouble of allowing more complex mode values.
784850
CodeMirror.defineMIME("text/x-brackets-html", {
785851
"name": "htmlmixed",
786-
"scriptTypes": [{"matches": /\/x-handlebars-template|\/x-mustache/i,
852+
"scriptTypes": [{"matches": /\/x-handlebars|\/x-mustache|^text\/html$/i,
787853
"mode": null}]
788854
});
789855

@@ -805,6 +871,10 @@ define(function (require, exports, module) {
805871
// But for now, we need to associate this madeup "html" mode with our HTML language object.
806872
_setLanguageForMode("html", html);
807873

874+
// Similarly, the php mode uses clike internally for the PHP parts
875+
var php = getLanguage("php");
876+
php._setLanguageForMode("clike", php);
877+
808878
// The fallback language for unknown modes and file extensions
809879
_fallbackLanguage = getLanguage("unknown");
810880
});

src/language/languages.json

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,9 @@
9393
"php": {
9494
"name": "PHP",
9595
"mode": "php",
96-
"fileExtensions": ["php", "php3", "php4", "php5", "phtm", "phtml", "ctp"]
96+
"fileExtensions": ["php", "php3", "php4", "php5", "phtm", "phtml", "ctp"],
97+
"blockComment": ["/*", "*/"],
98+
"lineComment": ["//", "#"]
9799
},
98100

99101
"c": {
@@ -120,13 +122,6 @@
120122
"lineComment": ["//"]
121123
},
122124

123-
"clike": {
124-
"name": "clike",
125-
"mode": "clike",
126-
"blockComment": ["/*", "*/"],
127-
"lineComment": ["//", "#"]
128-
},
129-
130125
"java": {
131126
"name": "Java",
132127
"mode": ["clike", "text/x-java"],
@@ -138,7 +133,9 @@
138133
"scala": {
139134
"name": "Scala",
140135
"mode": ["clike", "text/x-scala"],
141-
"fileExtensions": ["scala", "sbt"]
136+
"fileExtensions": ["scala", "sbt"],
137+
"blockComment": ["/*", "*/"],
138+
"lineComment": ["//"]
142139
},
143140

144141
"coffeescript": {
@@ -242,5 +239,13 @@
242239
"name": "Audio",
243240
"fileExtensions": ["mp3", "wav", "aif", "aiff", "ogg"],
244241
"isBinary": true
242+
},
243+
244+
"binary": {
245+
"name": "Other Binary",
246+
"fileExtensions": ["svgz", "jsz", "zip", "gz", "htmz", "htmlz", "rar", "tar", "exe", "bin", "dll", "pdb", "lib", "obj", "o", "so", "a", "dylib", "node",
247+
"pdf", "psd", "ai", "tif", "tiff", "mpg", "mpeg", "avi", "flv", "mp4", "swf", "ttf", "otf", "woff", "eot",
248+
"doc", "docx", "xls", "xlsx", "ppt", "pptx", "sqlite"],
249+
"isBinary": true
245250
}
246251
}

src/search/FindInFiles.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -751,7 +751,9 @@ define(function (require, exports, module) {
751751
var inWorkingSet = DocumentManager.getWorkingSet().some(function (wsFile) {
752752
return wsFile.fullPath === file.fullPath;
753753
});
754-
return inWorkingSet;
754+
if (!inWorkingSet) {
755+
return false;
756+
}
755757
}
756758
}
757759
// In the initial search, this is passed as a getAllFiles() filter

test/spec/LanguageManager-test.js

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,88 @@ define(function (require, exports, module) {
181181
expect(LanguageManager.getLanguageForPath("cakefile.doesNotExist")).toBe(unknown);
182182
expect(LanguageManager.getLanguageForPath("Something.cakefile")).toBe(unknown);
183183
});
184+
185+
it("should remove file extensions and add to new languages", function () {
186+
var html = LanguageManager.getLanguage("html"),
187+
ruby = LanguageManager.getLanguage("ruby"),
188+
unknown = LanguageManager.getLanguage("unknown");
189+
190+
expect(LanguageManager.getLanguageForPath("test.html")).toBe(html);
191+
192+
html.removeFileExtension("html");
193+
expect(LanguageManager.getLanguageForPath("test.html")).toBe(unknown);
194+
195+
ruby.addFileExtension("html");
196+
expect(LanguageManager.getLanguageForPath("test.html")).toBe(ruby);
197+
});
198+
199+
it("should remove file names and add to new languages", function () {
200+
var coffee = LanguageManager.getLanguage("coffeescript"),
201+
html = LanguageManager.getLanguage("html"),
202+
unknown = LanguageManager.getLanguage("unknown");
203+
204+
expect(LanguageManager.getLanguageForPath("Cakefile")).toBe(coffee);
205+
206+
coffee.removeFileName("Cakefile");
207+
expect(LanguageManager.getLanguageForPath("Cakefile")).toBe(unknown);
208+
209+
html.addFileName("Cakefile");
210+
expect(LanguageManager.getLanguageForPath("Cakefile")).toBe(html);
211+
});
212+
213+
it("should add multiple file extensions to languages", function () {
214+
var ruby = LanguageManager.getLanguage("ruby"),
215+
unknown = LanguageManager.getLanguage("unknown");
216+
217+
expect(LanguageManager.getLanguageForPath("foo.1")).toBe(unknown);
218+
expect(LanguageManager.getLanguageForPath("foo.2")).toBe(unknown);
219+
220+
ruby.addFileExtension(["1", "2"]);
221+
222+
expect(LanguageManager.getLanguageForPath("foo.1")).toBe(ruby);
223+
expect(LanguageManager.getLanguageForPath("foo.2")).toBe(ruby);
224+
});
225+
226+
it("should remove multiple file extensions from languages", function () {
227+
var ruby = LanguageManager.getLanguage("ruby"),
228+
unknown = LanguageManager.getLanguage("unknown");
229+
230+
// Assumes test above already ran (tests in this suite are not isolated)
231+
expect(LanguageManager.getLanguageForPath("foo.1")).toBe(ruby);
232+
expect(LanguageManager.getLanguageForPath("foo.2")).toBe(ruby);
233+
234+
ruby.removeFileExtension(["1", "2"]);
235+
236+
expect(LanguageManager.getLanguageForPath("foo.1")).toBe(unknown);
237+
expect(LanguageManager.getLanguageForPath("foo.2")).toBe(unknown);
238+
});
239+
240+
it("should add multiple file names to languages", function () {
241+
var ruby = LanguageManager.getLanguage("ruby"),
242+
unknown = LanguageManager.getLanguage("unknown");
243+
244+
expect(LanguageManager.getLanguageForPath("rubyFile1")).toBe(unknown);
245+
expect(LanguageManager.getLanguageForPath("rubyFile2")).toBe(unknown);
246+
247+
ruby.addFileName(["rubyFile1", "rubyFile2"]);
248+
249+
expect(LanguageManager.getLanguageForPath("rubyFile1")).toBe(ruby);
250+
expect(LanguageManager.getLanguageForPath("rubyFile2")).toBe(ruby);
251+
});
252+
253+
it("should remove multiple file names from languages", function () {
254+
var ruby = LanguageManager.getLanguage("ruby"),
255+
unknown = LanguageManager.getLanguage("unknown");
256+
257+
// Assumes test above already ran (tests in this suite are not isolated)
258+
expect(LanguageManager.getLanguageForPath("rubyFile1")).toBe(ruby);
259+
expect(LanguageManager.getLanguageForPath("rubyFile2")).toBe(ruby);
260+
261+
ruby.removeFileName(["rubyFile1", "rubyFile2"]);
262+
263+
expect(LanguageManager.getLanguageForPath("rubyFile1")).toBe(unknown);
264+
expect(LanguageManager.getLanguageForPath("rubyFile2")).toBe(unknown);
265+
});
184266
});
185267

186268
describe("defineLanguage", function () {

0 commit comments

Comments
 (0)