From b729047ca0d5669ddeb01cebd6121674be2e5818 Mon Sep 17 00:00:00 2001 From: morgilad Date: Sun, 19 May 2024 09:45:57 +0300 Subject: [PATCH 1/2] completion items exclude matches on parameter names --- .../kustoLanguageService.ts | 4 ++-- package/src/monaco.contribution.ts | 2 ++ package/test/test.js | 7 ++++++ package/tests/completion-items.spec.ts | 15 ++++++++---- package/tests/env/index.css | 8 +++---- package/tests/env/main.ts | 23 ++++++++++++++++++- package/tests/playwright.config.ts | 2 +- package/tests/testkit/drivers/intellisense.ts | 15 +++++------- 8 files changed, 55 insertions(+), 21 deletions(-) diff --git a/package/src/languageServiceManager/kustoLanguageService.ts b/package/src/languageServiceManager/kustoLanguageService.ts index afb3a2a1..b2c45470 100644 --- a/package/src/languageServiceManager/kustoLanguageService.ts +++ b/package/src/languageServiceManager/kustoLanguageService.ts @@ -435,7 +435,7 @@ class KustoLanguageService implements LanguageService { kItem.DisplayText ); const helpTopic: k.CslTopicDocumentation = this.getTopic(v1CompletionOption); - // If we have AfterText it means that the cursor should no be placed at end of suggested text. + // If we have AfterText it means that the cursor should not be placed at end of suggested text. // In that case we switch to snippet format and represent the point where the cursor should be as // as '\$0' const { textToInsert, format } = @@ -463,7 +463,7 @@ class KustoLanguageService implements LanguageService { lsItem.textEdit = ls.TextEdit.replace(ls.Range.create(startPosition, endPosition), textToInsert); lsItem.sortText = this.getSortText(sortTextPrefix + i + 1); // Changing the first letter to be lower case, to ignore case-sensitive matching - lsItem.filterText = lsItem.label.charAt(0).toLowerCase() + lsItem.label.slice(1); + lsItem.filterText = kItem.MatchText.charAt(0).toLowerCase() + kItem.MatchText.slice(1); lsItem.kind = this.kustoKindToLsKindV2(kItem.Kind); lsItem.insertTextFormat = format; lsItem.detail = helpTopic ? helpTopic.ShortDescription : undefined; diff --git a/package/src/monaco.contribution.ts b/package/src/monaco.contribution.ts index 6dcc0040..e7a2666c 100644 --- a/package/src/monaco.contribution.ts +++ b/package/src/monaco.contribution.ts @@ -194,6 +194,8 @@ monaco.editor.onDidCreateEditor((editor) => { } triggerSuggestDialogWhenCompletionItemSelected(editor); + + editor.updateOptions({ suggest: { filterGraceful: false } }); }); function triggerSuggestDialogWhenCompletionItemSelected(editor: monaco.editor.ICodeEditor) { diff --git a/package/test/test.js b/package/test/test.js index 15a525d9..d271b495 100644 --- a/package/test/test.js +++ b/package/test/test.js @@ -33,9 +33,16 @@ fetch('./test/mode.txt') selectionHighlight: false, theme: 'kusto-light', folding: true, + selectOnLineNumbers: true, + automaticLayout: true, + minimap: { + enabled: false, + }, + fixedOverflowWidgets: true, suggest: { selectionMode: 'whenQuickSuggestion', }, + copyWithSyntaxHighlighting: true, }); applyDefaultsOnDomElements(); diff --git a/package/tests/completion-items.spec.ts b/package/tests/completion-items.spec.ts index 7dec77dc..c99cc0ca 100644 --- a/package/tests/completion-items.spec.ts +++ b/package/tests/completion-items.spec.ts @@ -2,15 +2,15 @@ import { test, expect } from '@playwright/test'; import { loadPageAndWait } from './testkit'; import { IntelliSenseDriver, EditorDriver } from './testkit/drivers'; -const initialValue = 'StormEvents \n| take 10 '; - test.describe('Completion items tests', () => { let editor: EditorDriver; let intellisense: IntelliSenseDriver; test.beforeEach(async ({ page }) => { await loadPageAndWait(page); + editor = new EditorDriver(page); + const initialValue = 'StormEvents \n'; await editor.fill(initialValue); intellisense = new IntelliSenseDriver(page); }); @@ -18,7 +18,14 @@ test.describe('Completion items tests', () => { test('trigger completion on "("', async () => { await editor.type('| where StartTime > ago('); - const option = await intellisense.getOptionByIndex(0); - expect(option).toBe('1d'); + const option = intellisense.getOptionByIndex(0); + await expect(option).toHaveText('1d'); + }); + + test('match with exact substring and exclude parameters', async ({ page }) => { + await editor.type('| where StartTime > ago'); + + const options = intellisense.getAllOptions(); + await expect(options).toHaveCount(1); }); }); diff --git a/package/tests/env/index.css b/package/tests/env/index.css index 66cd5592..fcb3eabc 100644 --- a/package/tests/env/index.css +++ b/package/tests/env/index.css @@ -1,7 +1,7 @@ -html, -body, #root, .editor { - height: 100%; - margin: 0; + width: 800px; + height: 600px; + border: 1px solid grey; + border-radius: 4px; } diff --git a/package/tests/env/main.ts b/package/tests/env/main.ts index 50cec907..319e5d08 100644 --- a/package/tests/env/main.ts +++ b/package/tests/env/main.ts @@ -1,6 +1,7 @@ import * as monaco from 'monaco-editor/esm/vs/editor/edcore.main'; import { getKustoWorker } from '../../release/esm/monaco.contribution'; import './index.css'; +import debounce from 'lodash/debounce'; // Vite doesn't let us directly import files in dependencies as url's for some // reason. Instead, we'll import local files as url's, and they'll import what @@ -51,12 +52,32 @@ const schema = { }, }; +function getEditorValue(): string { + const defaultValue = ''; + const storageValue = localStorage.getItem('dev-kusto-query'); + return storageValue?.trim().length ? storageValue : defaultValue; +} + const editor = monaco.editor.create(document.getElementById('root'), { - value: '', + value: getEditorValue(), language: 'kusto', theme: 'kusto-light', + selectOnLineNumbers: true, + automaticLayout: true, + minimap: { + enabled: false, + }, + fixedOverflowWidgets: true, + suggest: { + selectionMode: 'whenQuickSuggestion', + }, + copyWithSyntaxHighlighting: true, }); +const updateEditorValueInLocalStorage = () => localStorage.setItem('dev-kusto-query', editor.getValue()); +const debouncedUpdateEditorValueInLocalStorage = debounce(updateEditorValueInLocalStorage, 1000); +editor.onDidChangeModelContent(debouncedUpdateEditorValueInLocalStorage); + window.addEventListener('resize', () => { editor.layout(); }); diff --git a/package/tests/playwright.config.ts b/package/tests/playwright.config.ts index 912dfc31..19d26447 100644 --- a/package/tests/playwright.config.ts +++ b/package/tests/playwright.config.ts @@ -7,7 +7,7 @@ export default defineConfig({ retries: process.env.CI ? 2 : 0, workers: process.env.CI ? 1 : undefined, timeout: 60_000, - expect: { timeout: 10_000 }, + expect: { timeout: 5_000 }, reporter: 'line', use: { trace: 'on-first-retry', diff --git a/package/tests/testkit/drivers/intellisense.ts b/package/tests/testkit/drivers/intellisense.ts index ef048207..702a6c2c 100644 --- a/package/tests/testkit/drivers/intellisense.ts +++ b/package/tests/testkit/drivers/intellisense.ts @@ -1,4 +1,5 @@ -import { ElementHandle, Page } from '@playwright/test'; +import { Page } from '@playwright/test'; +import { Locator } from 'playwright'; export class IntelliSenseDriver { private page: Page; @@ -7,15 +8,11 @@ export class IntelliSenseDriver { this.page = page; } - async getAllOptions(): Promise { - const options = await this.page.$$eval('[role="option"]', (options) => - options.map((option) => option.textContent || '') - ); - return options; + getAllOptions(): Locator { + return this.page.getByRole('option'); } - async getOptionByIndex(index: number): Promise { - const option = this.page.getByRole('option').nth(index); - return option.textContent(); + getOptionByIndex(index: number): Locator { + return this.page.getByRole('option').nth(index); } } From 31fc56968f171fc5f965f29ef243fe630998e73d Mon Sep 17 00:00:00 2001 From: morgilad Date: Mon, 20 May 2024 22:28:10 +0300 Subject: [PATCH 2/2] remove filter gracefully --- package/src/monaco.contribution.ts | 2 +- package/tests/completion-items.spec.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package/src/monaco.contribution.ts b/package/src/monaco.contribution.ts index e7a2666c..7359862b 100644 --- a/package/src/monaco.contribution.ts +++ b/package/src/monaco.contribution.ts @@ -195,7 +195,7 @@ monaco.editor.onDidCreateEditor((editor) => { triggerSuggestDialogWhenCompletionItemSelected(editor); - editor.updateOptions({ suggest: { filterGraceful: false } }); + // editor.updateOptions({ suggest: { filterGraceful: false } }); }); function triggerSuggestDialogWhenCompletionItemSelected(editor: monaco.editor.ICodeEditor) { diff --git a/package/tests/completion-items.spec.ts b/package/tests/completion-items.spec.ts index c99cc0ca..9b2eb39d 100644 --- a/package/tests/completion-items.spec.ts +++ b/package/tests/completion-items.spec.ts @@ -26,6 +26,6 @@ test.describe('Completion items tests', () => { await editor.type('| where StartTime > ago'); const options = intellisense.getAllOptions(); - await expect(options).toHaveCount(1); + await expect(options).toHaveCount(2); }); });