Skip to content

Commit 4398d9f

Browse files
authored
refactor: extracting ViewModelDecoration code into a separate file (microsoft#254615)
* exracting viewmodeldecoration code into a separate file * adding changes
1 parent f3c6f6b commit 4398d9f

File tree

7 files changed

+89
-65
lines changed

7 files changed

+89
-65
lines changed

src/vs/editor/browser/view/renderingContext.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@
66
import { Position } from '../../common/core/position.js';
77
import { Range } from '../../common/core/range.js';
88
import { ViewportData } from '../../common/viewLayout/viewLinesViewportData.js';
9-
import { IViewLayout, ViewModelDecoration } from '../../common/viewModel.js';
9+
import { IViewLayout } from '../../common/viewModel.js';
10+
import { ViewModelDecoration } from '../../common/viewModel/viewModelDecoration.js';
1011

1112
export interface IViewLines {
1213
linesVisibleRangesForRange(range: Range, includeNewLines: boolean): LineVisibleRanges[] | null;

src/vs/editor/browser/viewParts/decorations/decorations.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ import { HorizontalRange, RenderingContext } from '../../view/renderingContext.j
99
import { EditorOption } from '../../../common/config/editorOptions.js';
1010
import { Range } from '../../../common/core/range.js';
1111
import * as viewEvents from '../../../common/viewEvents.js';
12-
import { ViewModelDecoration } from '../../../common/viewModel.js';
1312
import { ViewContext } from '../../../common/viewModel/viewContext.js';
13+
import { ViewModelDecoration } from '../../../common/viewModel/viewModelDecoration.js';
1414

1515
export class DecorationsOverlay extends DynamicViewOverlay {
1616

src/vs/editor/browser/viewParts/minimap/minimap.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ import { RenderingContext, RestrictedRenderingContext } from '../../view/renderi
2626
import { ViewContext } from '../../../common/viewModel/viewContext.js';
2727
import { EditorTheme } from '../../../common/editorTheme.js';
2828
import * as viewEvents from '../../../common/viewEvents.js';
29-
import { ViewLineData, ViewModelDecoration } from '../../../common/viewModel.js';
29+
import { ViewLineData } from '../../../common/viewModel.js';
3030
import { minimapSelection, minimapBackground, minimapForegroundOpacity, editorForeground } from '../../../../platform/theme/common/colorRegistry.js';
3131
import { ModelDecorationMinimapOptions } from '../../../common/model/textModel.js';
3232
import { Selection } from '../../../common/core/selection.js';
@@ -37,6 +37,7 @@ import { MinimapPosition, MinimapSectionHeaderStyle, TextModelResolvedOptions }
3737
import { createSingleCallFunction } from '../../../../base/common/functional.js';
3838
import { LRUCache } from '../../../../base/common/map.js';
3939
import { DEFAULT_FONT_FAMILY } from '../../../../base/browser/fonts.js';
40+
import { ViewModelDecoration } from '../../../common/viewModel/viewModelDecoration.js';
4041

4142
/**
4243
* The orthogonal distance to the slider at which dragging "resets". This implements "snapping"

src/vs/editor/common/viewLayout/viewLinesViewportData.ts

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

66
import { Range } from '../core/range.js';
77
import { Selection } from '../core/selection.js';
8-
import { IPartialViewLinesViewportData, IViewModel, IViewWhitespaceViewportData, ViewLineRenderingData, ViewModelDecoration } from '../viewModel.js';
8+
import { IPartialViewLinesViewportData, IViewModel, IViewWhitespaceViewportData, ViewLineRenderingData } from '../viewModel.js';
9+
import { ViewModelDecoration } from '../viewModel/viewModelDecoration.js';
910

1011
/**
1112
* Contains all data needed to render at a specific viewport.
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
/*---------------------------------------------------------------------------------------------
2+
* Copyright (c) Microsoft Corporation. All rights reserved.
3+
* Licensed under the MIT License. See License.txt in the project root for license information.
4+
*--------------------------------------------------------------------------------------------*/
5+
6+
import { IModelDecoration, IModelDecorationOptions, ITextModel } from '../model.js';
7+
import { Range } from '../core/range.js';
8+
import { StandardTokenType } from '../encodedTokenAttributes.js';
9+
10+
export class ViewModelDecoration {
11+
_viewModelDecorationBrand: void = undefined;
12+
13+
public readonly range: Range;
14+
public readonly options: IModelDecorationOptions;
15+
16+
constructor(range: Range, options: IModelDecorationOptions) {
17+
this.range = range;
18+
this.options = options;
19+
}
20+
}
21+
22+
export function isModelDecorationVisible(model: ITextModel, decoration: IModelDecoration): boolean {
23+
if (decoration.options.hideInCommentTokens && isModelDecorationInComment(model, decoration)) {
24+
return false;
25+
}
26+
27+
if (decoration.options.hideInStringTokens && isModelDecorationInString(model, decoration)) {
28+
return false;
29+
}
30+
31+
return true;
32+
}
33+
34+
export function isModelDecorationInComment(model: ITextModel, decoration: IModelDecoration): boolean {
35+
return testTokensInRange(
36+
model,
37+
decoration.range,
38+
(tokenType) => tokenType === StandardTokenType.Comment
39+
);
40+
}
41+
42+
export function isModelDecorationInString(model: ITextModel, decoration: IModelDecoration): boolean {
43+
return testTokensInRange(
44+
model,
45+
decoration.range,
46+
(tokenType) => tokenType === StandardTokenType.String
47+
);
48+
}
49+
50+
/**
51+
* Calls the callback for every token that intersects the range.
52+
* If the callback returns `false`, iteration stops and `false` is returned.
53+
* Otherwise, `true` is returned.
54+
*/
55+
function testTokensInRange(model: ITextModel, range: Range, callback: (tokenType: StandardTokenType) => boolean): boolean {
56+
for (let lineNumber = range.startLineNumber; lineNumber <= range.endLineNumber; lineNumber++) {
57+
const lineTokens = model.tokenization.getLineTokens(lineNumber);
58+
const isFirstLine = lineNumber === range.startLineNumber;
59+
const isEndLine = lineNumber === range.endLineNumber;
60+
61+
let tokenIdx = isFirstLine ? lineTokens.findTokenIndexAtOffset(range.startColumn - 1) : 0;
62+
while (tokenIdx < lineTokens.getCount()) {
63+
if (isEndLine) {
64+
const startOffset = lineTokens.getStartOffset(tokenIdx);
65+
if (startOffset > range.endColumn - 1) {
66+
break;
67+
}
68+
}
69+
70+
const callbackResult = callback(lineTokens.getStandardTokenType(tokenIdx));
71+
if (!callbackResult) {
72+
return false;
73+
}
74+
tokenIdx++;
75+
}
76+
}
77+
return true;
78+
}
79+

src/vs/editor/common/viewModel/viewModelDecorations.ts

Lines changed: 2 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@ import { Range } from '../core/range.js';
99
import { IEditorConfiguration } from '../config/editorConfiguration.js';
1010
import { IModelDecoration, ITextModel, PositionAffinity } from '../model.js';
1111
import { IViewModelLines } from './viewModelLines.js';
12-
import { ICoordinatesConverter, ViewModelDecoration } from '../viewModel.js';
12+
import { ICoordinatesConverter } from '../viewModel.js';
1313
import { filterFontDecorations, filterValidationDecorations } from '../config/editorOptions.js';
14-
import { StandardTokenType } from '../encodedTokenAttributes.js';
14+
import { isModelDecorationVisible, ViewModelDecoration } from './viewModelDecoration.js';
1515
import { InlineDecoration, InlineDecorationType } from './inlineDecorations.js';
1616

1717
export interface IDecorationsViewportData {
@@ -187,61 +187,3 @@ export class ViewModelDecorations implements IDisposable {
187187
};
188188
}
189189
}
190-
191-
export function isModelDecorationVisible(model: ITextModel, decoration: IModelDecoration): boolean {
192-
if (decoration.options.hideInCommentTokens && isModelDecorationInComment(model, decoration)) {
193-
return false;
194-
}
195-
196-
if (decoration.options.hideInStringTokens && isModelDecorationInString(model, decoration)) {
197-
return false;
198-
}
199-
200-
return true;
201-
}
202-
203-
export function isModelDecorationInComment(model: ITextModel, decoration: IModelDecoration): boolean {
204-
return testTokensInRange(
205-
model,
206-
decoration.range,
207-
(tokenType) => tokenType === StandardTokenType.Comment
208-
);
209-
}
210-
211-
export function isModelDecorationInString(model: ITextModel, decoration: IModelDecoration): boolean {
212-
return testTokensInRange(
213-
model,
214-
decoration.range,
215-
(tokenType) => tokenType === StandardTokenType.String
216-
);
217-
}
218-
219-
/**
220-
* Calls the callback for every token that intersects the range.
221-
* If the callback returns `false`, iteration stops and `false` is returned.
222-
* Otherwise, `true` is returned.
223-
*/
224-
function testTokensInRange(model: ITextModel, range: Range, callback: (tokenType: StandardTokenType) => boolean): boolean {
225-
for (let lineNumber = range.startLineNumber; lineNumber <= range.endLineNumber; lineNumber++) {
226-
const lineTokens = model.tokenization.getLineTokens(lineNumber);
227-
const isFirstLine = lineNumber === range.startLineNumber;
228-
const isEndLine = lineNumber === range.endLineNumber;
229-
230-
let tokenIdx = isFirstLine ? lineTokens.findTokenIndexAtOffset(range.startColumn - 1) : 0;
231-
while (tokenIdx < lineTokens.getCount()) {
232-
if (isEndLine) {
233-
const startOffset = lineTokens.getStartOffset(tokenIdx);
234-
if (startOffset > range.endColumn - 1) {
235-
break;
236-
}
237-
}
238-
239-
const callbackResult = callback(lineTokens.getStandardTokenType(tokenIdx));
240-
if (!callbackResult) {
241-
return false;
242-
}
243-
tokenIdx++;
244-
}
245-
}
246-
return true;
247-
}

src/vs/editor/contrib/unicodeHighlighter/browser/unicodeHighlighter.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ import { ModelDecorationOptions } from '../../../common/model/textModel.js';
2121
import { UnicodeHighlighterOptions, UnicodeHighlighterReason, UnicodeHighlighterReasonKind, UnicodeTextModelHighlighter } from '../../../common/services/unicodeTextModelHighlighter.js';
2222
import { IEditorWorkerService, IUnicodeHighlightsResult } from '../../../common/services/editorWorker.js';
2323
import { ILanguageService } from '../../../common/languages/language.js';
24-
import { isModelDecorationInComment, isModelDecorationInString, isModelDecorationVisible } from '../../../common/viewModel/viewModelDecorations.js';
2524
import { HoverAnchor, HoverAnchorType, HoverParticipantRegistry, IEditorHoverParticipant, IEditorHoverRenderContext, IHoverPart, IRenderedHoverParts } from '../../hover/browser/hoverTypes.js';
2625
import { MarkdownHover, renderMarkdownHovers } from '../../hover/browser/markdownHoverParticipant.js';
2726
import { BannerController } from './bannerController.js';
@@ -34,6 +33,7 @@ import { registerIcon } from '../../../../platform/theme/common/iconRegistry.js'
3433
import { IWorkspaceTrustManagementService } from '../../../../platform/workspace/common/workspaceTrust.js';
3534
import { Action2, registerAction2 } from '../../../../platform/actions/common/actions.js';
3635
import { safeIntl } from '../../../../base/common/date.js';
36+
import { isModelDecorationInComment, isModelDecorationInString, isModelDecorationVisible } from '../../../common/viewModel/viewModelDecoration.js';
3737

3838
export const warningIcon = registerIcon('extensions-warning-message', Codicon.warning, nls.localize('warningIcon', 'Icon shown with a warning message in the extensions editor.'));
3939

0 commit comments

Comments
 (0)