Skip to content

Commit

Permalink
Show semantic token help
Browse files Browse the repository at this point in the history
  • Loading branch information
aeschli committed Mar 16, 2020
1 parent e983827 commit 2243766
Show file tree
Hide file tree
Showing 4 changed files with 92 additions and 0 deletions.
4 changes: 4 additions & 0 deletions src/vs/editor/common/model/textModel.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1754,6 +1754,7 @@ export class TextModel extends Disposable implements model.ITextModel {
if (ranges.length > 0) {
this._emitModelTokensChangedEvent({
tokenizationSupportChanged: false,
semanticTokensApplied: false,
ranges: ranges
});
}
Expand All @@ -1764,6 +1765,7 @@ export class TextModel extends Disposable implements model.ITextModel {

this._emitModelTokensChangedEvent({
tokenizationSupportChanged: false,
semanticTokensApplied: tokens !== null,
ranges: [{ fromLineNumber: 1, toLineNumber: this.getLineCount() }]
});
}
Expand All @@ -1778,6 +1780,7 @@ export class TextModel extends Disposable implements model.ITextModel {
this._tokens.flush();
this._emitModelTokensChangedEvent({
tokenizationSupportChanged: true,
semanticTokensApplied: false,
ranges: [{
fromLineNumber: 1,
toLineNumber: this._buffer.getLineCount()
Expand All @@ -1790,6 +1793,7 @@ export class TextModel extends Disposable implements model.ITextModel {

this._emitModelTokensChangedEvent({
tokenizationSupportChanged: false,
semanticTokensApplied: true,
ranges: [{ fromLineNumber: 1, toLineNumber: this.getLineCount() }]
});
}
Expand Down
1 change: 1 addition & 0 deletions src/vs/editor/common/model/textModelEvents.ts
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,7 @@ export interface IModelDecorationsChangedEvent {
*/
export interface IModelTokensChangedEvent {
readonly tokenizationSupportChanged: boolean;
readonly semanticTokensApplied: boolean;
readonly ranges: {
/**
* The start of the range (inclusive)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import './inspectEditorTokens/inspectEditorTokens';
import './quickaccess/gotoLineQuickAccess';
import './quickaccess/gotoSymbolQuickAccess';
import './saveParticipants';
import './semanticTokensHelp';
import './toggleColumnSelection';
import './toggleMinimap';
import './toggleMultiCursorModifier';
Expand Down
86 changes: 86 additions & 0 deletions src/vs/workbench/contrib/codeEditor/browser/semanticTokensHelp.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/

import * as nls from 'vs/nls';
import * as path from 'vs/base/common/path';
import { Disposable, DisposableStore } from 'vs/base/common/lifecycle';
import { ICodeEditor } from 'vs/editor/browser/editorBrowser';
import { registerEditorContribution } from 'vs/editor/browser/editorExtensions';
import { IEditorContribution } from 'vs/editor/common/editorCommon';
import { INotificationService, Severity } from 'vs/platform/notification/common/notification';
import { IOpenerService } from 'vs/platform/opener/common/opener';
import { URI } from 'vs/base/common/uri';
import { ITextModel } from 'vs/editor/common/model';
import { IWorkbenchThemeService } from 'vs/workbench/services/themes/common/workbenchThemeService';

/**
* Shows a message when semantic tokens are shown the first time.
*/
export class SemanticTokensHelp extends Disposable implements IEditorContribution {

public static readonly ID = 'editor.contrib.semanticHighlightHelp';

constructor(
_editor: ICodeEditor,
@INotificationService _notificationService: INotificationService,
@IOpenerService _openerService: IOpenerService,
@IWorkbenchThemeService _themeService: IWorkbenchThemeService
) {
super();

const toDispose = this._register(new DisposableStore());
const localToDispose = toDispose.add(new DisposableStore());
const installChangeTokenListener = (model: ITextModel) => {
localToDispose.add(model.onDidChangeTokens((e) => {
if (!e.semanticTokensApplied) {
return;
}

toDispose.dispose(); // uninstall all listeners, makes sure the notification is only shown once per window

const message = nls.localize(
{
key: 'semanticTokensHelp',
comment: [
'Variable 0 will be a file name.',
'Variable 1 will be a theme name.'
]
},
"Semantic highlighting has been applied on top of the syntax highlighting of {0} as current the theme ({1}) has semantic highlighting enabled.",
path.basename(model.uri.path), _themeService.getColorTheme().label
);

_notificationService.prompt(Severity.Info, message, [
{
label: nls.localize('learnMoreButton', "Learn More"),
run: () => {
const url = 'https://go.microsoft.com/fwlink/?linkid=852450';

_openerService.open(URI.parse(url));
}
}
], { neverShowAgain: { id: 'editor.contrib.semanticTokensHelp' } });
}));
};


const model = _editor.getModel();
if (model !== null) {
installChangeTokenListener(model);
}

toDispose.add(_editor.onDidChangeModel((e) => {
localToDispose.clear();

const model = _editor.getModel();
if (!model) {
return;
}
installChangeTokenListener(model);
}));
}
}

registerEditorContribution(SemanticTokensHelp.ID, SemanticTokensHelp);

0 comments on commit 2243766

Please sign in to comment.