11import * as vs from "vscode" ;
22import { Logger } from "../../shared/interfaces" ;
33import { PackageMap } from "../../shared/pub/package_map" ;
4- import { DartPackageUriTerminalLink , findPackageUriLinks } from "../../shared/vscode/terminal_link_provider_utils" ;
4+ import { notUndefined } from "../../shared/utils" ;
5+ import { DartPackageUriLink , findPackageUriLinks , formatLineColFragment } from "../../shared/vscode/terminal_link_provider_utils" ;
56import { getAllProjectFolders } from "../../shared/vscode/utils" ;
67import { WorkspaceContext } from "../../shared/workspace" ;
78import { config } from "../config" ;
89import { getExcludedFolders } from "../utils" ;
910
1011
11- export class DartPackageUriTerminalLinkProvider implements vs . TerminalLinkProvider < DartPackageUriTerminalLink > {
12+ export class DartPackageUriLinkProvider implements vs . TerminalLinkProvider < DartPackageUriLink > , vs . DocumentLinkProvider < vs . DocumentLink > {
1213 packageMaps : { [ key : string ] : PackageMap } | undefined ;
1314 packageMapDiscovery : Promise < void > | undefined ;
1415
@@ -49,14 +50,18 @@ export class DartPackageUriTerminalLinkProvider implements vs.TerminalLinkProvid
4950 return undefined ;
5051 }
5152
52- public async provideTerminalLinks ( context : vs . TerminalLinkContext , token : vs . CancellationToken ) : Promise < DartPackageUriTerminalLink [ ] > {
53+ public provideTerminalLinks ( context : vs . TerminalLinkContext , token : vs . CancellationToken ) : Promise < DartPackageUriLink [ ] > {
54+ return this . getLinks ( context . line ) ;
55+ }
56+
57+ private async getLinks ( content : string ) {
5358 if ( ! this . packageMaps )
5459 await this . discoverPackageMaps ( ) ;
5560
56- return findPackageUriLinks ( context . line , ( name ) => this . isKnownPackage ( name ) ) ;
61+ return findPackageUriLinks ( content , ( name ) => this . isKnownPackage ( name ) ) ;
5762 }
5863
59- public handleTerminalLink ( link : DartPackageUriTerminalLink ) : vs . ProviderResult < void > {
64+ public handleTerminalLink ( link : DartPackageUriLink ) : vs . ProviderResult < void > {
6065 const filePath = this . resolvePackageUri ( link . uri ) ;
6166 if ( ! filePath ) {
6267 vs . window . showErrorMessage ( `Unable to find root for package ${ link . packageName } ` ) ;
@@ -65,4 +70,17 @@ export class DartPackageUriTerminalLinkProvider implements vs.TerminalLinkProvid
6570
6671 vs . commands . executeCommand ( "_dart.jumpToLineColInUri" , vs . Uri . file ( filePath ) , link . line , link . col ) ;
6772 }
73+
74+ public async provideDocumentLinks ( document : vs . TextDocument , token : vs . CancellationToken ) : Promise < vs . DocumentLink [ ] > {
75+ const links = await this . getLinks ( document . getText ( ) ) ;
76+
77+ return links . map ( ( link ) => {
78+ const range = new vs . Range ( document . positionAt ( link . startIndex ) , document . positionAt ( link . startIndex + link . length ) ) ;
79+ const filePath = this . resolvePackageUri ( link . uri ) ;
80+ if ( ! filePath )
81+ return undefined ;
82+ return new vs . DocumentLink ( range , vs . Uri . file ( filePath ) . with ( { fragment : formatLineColFragment ( link ) } ) ) ;
83+ } ) . filter ( notUndefined ) ;
84+ }
85+
6886}
0 commit comments