Skip to content

Commit d433dfd

Browse files
committed
add utility method for the 80% case, add doc highlights command
1 parent 6497432 commit d433dfd

10 files changed

Lines changed: 70 additions & 68 deletions

File tree

src/vs/editor/common/core/position.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ export class Position implements EditorCommon.IEditorPosition {
5454
return new Position(pos.lineNumber, pos.column);
5555
}
5656

57-
public static isIPosition(obj: any): boolean {
57+
public static isIPosition(obj: any): obj is EditorCommon.IPosition {
5858
return (
5959
obj
6060
&& (typeof obj.lineNumber === 'number')

src/vs/editor/common/editorCommonExtensions.ts

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,13 @@
55
'use strict';
66

77
import EditorCommon = require('vs/editor/common/editorCommon');
8+
import {onUnexpectedError, illegalArgument} from 'vs/base/common/errors';
9+
import URI from 'vs/base/common/uri';
10+
import {Position} from 'vs/editor/common/core/position';
811
import {ServicesAccessor} from 'vs/platform/instantiation/common/instantiation';
912
import {ITelemetryService} from 'vs/platform/telemetry/common/telemetry';
13+
import {IModelService} from 'vs/editor/common/services/modelService';
1014
import {Registry} from 'vs/platform/platform';
11-
import Errors = require('vs/base/common/errors');
1215
import {KeybindingsRegistry,ICommandDescriptor} from 'vs/platform/keybinding/common/keybindingsRegistry';
1316
import config = require('vs/editor/common/config/config');
1417
import {IInstantiationService} from 'vs/platform/instantiation/common/instantiation';
@@ -84,6 +87,38 @@ export module CommonEditorRegistry {
8487

8588
KeybindingsRegistry.registerCommandDesc(commandDesc);
8689
}
90+
91+
export function registerLanguageCommand(id: string, handler: (accessor: ServicesAccessor, args: { [n: string]: any }) => any) {
92+
KeybindingsRegistry.registerCommandDesc({
93+
id,
94+
handler(accessor, args: any[]) {
95+
if (args && args.length > 1 || typeof args[0] !== 'object') {
96+
throw illegalArgument();
97+
}
98+
return handler(accessor, args && args[0]);
99+
},
100+
weight: KeybindingsRegistry.WEIGHT.editorContrib(),
101+
primary: undefined,
102+
context: undefined,
103+
});
104+
}
105+
106+
export function registerDefaultLanguageCommand(id: string, handler: (model: EditorCommon.IModel, position: EditorCommon.IPosition) => any) {
107+
registerLanguageCommand(id, function(accessor, args) {
108+
109+
const {resource, position} = args;
110+
if (!URI.isURI(resource) || !Position.isIPosition(position)) {
111+
throw illegalArgument();
112+
}
113+
114+
const model = accessor.get(IModelService).getModel(resource);
115+
if (!model) {
116+
throw illegalArgument();
117+
}
118+
119+
return handler(model, position);
120+
});
121+
}
87122
}
88123

89124
class SimpleEditorContributionDescriptor implements EditorCommon.ICommonEditorContributionDescriptor {
@@ -193,7 +228,7 @@ function triggerEditorActionGlobal(actionId: string, accessor: ServicesAccessor,
193228
var action = activeEditor.getAction(actionId);
194229
if (action) {
195230
accessor.get(ITelemetryService).publicLog('editorActionInvoked', {name: action.label} );
196-
action.run().done(null, Errors.onUnexpectedError);
231+
action.run().done(null, onUnexpectedError);
197232
}
198233
return;
199234
}

src/vs/editor/contrib/goToDeclaration/common/goToDeclaration.ts

Lines changed: 3 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,12 @@
77

88
import URI from 'vs/base/common/uri';
99
import {TPromise} from 'vs/base/common/winjs.base';
10-
import {onUnexpectedError, illegalArgument} from 'vs/base/common/errors';
10+
import {onUnexpectedError} from 'vs/base/common/errors';
1111
import {IModel, IPosition} from 'vs/editor/common/editorCommon';
1212
import {IDeclarationSupport} from 'vs/editor/common/modes';
1313
import LanguageFeatureRegistry from 'vs/editor/common/modes/languageFeatureRegistry';
1414
import {IReference} from 'vs/editor/common/modes';
15-
import {IModelService} from 'vs/editor/common/services/modelService';
16-
import {registerCommand} from 'vs/platform/keybinding/common/commandsUtils';
15+
import {CommonEditorRegistry} from 'vs/editor/common/editorCommonExtensions';
1716

1817
export const DeclarationRegistry = new LanguageFeatureRegistry<IDeclarationSupport>('declarationSupport');
1918

@@ -44,17 +43,4 @@ export function getDeclarationsAtPosition(model: IModel, position: IPosition): T
4443
});
4544
}
4645

