From cb3bcad346b31f8b71abe78a2d5cd91efc7cc3dd Mon Sep 17 00:00:00 2001 From: DukeNgn Date: Fri, 23 Oct 2020 10:16:20 -0400 Subject: [PATCH] monaco, siw: Move `findMatches` function into `TextEditorDocument` Signed-off-by: DukeNgn --- packages/editor/src/browser/editor.ts | 9 +---- .../monaco/src/browser/monaco-editor-model.ts | 33 ++++++++++++++++++- packages/monaco/src/browser/monaco-editor.ts | 30 +---------------- .../src/browser/monaco-text-model-service.ts | 2 +- ...search-in-workspace-result-tree-widget.tsx | 6 +--- 5 files changed, 36 insertions(+), 44 deletions(-) diff --git a/packages/editor/src/browser/editor.ts b/packages/editor/src/browser/editor.ts index f6bf9ab348bae..05e6aa43b21d5 100644 --- a/packages/editor/src/browser/editor.ts +++ b/packages/editor/src/browser/editor.ts @@ -29,6 +29,7 @@ export const TextEditorProvider = Symbol('TextEditorProvider'); export type TextEditorProvider = (uri: URI) => Promise; export interface TextEditorDocument extends lsp.TextDocument, Saveable, Disposable { + findMatches(options: FindMatchesOptions): FindMatch[]; getLineContent(lineNumber: number): string; getLineMaxColumn(lineNumber: number): number; } @@ -277,14 +278,6 @@ export interface TextEditor extends Disposable, TextEditorSelection, Navigatable setEncoding(encoding: string, mode: EncodingMode): void; readonly onEncodingChanged: Event; - - /** - * Find all matches in an editor for the given options. - * @param options the options for finding matches. - * - * @returns the list of matches. - */ - findMatches?(options: FindMatchesOptions): FindMatch[]; } export interface Dimension { diff --git a/packages/monaco/src/browser/monaco-editor-model.ts b/packages/monaco/src/browser/monaco-editor-model.ts index 53f3031114701..e7126bcef61c8 100644 --- a/packages/monaco/src/browser/monaco-editor-model.ts +++ b/packages/monaco/src/browser/monaco-editor-model.ts @@ -16,7 +16,7 @@ import { Position } from 'vscode-languageserver-types'; import { TextDocumentSaveReason, TextDocumentContentChangeEvent } from 'vscode-languageserver-protocol'; -import { TextEditorDocument, EncodingMode } from '@theia/editor/lib/browser'; +import { TextEditorDocument, EncodingMode, FindMatchesOptions, FindMatch, EditorPreferences } from '@theia/editor/lib/browser'; import { DisposableCollection, Disposable } from '@theia/core/lib/common/disposable'; import { Emitter, Event } from '@theia/core/lib/common/event'; import { CancellationTokenSource, CancellationToken } from '@theia/core/lib/common/cancellation'; @@ -54,6 +54,7 @@ export class MonacoEditorModel implements ITextEditorModel, TextEditorDocument { protected bufferSavedVersionId: number; protected model: monaco.editor.IModel; + protected readonly resolveModel: Promise; protected readonly toDispose = new DisposableCollection(); @@ -83,6 +84,7 @@ export class MonacoEditorModel implements ITextEditorModel, TextEditorDocument { protected readonly resource: Resource, protected readonly m2p: MonacoToProtocolConverter, protected readonly p2m: ProtocolToMonacoConverter, + protected readonly editorPreference: EditorPreferences, protected readonly logger?: ILogger ) { this.toDispose.push(resource); @@ -279,6 +281,35 @@ export class MonacoEditorModel implements ITextEditorModel, TextEditorDocument { return this.model; } + /** + * Find all matches in an editor for the given options. + * @param options the options for finding matches. + * + * @returns the list of matches. + */ + findMatches(options: FindMatchesOptions): FindMatch[] { + const results: monaco.editor.FindMatch[] = this.model.findMatches( + options.searchString, + false, + options.isRegex, + options.matchCase, + // eslint-disable-next-line no-null/no-null + options.matchWholeWord ? this.editorPreference['editor.wordSeparators'] : null, + true, + options.limitResultCount + ); + const extractedMatches: FindMatch[] = []; + results.forEach(r => { + if (r.matches) { + extractedMatches.push({ + matches: r.matches, + range: Range.create(r.range.startLineNumber, r.range.startColumn, r.range.endLineNumber, r.range.endColumn) + }); + } + }); + return extractedMatches; + } + async load(): Promise { await this.resolveModel; return this; diff --git a/packages/monaco/src/browser/monaco-editor.ts b/packages/monaco/src/browser/monaco-editor.ts index 20c8ce5b97f84..c6a3cf602001c 100644 --- a/packages/monaco/src/browser/monaco-editor.ts +++ b/packages/monaco/src/browser/monaco-editor.ts @@ -34,7 +34,7 @@ import { ReplaceTextParams, EditorDecoration, EditorMouseEvent, - EncodingMode, FindMatchesOptions, FindMatch + EncodingMode } from '@theia/editor/lib/browser'; import { MonacoEditorModel } from './monaco-editor-model'; import { MonacoToProtocolConverter } from './monaco-to-protocol-converter'; @@ -48,7 +48,6 @@ import IEditorOverrideServices = monaco.editor.IEditorOverrideServices; import IStandaloneCodeEditor = monaco.editor.IStandaloneCodeEditor; import IIdentifiedSingleEditOperation = monaco.editor.IIdentifiedSingleEditOperation; import IBoxSizing = ElementExt.IBoxSizing; -import EditorOptions = monaco.editor.EditorOption; @injectable() export class MonacoEditorServices { @@ -122,33 +121,6 @@ export class MonacoEditor extends MonacoEditorServices implements TextEditor { return this.document.setEncoding(encoding, mode); } - findMatches(options: FindMatchesOptions): FindMatch[] { - const model = this.editor.getModel(); - if (!model) { - return []; - } - const results: monaco.editor.FindMatch[] = model.findMatches( - options.searchString, - false, - options.isRegex, - options.matchCase, - // eslint-disable-next-line no-null/no-null - options.matchWholeWord ? this.editor.getOption(EditorOptions.wordSeparators) : null, - true, - options.limitResultCount - ); - const extractedMatches: FindMatch[] = []; - results.forEach(r => { - if (r.matches) { - extractedMatches.push({ - matches: r.matches, - range: Range.create(r.range.startLineNumber, r.range.startColumn, r.range.endLineNumber, r.range.endColumn) - }); - } - }); - return extractedMatches; - } - protected create(options?: IStandaloneEditorConstructionOptions, override?: monaco.editor.IEditorOverrideServices): Disposable { return this.editor = monaco.editor.create(this.node, { ...options, diff --git a/packages/monaco/src/browser/monaco-text-model-service.ts b/packages/monaco/src/browser/monaco-text-model-service.ts index ecaa9e5c3458e..f65572e45377c 100644 --- a/packages/monaco/src/browser/monaco-text-model-service.ts +++ b/packages/monaco/src/browser/monaco-text-model-service.ts @@ -128,7 +128,7 @@ export class MonacoTextModelService implements monaco.editor.ITextModelService { protected createModel(resource: Resource): MaybePromise { const factory = this.factories.getContributions().find(({ scheme }) => resource.uri.scheme === scheme); - return factory ? factory.createModel(resource) : new MonacoEditorModel(resource, this.m2p, this.p2m, this.logger); + return factory ? factory.createModel(resource) : new MonacoEditorModel(resource, this.m2p, this.p2m, this.editorPreferences, this.logger); } protected readonly modelOptions: { [name: string]: (keyof monaco.editor.ITextModelUpdateOptions | undefined) } = { diff --git a/packages/search-in-workspace/src/browser/search-in-workspace-result-tree-widget.tsx b/packages/search-in-workspace/src/browser/search-in-workspace-result-tree-widget.tsx index f2b706c11324f..c9b41606582e4 100644 --- a/packages/search-in-workspace/src/browser/search-in-workspace-result-tree-widget.tsx +++ b/packages/search-in-workspace/src/browser/search-in-workspace-result-tree-widget.tsx @@ -212,11 +212,7 @@ export class SearchInWorkspaceResultTreeWidget extends TreeWidget { * @returns the list of matches. */ protected findMatches(searchTerm: string, widget: EditorWidget, searchOptions: SearchInWorkspaceOptions): SearchMatch[] { - if (!widget.editor.findMatches) { - return []; - } - - const results: FindMatch[] = widget.editor.findMatches({ + const results: FindMatch[] = widget.editor.document.findMatches({ searchString: searchTerm, isRegex: !!searchOptions.useRegExp, matchCase: !!searchOptions.matchCase,