Skip to content

Commit 7dff078

Browse files
authored
Support Multi Editor/Model Highlighting (#196024)
* support multi-editor highlighting * Add experimental multi-document occurrences highlighting option * highlight accross notebook cells even without multi-doc setting * otherModels helper + ResourceMap + fixed removeDecorations * combine textual to just `TextualOccurenceRequest` * fix aggressive dispose/decoration clearing, introduce query interface
1 parent 9e597d3 commit 7dff078

File tree

10 files changed

+597
-266
lines changed

10 files changed

+597
-266
lines changed

src/vs/editor/common/config/editorOptions.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -562,6 +562,11 @@ export interface IEditorOptions {
562562
* Defaults to true.
563563
*/
564564
occurrencesHighlight?: boolean;
565+
/**
566+
* Enable semantic occurrences highlight.
567+
* Defaults to true.
568+
*/
569+
multiDocumentOccurrencesHighlight?: boolean;
565570
/**
566571
* Show code lens
567572
* Defaults to true.
@@ -5116,6 +5121,7 @@ export const enum EditorOption {
51165121
multiCursorModifier,
51175122
multiCursorPaste,
51185123
multiCursorLimit,
5124+
multiDocumentOccurrencesHighlight,
51195125
occurrencesHighlight,
51205126
overviewRulerBorder,
51215127
overviewRulerLanes,
@@ -5616,6 +5622,10 @@ export const EditorOptions = {
56165622
EditorOption.occurrencesHighlight, 'occurrencesHighlight', true,
56175623
{ description: nls.localize('occurrencesHighlight', "Controls whether the editor should highlight semantic symbol occurrences.") }
56185624
)),
5625+
multiDocumentOccurrencesHighlight: register(new EditorBooleanOption(
5626+
EditorOption.multiDocumentOccurrencesHighlight, 'multiDocumentOccurrencesHighlight', false,
5627+
{ description: nls.localize('multiDocumentOccurrencesHighlight', "Experimental: Controls whether the editor should highlight word occurrences accross multiple open editors.") }
5628+
)),
56195629
overviewRulerBorder: register(new EditorBooleanOption(
56205630
EditorOption.overviewRulerBorder, 'overviewRulerBorder', true,
56215631
{ description: nls.localize('overviewRulerBorder', "Controls whether a border should be drawn around the overview ruler.") }

src/vs/editor/common/languages.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -965,6 +965,17 @@ export interface DocumentHighlightProvider {
965965
provideDocumentHighlights(model: model.ITextModel, position: Position, token: CancellationToken): ProviderResult<DocumentHighlight[]>;
966966
}
967967

968+
export interface MultiDocumentHighlightProvider {
969+
/**
970+
* Provide a Map of URI --> document highlights, like all occurrences of a variable or
971+
* all exit-points of a function.
972+
*
973+
* Used in cases such as split view, notebooks, etc. where there can be multiple documents
974+
* with shared symbols.
975+
*/
976+
provideMultiDocumentHighlights(primaryModel: model.ITextModel, position: Position, otherModels: model.ITextModel[], token: CancellationToken): ProviderResult<Map<URI, DocumentHighlight[]>>;
977+
}
978+
968979
/**
969980
* The linked editing range provider interface defines the contract between extensions and
970981
* the linked editing feature.

src/vs/editor/common/services/languageFeatures.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
*--------------------------------------------------------------------------------------------*/
55

66
import { LanguageFeatureRegistry, NotebookInfoResolver } from 'vs/editor/common/languageFeatureRegistry';
7-
import { CodeActionProvider, CodeLensProvider, CompletionItemProvider, DeclarationProvider, DefinitionProvider, DocumentColorProvider, DocumentFormattingEditProvider, DocumentHighlightProvider, DocumentOnDropEditProvider, DocumentPasteEditProvider, DocumentRangeFormattingEditProvider, DocumentRangeSemanticTokensProvider, DocumentSemanticTokensProvider, DocumentSymbolProvider, EvaluatableExpressionProvider, FoldingRangeProvider, HoverProvider, ImplementationProvider, InlayHintsProvider, InlineCompletionsProvider, InlineValuesProvider, LinkedEditingRangeProvider, LinkProvider, MappedEditsProvider, OnTypeFormattingEditProvider, ReferenceProvider, RenameProvider, SelectionRangeProvider, SignatureHelpProvider, TypeDefinitionProvider } from 'vs/editor/common/languages';
7+
import { CodeActionProvider, CodeLensProvider, CompletionItemProvider, DeclarationProvider, DefinitionProvider, DocumentColorProvider, DocumentFormattingEditProvider, DocumentHighlightProvider, DocumentOnDropEditProvider, DocumentPasteEditProvider, DocumentRangeFormattingEditProvider, DocumentRangeSemanticTokensProvider, DocumentSemanticTokensProvider, DocumentSymbolProvider, EvaluatableExpressionProvider, FoldingRangeProvider, HoverProvider, ImplementationProvider, InlayHintsProvider, InlineCompletionsProvider, InlineValuesProvider, LinkedEditingRangeProvider, LinkProvider, MappedEditsProvider, MultiDocumentHighlightProvider, OnTypeFormattingEditProvider, ReferenceProvider, RenameProvider, SelectionRangeProvider, SignatureHelpProvider, TypeDefinitionProvider } from 'vs/editor/common/languages';
88
import { createDecorator } from 'vs/platform/instantiation/common/instantiation';
99

1010
export const ILanguageFeaturesService = createDecorator<ILanguageFeaturesService>('ILanguageFeaturesService');
@@ -49,6 +49,8 @@ export interface ILanguageFeaturesService {
4949

5050
readonly documentHighlightProvider: LanguageFeatureRegistry<DocumentHighlightProvider>;
5151

52+
readonly multiDocumentHighlightProvider: LanguageFeatureRegistry<MultiDocumentHighlightProvider>;
53+
5254
readonly documentRangeSemanticTokensProvider: LanguageFeatureRegistry<DocumentRangeSemanticTokensProvider>;
5355

5456
readonly documentSemanticTokensProvider: LanguageFeatureRegistry<DocumentSemanticTokensProvider>;

src/vs/editor/common/services/languageFeaturesService.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
import { URI } from 'vs/base/common/uri';
77
import { LanguageFeatureRegistry, NotebookInfo, NotebookInfoResolver } from 'vs/editor/common/languageFeatureRegistry';
8-
import { CodeActionProvider, CodeLensProvider, CompletionItemProvider, DocumentPasteEditProvider, DeclarationProvider, DefinitionProvider, DocumentColorProvider, DocumentFormattingEditProvider, DocumentHighlightProvider, DocumentOnDropEditProvider, DocumentRangeFormattingEditProvider, DocumentRangeSemanticTokensProvider, DocumentSemanticTokensProvider, DocumentSymbolProvider, EvaluatableExpressionProvider, FoldingRangeProvider, HoverProvider, ImplementationProvider, InlayHintsProvider, InlineCompletionsProvider, InlineValuesProvider, LinkedEditingRangeProvider, LinkProvider, OnTypeFormattingEditProvider, ReferenceProvider, RenameProvider, SelectionRangeProvider, SignatureHelpProvider, TypeDefinitionProvider, MappedEditsProvider } from 'vs/editor/common/languages';
8+
import { CodeActionProvider, CodeLensProvider, CompletionItemProvider, DocumentPasteEditProvider, DeclarationProvider, DefinitionProvider, DocumentColorProvider, DocumentFormattingEditProvider, MultiDocumentHighlightProvider, DocumentHighlightProvider, DocumentOnDropEditProvider, DocumentRangeFormattingEditProvider, DocumentRangeSemanticTokensProvider, DocumentSemanticTokensProvider, DocumentSymbolProvider, EvaluatableExpressionProvider, FoldingRangeProvider, HoverProvider, ImplementationProvider, InlayHintsProvider, InlineCompletionsProvider, InlineValuesProvider, LinkedEditingRangeProvider, LinkProvider, OnTypeFormattingEditProvider, ReferenceProvider, RenameProvider, SelectionRangeProvider, SignatureHelpProvider, TypeDefinitionProvider, MappedEditsProvider } from 'vs/editor/common/languages';
99
import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures';
1010
import { InstantiationType, registerSingleton } from 'vs/platform/instantiation/common/extensions';
1111

@@ -30,6 +30,7 @@ export class LanguageFeaturesService implements ILanguageFeaturesService {
3030
readonly signatureHelpProvider = new LanguageFeatureRegistry<SignatureHelpProvider>(this._score.bind(this));
3131
readonly hoverProvider = new LanguageFeatureRegistry<HoverProvider>(this._score.bind(this));
3232
readonly documentHighlightProvider = new LanguageFeatureRegistry<DocumentHighlightProvider>(this._score.bind(this));
33+
readonly multiDocumentHighlightProvider = new LanguageFeatureRegistry<MultiDocumentHighlightProvider>(this._score.bind(this));
3334
readonly selectionRangeProvider = new LanguageFeatureRegistry<SelectionRangeProvider>(this._score.bind(this));
3435
readonly foldingRangeProvider = new LanguageFeatureRegistry<FoldingRangeProvider>(this._score.bind(this));
3536
readonly linkProvider = new LanguageFeatureRegistry<LinkProvider>(this._score.bind(this));

src/vs/editor/common/standalone/standaloneEnums.ts

Lines changed: 69 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -253,74 +253,75 @@ export enum EditorOption {
253253
multiCursorModifier = 77,
254254
multiCursorPaste = 78,
255255
multiCursorLimit = 79,
256-
occurrencesHighlight = 80,
257-
overviewRulerBorder = 81,
258-
overviewRulerLanes = 82,
259-
padding = 83,
260-
pasteAs = 84,
261-
parameterHints = 85,
262-
peekWidgetDefaultFocus = 86,
263-
definitionLinkOpensInPeek = 87,
264-
quickSuggestions = 88,
265-
quickSuggestionsDelay = 89,
266-
readOnly = 90,
267-
readOnlyMessage = 91,
268-
renameOnType = 92,
269-
renderControlCharacters = 93,
270-
renderFinalNewline = 94,
271-
renderLineHighlight = 95,
272-
renderLineHighlightOnlyWhenFocus = 96,
273-
renderValidationDecorations = 97,
274-
renderWhitespace = 98,
275-
revealHorizontalRightPadding = 99,
276-
roundedSelection = 100,
277-
rulers = 101,
278-
scrollbar = 102,
279-
scrollBeyondLastColumn = 103,
280-
scrollBeyondLastLine = 104,
281-
scrollPredominantAxis = 105,
282-
selectionClipboard = 106,
283-
selectionHighlight = 107,
284-
selectOnLineNumbers = 108,
285-
showFoldingControls = 109,
286-
showUnused = 110,
287-
snippetSuggestions = 111,
288-
smartSelect = 112,
289-
smoothScrolling = 113,
290-
stickyScroll = 114,
291-
stickyTabStops = 115,
292-
stopRenderingLineAfter = 116,
293-
suggest = 117,
294-
suggestFontSize = 118,
295-
suggestLineHeight = 119,
296-
suggestOnTriggerCharacters = 120,
297-
suggestSelection = 121,
298-
tabCompletion = 122,
299-
tabIndex = 123,
300-
unicodeHighlighting = 124,
301-
unusualLineTerminators = 125,
302-
useShadowDOM = 126,
303-
useTabStops = 127,
304-
wordBreak = 128,
305-
wordSeparators = 129,
306-
wordWrap = 130,
307-
wordWrapBreakAfterCharacters = 131,
308-
wordWrapBreakBeforeCharacters = 132,
309-
wordWrapColumn = 133,
310-
wordWrapOverride1 = 134,
311-
wordWrapOverride2 = 135,
312-
wrappingIndent = 136,
313-
wrappingStrategy = 137,
314-
showDeprecated = 138,
315-
inlayHints = 139,
316-
editorClassName = 140,
317-
pixelRatio = 141,
318-
tabFocusMode = 142,
319-
layoutInfo = 143,
320-
wrappingInfo = 144,
321-
defaultColorDecorators = 145,
322-
colorDecoratorsActivatedOn = 146,
323-
inlineCompletionsAccessibilityVerbose = 147
256+
multiDocumentOccurrencesHighlight = 80,
257+
occurrencesHighlight = 81,
258+
overviewRulerBorder = 82,
259+
overviewRulerLanes = 83,
260+
padding = 84,
261+
pasteAs = 85,
262+
parameterHints = 86,
263+
peekWidgetDefaultFocus = 87,
264+
definitionLinkOpensInPeek = 88,
265+
quickSuggestions = 89,
266+
quickSuggestionsDelay = 90,
267+
readOnly = 91,
268+
readOnlyMessage = 92,
269+
renameOnType = 93,
270+
renderControlCharacters = 94,
271+
renderFinalNewline = 95,
272+
renderLineHighlight = 96,
273+
renderLineHighlightOnlyWhenFocus = 97,
274+
renderValidationDecorations = 98,
275+
renderWhitespace = 99,
276+
revealHorizontalRightPadding = 100,
277+
roundedSelection = 101,
278+
rulers = 102,
279+
scrollbar = 103,
280+
scrollBeyondLastColumn = 104,
281+
scrollBeyondLastLine = 105,
282+
scrollPredominantAxis = 106,
283+
selectionClipboard = 107,
284+
selectionHighlight = 108,
285+
selectOnLineNumbers = 109,
286+
showFoldingControls = 110,
287+
showUnused = 111,
288+
snippetSuggestions = 112,
289+
smartSelect = 113,
290+
smoothScrolling = 114,
291+
stickyScroll = 115,
292+
stickyTabStops = 116,
293+
stopRenderingLineAfter = 117,
294+
suggest = 118,
295+
suggestFontSize = 119,
296+
suggestLineHeight = 120,
297+
suggestOnTriggerCharacters = 121,
298+
suggestSelection = 122,
299+
tabCompletion = 123,
300+
tabIndex = 124,
301+
unicodeHighlighting = 125,
302+
unusualLineTerminators = 126,
303+
useShadowDOM = 127,
304+
useTabStops = 128,
305+
wordBreak = 129,
306+
wordSeparators = 130,
307+
wordWrap = 131,
308+
wordWrapBreakAfterCharacters = 132,
309+
wordWrapBreakBeforeCharacters = 133,
310+
wordWrapColumn = 134,
311+
wordWrapOverride1 = 135,
312+
wordWrapOverride2 = 136,
313+
wrappingIndent = 137,
314+
wrappingStrategy = 138,
315+
showDeprecated = 139,
316+
inlayHints = 140,
317+
editorClassName = 141,
318+
pixelRatio = 142,
319+
tabFocusMode = 143,
320+
layoutInfo = 144,
321+
wrappingInfo = 145,
322+
defaultColorDecorators = 146,
323+
colorDecoratorsActivatedOn = 147,
324+
inlineCompletionsAccessibilityVerbose = 148
324325
}
325326

326327
/**

0 commit comments

Comments
 (0)