47-
registerCommand('_executeDefinitionProvider', function(accessor, args) {
48-
49-
let {resource, position} = args;
50-
if (!URI.isURI(resource)) {
51-
throw illegalArgument();
52-
}
53-
54-
let model = accessor.get(IModelService).getModel(resource);
55-
if (!model) {
56-
throw illegalArgument(resource + ' not found');
57-
}
58-
59-
return getDeclarationsAtPosition(model, position);
60-
});
46+
CommonEditorRegistry.registerDefaultLanguageCommand('_executeDefinitionProvider', getDeclarationsAtPosition)

src/vs/editor/contrib/hover/common/hover.ts

Lines changed: 3 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,13 @@
55

66
'use strict';
77

8-
import URI from 'vs/base/common/uri';
98
import {IExtraInfoSupport, IComputeExtraInfoResult} from 'vs/editor/common/modes';
109
import LanguageFeatureRegistry from 'vs/editor/common/modes/languageFeatureRegistry';
1110
import {TPromise} from 'vs/base/common/winjs.base';
1211
import {coalesce} from 'vs/base/common/arrays';
13-
import {onUnexpectedError, illegalArgument} from 'vs/base/common/errors';
12+
import {onUnexpectedError} from 'vs/base/common/errors';
1413
import {IPosition, IModel} from 'vs/editor/common/editorCommon';
15-
import {IModelService} from 'vs/editor/common/services/modelService';
16-
import {registerCommand} from 'vs/platform/keybinding/common/commandsUtils';
14+
import {CommonEditorRegistry} from 'vs/editor/common/editorCommonExtensions';
1715

1816
export const ExtraInfoRegistry = new LanguageFeatureRegistry<IExtraInfoSupport>('extraInfoSupport');
1917

@@ -41,16 +39,4 @@ export function getExtraInfoAtPosition(model: IModel, position: IPosition): TPro
4139
return TPromise.join(promises).then(() => coalesce(values));
4240
}
4341

44-
registerCommand('_executeHoverProvider', function(accessor, args) {
45-
46-
let {resource, position} = args;
47-
if (!URI.isURI(resource)) {
48-
throw illegalArgument();
49-
}
50-
let model = accessor.get(IModelService).getModel(resource);
51-
if (!model) {
52-
throw illegalArgument(resource + ' not found');
53-
}
54-
55-
return getExtraInfoAtPosition(model, position);
56-
});
42+
CommonEditorRegistry.registerDefaultLanguageCommand('_executeHoverProvider', getExtraInfoAtPosition);

src/vs/editor/contrib/wordHighlighter/common/wordHighlighter.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,10 @@ import * as EditorCommon from 'vs/editor/common/editorCommon';
1010
import {IOccurrencesSupport, IOccurence} from 'vs/editor/common/modes';
1111
import {CommonEditorRegistry} from 'vs/editor/common/editorCommonExtensions';
1212
import {Range} from 'vs/editor/common/core/range';
13-
import {onUnexpectedError} from 'vs/base/common/errors';
13+
import {onUnexpectedError, illegalArgument} from 'vs/base/common/errors';
1414
import {INullService} from 'vs/platform/instantiation/common/instantiation';
1515
import {sequence} from 'vs/base/common/async';
16+
import {IModelService} from 'vs/editor/common/services/modelService';
1617
import LanguageFeatureRegistry from 'vs/editor/common/modes/languageFeatureRegistry';
1718

1819
export const OccurrencesRegistry = new LanguageFeatureRegistry<IOccurrencesSupport>('occurrencesSupport');
@@ -44,6 +45,8 @@ export function getOccurrencesAtPosition(model: EditorCommon.IModel, position: E
4445
});
4546
}
4647

