Skip to content

Commit

Permalink
updated formatter registration
Browse files Browse the repository at this point in the history
  • Loading branch information
ntotten committed Mar 16, 2021
1 parent 899e952 commit a9d5bf3
Show file tree
Hide file tree
Showing 4 changed files with 74 additions and 105 deletions.
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,10 @@ All notable changes to the "prettier-vscode" extension will be documented in thi

<!-- Check [Keep a Changelog](http://keepachangelog.com/) for recommendations on how to structure this file. -->

## [6.3.1]

- Updates to formatter registration

## [6.3.0]

- Removed notifications, all messages logged with status icon update.
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"name": "prettier-vscode",
"displayName": "Prettier - Code formatter",
"description": "Code formatter using prettier",
"version": "6.3.0",
"version": "6.3.1",
"publisher": "esbenp",
"author": "Prettier <@prettiercode>",
"galleryBanner": {
Expand Down
134 changes: 69 additions & 65 deletions src/PrettierEditService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,7 @@ import {
window,
workspace,
} from "vscode";
import {
getSupportedLanguages,
getSupportedFileExtensions,
getRangeSupportedLanguages,
getParserFromLanguageId,
} from "./languageFilters";
import { getParserFromLanguageId } from "./languageFilters";
import { LoggingService } from "./LoggingService";
import { INVALID_PRETTIER_CONFIG, RESTART_TO_ENABLE } from "./message";
import { ModuleResolver } from "./ModuleResolver";
Expand Down Expand Up @@ -57,6 +52,17 @@ export default class PrettierEditService implements Disposable {
private rangeFormatterHandler: undefined | Disposable;
private registeredWorkspaces = new Set<string>();

private allLanguages: string[] = [];
private allExtensions: string[] = [];
private allRangeLanguages: string[] = [
"javascript",
"javascriptreact",
"typescript",
"typescriptreact",
"json",
"graphql",
];

constructor(
private moduleResolver: ModuleResolver,
private loggingService: LoggingService,
Expand Down Expand Up @@ -157,7 +163,7 @@ export default class PrettierEditService implements Disposable {
}

const prettierInstance = await this.moduleResolver.getPrettierInstance(
workspaceFolder.uri.fsPath
workspaceFolder?.uri.fsPath
);

const isRegistered = this.registeredWorkspaces.has(
Expand All @@ -181,7 +187,7 @@ export default class PrettierEditService implements Disposable {
return;
}

const selectors = await this.getWorkspaceSelectors(
const selectors = await this.getSelectors(
prettierInstance,
workspaceFolder.uri
);
Expand All @@ -190,9 +196,9 @@ export default class PrettierEditService implements Disposable {
this.registerDocumentFormatEditorProviders(selectors);
this.registeredWorkspaces.add(workspaceFolder.uri.fsPath);
this.loggingService.logDebug(
`Enabling Prettier for Workspace ${workspaceFolder.uri.fsPath}`
`Enabling Prettier for Workspace ${workspaceFolder.uri.fsPath}`,
selectors
);
this.loggingService.logDebug("Workspace enabled selectors", selectors);
}

const score = languages.match(selectors.languageSelector, document);
Expand All @@ -207,10 +213,9 @@ export default class PrettierEditService implements Disposable {
};

public async registerGlobal() {
const selectors = this.getGlobalSelectors();
const selectors = await this.getSelectors(prettier);
this.registerDocumentFormatEditorProviders(selectors);
this.loggingService.logDebug(`Enabling Prettier globally`);
this.loggingService.logDebug("Globally enabled selectors", selectors);
this.loggingService.logDebug("Enabling Prettier globally", selectors);
}

public dispose = () => {
Expand All @@ -225,6 +230,7 @@ export default class PrettierEditService implements Disposable {
languageSelector,
rangeLanguageSelector,
}: ISelectors) {
this.dispose();
this.statusBar.update(FormatterStatus.Loading);
const editProvider = new PrettierEditProvider(this.provideEdits);
this.rangeFormatterHandler = languages.registerDocumentRangeFormattingEditProvider(
Expand All @@ -237,83 +243,81 @@ export default class PrettierEditService implements Disposable {
);
}

private getGlobalSelectors() {
const { languages } = prettier.getSupportInfo();

const allLanguages = getSupportedLanguages(languages);
//TODO: const allFileNames = getSupportedFileNames(languages);
const allRangeLanguages = getRangeSupportedLanguages();

const buildSelector = (languages: string[], scheme: string) =>
languages.map((l) => ({ language: l, scheme }));

const languageSelector: DocumentFilter[] = [
...buildSelector(allLanguages, "file"),
...buildSelector(allLanguages, "untitled"),
...buildSelector(["jsonc"], "vscode-userdata"), // Selector for VSCode settings.json
];

const rangeLanguageSelector: DocumentFilter[] = [
...buildSelector(allRangeLanguages, "file"),
...buildSelector(allRangeLanguages, "untitled"),
];

return { languageSelector, rangeLanguageSelector };
}

/**
* Build formatter selectors
*/
private getWorkspaceSelectors = async (
private getSelectors = async (
prettierInstance: PrettierModule,
uri: Uri
uri?: Uri
): Promise<ISelectors> => {
const { languages } = prettierInstance.getSupportInfo();

const allLanguages = getSupportedLanguages(languages);
const allExtensions = getSupportedFileExtensions(languages);
//TODO: const allFileNames = getSupportedFileNames(languages);
const allRangeLanguages = getRangeSupportedLanguages();
languages.forEach((lang) => {
if (lang && lang.vscodeLanguageIds) {
this.allLanguages.push(...lang.vscodeLanguageIds);
}
});
this.allLanguages = this.allLanguages.filter((value, index, self) => {
return self.indexOf(value) === index;
});

languages.forEach((lang) => {
if (lang && lang.extensions) {
this.allExtensions.push(...lang.extensions);
}
});
this.allExtensions = this.allExtensions.filter((value, index, self) => {
return self.indexOf(value) === index;
});

const { documentSelectors } = getConfig();

// Language selector for file extensions
const extensionLanguageSelector: DocumentFilter[] =
allExtensions.length === 0
const extensionLanguageSelector: DocumentFilter[] = uri
? this.allExtensions.length === 0
? []
: [
{
pattern: `${uri.fsPath}/**/*.{${allExtensions
pattern: `${uri.fsPath}/**/*.{${this.allExtensions
.map((e) => e.substring(1))
.join(",")}}`,
scheme: "file",
},
];

const customLanguageSelectors: DocumentFilter[] = documentSelectors.map(
(pattern) => ({
pattern: `${uri.fsPath}/${pattern}`,
scheme: "file",
})
);

const defaultLanguageSelectors: DocumentFilter[] = allLanguages.map(
(language) => ({
pattern: `${uri.fsPath}/**/*.*`,
scheme: "file",
]
: [];

const customLanguageSelectors: DocumentFilter[] = uri
? documentSelectors.map((pattern) => ({
pattern: `${uri.fsPath}/${pattern}`,
scheme: "file",
}))
: [];

const defaultLanguageSelectors: DocumentFilter[] = [
...this.allLanguages.map((language) => ({ language, scheme: "file" })),
...this.allLanguages.map((language) => ({
language,
})
);
scheme: "untitled",
})),
{ language: "jsonc", scheme: "vscode-userdata" }, // Selector for VSCode settings.json
];

const languageSelector = [
...defaultLanguageSelectors,
...customLanguageSelectors,
...extensionLanguageSelector,
...defaultLanguageSelectors,
];

const rangeLanguageSelector: DocumentFilter[] = allRangeLanguages.map(
(l) => ({ language: l })
);
const rangeLanguageSelector: DocumentFilter[] = [
...this.allRangeLanguages.map((language) => ({
language,
scheme: "file",
})),
...this.allRangeLanguages.map((language) => ({
language,
scheme: "untitled",
})),
];

return { languageSelector, rangeLanguageSelector };
};
Expand Down
39 changes: 0 additions & 39 deletions src/languageFilters.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,45 +28,6 @@ export function getParserFromLanguageId(
}
}

export function getSupportedLanguages(
languages: prettier.SupportLanguage[]
): string[] {
const enabledLanguages: string[] = [];
languages.forEach((lang) => {
if (lang && lang.vscodeLanguageIds) {
enabledLanguages.push(...lang.vscodeLanguageIds);
}
});
return enabledLanguages.filter((value, index, self) => {
return self.indexOf(value) === index;
});
}

export function getRangeSupportedLanguages(): string[] {
return [
"javascript",
"javascriptreact",
"typescript",
"typescriptreact",
"json",
"graphql",
];
}

export function getSupportedFileExtensions(
languages: prettier.SupportLanguage[]
) {
const extensions: string[] = [];
languages.forEach((lang) => {
if (lang && lang.extensions) {
extensions.push(...lang.extensions);
}
});
return extensions.filter((value, index, self) => {
return self.indexOf(value) === index;
});
}

export function getSupportedFileNames(languages: prettier.SupportLanguage[]) {
const fileNames: string[] = [];
languages.forEach((lang) => {
Expand Down

0 comments on commit a9d5bf3

Please sign in to comment.