registerDocumentLinkProvider

This commit is contained in:
Johannes Rieken
2016-07-21 16:05:59 +02:00
parent 7c6e9672cd
commit b5287d4621
9 changed files with 221 additions and 22 deletions

View File

@@ -74,6 +74,7 @@ export class ExtHostAPIImplementation {
CompletionItem: typeof vscode.CompletionItem;
CompletionItemKind: typeof vscode.CompletionItemKind;
CompletionList: typeof vscode.CompletionList;
DocumentLink: typeof vscode.DocumentLink;
IndentAction: typeof vscode.IndentAction;
OverviewRulerLane: typeof vscode.OverviewRulerLane;
TextEditorRevealType: typeof vscode.TextEditorRevealType;
@@ -150,6 +151,7 @@ export class ExtHostAPIImplementation {
this.CompletionItem = extHostTypes.CompletionItem;
this.CompletionItemKind = extHostTypes.CompletionItemKind;
this.CompletionList = extHostTypes.CompletionList;
this.DocumentLink = extHostTypes.DocumentLink;
this.ViewColumn = extHostTypes.ViewColumn;
this.StatusBarAlignment = extHostTypes.StatusBarAlignment;
this.IndentAction = Modes.IndentAction;
@@ -369,6 +371,9 @@ export class ExtHostAPIImplementation {
registerCompletionItemProvider(selector: vscode.DocumentSelector, provider: vscode.CompletionItemProvider, ...triggerCharacters: string[]): vscode.Disposable {
return languageFeatures.registerCompletionItemProvider(selector, provider, triggerCharacters);
},
registerDocumentLinkProvider(selector: vscode.DocumentSelector, provider: vscode.DocumentLinkProvider): vscode.Disposable {
return languageFeatures.registerDocumentLinkProvider(selector, provider);
},
setLanguageConfiguration: (language: string, configuration: vscode.LanguageConfiguration):vscode.Disposable => {
return languageFeatures.setLanguageConfiguration(language, configuration);
}

View File

@@ -127,6 +127,7 @@ export abstract class MainThreadLanguageFeaturesShape {
$registerRenameSupport(handle: number, selector: vscode.DocumentSelector): TPromise<any> { throw ni(); }
$registerSuggestSupport(handle: number, selector: vscode.DocumentSelector, triggerCharacters: string[]): TPromise<any> { throw ni(); }
$registerSignatureHelpProvider(handle: number, selector: vscode.DocumentSelector, triggerCharacter: string[]): TPromise<any> { throw ni(); }
$registerDocumentLinkProvider(handle: number, selector: vscode.DocumentSelector): TPromise<any> { throw ni(); }
$setLanguageConfiguration(handle: number, languageId:string, configuration: vscode.LanguageConfiguration): TPromise<any> { throw ni(); }
}
@@ -267,6 +268,8 @@ export abstract class ExtHostLanguageFeaturesShape {
$provideCompletionItems(handle: number, resource: URI, position: editorCommon.IPosition): TPromise<modes.ISuggestResult[]> { throw ni(); }
$resolveCompletionItem(handle: number, resource: URI, position: editorCommon.IPosition, suggestion: modes.ISuggestion): TPromise<modes.ISuggestion> { throw ni(); }
$provideSignatureHelp(handle: number, resource: URI, position: editorCommon.IPosition): TPromise<modes.SignatureHelp> { throw ni(); }
$providDocumentLinks(handle: number, resource: URI): TPromise<modes.ILink[]> { throw ni(); }
}
export abstract class ExtHostQuickOpenShape {

View File

@@ -588,10 +588,31 @@ class SignatureHelpAdapter {
}
}
class LinkProviderAdapter {
private _documents: ExtHostDocuments;
private _provider: vscode.DocumentLinkProvider;
constructor(documents: ExtHostDocuments, provider: vscode.DocumentLinkProvider) {
this._documents = documents;
this._provider = provider;
}
provideLinks(resource: URI): TPromise<modes.ILink[]> {
const doc = this._documents.getDocumentData(resource).document;
return asWinJsPromise(token => this._provider.provideDocumentLinks(doc, token)).then(links => {
if (Array.isArray(links)) {
return links.map(TypeConverters.DocumentLink.from);
}
});
}
}
type Adapter = OutlineAdapter | CodeLensAdapter | DefinitionAdapter | HoverAdapter
| DocumentHighlightAdapter | ReferenceAdapter | QuickFixAdapter | DocumentFormattingAdapter
| RangeFormattingAdapter | OnTypeFormattingAdapter | NavigateTypeAdapter | RenameAdapter
| SuggestAdapter | SignatureHelpAdapter;
| SuggestAdapter | SignatureHelpAdapter | LinkProviderAdapter;
export class ExtHostLanguageFeatures extends ExtHostLanguageFeaturesShape {
@@ -821,6 +842,19 @@ export class ExtHostLanguageFeatures extends ExtHostLanguageFeaturesShape {
return this._withAdapter(handle, SignatureHelpAdapter, adapter => adapter.provideSignatureHelp(resource, position));
}
// --- links
registerDocumentLinkProvider(selector: vscode.DocumentSelector, provider: vscode.DocumentLinkProvider): vscode.Disposable {
const handle = this._nextHandle();
this._adapter[handle] = new LinkProviderAdapter(this._documents, provider);
this._proxy.$registerDocumentLinkProvider(handle, selector);
return this._createDisposable(handle);
}
$providDocumentLinks(handle: number, resource: URI): TPromise<modes.ILink[]> {
return this._withAdapter(handle, LinkProviderAdapter, adapter => adapter.provideLinks(resource));
}
// --- configuration
setLanguageConfiguration(languageId:string, configuration: vscode.LanguageConfiguration): vscode.Disposable {

View File

@@ -318,6 +318,19 @@ export namespace SignatureHelp {
}
}
export namespace DocumentLink {
export function from(link: types.DocumentLink): modes.ILink {
return {
range: fromRange(link.range),
url: link.target.toString()
};
}
export function to(link: modes.ILink):types.DocumentLink {
return new types.DocumentLink(toRange(link.range), URI.parse(link.url));
}
}
export namespace Command {

View File

@@ -206,6 +206,17 @@ export class Position {
export class Range {
static is(thing: any): thing is Range {
if (thing instanceof Range) {
return true;
}
if (!thing) {
return false;
}
return Position.is((<Range>thing).start)
&& Position.is((<Range>thing.end));
}
protected _start: Position;
protected _end: Position;
@@ -769,3 +780,21 @@ export enum TextEditorRevealType {
InCenter = 1,
InCenterIfOutsideViewport = 2
}
export class DocumentLink {
range: Range;
target: URI;
constructor(range: Range, target: URI) {
if (!(target instanceof URI)) {
throw illegalArgument('target');
}
if (!Range.is(range) || range.isEmpty) {
throw illegalArgument('range');
}
this.range = range;
this.target = target;
}
}

View File

@@ -201,6 +201,17 @@ export class MainThreadLanguageFeatures extends MainThreadLanguageFeaturesShape
return undefined;
}
// --- links
$registerDocumentLinkProvider(handle: number, selector: vscode.DocumentSelector): TPromise<any> {
this._registrations[handle] = modes.LinkProviderRegistry.register(selector, <modes.LinkProvider>{
provideLinks: (model, token) => {
return wireCancellationToken(token, this._proxy.$providDocumentLinks(handle, model.uri));
}
});
return undefined;
}
// --- configuration
$setLanguageConfiguration(handle: number, languageId: string, configuration: vscode.LanguageConfiguration): TPromise<any> {