48+
CommonEditorRegistry.registerDefaultLanguageCommand('_executeDocumentHighlights', getOccurrencesAtPosition);
49+
4750
class WordHighlighter {
4851

4952
private editor: EditorCommon.ICommonCodeEditor;

src/vs/platform/keybinding/common/commandsUtils.ts

Lines changed: 0 additions & 26 deletions
This file was deleted.

src/vs/workbench/api/common/extHostLanguageFeatureCommands.ts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,8 @@ import {SuggestRegistry} from 'vs/editor/contrib/suggest/common/suggest';
4141
// vscode.executeWorkspaceSymbolProvider
4242
// vscode.executeDefinitionProvider
4343
// vscode.executeHoverProvider
44-
4544
// vscode.executeDocumentHighlights
45+
4646
// vscode.executeReferenceProvider
4747
// vscode.executeCodeActionProvider
4848
// vscode.executeCodeLensProvider
@@ -65,6 +65,7 @@ export class ExtHostLanguageFeatureCommands {
6565
this._register('vscode.executeWorkspaceSymbolProvider', this._executeWorkspaceSymbolProvider);
6666
this._register('vscode.executeDefinitionProvider', this._executeDefinitionProvider);
6767
this._register('vscode.executeHoverProvider', this._executeHoverProvider);
68+
this._register('vscode.executeDocumentHighlights', this._executeDocumentHighlights);
6869
}
6970

7071
private _register(id: string, callback: (...args: any[]) => any): void {
@@ -104,4 +105,16 @@ export class ExtHostLanguageFeatureCommands {
104105
}
105106
});
106107
}
108+
109+
private _executeDocumentHighlights(resource: URI, position: types.Position): Thenable<types.DocumentHighlight[]> {
110+
const args = {
111+
resource,
112+
position: position && typeConverters.fromPosition(position)
113+
};
114+
return this._commands.executeCommand<modes.IOccurence[]>('_executeDocumentHighlights', args).then(value => {
115+
if (Array.isArray(value)) {
116+
return value.map(typeConverters.toDocumentHighlight)
117+
}
118+
});
119+
}
107120
}

src/vs/workbench/api/common/pluginHostTypeConverters.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,4 +245,9 @@ export function fromHover(hover: vscode.Hover): modes.IComputeExtraInfoResult {
245245

246246
export function toHover(info: modes.IComputeExtraInfoResult): types.Hover {
247247
return new types.Hover(info.htmlContent.map(toFormattedString), toRange(info.range));
248+
}
249+
250+
export function toDocumentHighlight(occurrence: modes.IOccurence): types.DocumentHighlight {
251+
return new types.DocumentHighlight(toRange(occurrence.range),
252+
types.DocumentHighlightKind[occurrence.kind.charAt(0).toUpperCase() + occurrence.kind.substr(1)]);
248253
}

src/vs/workbench/parts/search/common/search.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@ import {TPromise} from 'vs/base/common/winjs.base';
99
import {onUnexpectedError, illegalArgument} from 'vs/base/common/errors';
1010
import {IDisposable} from 'vs/base/common/lifecycle';
1111
import LanguageFeatureRegistry from 'vs/editor/common/modes/languageFeatureRegistry';
12+
import {CommonEditorRegistry} from 'vs/editor/common/editorCommonExtensions';
1213
import {IRange} from 'vs/editor/common/editorCommon';
1314
import URI from 'vs/base/common/uri';
14-
import {registerCommand} from 'vs/platform/keybinding/common/commandsUtils';
1515

1616
/**
1717
* Interface used to navigate to types by value.
@@ -75,7 +75,7 @@ export function getNavigateToItems(query: string): TPromise<ITypeBearing[]> {
7575
});
7676
}
7777

78-
registerCommand('_executeWorkspaceSymbolProvider', function(accessor, args: { query: string;}) {
78+
CommonEditorRegistry.registerLanguageCommand('_executeWorkspaceSymbolProvider', function(accessor, args: { query: string;}) {
7979
let {query} = args;
8080
if (typeof query !== 'string') {
8181
throw illegalArgument();

src/vs/workbench/test/common/api/testThreadService.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ export class TestThreadService extends NullThreadService {
2424
private set _callCount(value:number) {
2525
this._callCountValue = value;
2626
if (this._callCountValue === 0) {
27-
this._completeIdle();
27+
this._completeIdle && this._completeIdle();
2828
this._idle = undefined;
2929
}
3030
}

0 commit comments

Comments
 (0)