Skip to content

Commit

Permalink
fix: Be able to fix spelling issues from the CSpell Panel (#3260)
Browse files Browse the repository at this point in the history
  • Loading branch information
Jason3S committed May 14, 2024
1 parent 2d1df6c commit 2ab2a41
Show file tree
Hide file tree
Showing 43 changed files with 1,241 additions and 298 deletions.
26 changes: 9 additions & 17 deletions .vscode/launch.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,9 @@
"--disable-extensions",
"--extensionDevelopmentPath=${workspaceRoot}"
],
"stopOnEntry": false,
"sourceMaps": true,
"outFiles": [
"${workspaceRoot}/packages/client/dist/**/*.js"
"${workspaceRoot}/packages/client/dist/**"
],
"smartStep": true,
"skipFiles": [
Expand All @@ -28,10 +27,9 @@
"args": [
"--extensionDevelopmentPath=${workspaceRoot}"
],
"stopOnEntry": false,
"sourceMaps": true,
"outFiles": [
"${workspaceRoot}/packages/client/dist/**/*.js"
"${workspaceRoot}/packages/client/dist/**"
],
"smartStep": true,
"skipFiles": [
Expand All @@ -47,10 +45,9 @@
"--extensionDevelopmentPath=${workspaceRoot}",
"--folder-uri=vscode-vfs://github/streetsidesoftware/cspell-dicts"
],
"stopOnEntry": false,
"sourceMaps": true,
"outFiles": [
"${workspaceRoot}/packages/client/dist/**/*.js"
"${workspaceRoot}/packages/client/dist/**"
],
"smartStep": true,
"skipFiles": [
Expand All @@ -69,7 +66,7 @@
],
"sourceMaps": true,
"outFiles": [
"${workspaceRoot}/packages/client/dist/**/*.js"
"${workspaceRoot}/packages/client/dist/**"
],
"smartStep": true,
"skipFiles": [
Expand All @@ -86,10 +83,9 @@
"--extensionDevelopmentPath=${workspaceRoot}",
"${workspaceRoot}/fixtures/workspaces/multi-root/multi-root.code-workspace"
],
"stopOnEntry": false,
"sourceMaps": true,
"outFiles": [
"${workspaceRoot}/packages/client/dist/**/*.js"
"${workspaceRoot}/packages/client/dist/**"
],
"smartStep": true,
"skipFiles": [
Expand All @@ -106,10 +102,9 @@
"--extensionDevelopmentPath=${workspaceRoot}",
"${workspaceRoot}/fixtures/workspaces/single-root/single-root.code-workspace"
],
"stopOnEntry": false,
"sourceMaps": true,
"outFiles": [
"${workspaceRoot}/packages/client/dist/**/*.js"
"${workspaceRoot}/packages/client/dist/**"
],
"smartStep": true,
"skipFiles": [
Expand All @@ -126,10 +121,9 @@
"--extensionDevelopmentPath=${workspaceRoot}",
"${workspaceRoot}/fixtures/workspaces/single/single.code-workspace"
],
"stopOnEntry": false,
"sourceMaps": true,
"outFiles": [
"${workspaceRoot}/packages/client/dist/**/*.js"
"${workspaceRoot}/packages/client/dist/**"
],
"smartStep": true,
"skipFiles": [
Expand All @@ -146,10 +140,9 @@
"--extensionDevelopmentPath=${workspaceRoot}",
"${workspaceRoot}/fixtures/workspaces/no-workspace"
],
"stopOnEntry": false,
"sourceMaps": true,
"outFiles": [
"${workspaceRoot}/packages/client/dist/**/*.js"
"${workspaceRoot}/packages/client/dist/**"
],
"smartStep": true,
"skipFiles": [
Expand All @@ -166,10 +159,9 @@
"--extensionDevelopmentPath=${workspaceRoot}",
"${workspaceRoot}/fixtures/workspaces/jupyter"
],
"stopOnEntry": false,
"sourceMaps": true,
"outFiles": [
"${workspaceRoot}/packages/client/dist/**/*.js"
"${workspaceRoot}/packages/client/dist/**"
],
"smartStep": true,
"skipFiles": [
Expand Down
21 changes: 7 additions & 14 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -168,13 +168,7 @@
"when": "view == cSpellRegExpView"
}
],
"view/title": [
{
"command": "cSpell.autoFixSpellingIssues",
"when": "view == cspell-info.issuesView",
"group": "navigation"
}
],
"view/title": [],
"view/item/context": [
{
"command": "cSpellRegExpTester.editRegExp",
Expand Down Expand Up @@ -217,7 +211,7 @@
"activitybar": [
{
"id": "cspell-info-explorer",
"title": "Spell Checker",
"title": "Spell Checker Info",
"icon": "resources/dark/check_circle.svg"
}
],
Expand All @@ -240,8 +234,7 @@
{
"type": "webview",
"id": "cspell-info.infoView",
"name": "Spell Checker",
"when": "config.cSpell.experimental.enableSettingsViewerV2"
"name": "Spell Checker"
},
{
"id": "cSpellRegExpView",
Expand All @@ -254,7 +247,7 @@
"type": "tree",
"id": "cspell.issuesViewByFile",
"name": "File Issues",
"contextualTitle": "Spell Checker",
"contextualTitle": "Spell Checker issues by file.",
"icon": "$(lightbulb)",
"initialSize": 4,
"visibility": "visible"
Expand All @@ -263,7 +256,7 @@
"type": "tree",
"id": "cspell-info.issuesView",
"name": "Issues",
"contextualTitle": "Spell Checker",
"contextualTitle": "Spell Checker Issues",
"icon": "$(lightbulb)",
"initialSize": 1,
"visibility": "visible"
Expand Down Expand Up @@ -548,15 +541,15 @@
"category": "Spell",
"title": "Show Spelling Issues",
"shortTitle": "Show",
"when": "!cSpell.showDecorations",
"when": "!cSpell.context.showDecorations",
"icon": "$(eye)"
},
{
"command": "cSpell.hide",
"category": "Spell",
"title": "Hide Spelling Issues",
"shortTitle": "Hide",
"when": "cSpell.showDecorations",
"when": "cSpell.context.showDecorations",
"icon": "$(eye-closed)"
},
{
Expand Down
2 changes: 1 addition & 1 deletion packages/__utils/src/index.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
export { autoResolve, AutoResolveCache, createAutoResolveCache, createAutoResolveWeakCache } from './AutoResolve.js';
export * from './errors.js';
export { groupByField, groupByKey } from './groupBy.js';
export { log, logDebug, logError, logInfo } from './log.js';
export { consoleDebug, consoleError, consoleInfo, consoleLog, consoleWarn, log, logDebug, logError, logInfo } from './log.js';
export { LogFileConnection } from './logFile.js';
export * from './uriHelper.js';
export * from './util.js';
36 changes: 34 additions & 2 deletions packages/__utils/src/log.test.mts
Original file line number Diff line number Diff line change
@@ -1,8 +1,23 @@
import { describe, expect, test } from 'vitest';
import { beforeEach, describe, expect, test } from 'vitest';

import { log, logDebug, logError, logger, logInfo, setWorkspaceFolders } from './log.js';
import {
consoleDebug,
consoleError,
consoleInfo,
consoleLog,
log,
logDebug,
logError,
logger,
logInfo,
setWorkspaceFolders,
} from './log.js';

describe('Validate Util Functions', () => {
beforeEach(() => {
logger.clearPendingEntries();
});

test('Logging', () => {
setWorkspaceFolders([__dirname, __dirname]);
log('log', __filename);
Expand All @@ -19,4 +34,21 @@ describe('Validate Util Functions', () => {
expect.stringContaining('info'),
]);
});

test('console logging', () => {
setWorkspaceFolders([__dirname, __dirname]);
consoleLog('log', __filename);
consoleError('error');
consoleDebug('debug');
consoleInfo('info');

expect(logger.getPendingEntries().map((e) => e.msg)).toEqual([
expect.stringContaining('setWorkspaceFolders'),
expect.stringContaining('setWorkspaceBase'),
expect.stringMatching(/^log\s+.*log.test.mts/),
expect.stringContaining('error'),
expect.stringContaining('debug'),
expect.stringContaining('info'),
]);
});
});
22 changes: 22 additions & 0 deletions packages/__utils/src/log.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import { format } from 'node:util';

import { Logger } from './logger.js';

export { LogLevel } from './logger.js';
Expand All @@ -22,6 +24,26 @@ export function logDebug(msg: string, uri?: string | string[]) {
logger.debug(formatMessage(msg, uri));
}

export function consoleLog(...args: Parameters<typeof console.log>) {
logger.log(format(...args));
}

export function consoleInfo(...args: Parameters<typeof console.log>) {
logger.info(format(...args));
}

export function consoleWarn(...args: Parameters<typeof console.log>) {
logger.warn(format(...args));
}

export function consoleDebug(...args: Parameters<typeof console.log>) {
logger.debug(format(...args));
}

export function consoleError(...args: Parameters<typeof console.log>) {
logger.error(format(...args));
}

export function setWorkspaceBase(uri: string) {
log(`setWorkspaceBase URI: ${uri}`);
workspaceBase = uri;
Expand Down
4 changes: 4 additions & 0 deletions packages/__utils/src/logger.ts
Original file line number Diff line number Diff line change
Expand Up @@ -155,6 +155,10 @@ export class Logger {
getPendingEntries(): LogEntry[] {
return this.logs;
}

clearPendingEntries() {
this.logs = [];
}
}

function toLogLevel(level: string | LogLevel) {
Expand Down
3 changes: 3 additions & 0 deletions packages/_server/src/api/api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ import type {
ConfigurationFields,
GetConfigurationForDocumentRequest,
GetConfigurationForDocumentResult,
GetConfigurationTargetsRequest,
GetConfigurationTargetsResult,
GetSpellCheckingOffsetsResult,
IsSpellCheckEnabledResult,
OnSpellCheckDocumentStep,
Expand All @@ -40,6 +42,7 @@ export interface ServerRequestsAPI {
getConfigurationForDocument<Fields extends ConfigurationFields>(
req: GetConfigurationForDocumentRequest<Fields>,
): GetConfigurationForDocumentResult<Fields>;
getConfigurationTargets(req: GetConfigurationTargetsRequest): GetConfigurationTargetsResult;
isSpellCheckEnabled(req: TextDocumentInfo): IsSpellCheckEnabledResult;
splitTextIntoWords(req: string): SplitTextIntoWordsResult;
spellingSuggestions(word: string, doc?: TextDocumentInfo): SpellingSuggestionsResult;
Expand Down
22 changes: 16 additions & 6 deletions packages/_server/src/api/apiModels.ts
Original file line number Diff line number Diff line change
Expand Up @@ -82,19 +82,19 @@ export interface GetSpellCheckingOffsetsResult {
export type ConfigurationFields = keyof CSpellUserSettings;
export type ConfigFieldSelector<T extends ConfigurationFields> = Readonly<Record<T, true>>;

export type AllowUndefined<T> = {
[P in keyof T]: T[P] | undefined;
};

export type PartialCSpellUserSettings<T extends ConfigurationFields> = Pick<CSpellUserSettings, T> & { _fields?: ConfigFieldSelector<T> };

export interface GetConfigurationForDocumentRequest<Fields extends ConfigurationFields> extends Partial<TextDocumentInfo> {
/** used to calculate configTargets, configTargets will be empty if undefined. */
workspaceConfig?: WorkspaceConfigForDocument;
/** List of Settings fields to return. */
fields: ConfigFieldSelector<Fields>;
}

export type AllowUndefined<T> = {
[P in keyof T]: T[P] | undefined;
};

export type PartialCSpellUserSettings<T extends ConfigurationFields> = Pick<CSpellUserSettings, T> & { _fields?: ConfigFieldSelector<T> };

export interface GetConfigurationForDocumentResult<T extends ConfigurationFields> extends IsSpellCheckEnabledResult {
/** Merged configuration settings. Does NOT include in-document directives. */
settings: PartialCSpellUserSettings<T> | undefined;
Expand All @@ -106,6 +106,16 @@ export interface GetConfigurationForDocumentResult<T extends ConfigurationFields
configTargets: ConfigTarget[];
}

export interface GetConfigurationTargetsRequest extends Partial<TextDocumentInfo> {
/** used to calculate configTargets, configTargets will be empty if undefined. */
workspaceConfig?: WorkspaceConfigForDocument;
}

export interface GetConfigurationTargetsResult {
/** Possible configuration targets. */
configTargets: ConfigTarget[];
}

export interface TextDocumentRef {
readonly uri: DocumentUri;
}
Expand Down
18 changes: 18 additions & 0 deletions packages/_server/src/server.mts
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,7 @@ export function run(): void {
},
serverRequests: {
getConfigurationForDocument: handleGetConfigurationForDocument,
getConfigurationTargets: handleGetConfigurationTargets,
getSpellCheckingOffsets: simpleDebounce(_handleGetSpellCheckingOffsets, 100, ({ uri }) => uri),
traceWord: simpleDebounce(_handleGetWordTrace, 100, ({ uri, word }) => uri + '|' + word),
checkDocument: simpleDebounce(_handleCheckDocument, 100, ({ uri }) => uri),
Expand Down Expand Up @@ -171,6 +172,7 @@ export function run(): void {
);

const _handleGetConfigurationForDocument = simpleDebounce(__handleGetConfigurationForDocument, 100, (params) => JSON.stringify(params));
const _handleGetConfigurationTargets = simpleDebounce(__handleGetConfigurationTargets, 100, (params) => JSON.stringify(params));

// validate documents
ds(
Expand Down Expand Up @@ -407,6 +409,22 @@ export function run(): void {
};
}

async function handleGetConfigurationTargets(params: Api.GetConfigurationTargetsRequest): Promise<Api.GetConfigurationTargetsResult> {
return _handleGetConfigurationTargets(params);
}

async function __handleGetConfigurationTargets(params: Api.GetConfigurationTargetsRequest): Promise<Api.GetConfigurationTargetsResult> {
log('handleGetConfigurationTargets', params.uri);
const { uri, workspaceConfig } = params;
const settingsRaw = await getActiveUriSettings(uri);
const configFiles = uri ? (await documentSettings.findCSpellConfigurationFilesForUri(uri)).map((uri) => uri.toString()) : [];
const configTargets = workspaceConfig ? await calculateConfigTargets(settingsRaw, workspaceConfig, configFiles) : [];

return {
configTargets,
};
}

async function _handleGetSpellCheckingOffsets(docRef: Api.TextDocumentRef): Promise<Api.GetSpellCheckingOffsetsResult> {
log('handleGetSpellCheckingOffsets', docRef.uri);
const { uri } = docRef;
Expand Down
1 change: 1 addition & 0 deletions packages/_server/src/serverApi.mts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ export function createServerApi(connection: MessageConnection, handlers: Partial
const api: ServerSideApiDef = {
serverRequests: {
getConfigurationForDocument: true,
getConfigurationTargets: true,
getSpellCheckingOffsets: true,
isSpellCheckEnabled: true,
splitTextIntoWords: true,
Expand Down
2 changes: 2 additions & 0 deletions packages/_server/src/test/test.api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ export function createMockServerSideApi() {
},
serverRequest: {
getConfigurationForDocument: { subscribe: vi.fn() },
getConfigurationTargets: { subscribe: vi.fn() },
isSpellCheckEnabled: { subscribe: vi.fn() },
splitTextIntoWords: { subscribe: vi.fn() },
getSpellCheckingOffsets: { subscribe: vi.fn() },
Expand Down Expand Up @@ -64,6 +65,7 @@ export function mockHandlers(): ServerSideHandlers {
configFiles: [],
configTargets: [],
})),
getConfigurationTargets: vi.fn(() => ({ configTargets: [] })),
isSpellCheckEnabled: vi.fn(() => ({ ...sampleIsSpellCheckEnabledResult })),
splitTextIntoWords: vi.fn(() => ({ words: [] })),
spellingSuggestions: vi.fn(() => ({ suggestions: [] })),
Expand Down

0 comments on commit 2ab2a41

Please sign in to comment.