(host, program, options, preferences, name, symbol, location, contextToken, formatContext)
| 132605 | ts.isClassLike(location.parent))); |
| 132606 | } |
| 132607 | function getEntryForMemberCompletion(host, program, options, preferences, name, symbol, location, contextToken, formatContext) { |
| 132608 | var classLikeDeclaration = ts.findAncestor(location, ts.isClassLike); |
| 132609 | if (!classLikeDeclaration) { |
| 132610 | return { insertText: name }; |
| 132611 | } |
| 132612 | var isSnippet; |
| 132613 | var replacementSpan; |
| 132614 | var insertText = name; |
| 132615 | var checker = program.getTypeChecker(); |
| 132616 | var sourceFile = location.getSourceFile(); |
| 132617 | var printer = createSnippetPrinter({ |
| 132618 | removeComments: true, |
| 132619 | module: options.module, |
| 132620 | target: options.target, |
| 132621 | omitTrailingSemicolon: false, |
| 132622 | newLine: ts.getNewLineKind(ts.getNewLineCharacter(options, ts.maybeBind(host, host.getNewLine))), |
| 132623 | }); |
| 132624 | var importAdder = ts.codefix.createImportAdder(sourceFile, program, preferences, host); |
| 132625 | // Create empty body for possible method implementation. |
| 132626 | var body; |
| 132627 | if (preferences.includeCompletionsWithSnippetText) { |
| 132628 | isSnippet = true; |
| 132629 | // We are adding a tabstop (i.e. `$0`) in the body of the suggested member, |
| 132630 | // if it has one, so that the cursor ends up in the body once the completion is inserted. |
| 132631 | // Note: this assumes we won't have more than one body in the completion nodes, which should be the case. |
| 132632 | var emptyStmt = ts.factory.createEmptyStatement(); |
| 132633 | body = ts.factory.createBlock([emptyStmt], /* multiline */ true); |
| 132634 | ts.setSnippetElement(emptyStmt, { kind: 0 /* SnippetKind.TabStop */, order: 0 }); |
| 132635 | } |
| 132636 | else { |
| 132637 | body = ts.factory.createBlock([], /* multiline */ true); |
| 132638 | } |
| 132639 | var modifiers = 0 /* ModifierFlags.None */; |
| 132640 | // Whether the suggested member should be abstract. |
| 132641 | // e.g. in `abstract class C { abstract | }`, we should offer abstract method signatures at position `|`. |
| 132642 | var _a = getPresentModifiers(contextToken), presentModifiers = _a.modifiers, modifiersSpan = _a.span; |
| 132643 | var isAbstract = !!(presentModifiers & 128 /* ModifierFlags.Abstract */); |
| 132644 | var completionNodes = []; |
| 132645 | ts.codefix.addNewNodeForMemberSymbol(symbol, classLikeDeclaration, sourceFile, { program: program, host: host }, preferences, importAdder, |
| 132646 | // `addNewNodeForMemberSymbol` calls this callback function for each new member node |
| 132647 | // it adds for the given member symbol. |
| 132648 | // We store these member nodes in the `completionNodes` array. |
| 132649 | // Note: there might be: |
| 132650 | // - No nodes if `addNewNodeForMemberSymbol` cannot figure out a node for the member; |
| 132651 | // - One node; |
| 132652 | // - More than one node if the member is overloaded (e.g. a method with overload signatures). |
| 132653 | function (node) { |
| 132654 | var requiredModifiers = 0 /* ModifierFlags.None */; |
| 132655 | if (isAbstract) { |
| 132656 | requiredModifiers |= 128 /* ModifierFlags.Abstract */; |
| 132657 | } |
| 132658 | if (ts.isClassElement(node) |
| 132659 | && checker.getMemberOverrideModifierStatus(classLikeDeclaration, node) === 1 /* MemberOverrideStatus.NeedsOverride */) { |
| 132660 | requiredModifiers |= 16384 /* ModifierFlags.Override */; |
| 132661 | } |
| 132662 | if (!completionNodes.length) { |
| 132663 | // Keep track of added missing required modifiers and modifiers already present. |
| 132664 | // This is needed when we have overloaded signatures, |
no test coverage detected
searching dependent graphs…