@@ -3,7 +3,7 @@ namespace ts.GoToDefinition {
33 export function getDefinitionAtPosition ( program : Program , sourceFile : SourceFile , position : number ) : readonly DefinitionInfo [ ] | undefined {
44 const resolvedRef = getReferenceAtPosition ( sourceFile , position , program ) ;
55 if ( resolvedRef ) {
6- return [ getDefinitionInfoForFileReference ( resolvedRef . reference . fileName , resolvedRef . file . fileName ) ] ;
6+ return [ getDefinitionInfoForFileReference ( resolvedRef . reference . fileName , resolvedRef . fileName ) ] ;
77 }
88
99 const node = getTouchingPropertyName ( sourceFile , position ) ;
@@ -108,24 +108,41 @@ namespace ts.GoToDefinition {
108108 || ( ! isCallLikeExpression ( calledDeclaration . parent ) && s === calledDeclaration . parent . symbol ) ;
109109 }
110110
111- export function getReferenceAtPosition ( sourceFile : SourceFile , position : number , program : Program ) : { reference : FileReference , file : SourceFile } | undefined {
111+ export function getReferenceAtPosition ( sourceFile : SourceFile , position : number , program : Program ) : { reference : FileReference , fileName : string , file ? : SourceFile } | undefined {
112112 const referencePath = findReferenceInPosition ( sourceFile . referencedFiles , position ) ;
113113 if ( referencePath ) {
114114 const file = program . getSourceFileFromReference ( sourceFile , referencePath ) ;
115- return file && { reference : referencePath , file } ;
115+ return file && { reference : referencePath , fileName : file . fileName } ;
116116 }
117117
118118 const typeReferenceDirective = findReferenceInPosition ( sourceFile . typeReferenceDirectives , position ) ;
119119 if ( typeReferenceDirective ) {
120120 const reference = program . getResolvedTypeReferenceDirectives ( ) . get ( typeReferenceDirective . fileName ) ;
121121 const file = reference && program . getSourceFile ( reference . resolvedFileName ! ) ; // TODO:GH#18217
122- return file && { reference : typeReferenceDirective , file } ;
122+ return file && { reference : typeReferenceDirective , fileName : file . fileName } ;
123123 }
124124
125125 const libReferenceDirective = findReferenceInPosition ( sourceFile . libReferenceDirectives , position ) ;
126126 if ( libReferenceDirective ) {
127127 const file = program . getLibFileFromReference ( libReferenceDirective ) ;
128- return file && { reference : libReferenceDirective , file } ;
128+ return file && { reference : libReferenceDirective , fileName : file . fileName } ;
129+ }
130+
131+ if ( sourceFile . resolvedModules ?. size ) {
132+ const node = getTokenAtPosition ( sourceFile , position ) ;
133+ if ( isModuleSpecifierLike ( node ) && ! pathIsBareSpecifier ( node . text ) && sourceFile . resolvedModules . has ( node . text ) ) {
134+ const fileName = sourceFile . resolvedModules . get ( node . text ) ?. resolvedFileName
135+ || resolvePath ( getDirectoryPath ( sourceFile . fileName ) , node . text ) ;
136+ return {
137+ file : program . getSourceFile ( fileName ) ,
138+ fileName,
139+ reference : {
140+ pos : node . getStart ( ) ,
141+ end : node . getEnd ( ) ,
142+ fileName : node . text
143+ }
144+ } ;
145+ }
129146 }
130147
131148 return undefined ;
0 commit comments