All files / commands select-active-language.ts

92.5% Statements 37/40
77.77% Branches 28/36
100% Functions 4/4
92.5% Lines 37/40

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97                          1x     6x   6x 1x     5x 5x   5x 1x     4x 4x   4x 4x   4x 3x 4x   4x       4x   4x 1x           3x   3x 4x 4x 4x   4x           1x       1x       1x       1x     3x 1x 1x 1x     1x 1x   1x         4x    
import * as vscode from 'vscode';
import { container } from 'tsyringe';
import { ServiceToken } from '@src/services/tokens';
import { ISettingsService } from '@src/services/core';
import { IDocumentContextService } from '@src/services/document';
 
interface LanguageQuckPickItem extends vscode.QuickPickItem {
	/**
	 * The language code.
	 */
	language: string | undefined;
}
 
export const selectActiveLanguage = {
	id: 'mentor.command.selectActiveLanguage',
	handler: async () => {
		const document = vscode.window.activeTextEditor?.document;
 
		if (!document) {
			return;
		}
 
		const contextService = container.resolve<IDocumentContextService>(ServiceToken.DocumentContextService);
		const context = contextService.contexts[document.uri.toString()];
 
		if (!context) {
			return;
		}
 
		const quickPick = vscode.window.createQuickPick<LanguageQuckPickItem>();
		quickPick.title = 'Select active document language';
 
		const noLanguageKey = '__unspecified__';
		const languageStats = new Map<string, number>();
 
		for (const predicateStats of Object.values(context.predicateStats)) {
			for (const [languageTag, count] of Object.entries(predicateStats.languageTags)) {
				const key = languageTag && languageTag !== 'undefined' ? languageTag : noLanguageKey;
 
				languageStats.set(key, (languageStats.get(key) ?? 0) + count);
			}
		}
 
		const languageEntries = Array.from(languageStats.entries());
 
		if (languageEntries.length === 0) {
			quickPick.items = [{
				label: 'No language tagged literals found.',
				language: undefined
			}];
		} else {
			// Note: We translate the language code into a readable name in the UI language of the editor.
			const languageNames = new Intl.DisplayNames([vscode.env.language], { type: 'language' });
 
			quickPick.items = languageEntries.map(([l, count]) => {
				const language = l === noLanguageKey ? undefined : l;
				const values = count === 1 ? 'value' : 'values';
				const displayName = language ? (languageNames.of(language) ?? language) : 'undefined';
 
				return {
					language,
					label: language ? `${language} - ${displayName}` : displayName,
					description: `${count} ${values}`,
				};
			}).sort((a, b) => {
				Iif (!a.language && b.language) {
					return -1;
				}
 
				Iif (a.language && !b.language) {
					return 1;
				}
 
				Iif (!a.language && !b.language) {
					return 0;
				}
 
				return a.language!.localeCompare(b.language!);
			});
 
			quickPick.onDidChangeSelection((selection) => {
				Eif (selection.length > 0) {
					const language = selection[0].language;
					context.activeLanguageTag = language;
 
					// Refresh the tree views..
					const settings = container.resolve<ISettingsService>(ServiceToken.SettingsService);
					settings.set('view.activeLanguage', language);
 
					quickPick.dispose();
				}
			});
		}
 
		quickPick.show();
	}
};