@@ -927,6 +927,7 @@ function completionInfoFromData(
927927 /*replacementToken*/ undefined ,
928928 contextToken ,
929929 location ,
930+ position ,
930931 sourceFile ,
931932 host ,
932933 program ,
@@ -1316,6 +1317,7 @@ function createCompletionEntry(
13161317 replacementToken : Node | undefined ,
13171318 contextToken : Node | undefined ,
13181319 location : Node ,
1320+ position : number ,
13191321 sourceFile : SourceFile ,
13201322 host : LanguageServiceHost ,
13211323 program : Program ,
@@ -1406,7 +1408,8 @@ function createCompletionEntry(
14061408 completionKind === CompletionKind . MemberLike &&
14071409 isClassLikeMemberCompletion ( symbol , location , sourceFile ) ) {
14081410 let importAdder ;
1409- ( { insertText, isSnippet, importAdder, replacementSpan } = getEntryForMemberCompletion ( host , program , options , preferences , name , symbol , location , contextToken , formatContext ) ) ;
1411+ ( { insertText, isSnippet, importAdder, replacementSpan } =
1412+ getEntryForMemberCompletion ( host , program , options , preferences , name , symbol , location , position , contextToken , formatContext ) ) ;
14101413 sortText = SortText . ClassMemberSnippets ; // sortText has to be lower priority than the sortText for keywords. See #47852.
14111414 if ( importAdder ?. hasFixes ( ) ) {
14121415 hasAction = true ;
@@ -1545,6 +1548,7 @@ function getEntryForMemberCompletion(
15451548 name : string ,
15461549 symbol : Symbol ,
15471550 location : Node ,
1551+ position : number ,
15481552 contextToken : Node | undefined ,
15491553 formatContext : formatting . FormatContext | undefined ,
15501554) : { insertText : string , isSnippet ?: true , importAdder ?: codefix . ImportAdder , replacementSpan ?: TextSpan } {
@@ -1586,7 +1590,7 @@ function getEntryForMemberCompletion(
15861590 let modifiers = ModifierFlags . None ;
15871591 // Whether the suggested member should be abstract.
15881592 // e.g. in `abstract class C { abstract | }`, we should offer abstract method signatures at position `|`.
1589- const { modifiers : presentModifiers , span : modifiersSpan } = getPresentModifiers ( contextToken ) ;
1593+ const { modifiers : presentModifiers , span : modifiersSpan } = getPresentModifiers ( contextToken , sourceFile , position ) ;
15901594 const isAbstract = ! ! ( presentModifiers & ModifierFlags . Abstract ) ;
15911595 const completionNodes : Node [ ] = [ ] ;
15921596 codefix . addNewNodeForMemberSymbol (
@@ -1650,8 +1654,13 @@ function getEntryForMemberCompletion(
16501654 return { insertText, isSnippet, importAdder, replacementSpan } ;
16511655}
16521656
1653- function getPresentModifiers ( contextToken : Node | undefined ) : { modifiers : ModifierFlags , span ?: TextSpan } {
1654- if ( ! contextToken ) {
1657+ function getPresentModifiers (
1658+ contextToken : Node | undefined ,
1659+ sourceFile : SourceFile ,
1660+ position : number ) : { modifiers : ModifierFlags , span ?: TextSpan } {
1661+ if ( ! contextToken ||
1662+ getLineAndCharacterOfPosition ( sourceFile , position ) . line
1663+ > getLineAndCharacterOfPosition ( sourceFile , contextToken . getEnd ( ) ) . line ) {
16551664 return { modifiers : ModifierFlags . None } ;
16561665 }
16571666 let modifiers = ModifierFlags . None ;
@@ -2086,6 +2095,7 @@ export function getCompletionEntriesFromSymbols(
20862095 replacementToken : Node | undefined ,
20872096 contextToken : Node | undefined ,
20882097 location : Node ,
2098+ position : number ,
20892099 sourceFile : SourceFile ,
20902100 host : LanguageServiceHost ,
20912101 program : Program ,
@@ -2132,6 +2142,7 @@ export function getCompletionEntriesFromSymbols(
21322142 replacementToken ,
21332143 contextToken ,
21342144 location ,
2145+ position ,
21352146 sourceFile ,
21362147 host ,
21372148 program ,
@@ -2471,6 +2482,7 @@ function getCompletionEntryCodeActionsAndSourceDisplay(
24712482 name ,
24722483 symbol ,
24732484 location ,
2485+ position ,
24742486 contextToken ,
24752487 formatContext ) ;
24762488 if ( importAdder ) {
0 commit comments