Skip to content

Commit

Permalink
Improvements to document selectors, custom selectors.
Browse files Browse the repository at this point in the history
  • Loading branch information
ntotten committed Aug 26, 2020
1 parent 3a00fe3 commit 0ae17e5
Show file tree
Hide file tree
Showing 12 changed files with 136 additions and 50 deletions.
4 changes: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -273,6 +273,10 @@ A list of languages IDs to disable this extension on.

**Note: Disabling a language enabled in a parent folder will prevent formatting instead of letting any other formatter to run**

#### prettier.documentSelectors

A list of [glob patterns](https://code.visualstudio.com/api/references/vscode-api#GlobPattern) to register Prettier formatter. Typically these will be in the format of `**/*.abc` to tell this extension to register itself as the formatter for all files with the `abc` extension. This feature can be useful when you have [overrides](https://prettier.io/docs/en/configuration.html#configuration-overrides) set in your config file to map custom extensions to a parser.

#### prettier.useEditorConfig (default: `true`)

Whether or not to take .editorconfig into account when parsing configuration. See the [prettier.resolveConfig docs](https://prettier.io/docs/en/api.html) for details.
Expand Down
8 changes: 8 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,14 @@
"markdownDescription": "%ext.config.disableLanguages%",
"scope": "window"
},
"prettier.documentSelectors": {
"type": "array",
"items": {
"type": "string"
},
"markdownDescription": "%ext.config.documentSelectors%",
"scope": "window"
},
"prettier.requireConfig": {
"type": "boolean",
"default": false,
Expand Down
1 change: 1 addition & 0 deletions package.nls.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
"ext.config.bracketSpacing": "Controls the printing of spaces inside object literals",
"ext.config.configPath": "Path to the prettier configuration file",
"ext.config.disableLanguages": "A list of languages IDs to disable this extension on",
"ext.config.documentSelectors": "A list of [glob patterns](https://code.visualstudio.com/api/references/vscode-api#GlobPattern) to register Prettier formatter",
"ext.config.endOfLine": "Specify the end of line used by prettier",
"ext.config.htmlWhitespaceSensitivity": "Specify the global whitespace sensitivity for HTML files.\n Valid options:\n- `css` - Respect the default value of CSS display property.\n- `strict` - Whitespaces are considered sensitive.\n- `ignores` - Whitespaces are considered insensitive.",
"ext.config.ignorePath": "Path to a .prettierignore file",
Expand Down
16 changes: 14 additions & 2 deletions src/LanguageResolver.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ export class LanguageResolver {
}
}

public allEnabledLanguages(fsPath?: string): string[] {
public getSupportedLanguages(fsPath?: string): string[] {
const enabledLanguages: string[] = [];
this.getSupportLanguages(fsPath).forEach((lang) => {
if (lang && lang.vscodeLanguageIds) {
Expand All @@ -42,7 +42,7 @@ export class LanguageResolver {
});
}

public rangeSupportedLanguages(): string[] {
public getRangeSupportedLanguages(): string[] {
return [
"javascript",
"javascriptreact",
Expand All @@ -53,6 +53,18 @@ export class LanguageResolver {
];
}

public getSupportedFileExtensions(fsPath?: string) {
const extensions: string[] = [];
this.getSupportLanguages(fsPath).forEach((lang) => {
if (lang && lang.extensions) {
extensions.push(...lang.extensions);
}
});
return extensions.filter((value, index, self) => {
return self.indexOf(value) === index;
});
}

private getSupportLanguages(fsPath?: string) {
const prettierInstance = this.moduleResolver.getPrettierInstance(fsPath);
return prettierInstance.getSupportInfo().languages;
Expand Down
108 changes: 62 additions & 46 deletions src/PrettierEditService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -114,15 +114,15 @@ export default class PrettierEditService implements Disposable {
* Build formatter selectors
*/
private selectors = (): ISelectors => {
const { disableLanguages } = getConfig();
const { disableLanguages, documentSelectors } = getConfig();

let allLanguages: string[];
if (workspace.workspaceFolders === undefined) {
allLanguages = this.languageResolver.allEnabledLanguages();
allLanguages = this.languageResolver.getSupportedLanguages();
} else {
allLanguages = [];
for (const folder of workspace.workspaceFolders) {
const allWorkspaceLanguages = this.languageResolver.allEnabledLanguages(
const allWorkspaceLanguages = this.languageResolver.getSupportedLanguages(
folder.uri.fsPath
);
allWorkspaceLanguages.forEach((lang) => {
Expand All @@ -133,61 +133,73 @@ export default class PrettierEditService implements Disposable {
}
}

let allExtensions: string[];
if (workspace.workspaceFolders === undefined) {
allExtensions = this.languageResolver.getSupportedFileExtensions();
} else {
allExtensions = [];
for (const folder of workspace.workspaceFolders) {
const allWorkspaceLanguages = this.languageResolver.getSupportedFileExtensions(
folder.uri.fsPath
);
allWorkspaceLanguages.forEach((lang) => {
if (!allExtensions.includes(lang)) {
allExtensions.push(lang);
}
});
}
}

this.loggingService.logInfo(
"Enabling prettier for languages",
allLanguages.sort()
`Enabling prettier for languages: ${allLanguages.sort().join(", ")}`
);

const allRangeLanguages = this.languageResolver.rangeSupportedLanguages();
this.loggingService.logInfo(
"Enabling prettier for range supported languages",
allRangeLanguages.sort()
`Enabling prettier for file extensions: ${allExtensions
.sort()
.join(", ")}`
);

const specialLanguageSelector: DocumentFilter[] = [
// This selector is for settings.json files
{
language: "jsonc",
scheme: "vscode-userdata",
},
];
if (documentSelectors && documentSelectors.length > 0) {
this.loggingService.logInfo(
`Enabling prettier for user defined selectors: ${documentSelectors
.sort()
.join(", ")}`
);
}

const allRangeLanguages = this.languageResolver.getRangeSupportedLanguages();
this.loggingService.logInfo(
`Enabling prettier for range supported languages: ${allRangeLanguages
.sort()
.join(", ")}`
);

// Language selector for file extensions
const extensionLanguageSelector: DocumentFilter = {
pattern: `**/*.{${allExtensions.map((e) => e.substring(1)).join(",")}}`,
};

const customLanguageSelectors: DocumentFilter[] = [];
documentSelectors.forEach((pattern) => {
customLanguageSelectors.push({
pattern,
});
});

// Language selectors for language IDs
const globalLanguageSelector: DocumentFilter[] = allLanguages
.filter((l) => !disableLanguages.includes(l))
.map((l) => ({ language: l }));
const globalRangeLanguageSelector: DocumentFilter[] = allRangeLanguages
.filter((l) => !disableLanguages.includes(l))
.map((l) => ({ language: l }));
if (workspace.workspaceFolders === undefined) {
// no workspace opened
return {
languageSelector: globalLanguageSelector.concat(
specialLanguageSelector
),
rangeLanguageSelector: globalRangeLanguageSelector,
};
}

// at least 1 workspace
const untitledLanguageSelector: DocumentFilter[] = globalLanguageSelector.map(
(l) => ({ language: l.language, scheme: "untitled" })
);
const untitledRangeLanguageSelector: DocumentFilter[] = globalRangeLanguageSelector.map(
(l) => ({ language: l.language, scheme: "untitled" })
);
const fileLanguageSelector: DocumentFilter[] = globalLanguageSelector.map(
(l) => ({ language: l.language, scheme: "file" })
);
const fileRangeLanguageSelector: DocumentFilter[] = globalRangeLanguageSelector.map(
(l) => ({ language: l.language, scheme: "file" })
);
return {
languageSelector: untitledLanguageSelector
.concat(fileLanguageSelector)
.concat(specialLanguageSelector),
rangeLanguageSelector: untitledRangeLanguageSelector.concat(
fileRangeLanguageSelector
),
languageSelector: globalLanguageSelector
.concat(customLanguageSelectors)
.concat(extensionLanguageSelector),
rangeLanguageSelector: globalRangeLanguageSelector,
};
};

Expand Down Expand Up @@ -278,16 +290,20 @@ export default class PrettierEditService implements Disposable {
let parser: prettier.BuiltInParserName | string | undefined;
if (fileInfo && fileInfo.inferredParser) {
parser = fileInfo.inferredParser;
} else {
} else if (languageId !== "plaintext") {
// Don't attempt VS Code language for plaintext because we never have
// a formatter for plaintext and most likely the reason for this is
// somebody has registered a custom file extension without properly
// configuring the parser in their prettier config.
this.loggingService.logWarning(
"Parser not inferred, using VS Code language."
`Parser not inferred, trying VS Code language.`
);
parser = this.languageResolver.getParserFromLanguageId(uri, languageId);
}

if (!parser) {
this.loggingService.logError(
`Failed to resolve a parser, skipping file.`
`Failed to resolve a parser, skipping file. If you registered a custom file extension, be sure to configure the parser.`
);
this.statusBarService.updateStatusBar(FormattingResult.Error);
return;
Expand Down
2 changes: 1 addition & 1 deletion src/StatusBarService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ export class StatusBarService {
? undefined
: editor.document.fileName;
const score = languages.match(
this.languageResolver.allEnabledLanguages(filePath),
this.languageResolver.getSupportedLanguages(filePath),
editor.document
);
const disabledLanguages: PrettierVSCodeConfig["disableLanguages"] = getConfig(
Expand Down
5 changes: 5 additions & 0 deletions src/test/suite/config.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -42,4 +42,9 @@ suite("Test configurations", function () {
/* cspell: disable-next-line */
testConfig("vscodeconfig/test.js", "vscodeconfig/test.result.js")
);
test(
"it formats custom file extension ",
/* cspell: disable-next-line */
testConfig("customextension/test.abc", "customextension/test.result.abc")
);
});
4 changes: 4 additions & 0 deletions src/types.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,10 @@ interface IExtensionConfig {
* If true, this extension will process files in node_modules
*/
withNodeModules: boolean;
/**
* Additional file patterns to register for formatting
*/
documentSelectors: string[];
}
/**
* Configuration for prettier-vscode
Expand Down
10 changes: 10 additions & 0 deletions test-fixtures/config/customextension/.prettierrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"overrides": [
{
"files": "*.abc",
"options": {
"parser": "babel"
}
}
]
}
7 changes: 7 additions & 0 deletions test-fixtures/config/customextension/test.abc
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
function foo() {
const foo = ["aaaaaaaaa", "bbbbbb",
"c","a", "b",
"c","a", "b",
"c","a", "b",
"c"]
}
16 changes: 16 additions & 0 deletions test-fixtures/config/customextension/test.result.abc
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
function foo() {
const foo = [
"aaaaaaaaa",
"bbbbbb",
"c",
"a",
"b",
"c",
"a",
"b",
"c",
"a",
"b",
"c",
];
}
5 changes: 4 additions & 1 deletion test-fixtures/test.code-workspace
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,9 @@
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"prettier.trailingComma": "all",
"prettier.prettierPath": ""
"prettier.prettierPath": "",
"prettier.documentSelectors": [
"**/*.abc"
],
}
}

0 comments on commit 0ae17e5

Please sign in to comment.