diff --git a/internal/checker/nodecopy.go b/internal/checker/nodecopy.go index fbe96b437f1..2e935e32ef8 100644 --- a/internal/checker/nodecopy.go +++ b/internal/checker/nodecopy.go @@ -610,12 +610,15 @@ func getExistingNodeTreeVisitor(b *NodeBuilderImpl, bound *recoveryBoundary) *as if specifier != originalSpec { arg = factory.NewLiteralTypeNode(specifier) } + originalQualifier := node.AsImportTypeNode().Qualifier + qualifier := visitor.VisitNode(originalQualifier) + b.copyImportTypeQualifierSymbol(originalQualifier, qualifier) return factory.UpdateImportTypeNode( node.AsImportTypeNode(), node.AsImportTypeNode().IsTypeOf, arg, visitor.VisitNode(node.AsImportTypeNode().Attributes), - visitor.VisitNode(node.AsImportTypeNode().Qualifier), + qualifier, visitor.VisitNodes(node.AsImportTypeNode().TypeArguments), ) } @@ -872,3 +875,14 @@ func getExistingNodeTreeVisitor(b *NodeBuilderImpl, bound *recoveryBoundary) *as }) return visitor } + +func (b *NodeBuilderImpl) copyImportTypeQualifierSymbol(node *ast.Node, qualifier *ast.Node) { + if node == nil || qualifier == nil { + return + } + symbol := b.ch.symbolNodeLinks.Get(ast.GetFirstIdentifier(node)).resolvedSymbol + if symbol == nil { + return + } + b.idToSymbol[ast.GetFirstIdentifier(qualifier)] = symbol +} diff --git a/internal/fourslash/_scripts/convertFourslash.mts b/internal/fourslash/_scripts/convertFourslash.mts index 6cc6bb13239..c1c9c4ac1a0 100755 --- a/internal/fourslash/_scripts/convertFourslash.mts +++ b/internal/fourslash/_scripts/convertFourslash.mts @@ -533,31 +533,26 @@ function parseFormatStatement(funcName: string, args: readonly ts.Expression[]): goStatement: `f.FormatDocument(t, "")`, }]; } - case "setOption": - var optName = getStringLiteralLike(args[0])!.text; - if (optName == "newline") { - optName = "NewLineCharacter"; + case "setOption": { + const [optionNameArg, optionValueArg] = args; + const optionNameLiteral = getStringLiteralLike(optionNameArg); + if (!optionNameLiteral || !optionValueArg) { + throw new Error(`format.setOption: expected option name and value`); } - var optValue = args[1].getText(); + const optName = optionNameLiteral.text === "newline" ? "NewLineCharacter" : optionNameLiteral.text; + let optValue = optionValueArg.getText(); if ( - (args[1].kind == ts.SyntaxKind.TrueKeyword || args[1].kind == ts.SyntaxKind.FalseKeyword) + (optionValueArg.kind == ts.SyntaxKind.TrueKeyword || optionValueArg.kind == ts.SyntaxKind.FalseKeyword) ) { - optValue = stringToTristate(args[1].getText()); + optValue = stringToTristate(optionValueArg.getText()); } - const varName = "opts" + args[1].pos; - return [{ - kind: "format", - goStatement: `${varName} := f.GetOptions()`, - }, { - kind: "format", - goStatement: `${varName}.FormatCodeSettings.${optName.charAt(0).toUpperCase() + optName.slice(1)} = ${optValue}`, - }, { - kind: "format", - goStatement: `f.Configure(t, ${varName})`, - }]; + const formatOptionsIdent = "opts" + optionValueArg.pos; + return createFormatOptionCommands(formatOptionsIdent, [{ name: optName, value: optValue }]); + } case "selection": { - const startMarker = getStringLiteralLike(args[0])?.text; - const endMarker = getStringLiteralLike(args[1])?.text; + const [startMarkerArg, endMarkerArg] = args; + const startMarker = getStringLiteralLike(startMarkerArg)?.text; + const endMarker = getStringLiteralLike(endMarkerArg)?.text; if (startMarker === undefined || endMarker === undefined) { throw new Error(`format.selection: expected two string literal marker names`); } @@ -568,12 +563,57 @@ function parseFormatStatement(funcName: string, args: readonly ts.Expression[]): } case "onType": case "copyFormatOptions": - case "setFormatOptions": + case "setFormatOptions": { + const [optionsArg] = args; + const options = optionsArg && getObjectLiteralExpression(optionsArg); + if (!options) { + throw new Error(`Unrecognized format function: ${funcName}`); + } + if (options.properties.length === 0) { + throw new Error(`Unrecognized format function: ${funcName}`); + } + const formatOptionsIdent = "opts" + optionsArg.pos; + const optionAssignments: FormatOptionAssignment[] = []; + for (const prop of options.properties) { + if (!ts.isPropertyAssignment(prop) || !ts.isIdentifier(prop.name) || prop.name.text !== "insertSpaceAfterConstructor") { + throw new Error(`Unrecognized format function: ${funcName}`); + } + const optValue = prop.initializer.kind === ts.SyntaxKind.TrueKeyword || prop.initializer.kind === ts.SyntaxKind.FalseKeyword + ? stringToTristate(prop.initializer.getText()) + : prop.initializer.getText(); + const optName = prop.name.text; + optionAssignments.push({ name: optName, value: optValue }); + } + return createFormatOptionCommands(formatOptionsIdent, optionAssignments); + } default: throw new Error(`Unrecognized format function: ${funcName}`); } } +interface FormatOptionAssignment { + name: string; + value: string; +} + +function createFormatOptionCommands(formatOptionsIdent: string, optionAssignments: FormatOptionAssignment[]): FormatCmd[] { + const commands: FormatCmd[] = [{ + kind: "format", + goStatement: `${formatOptionsIdent} := f.GetOptions()`, + }]; + for (const { name, value } of optionAssignments) { + commands.push({ + kind: "format", + goStatement: `${formatOptionsIdent}.FormatCodeSettings.${name.charAt(0).toUpperCase() + name.slice(1)} = ${value}`, + }); + } + commands.push({ + kind: "format", + goStatement: `f.Configure(t, ${formatOptionsIdent})`, + }); + return commands; +} + function parseCurrentContentIsArgs(funcName: string, args: readonly ts.Expression[]): VerifyContentCmd[] { switch (funcName) { case "currentFileContentIs": @@ -726,6 +766,19 @@ function parseVerifyCompletionsArgs(args: readonly ts.Expression[], codeActionAr return cmds; } +function getCompletionSourceText(expr: ts.Expression): string | undefined { + if (ts.isStringLiteralLike(expr)) { + return expr.text; + } + if (expr.getText() === "completion.CompletionSource.ClassMemberSnippet") { + return "ClassMemberSnippet/"; + } + if (expr.getText() === "completion.CompletionSource.ObjectLiteralMethodSnippet") { + return "ObjectLiteralMethodSnippet/"; + } + return undefined; +} + function parseVerifyApplyCodeActionFromCompletionArgs(args: readonly ts.Expression[]): VerifyApplyCodeActionFromCompletionCmd[] { const cmds: VerifyApplyCodeActionFromCompletionCmd[] = []; if (args.length !== 2) { @@ -747,12 +800,11 @@ function parseVerifyApplyCodeActionArgs(arg: ts.Expression): string { if (!obj) { throw new Error(`Expected object literal for verify.applyCodeActionFromCompletion options, got ${arg.getText()}`); } - let nameInit, sourceInit, descInit, dataInit; - const props: string[] = []; - for (const prop of obj.properties) { + const hasOption = (name: string) => obj.properties.some(prop => ts.isPropertyAssignment(prop) && ts.isIdentifier(prop.name) && prop.name.text === name); + const props = obj.properties.flatMap(prop => { if (!ts.isPropertyAssignment(prop) || !ts.isIdentifier(prop.name)) { if (ts.isShorthandPropertyAssignment(prop) && prop.name.text === "preferences") { - continue; // !!! parse once preferences are supported in fourslash + return []; // !!! parse once preferences are supported in fourslash } throw new Error(`Expected property assignment with identifier name in verify.applyCodeActionFromCompletion options, got ${prop.getText()}`); } @@ -760,21 +812,19 @@ function parseVerifyApplyCodeActionArgs(arg: ts.Expression): string { const init = prop.initializer; switch (propName) { case "name": - nameInit = getStringLiteralLike(init); + const nameInit = getStringLiteralLike(init); if (!nameInit) { throw new Error(`Expected string literal for name in verify.applyCodeActionFromCompletion options, got ${init.getText()}`); } - props.push(`Name: ${getGoStringLiteral(nameInit.text)},`); - break; + return [`Name: ${getGoStringLiteral(nameInit.text)},`]; case "source": - sourceInit = getStringLiteralLike(init); - if (!sourceInit) { + const sourceText = getCompletionSourceText(init); + if (sourceText === undefined) { throw new Error(`Expected string literal for source in verify.applyCodeActionFromCompletion options, got ${init.getText()}`); } - props.push(`Source: ${getGoStringLiteral(sourceInit.text)},`); - break; + return [`Source: ${getGoStringLiteral(sourceText)},`]; case "data": - dataInit = getObjectLiteralExpression(init); + const dataInit = getObjectLiteralExpression(init); if (!dataInit) { throw new Error(`Expected object literal for data in verify.applyCodeActionFromCompletion options, got ${init.getText()}`); } @@ -794,43 +844,39 @@ function parseVerifyApplyCodeActionArgs(arg: ts.Expression): string { break; } } - props.push(`AutoImportFix: &lsproto.AutoImportFix{\n${dataProps.join("\n")}\n},`); - break; + return [`AutoImportFix: &lsproto.AutoImportFix{\n${dataProps.join("\n")}\n},`]; case "description": - descInit = getStringLiteralLike(init); + const descInit = getStringLiteralLike(init); if (!descInit) { throw new Error(`Expected string literal for description in verify.applyCodeActionFromCompletion options, got ${init.getText()}`); } - props.push(`Description: ${getGoStringLiteral(descInit.text)},`); - break; + return [`Description: ${getGoStringLiteral(descInit.text)},`]; case "newFileContent": const newFileContentInit = getStringLiteralLike(init); if (!newFileContentInit) { throw new Error(`Expected string literal for newFileContent in verify.applyCodeActionFromCompletion options, got ${init.getText()}`); } - props.push(`NewFileContent: new(${getGoMultiLineStringLiteral(newFileContentInit.text)}),`); - break; + return [`NewFileContent: new(${getGoMultiLineStringLiteral(newFileContentInit.text)}),`]; case "newRangeContent": const newRangeContentInit = getStringLiteralLike(init); if (!newRangeContentInit) { throw new Error(`Expected string literal for newRangeContent in verify.applyCodeActionFromCompletion options, got ${init.getText()}`); } - props.push(`NewRangeContent: new(${getGoMultiLineStringLiteral(newRangeContentInit.text)}),`); - break; + return [`NewRangeContent: new(${getGoMultiLineStringLiteral(newRangeContentInit.text)}),`]; case "preferences": // Few if any tests use non-default preferences - break; + return []; default: throw new Error(`Unrecognized property in verify.applyCodeActionFromCompletion options: ${prop.getText()}`); } - } - if (!nameInit) { + }); + if (!hasOption("name")) { throw new Error(`Expected name property in verify.applyCodeActionFromCompletion options`); } - if (!sourceInit && !dataInit) { + if (!hasOption("source") && !hasOption("data")) { throw new Error(`Expected source property in verify.applyCodeActionFromCompletion options`); } - if (!descInit) { + if (!hasOption("description")) { throw new Error(`Expected description property in verify.applyCodeActionFromCompletion options`); } return `&fourslash.ApplyCodeActionFromCompletionOptions{\n${props.join("\n")}\n}`; @@ -933,8 +979,11 @@ const completionPlus = new Map([ function parseVerifyCompletionArg(arg: ts.Expression, codeActionArgs?: VerifyApplyCodeActionArgs): VerifyCompletionsCmd { let marker: string | undefined; - let goArgs: VerifyCompletionsArgs | undefined; - const defaultGoArgs: VerifyCompletionsArgs = { preferences: "nil /*preferences*/" }; + let includes: string | undefined; + let excludes: string | undefined; + let exact: string | undefined; + let unsorted: string | undefined; + let preferences = "nil /*preferences*/"; const obj = getObjectLiteralExpression(arg); if (!obj) { throw new Error(`Expected object literal expression in verify.completions, got ${arg.getText()}`); @@ -943,7 +992,12 @@ function parseVerifyCompletionArg(arg: ts.Expression, codeActionArgs?: VerifyApp for (const prop of obj.properties) { if (!ts.isPropertyAssignment(prop) || !ts.isIdentifier(prop.name)) { if (ts.isShorthandPropertyAssignment(prop) && prop.name.text === "preferences") { - continue; // !!! parse once preferences are supported in fourslash + const preferenceLiteral = getObjectLiteralExpression(prop.name); + if (!preferenceLiteral) { + throw new Error(`Expected object literal for user preferences, got ${prop.name.getText()}`); + } + preferences = parseUserPreferences(preferenceLiteral); + continue; } throw new Error(`Expected property assignment with identifier name, got ${prop.getText()}`); } @@ -1056,32 +1110,32 @@ function parseVerifyCompletionArg(arg: ts.Expression, codeActionArgs?: VerifyApp expected += "\n}"; } if (propName === "includes") { - (goArgs ??= defaultGoArgs).includes = expected; + includes = expected; } else if (propName === "exact") { - (goArgs ??= defaultGoArgs).exact = expected; + exact = expected; } else { - (goArgs ??= defaultGoArgs).unsorted = expected; + unsorted = expected; } break; } case "excludes": { - let excludes = "[]string{"; + let excludesText = "[]string{"; let item; if (item = getStringLiteralLike(init)) { - excludes += `\n${getGoStringLiteral(item.text)},`; + excludesText += `\n${getGoStringLiteral(item.text)},`; } else if (item = getArrayLiteralExpression(init)) { for (const elem of item.elements) { if (!ts.isStringLiteral(elem)) { throw new Error(`Expected string literal in excludes array, got ${elem.getText()}`); } - excludes += `\n${getGoStringLiteral(elem.text)},`; + excludesText += `\n${getGoStringLiteral(elem.text)},`; } } - excludes += "\n}"; - (goArgs ??= defaultGoArgs).excludes = excludes; + excludesText += "\n}"; + excludes = excludesText; break; } case "isNewIdentifierLocation": @@ -1090,11 +1144,11 @@ function parseVerifyCompletionArg(arg: ts.Expression, codeActionArgs?: VerifyApp } break; case "preferences": { - if (!ts.isObjectLiteralExpression(init)) { + const preferenceLiteral = getObjectLiteralExpression(init); + if (!preferenceLiteral) { throw new Error(`Expected object literal for user preferences, got ${init.getText()}`); } - const preferences = parseUserPreferences(init); - (goArgs ??= defaultGoArgs).preferences = preferences; + preferences = parseUserPreferences(preferenceLiteral); break; } case "triggerCharacter": @@ -1110,7 +1164,7 @@ function parseVerifyCompletionArg(arg: ts.Expression, codeActionArgs?: VerifyApp return { kind: "verifyCompletions", marker: marker ? marker : "nil", - args: goArgs, + args: { includes, excludes, exact, unsorted, preferences }, isNewIdentifierLocation: isNewIdentifierLocation, }; } @@ -1248,16 +1302,18 @@ function parseExpectedCompletionItem(expr: ts.Expression, codeActionArgs?: Verif }, },`); } - else if (init.getText().startsWith("completion.CompletionSource.")) { - const source = init.getText().slice("completion.CompletionSource.".length); - switch (source) { - // Ignore switch snippet sources - case "SwitchCases": { - continue; - } - default: - throw new Error(`Unrecognized source in expected completion item: ${init.getText()}`); - } + else if (init.getText() === "completion.CompletionSource.ClassMemberSnippet") { + itemProps.push(`Data: &lsproto.CompletionItemData{ + Source: "ClassMemberSnippet/", + },`); + } + else if (init.getText() === "completion.CompletionSource.ObjectLiteralMethodSnippet") { + itemProps.push(`Data: &lsproto.CompletionItemData{ + Source: "ObjectLiteralMethodSnippet/", + },`); + } + else if (init.getText() === "completion.CompletionSource.SwitchCases") { + continue; } else { throw new Error(`Expected string literal for source/sourceDisplay, got ${init.getText()}`); @@ -1284,6 +1340,36 @@ function parseExpectedCompletionItem(expr: ts.Expression, codeActionArgs?: Verif itemProps.push(`InsertTextFormat: new(lsproto.InsertTextFormatSnippet),`); } break; + case "labelDetails": { + const labelDetails = getObjectLiteralExpression(init); + if (!labelDetails) { + throw new Error(`Expected object literal for labelDetails, got ${init.getText()}`); + } + const labelDetailProps: string[] = []; + for (const labelDetailProp of labelDetails.properties) { + if (!ts.isPropertyAssignment(labelDetailProp) || !ts.isIdentifier(labelDetailProp.name)) { + throw new Error(`Expected property assignment with identifier name for labelDetails, got ${labelDetailProp.getText()}`); + } + const value = getStringLiteralLike(labelDetailProp.initializer); + if (!value) { + throw new Error(`Expected string literal for labelDetails.${labelDetailProp.name.text}, got ${labelDetailProp.initializer.getText()}`); + } + switch (labelDetailProp.name.text) { + case "detail": + labelDetailProps.push(`Detail: new(${getGoStringLiteral(value.text)}),`); + break; + case "description": + labelDetailProps.push(`Description: new(${getGoStringLiteral(value.text)}),`); + break; + default: + throw new Error(`Unrecognized labelDetails property: ${labelDetailProp.name.text}`); + } + } + itemProps.push(`LabelDetails: &lsproto.CompletionItemLabelDetails{ + ${labelDetailProps.join("\n")} + },`); + break; + } default: throw new Error(`Unrecognized property in expected completion item: ${propName}`); // Unsupported property } @@ -1299,7 +1385,7 @@ function parseExpectedCompletionItem(expr: ts.Expression, codeActionArgs?: Verif if (replacementSpanIdx) { itemProps.push(`TextEdit: &lsproto.TextEditOrInsertReplaceEdit{ TextEdit: &lsproto.TextEdit{ - NewText: ${getGoStringLiteral(name)}, + NewText: ${getGoStringLiteral(insertText ?? name)}, Range: f.Ranges()[${replacementSpanIdx}].LSRange, }, },`); @@ -1337,7 +1423,7 @@ function parseAndApplyCodeActionArg(arg: ts.Expression): VerifyApplyCodeActionAr ts.isPropertyAssignment(prop) && ts.isIdentifier(prop.name) && prop.name.text === "source" && - ts.isStringLiteralLike(prop.initializer) + getCompletionSourceText(prop.initializer) !== undefined ) as ts.PropertyAssignment; if (!sourceProperty) { throw new Error(`Expected source property in code action argument, got ${obj.getText()}`); @@ -1362,7 +1448,7 @@ function parseAndApplyCodeActionArg(arg: ts.Expression): VerifyApplyCodeActionAr } return { name: (nameProperty.initializer as ts.StringLiteralLike).text, - source: (sourceProperty.initializer as ts.StringLiteralLike).text, + source: getCompletionSourceText(sourceProperty.initializer)!, description: (descriptionProperty.initializer as ts.StringLiteralLike).text, newFileContent: (newFileContentProperty.initializer as ts.StringLiteralLike).text, }; @@ -2151,6 +2237,39 @@ function parseUserPreferences(arg: ts.ObjectLiteralExpression): string { case "preferTypeOnlyAutoImports": preferences.push(`PreferTypeOnlyAutoImports: ${stringToTristate(prop.initializer.getText())}`); break; + case "includeCompletionsWithClassMemberSnippets": + preferences.push(`IncludeCompletionsWithClassMemberSnippets: ${stringToTristate(prop.initializer.getText())}`); + break; + case "includeCompletionsWithSnippetText": + preferences.push(`IncludeCompletionsWithSnippetText: ${stringToTristate(prop.initializer.getText())}`); + break; + case "useLabelDetailsInCompletionEntries": + preferences.push(`UseLabelDetailsInCompletionEntries: ${stringToTristate(prop.initializer.getText())}`); + break; + case "includeCompletionsWithObjectLiteralMethodSnippets": + preferences.push(`IncludeCompletionsWithObjectLiteralMethodSnippets: ${stringToTristate(prop.initializer.getText())}`); + break; + case "jsxAttributeCompletionStyle": + if (prop.initializer.getText() === "undefined") { + break; + } + if (!ts.isStringLiteralLike(prop.initializer)) { + throw new Error(`Expected string literal for jsxAttributeCompletionStyle, got ${prop.initializer.getText()}`); + } + switch (prop.initializer.text) { + case "auto": + preferences.push(`JsxAttributeCompletionStyle: lsutil.JsxAttributeCompletionStyleAuto`); + break; + case "braces": + preferences.push(`JsxAttributeCompletionStyle: lsutil.JsxAttributeCompletionStyleBraces`); + break; + case "none": + preferences.push(`JsxAttributeCompletionStyle: lsutil.JsxAttributeCompletionStyleNone`); + break; + default: + throw new Error(`Unsupported jsxAttributeCompletionStyle value: ${prop.initializer.text}`); + } + break; case "organizeImportsTypeOrder": if (!ts.isStringLiteralLike(prop.initializer)) { throw new Error(`Expected string literal for organizeImportsTypeOrder, got ${prop.initializer.getText()}`); @@ -3313,6 +3432,24 @@ function parseSortText(expr: ts.Expression): ParsedSortText { deprecated: true, }; } + if (ts.isCallExpression(expr) && expr.expression.getText() === "completion.SortText.SortBelow") { + const inner = parseSortText(expr.arguments[0]); + return { + expression: `ls.SortBelow(${inner.expression})`, + deprecated: inner.deprecated, + }; + } + if (ts.isCallExpression(expr) && expr.expression.getText() === "completion.SortText.ObjectLiteralProperty") { + const base = parseSortText(expr.arguments[0]); + const symbolDisplayName = expr.arguments[1]; + if (!ts.isStringLiteralLike(symbolDisplayName)) { + throw new Error(`Expected string literal for ObjectLiteralProperty sort text, got ${symbolDisplayName.getText()}`); + } + return { + expression: `ls.ObjectLiteralPropertySortText(${base.expression}, ${getGoStringLiteral(symbolDisplayName.text)})`, + deprecated: base.deprecated, + }; + } return { expression: parseSortTextExpression(expr.getText()), deprecated: false }; } diff --git a/internal/fourslash/_scripts/failingTests.txt b/internal/fourslash/_scripts/failingTests.txt index b9bb35865a1..791710b2931 100644 --- a/internal/fourslash/_scripts/failingTests.txt +++ b/internal/fourslash/_scripts/failingTests.txt @@ -4,11 +4,6 @@ TestAmbientShorthandGotoDefinition TestArgumentsAreAvailableAfterEditsAtEndOfFunction TestAugmentedTypesClass1 TestAutoImportAllowImportingTsExtensionsPackageJsonImports1 -TestAutoImportCompletionAmbientMergedModule1 -TestAutoImportCompletionExportListAugmentation1 -TestAutoImportCompletionExportListAugmentation2 -TestAutoImportCompletionExportListAugmentation3 -TestAutoImportCompletionExportListAugmentation4 TestAutoImportCrossProject_symlinks_stripSrc TestAutoImportCrossProject_symlinks_toDist TestAutoImportFileExcludePatterns10 @@ -90,32 +85,24 @@ TestCommentsLinePreservation TestCommentsOverloadsFourslash TestCommentsVariables TestCompletionAfterQuestionDot -TestCompletionAutoInsertQuestionDot TestCompletionCloneQuestionToken -TestCompletionEntryClassMembersWithInferredFunctionReturnType1 TestCompletionEntryForArgumentConstrainedToString TestCompletionEntryForArrayElementConstrainedToString TestCompletionEntryForArrayElementConstrainedToString2 TestCompletionEntryForUnionProperty TestCompletionEntryForUnionProperty2 -TestCompletionForComputedStringProperties TestCompletionForMetaProperty TestCompletionForObjectProperty TestCompletionForStringLiteral TestCompletionForStringLiteral_quotePreference TestCompletionForStringLiteral_quotePreference1 -TestCompletionForStringLiteral_quotePreference2 -TestCompletionForStringLiteral_quotePreference3 TestCompletionForStringLiteral_quotePreference4 TestCompletionForStringLiteral_quotePreference5 TestCompletionForStringLiteral_quotePreference6 -TestCompletionForStringLiteral_quotePreference7 -TestCompletionForStringLiteral_quotePreference8 TestCompletionForStringLiteral4 TestCompletionImportMeta TestCompletionImportMetaWithGlobalDeclaration TestCompletionImportModuleSpecifierEndingUnsupportedExtension -TestCompletionInChecks1 TestCompletionInFunctionLikeBody_includesPrimitiveTypes TestCompletionInUncheckedJSFile TestCompletionListBuilderLocations_VariableDeclarations @@ -136,8 +123,6 @@ TestCompletionListInUnclosedTaggedTemplate02 TestCompletionListInUnclosedTemplate01 TestCompletionListInUnclosedTemplate02 TestCompletionListInvalidMemberNames -TestCompletionListInvalidMemberNames_escapeQuote -TestCompletionListInvalidMemberNames_startWithSpace TestCompletionListInvalidMemberNames_withExistingIdentifier TestCompletionListInvalidMemberNames2 TestCompletionListOnAliases @@ -145,22 +130,11 @@ TestCompletionListsStringLiteralTypeAsIndexedAccessTypeObject TestCompletionListStringParenthesizedExpression TestCompletionListStringParenthesizedType TestCompletionListWithoutVariableinitializer -TestCompletionNoAutoInsertQuestionDotForThis -TestCompletionNoAutoInsertQuestionDotForTypeParameter TestCompletionNoAutoInsertQuestionDotWithUserPreferencesOff -TestCompletionOfAwaitPromise1 -TestCompletionOfAwaitPromise2 -TestCompletionOfAwaitPromise3 -TestCompletionOfAwaitPromise5 TestCompletionOfAwaitPromise6 -TestCompletionOfAwaitPromise7 TestCompletionOfInterfaceAndVar TestCompletionPreferredSuggestions1 TestCompletionsBeforeRestArg1 -TestCompletionsClassMemberImportTypeNodeParameter1 -TestCompletionsClassMemberImportTypeNodeParameter2 -TestCompletionsClassMemberImportTypeNodeParameter3 -TestCompletionsClassMemberImportTypeNodeParameter4 TestCompletionsElementAccessNumeric TestCompletionsExportImport TestCompletionsImport_default_anonymous @@ -189,27 +163,12 @@ TestCompletionsLiteralFromInferenceWithinInferredType3 TestCompletionsLiterals TestCompletionsMergedDeclarations1 TestCompletionsNewTarget -TestCompletionsOptionalMethod -TestCompletionsOverridingMethod1 -TestCompletionsOverridingMethod10 -TestCompletionsOverridingMethod11 -TestCompletionsOverridingMethod14 -TestCompletionsOverridingMethod17 -TestCompletionsOverridingMethod2 -TestCompletionsOverridingMethod3 -TestCompletionsOverridingMethod4 -TestCompletionsOverridingMethod9 -TestCompletionsOverridingMethodCrash1 -TestCompletionsOverridingProperties1 TestCompletionsRecommended_namespace TestCompletionsRecommended_union TestCompletionsRedeclareModuleAsGlobal TestCompletionsStringsWithTriggerCharacter -TestCompletionsSymbolMembers TestCompletionsTriggerCharacter -TestCompletionsTuple TestCompletionsUniqueSymbol_import -TestCompletionsUniqueSymbol1 TestCompletionsWithDeprecatedTag10 TestConstQuickInfoAndCompletionList TestContextuallyTypedFunctionExpressionGeneric1 @@ -275,18 +234,8 @@ TestImportNameCodeFixNewImportBaseUrl1 TestImportNameCodeFixNewImportBaseUrl2 TestImportNameCodeFixNewImportFile2 TestImportNameCodeFixNewImportTypeRoots1 -TestImportStatementCompletions_esModuleInterop2 -TestImportStatementCompletions_noSnippet -TestImportStatementCompletions_pnpm1 -TestImportStatementCompletions_quotes -TestImportStatementCompletions_semicolons TestImportSuggestionsCache_invalidPackageJson -TestImportTypeCompletions1 -TestImportTypeCompletions3 -TestImportTypeCompletions4 -TestImportTypeCompletions6 TestImportTypeCompletions7 -TestImportTypeCompletions8 TestImportTypeCompletions9 TestIndirectClassInstantiation TestJavascriptModules20 @@ -316,14 +265,6 @@ TestJsdocTypedefTagNamespace TestJsFileImportNoTypes2 TestJsQuickInfoGenerallyAcceptableSize TestJsRequireQuickInfo -TestJsxAttributeCompletionStyleAuto -TestJsxAttributeCompletionStyleBraces -TestJsxAttributeCompletionStyleDefault -TestJsxAttributeCompletionStyleNone -TestJsxAttributeCompletionStyleNoSnippet -TestJsxAttributeSnippetCompletionAfterTypeArgs -TestJsxAttributeSnippetCompletionClosed -TestJsxAttributeSnippetCompletionUnclosed TestJsxWithTypeParametershasInstantiatedSignatureHelp TestLetQuickInfoAndCompletionList TestLocalFunction diff --git a/internal/fourslash/_scripts/unparsedTests.txt b/internal/fourslash/_scripts/unparsedTests.txt index 3b5bf04a0ab..68cbe3d6b98 100644 --- a/internal/fourslash/_scripts/unparsedTests.txt +++ b/internal/fourslash/_scripts/unparsedTests.txt @@ -949,7 +949,6 @@ commentsMultiModuleMultiFileFourslash.ts parse error: "Unrecognized fourslash st commentsMultiModuleSingleFileFourslash.ts parse error: "Unrecognized fourslash statement: for (const marker of [\"2\", \"3\", \"4\", \"5\"]) {\r\n verify.quickInfoAt(marker, \"namespace multiM\", comment);\r\n}" compileOnSaveWorksWhenEmitBlockingErrorOnOtherFile.ts parse error: "Unrecognized fourslash statement: verify.baselineGetEmitOutput(...)" completionAfterGlobalThis.ts parse error: "Expected string literal or object literal for expected completion item, got [\n completion.globalThisEntry,\n ...completion.globalsVars,\n completion.undefinedVarEntry\n ].map(e => {\n if (e.sortText === completion.SortText.Deprecated(completion.SortText.GlobalsOrKeywords)) {\n return { ...e, sortText: completion.SortText.Deprecated(completion.SortText.LocationPriority) };\n }\n return { ...e, sortText: completion.SortText.LocationPriority };\n })" -completionClassMemberSnippetCrossFileNodeReuse1.ts parse error: "Unrecognized format function: setFormatOptions" completionConstructorKeywordAfterPropertyDeclaration.ts parse error: "Unrecognized fourslash statement: function generateRange(l: number, r: number) {\n return Array.from(Array(r - l + 1), (_, i) => String(i + l)); // [l, r]\n}" completionEntryDetailAcrossFiles01.ts parse error: "Expected string literal or object literal for expected completion item, got entry(\"var foo: (p1: string) => void\")" completionEntryDetailAcrossFiles02.ts parse error: "Unrecognized property in expected completion item: tags" @@ -1031,12 +1030,12 @@ completionsImport_keywords.ts parse error: "Expected string literal or object li completionsImport_matching.ts parse error: "Expected string literal or object literal for expected completion item, got [\"aBcdef\", \"a_bcdef\", \"BDF\"].map(name =>\n ({\n name,\n source: \"./a\",\n text: `function ${name}(): void`,\n hasAction: true,\n kind: \"function\",\n kindModifiers: \"export\",\n sourceDisplay: \"./a\",\n sortText: completion.SortText.AutoImportSuggestions\n }))" completionsImport_notFromIndex.ts parse error: "Unrecognized fourslash statement: for (const [marker, sourceDisplay] of [[\"0\", \"./src\"], [\"1\", \"./a\"], [\"2\", \"../a\"]]) {\r\n verify.completions({\r\n marker,\r\n includes: {\r\n name: \"x\",\r\n source: sourceDisplay,\r\n sourceDisplay,\r\n hasAction: true,\r\n sortText: completion.SortText.AutoImportSuggestions\r\n },\r\n preferences: { includeCompletionsForModuleExports: true },\r\n });\r\n verify.applyCodeActionFromCompletion(marker, {\r\n name: \"x\",\r\n source: sourceDisplay,\r\n description: `Add import from \"${sourceDisplay}\"`,\r\n newFileContent: `import { x } from \"${sourceDisplay}\";\\n\\nx`,\r\n });\r\n}" completionsImport_ofAlias.ts parse error: "Expected string literal or object literal for expected completion item, got ...completion.statementKeywordsWithTypes" -completionsImport_promoteTypeOnly1.ts parse error: "Unrecognized source in expected completion item: completion.CompletionSource.TypeOnlyAlias" -completionsImport_promoteTypeOnly3.ts parse error: "Unrecognized source in expected completion item: completion.CompletionSource.TypeOnlyAlias" -completionsImport_promoteTypeOnly4.ts parse error: "Unrecognized source in expected completion item: completion.CompletionSource.TypeOnlyAlias" -completionsImport_promoteTypeOnly5.ts parse error: "Unrecognized source in expected completion item: completion.CompletionSource.TypeOnlyAlias" -completionsImport_promoteTypeOnly6.ts parse error: "Unrecognized source in expected completion item: completion.CompletionSource.TypeOnlyAlias" -completionsImport_promoteTypeOnly7.ts parse error: "Unrecognized source in expected completion item: completion.CompletionSource.TypeOnlyAlias" +completionsImport_promoteTypeOnly1.ts parse error: "Expected string literal for source/sourceDisplay, got completion.CompletionSource.TypeOnlyAlias" +completionsImport_promoteTypeOnly3.ts parse error: "Expected string literal for source/sourceDisplay, got completion.CompletionSource.TypeOnlyAlias" +completionsImport_promoteTypeOnly4.ts parse error: "Expected string literal for source/sourceDisplay, got completion.CompletionSource.TypeOnlyAlias" +completionsImport_promoteTypeOnly5.ts parse error: "Expected string literal for source/sourceDisplay, got completion.CompletionSource.TypeOnlyAlias" +completionsImport_promoteTypeOnly6.ts parse error: "Expected string literal for source/sourceDisplay, got completion.CompletionSource.TypeOnlyAlias" +completionsImport_promoteTypeOnly7.ts parse error: "Expected string literal for source/sourceDisplay, got completion.CompletionSource.TypeOnlyAlias" completionsImport_satisfiesKeyword.ts parse error: "Unrecognized fourslash statement: verify.baselineCompletions(...)" completionsImportWithKeyword.ts parse error: "Unrecognized fourslash statement: verify.baselineCompletions(...)" completionsInitializerCommitCharacter.ts parse error: "Unrecognized fourslash statement: verify.baselineCompletions(...)" @@ -1045,39 +1044,21 @@ completionsJSDocTags.ts parse error: "Unrecognized fourslash statement: verify.b completionsJsxAttribute.ts parse error: "Expected property assignment with identifier name, got exact" completionsJsxAttributeGeneric.ts parse error: "Unrecognized fourslash statement: ['1', '2'].forEach(...)" completionsJsxAttributeGeneric2.ts parse error: "Unrecognized fourslash statement: [\"1\", \"2\", \"3\", \"4\"].forEach(...)" -completionsJsxAttributeInitializer.ts parse error: "Unrecognized source in expected completion item: completion.CompletionSource.ThisProperty" -completionsObjectLiteralExpressions1.ts parse error: "Unrecognized source in expected completion item: completion.CompletionSource.ObjectLiteralMemberWithComma" -completionsObjectLiteralExpressions10.ts parse error: "Unrecognized source in expected completion item: completion.CompletionSource.ObjectLiteralMemberWithComma" -completionsObjectLiteralExpressions2.ts parse error: "Unrecognized source in expected completion item: completion.CompletionSource.ObjectLiteralMemberWithComma" -completionsObjectLiteralExpressions3.ts parse error: "Unrecognized source in expected completion item: completion.CompletionSource.ObjectLiteralMemberWithComma" -completionsObjectLiteralExpressions4.ts parse error: "Unrecognized source in expected completion item: completion.CompletionSource.ObjectLiteralMemberWithComma" -completionsObjectLiteralExpressions5.ts parse error: "Unrecognized source in expected completion item: completion.CompletionSource.ObjectLiteralMemberWithComma" -completionsObjectLiteralExpressions6.ts parse error: "Unrecognized source in expected completion item: completion.CompletionSource.ObjectLiteralMemberWithComma" -completionsObjectLiteralExpressions7.ts parse error: "Unrecognized source in expected completion item: completion.CompletionSource.ObjectLiteralMemberWithComma" -completionsObjectLiteralExpressions8.ts parse error: "Unrecognized source in expected completion item: completion.CompletionSource.ObjectLiteralMemberWithComma" -completionsObjectLiteralExpressions9.ts parse error: "Unrecognized source in expected completion item: completion.CompletionSource.ObjectLiteralMemberWithComma" -completionsObjectLiteralMethod1.ts parse error: "Unrecognized sort text: completion.SortText.ObjectLiteralProperty(completion.SortText.LocationPriority, \"bar\")" -completionsObjectLiteralMethod2.ts parse error: "Unrecognized sort text: completion.SortText.ObjectLiteralProperty(completion.SortText.LocationPriority, \"foo\")" -completionsObjectLiteralMethod3.ts parse error: "Unrecognized sort text: completion.SortText.ObjectLiteralProperty(completion.SortText.LocationPriority, \"M\")" -completionsObjectLiteralMethod4.ts parse error: "Unrecognized sort text: completion.SortText.ObjectLiteralProperty(completion.SortText.LocationPriority, \"bar\")" -completionsObjectLiteralMethod5.ts parse error: "Unrecognized sort text: completion.SortText.ObjectLiteralProperty(completion.SortText.LocationPriority, \"method\")" +completionsJsxAttributeInitializer.ts parse error: "Expected string literal for source/sourceDisplay, got completion.CompletionSource.ThisProperty" +completionsObjectLiteralExpressions1.ts parse error: "Expected string literal for source/sourceDisplay, got completion.CompletionSource.ObjectLiteralMemberWithComma" +completionsObjectLiteralExpressions10.ts parse error: "Expected string literal for source/sourceDisplay, got completion.CompletionSource.ObjectLiteralMemberWithComma" +completionsObjectLiteralExpressions2.ts parse error: "Expected string literal for source/sourceDisplay, got completion.CompletionSource.ObjectLiteralMemberWithComma" +completionsObjectLiteralExpressions3.ts parse error: "Expected string literal for source/sourceDisplay, got completion.CompletionSource.ObjectLiteralMemberWithComma" +completionsObjectLiteralExpressions4.ts parse error: "Expected string literal for source/sourceDisplay, got completion.CompletionSource.ObjectLiteralMemberWithComma" +completionsObjectLiteralExpressions5.ts parse error: "Expected string literal for source/sourceDisplay, got completion.CompletionSource.ObjectLiteralMemberWithComma" +completionsObjectLiteralExpressions6.ts parse error: "Expected string literal for source/sourceDisplay, got completion.CompletionSource.ObjectLiteralMemberWithComma" +completionsObjectLiteralExpressions7.ts parse error: "Expected string literal for source/sourceDisplay, got completion.CompletionSource.ObjectLiteralMemberWithComma" +completionsObjectLiteralExpressions8.ts parse error: "Expected string literal for source/sourceDisplay, got completion.CompletionSource.ObjectLiteralMemberWithComma" +completionsObjectLiteralExpressions9.ts parse error: "Expected string literal for source/sourceDisplay, got completion.CompletionSource.ObjectLiteralMemberWithComma" completionsOptionalReplacementSpan1.ts parse error: "Unrecognized fourslash statement: test.ranges().forEach(...)" -completionsOverridingMethod0.ts parse error: "Unrecognized source in expected completion item: completion.CompletionSource.ClassMemberSnippet" -completionsOverridingMethod12.ts parse error: "Unrecognized source in expected completion item: completion.CompletionSource.ClassMemberSnippet" completionsOverridingMethod13.ts parse error: "Expected string literal or object literal for expected completion item, got ...completion.classElementKeywords" completionsOverridingMethod15.ts parse error: "Unrecognized fourslash statement: verify.baselineCompletions(...)" completionsOverridingMethod16.ts parse error: "Unrecognized fourslash statement: verify.baselineCompletions(...)" -completionsOverridingMethod18.ts parse error: "Unrecognized source in expected completion item: completion.CompletionSource.ClassMemberSnippet" -completionsOverridingMethod19.ts parse error: "Unrecognized source in expected completion item: completion.CompletionSource.ClassMemberSnippet" -completionsOverridingMethod20.ts parse error: "Unrecognized source in expected completion item: completion.CompletionSource.ClassMemberSnippet" -completionsOverridingMethod21.ts parse error: "Unrecognized source in expected completion item: completion.CompletionSource.ClassMemberSnippet" -completionsOverridingMethod22.ts parse error: "Unrecognized source in expected completion item: completion.CompletionSource.ClassMemberSnippet" -completionsOverridingMethod5.ts parse error: "Unrecognized source in expected completion item: completion.CompletionSource.ClassMemberSnippet" -completionsOverridingMethod6.ts parse error: "Unrecognized source in expected completion item: completion.CompletionSource.ClassMemberSnippet" -completionsOverridingMethod7.ts parse error: "Unrecognized source in expected completion item: completion.CompletionSource.ClassMemberSnippet" -completionsOverridingMethod8.ts parse error: "Unrecognized source in expected completion item: completion.CompletionSource.ClassMemberSnippet" -completionsOverridingMethodCrash2.ts parse error: "Unrecognized source in expected completion item: completion.CompletionSource.ClassMemberSnippet" -completionsOverridingMethodDefaultExported.ts parse error: "Unrecognized source in expected completion item: completion.CompletionSource.ClassMemberSnippet" completionsPaths_fromTypings.ts parse error: "Expected string literal or object literal for expected completion item, got [\"bar\", \"index\"].map(name => ({ name, kind: \"script\", kindModifiers: \".d.ts\" }))" completionsPaths_pathMapping_relativePath.ts parse error: "Expected string literal or object literal for expected completion item, got [\"a\", \"b\"].map(name => ({ name, kind: \"script\", kindModifiers: \".ts\" }))" completionsPaths_pathMapping_topLevel.ts parse error: "Expected string literal or object literal for expected completion item, got [\"src\", \"foo\"].map(name => ({ name, kind: \"directory\" }))" @@ -1092,12 +1073,12 @@ completionsStringCommitCharacter.ts parse error: "Unrecognized fourslash stateme completionsStringMethods.ts parse error: "Unrecognized fourslash statement: verify.baselineCompletions(...)" completionsThisProperties_globalSameName.ts parse error: "Expected string literal or object literal for expected completion item, got ...completion.globalsVars" completionsThisProperties_globalType.ts parse error: "Unrecognized fourslash statement: test.markerNames().forEach(...)" -completionsThisPropertiesInPropertyDeclaration1.ts parse error: "Unrecognized source in expected completion item: completion.CompletionSource.ThisProperty" -completionsThisPropertiesInPropertyDeclaration2.ts parse error: "Unrecognized source in expected completion item: completion.CompletionSource.ThisProperty" -completionsThisType.ts parse error: "Unrecognized source in expected completion item: completion.CompletionSource.ThisProperty" +completionsThisPropertiesInPropertyDeclaration1.ts parse error: "Expected string literal for source/sourceDisplay, got completion.CompletionSource.ThisProperty" +completionsThisPropertiesInPropertyDeclaration2.ts parse error: "Expected string literal for source/sourceDisplay, got completion.CompletionSource.ThisProperty" +completionsThisType.ts parse error: "Expected string literal for source/sourceDisplay, got completion.CompletionSource.ThisProperty" completionsUniqueSymbol2.ts parse error: "Unrecognized fourslash statement: verify.baselineCompletions(...)" -completionsWithDeprecatedTag8.ts parse error: "Unrecognized source in expected completion item: completion.CompletionSource.ThisProperty" -completionsWithDeprecatedTag9.ts parse error: "Unrecognized source in expected completion item: completion.CompletionSource.ThisProperty" +completionsWithDeprecatedTag8.ts parse error: "Expected string literal for source/sourceDisplay, got completion.CompletionSource.ThisProperty" +completionsWithDeprecatedTag9.ts parse error: "Expected string literal for source/sourceDisplay, got completion.CompletionSource.ThisProperty" completionsWithStringReplacementMode.ts parse error: "Unrecognized fourslash statement: for (let i = 0 ; i < 3; ++i) {\n verify.completions({\n marker: `${i + 1}`,\n exact: [\n { name: \"bar\", replacementSpan: test.ranges()[i] },\n { name: \"foo\", replacementSpan: test.ranges()[i] },\n ]\n });\n}" completionWritingSpreadLikeArgument.ts parse error: "Unrecognized fourslash statement: for (const marker of test.markers()) {\n goTo.marker(marker);\n verify.completions({ exact: undefined });\n\n edit.insert(\".\");\n verify.completions({ exact: undefined });\n\n edit.insert(\".\");\n verify.completions({ exact: undefined });\n}" configurePlugin.ts parse error: "Unrecognized marker or range argument: { pos: 0, end: 3, fileName: \"a.ts\" }" diff --git a/internal/fourslash/fourslash.go b/internal/fourslash/fourslash.go index d1087aabdf1..4eaf271e4fa 100644 --- a/internal/fourslash/fourslash.go +++ b/internal/fourslash/fourslash.go @@ -1134,7 +1134,8 @@ func (f *FourslashTest) getCompletions(t *testing.T, userPreferences *lsutil.Use Context: &lsproto.CompletionContext{}, } if userPreferences != nil { - reset := f.ConfigureWithReset(t, *userPreferences) + config := f.userPreferences.WithOverrides(*userPreferences) + reset := f.ConfigureWithReset(t, config) defer reset() } result := sendRequest(t, f, lsproto.TextDocumentCompletionInfo, params) @@ -1346,20 +1347,21 @@ func (f *FourslashTest) verifyCompletionsItems(t *testing.T, prefix string, actu } func (f *FourslashTest) verifyCompletionsAreExactly(t *testing.T, prefix string, actual []*lsproto.CompletionItem, expected []CompletionsExpectedItem) { - // Verify labels first - assertDeepEqual(t, core.Map(actual, func(item *lsproto.CompletionItem) string { - return item.Label - }), core.Map(expected, func(item CompletionsExpectedItem) string { - return getExpectedLabel(t, item) - }), prefix+"Labels mismatch") + labelMismatchPrefix := prefix + "Label mismatch" for i, actualItem := range actual { switch expectedItem := expected[i].(type) { case string: - continue // already checked labels + if actualItem.Data != nil && actualItem.Data.Name == expectedItem { + continue + } + assertDeepEqual(t, actualItem.Label, expectedItem, labelMismatchPrefix) case *lsproto.CompletionItem: + assertDeepEqual(t, actualItem.Label, expectedItem.Label, labelMismatchPrefix) if err := f.verifyCompletionItem(t, prefix+"Completion item mismatch for label "+actualItem.Label, actualItem, expectedItem); err != "" { t.Fatalf("%s:\n%s", prefix+"Completion item mismatch for label "+actualItem.Label, err) } + default: + t.Fatalf("Expected completion item to be a string or *lsproto.CompletionItem, got %T", expectedItem) } } } @@ -1397,6 +1399,20 @@ func (f *FourslashTest) verifyCompletionItem(t *testing.T, prefix string, actual actual = f.resolveCompletionItem(t, actual) } + if expected.InsertText != nil && expected.TextEdit == nil && actual.InsertText == nil && actual.TextEdit != nil { + var newText *string + if actual.TextEdit.TextEdit != nil { + newText = &actual.TextEdit.TextEdit.NewText + } else if actual.TextEdit.InsertReplaceEdit != nil { + newText = &actual.TextEdit.InsertReplaceEdit.NewText + } + + if newText != nil && *newText == *expected.InsertText { + actual.InsertText = expected.InsertText + actual.TextEdit = nil + } + } + if actualAutoImportFix != nil { if err := cmp.Diff(actual, expected, autoImportIgnoreOpts); err != "" { return err @@ -2387,6 +2403,7 @@ func (f *FourslashTest) VerifyBaselineCodeLens(t *testing.T, preferences *lsutil func (f *FourslashTest) MarkTestAsStradaServer() { f.isStradaServer = true + f.userPreferences.FormatCodeSettings.NewLineCharacter = core.NewLineKindCRLF.GetNewLineCharacter() } func (f *FourslashTest) VerifyBaselineGoToDefinition( diff --git a/internal/fourslash/tests/completionClassMembersAfterConstAssertionInitializer_test.go b/internal/fourslash/tests/completionClassMembersAfterConstAssertionInitializer_test.go index b3d081c0984..08f2658849c 100644 --- a/internal/fourslash/tests/completionClassMembersAfterConstAssertionInitializer_test.go +++ b/internal/fourslash/tests/completionClassMembersAfterConstAssertionInitializer_test.go @@ -36,9 +36,10 @@ class B implements A { Items: &fourslash.CompletionsExpectedItems{ Exact: append([]fourslash.CompletionsExpectedItem{ &lsproto.CompletionItem{ - Label: "def", - Kind: new(lsproto.CompletionItemKindField), - SortText: new(string(ls.SortTextLocationPriority)), + Label: "def", + Kind: new(lsproto.CompletionItemKindField), + SortText: new(string(ls.SortTextLocationPriority)), + InsertText: new("def: string"), }, }, CompletionClassElementKeywords...), }, diff --git a/internal/fourslash/tests/gen/autoImportCompletionAmbientMergedModule1_test.go b/internal/fourslash/tests/gen/autoImportCompletionAmbientMergedModule1_test.go index d620b4c7482..6e4d7b71d27 100644 --- a/internal/fourslash/tests/gen/autoImportCompletionAmbientMergedModule1_test.go +++ b/internal/fourslash/tests/gen/autoImportCompletionAmbientMergedModule1_test.go @@ -6,8 +6,10 @@ package fourslash_test import ( "testing" + "github.com/microsoft/typescript-go/internal/core" "github.com/microsoft/typescript-go/internal/fourslash" . "github.com/microsoft/typescript-go/internal/fourslash/tests/util" + "github.com/microsoft/typescript-go/internal/ls/lsutil" "github.com/microsoft/typescript-go/internal/lsp/lsproto" "github.com/microsoft/typescript-go/internal/testutil" ) @@ -66,6 +68,7 @@ export class MoveInsideNextQuote extends MoveQuoteMatch {/*1*/ }, }, }, + UserPreferences: &lsutil.UserPreferences{IncludeCompletionsWithClassMemberSnippets: core.TSTrue}, }) f.VerifyApplyCodeActionFromCompletion(t, new("1"), &fourslash.ApplyCodeActionFromCompletionOptions{ Name: "execActionWithCount", diff --git a/internal/fourslash/tests/gen/autoImportCompletionExportEqualsWithDefault1_test.go b/internal/fourslash/tests/gen/autoImportCompletionExportEqualsWithDefault1_test.go index 5bea86d5bfe..f1d1ae6974e 100644 --- a/internal/fourslash/tests/gen/autoImportCompletionExportEqualsWithDefault1_test.go +++ b/internal/fourslash/tests/gen/autoImportCompletionExportEqualsWithDefault1_test.go @@ -6,8 +6,10 @@ package fourslash_test import ( "testing" + "github.com/microsoft/typescript-go/internal/core" "github.com/microsoft/typescript-go/internal/fourslash" . "github.com/microsoft/typescript-go/internal/fourslash/tests/util" + "github.com/microsoft/typescript-go/internal/ls/lsutil" "github.com/microsoft/typescript-go/internal/lsp/lsproto" "github.com/microsoft/typescript-go/internal/testutil" ) @@ -84,6 +86,7 @@ export = Container;` }, }, }, + UserPreferences: &lsutil.UserPreferences{IncludeCompletionsWithClassMemberSnippets: core.TSTrue}, }) f.VerifyApplyCodeActionFromCompletion(t, new("1"), &fourslash.ApplyCodeActionFromCompletionOptions{ Name: "parent", diff --git a/internal/fourslash/tests/gen/autoImportCompletionExportListAugmentation1_test.go b/internal/fourslash/tests/gen/autoImportCompletionExportListAugmentation1_test.go index 8f621eb3b1e..bc611ac9527 100644 --- a/internal/fourslash/tests/gen/autoImportCompletionExportListAugmentation1_test.go +++ b/internal/fourslash/tests/gen/autoImportCompletionExportListAugmentation1_test.go @@ -6,8 +6,10 @@ package fourslash_test import ( "testing" + "github.com/microsoft/typescript-go/internal/core" "github.com/microsoft/typescript-go/internal/fourslash" . "github.com/microsoft/typescript-go/internal/fourslash/tests/util" + "github.com/microsoft/typescript-go/internal/ls/lsutil" "github.com/microsoft/typescript-go/internal/lsp/lsproto" "github.com/microsoft/typescript-go/internal/testutil" ) @@ -60,6 +62,7 @@ class FullPiece extends Piece { }, }, }, + UserPreferences: &lsutil.UserPreferences{IncludeCompletionsWithClassMemberSnippets: core.TSTrue}, }) f.VerifyApplyCodeActionFromCompletion(t, new("1"), &fourslash.ApplyCodeActionFromCompletionOptions{ Name: "container", diff --git a/internal/fourslash/tests/gen/autoImportCompletionExportListAugmentation2_test.go b/internal/fourslash/tests/gen/autoImportCompletionExportListAugmentation2_test.go index df15e7fec76..fa89bca1ca3 100644 --- a/internal/fourslash/tests/gen/autoImportCompletionExportListAugmentation2_test.go +++ b/internal/fourslash/tests/gen/autoImportCompletionExportListAugmentation2_test.go @@ -6,8 +6,10 @@ package fourslash_test import ( "testing" + "github.com/microsoft/typescript-go/internal/core" "github.com/microsoft/typescript-go/internal/fourslash" . "github.com/microsoft/typescript-go/internal/fourslash/tests/util" + "github.com/microsoft/typescript-go/internal/ls/lsutil" "github.com/microsoft/typescript-go/internal/lsp/lsproto" "github.com/microsoft/typescript-go/internal/testutil" ) @@ -68,6 +70,7 @@ class PingCommand extends Command { }, }, }, + UserPreferences: &lsutil.UserPreferences{IncludeCompletionsWithClassMemberSnippets: core.TSTrue}, }) f.VerifyApplyCodeActionFromCompletion(t, new("1"), &fourslash.ApplyCodeActionFromCompletionOptions{ Name: "container", diff --git a/internal/fourslash/tests/gen/autoImportCompletionExportListAugmentation3_test.go b/internal/fourslash/tests/gen/autoImportCompletionExportListAugmentation3_test.go index daa7035d67d..3da3f3ddda6 100644 --- a/internal/fourslash/tests/gen/autoImportCompletionExportListAugmentation3_test.go +++ b/internal/fourslash/tests/gen/autoImportCompletionExportListAugmentation3_test.go @@ -6,8 +6,10 @@ package fourslash_test import ( "testing" + "github.com/microsoft/typescript-go/internal/core" "github.com/microsoft/typescript-go/internal/fourslash" . "github.com/microsoft/typescript-go/internal/fourslash/tests/util" + "github.com/microsoft/typescript-go/internal/ls/lsutil" "github.com/microsoft/typescript-go/internal/lsp/lsproto" "github.com/microsoft/typescript-go/internal/testutil" ) @@ -59,6 +61,7 @@ class FullPiece extends Piece { }, }, }, + UserPreferences: &lsutil.UserPreferences{IncludeCompletionsWithClassMemberSnippets: core.TSTrue}, }) f.VerifyApplyCodeActionFromCompletion(t, new("1"), &fourslash.ApplyCodeActionFromCompletionOptions{ Name: "container", diff --git a/internal/fourslash/tests/gen/autoImportCompletionExportListAugmentation4_test.go b/internal/fourslash/tests/gen/autoImportCompletionExportListAugmentation4_test.go index 74745c81182..64f46e7233f 100644 --- a/internal/fourslash/tests/gen/autoImportCompletionExportListAugmentation4_test.go +++ b/internal/fourslash/tests/gen/autoImportCompletionExportListAugmentation4_test.go @@ -6,8 +6,10 @@ package fourslash_test import ( "testing" + "github.com/microsoft/typescript-go/internal/core" "github.com/microsoft/typescript-go/internal/fourslash" . "github.com/microsoft/typescript-go/internal/fourslash/tests/util" + "github.com/microsoft/typescript-go/internal/ls/lsutil" "github.com/microsoft/typescript-go/internal/lsp/lsproto" "github.com/microsoft/typescript-go/internal/testutil" ) @@ -66,6 +68,7 @@ class PingCommand extends CommandAlias { }, }, }, + UserPreferences: &lsutil.UserPreferences{IncludeCompletionsWithClassMemberSnippets: core.TSTrue}, }) f.VerifyApplyCodeActionFromCompletion(t, new("1"), &fourslash.ApplyCodeActionFromCompletionOptions{ Name: "container", diff --git a/internal/fourslash/tests/gen/completionAfterQuestionDot_test.go b/internal/fourslash/tests/gen/completionAfterQuestionDot_test.go index f8f95221208..61ccf325d65 100644 --- a/internal/fourslash/tests/gen/completionAfterQuestionDot_test.go +++ b/internal/fourslash/tests/gen/completionAfterQuestionDot_test.go @@ -50,7 +50,7 @@ class User { Detail: new("(property) \"postal code\": string"), TextEdit: &lsproto.TextEditOrInsertReplaceEdit{ TextEdit: &lsproto.TextEdit{ - NewText: "postal code", + NewText: "?.[\"postal code\"]", Range: f.Ranges()[0].LSRange, }, }, diff --git a/internal/fourslash/tests/gen/completionAutoInsertQuestionDot_test.go b/internal/fourslash/tests/gen/completionAutoInsertQuestionDot_test.go index 8bcdfa26f7b..50f87fa6bad 100644 --- a/internal/fourslash/tests/gen/completionAutoInsertQuestionDot_test.go +++ b/internal/fourslash/tests/gen/completionAutoInsertQuestionDot_test.go @@ -41,7 +41,7 @@ user.address[|./**/|]` Detail: new("(property) city: string"), TextEdit: &lsproto.TextEditOrInsertReplaceEdit{ TextEdit: &lsproto.TextEdit{ - NewText: "city", + NewText: "?.city", Range: f.Ranges()[0].LSRange, }, }, @@ -52,7 +52,7 @@ user.address[|./**/|]` Detail: new("(property) \"postal code\": string"), TextEdit: &lsproto.TextEditOrInsertReplaceEdit{ TextEdit: &lsproto.TextEdit{ - NewText: "postal code", + NewText: "?.[\"postal code\"]", Range: f.Ranges()[0].LSRange, }, }, diff --git a/internal/fourslash/tests/gen/completionClassMemberSnippetCrossFileNodeReuse1_test.go b/internal/fourslash/tests/gen/completionClassMemberSnippetCrossFileNodeReuse1_test.go new file mode 100644 index 00000000000..5fb8c7955ad --- /dev/null +++ b/internal/fourslash/tests/gen/completionClassMemberSnippetCrossFileNodeReuse1_test.go @@ -0,0 +1,68 @@ +// Code generated by convertFourslash; DO NOT EDIT. +// To modify this test, run "npm run makemanual completionClassMemberSnippetCrossFileNodeReuse1" + +package fourslash_test + +import ( + "testing" + + "github.com/microsoft/typescript-go/internal/core" + "github.com/microsoft/typescript-go/internal/fourslash" + . "github.com/microsoft/typescript-go/internal/fourslash/tests/util" + "github.com/microsoft/typescript-go/internal/ls/lsutil" + "github.com/microsoft/typescript-go/internal/lsp/lsproto" + "github.com/microsoft/typescript-go/internal/testutil" +) + +func TestCompletionClassMemberSnippetCrossFileNodeReuse1(t *testing.T) { + fourslash.SkipIfFailing(t) + t.Parallel() + defer testutil.RecoverAndFail(t, "Panic on fourslash test") + const content = `// @strict: true +// @filename: KlassConstructor.ts +type GenericConstructor = new (...args: any[]) => T; +export type KlassConstructor> = + GenericConstructor> & { [k in keyof Cls]: Cls[k] }; +// @filename: ElementNode.ts +import { KlassConstructor } from "./KlassConstructor"; + +export type NodeKey = string; + +export class ElementNode { + ["constructor"]!: KlassConstructor; +} +// @filename: CollapsibleContainerNode.ts +import { ElementNode, NodeKey } from "./ElementNode"; + +export class CollapsibleContainerNode extends ElementNode { + __open: boolean; + + /*1*/ +}` + f, done := fourslash.NewFourslash(t, nil /*capabilities*/, content) + defer done() + opts786 := f.GetOptions() + opts786.FormatCodeSettings.InsertSpaceAfterConstructor = core.TSFalse + f.Configure(t, opts786) + f.VerifyCompletions(t, "1", &fourslash.CompletionsExpectedList{ + IsIncomplete: false, + ItemDefaults: &fourslash.CompletionsExpectedItemDefaults{ + CommitCharacters: &[]string{}, + EditRange: Ignored, + }, + Items: &fourslash.CompletionsExpectedItems{ + Includes: []fourslash.CompletionsExpectedItem{ + &lsproto.CompletionItem{ + Label: "[\"constructor\"]", + InsertText: new("[\"constructor\"]: KlassConstructor;"), + FilterText: new("[\"constructor\"]"), + AdditionalTextEdits: fourslash.AnyTextEdits, + Data: &lsproto.CompletionItemData{ + Source: "ClassMemberSnippet/", + }, + }, + }, + }, + UserPreferences: &lsutil.UserPreferences{IncludeCompletionsWithClassMemberSnippets: core.TSTrue}, + }) +} diff --git a/internal/fourslash/tests/gen/completionCloneQuestionToken_test.go b/internal/fourslash/tests/gen/completionCloneQuestionToken_test.go index 1d3333139b8..754da115a85 100644 --- a/internal/fourslash/tests/gen/completionCloneQuestionToken_test.go +++ b/internal/fourslash/tests/gen/completionCloneQuestionToken_test.go @@ -6,8 +6,10 @@ package fourslash_test import ( "testing" + "github.com/microsoft/typescript-go/internal/core" "github.com/microsoft/typescript-go/internal/fourslash" . "github.com/microsoft/typescript-go/internal/fourslash/tests/util" + "github.com/microsoft/typescript-go/internal/ls/lsutil" "github.com/microsoft/typescript-go/internal/lsp/lsproto" "github.com/microsoft/typescript-go/internal/testutil" ) @@ -46,5 +48,6 @@ class Foo extends Bar { }, }, }, + UserPreferences: &lsutil.UserPreferences{IncludeCompletionsWithClassMemberSnippets: core.TSTrue}, }) } diff --git a/internal/fourslash/tests/gen/completionEntryClassMembersWithInferredFunctionReturnType1_test.go b/internal/fourslash/tests/gen/completionEntryClassMembersWithInferredFunctionReturnType1_test.go index 925c547e8d2..1095ea76991 100644 --- a/internal/fourslash/tests/gen/completionEntryClassMembersWithInferredFunctionReturnType1_test.go +++ b/internal/fourslash/tests/gen/completionEntryClassMembersWithInferredFunctionReturnType1_test.go @@ -6,8 +6,10 @@ package fourslash_test import ( "testing" + "github.com/microsoft/typescript-go/internal/core" "github.com/microsoft/typescript-go/internal/fourslash" . "github.com/microsoft/typescript-go/internal/fourslash/tests/util" + "github.com/microsoft/typescript-go/internal/ls/lsutil" "github.com/microsoft/typescript-go/internal/lsp/lsproto" "github.com/microsoft/typescript-go/internal/testutil" ) @@ -45,5 +47,6 @@ export default abstract class ExpressionParser extends Tokenizer { }, }, }, + UserPreferences: &lsutil.UserPreferences{IncludeCompletionsWithClassMemberSnippets: core.TSTrue}, }) } diff --git a/internal/fourslash/tests/gen/completionForComputedStringProperties_test.go b/internal/fourslash/tests/gen/completionForComputedStringProperties_test.go index 126f6e1493b..36dbee6cd81 100644 --- a/internal/fourslash/tests/gen/completionForComputedStringProperties_test.go +++ b/internal/fourslash/tests/gen/completionForComputedStringProperties_test.go @@ -43,7 +43,7 @@ a[|./**/|]` SortText: new(string(ls.SortTextGlobalsOrKeywords)), TextEdit: &lsproto.TextEditOrInsertReplaceEdit{ TextEdit: &lsproto.TextEdit{ - NewText: "p2", + NewText: "[p2]", Range: f.Ranges()[0].LSRange, }, }, diff --git a/internal/fourslash/tests/gen/completionForStringLiteral_quotePreference2_test.go b/internal/fourslash/tests/gen/completionForStringLiteral_quotePreference2_test.go index ccfea5b5fc7..c8b213db624 100644 --- a/internal/fourslash/tests/gen/completionForStringLiteral_quotePreference2_test.go +++ b/internal/fourslash/tests/gen/completionForStringLiteral_quotePreference2_test.go @@ -36,7 +36,7 @@ a[|./**/|]` InsertText: new("['#']"), TextEdit: &lsproto.TextEditOrInsertReplaceEdit{ TextEdit: &lsproto.TextEdit{ - NewText: "#", + NewText: "['#']", Range: f.Ranges()[0].LSRange, }, }, diff --git a/internal/fourslash/tests/gen/completionForStringLiteral_quotePreference3_test.go b/internal/fourslash/tests/gen/completionForStringLiteral_quotePreference3_test.go index b49c9eaf2b4..a06acac9f6c 100644 --- a/internal/fourslash/tests/gen/completionForStringLiteral_quotePreference3_test.go +++ b/internal/fourslash/tests/gen/completionForStringLiteral_quotePreference3_test.go @@ -36,7 +36,7 @@ a[|./**/|]` InsertText: new("[\"#\"]"), TextEdit: &lsproto.TextEditOrInsertReplaceEdit{ TextEdit: &lsproto.TextEdit{ - NewText: "#", + NewText: "[\"#\"]", Range: f.Ranges()[0].LSRange, }, }, diff --git a/internal/fourslash/tests/gen/completionForStringLiteral_quotePreference7_test.go b/internal/fourslash/tests/gen/completionForStringLiteral_quotePreference7_test.go index 73c28991102..f5bd9a4ea23 100644 --- a/internal/fourslash/tests/gen/completionForStringLiteral_quotePreference7_test.go +++ b/internal/fourslash/tests/gen/completionForStringLiteral_quotePreference7_test.go @@ -40,7 +40,7 @@ foo[|./**/|]` InsertText: new("['#']"), TextEdit: &lsproto.TextEditOrInsertReplaceEdit{ TextEdit: &lsproto.TextEdit{ - NewText: "#", + NewText: "['#']", Range: f.Ranges()[0].LSRange, }, }, diff --git a/internal/fourslash/tests/gen/completionForStringLiteral_quotePreference8_test.go b/internal/fourslash/tests/gen/completionForStringLiteral_quotePreference8_test.go index d8c1458cc00..5103861e6f2 100644 --- a/internal/fourslash/tests/gen/completionForStringLiteral_quotePreference8_test.go +++ b/internal/fourslash/tests/gen/completionForStringLiteral_quotePreference8_test.go @@ -40,7 +40,7 @@ foo[|./**/|]` InsertText: new("['\"a name\\'s all good but it\\'s better with more\"']"), TextEdit: &lsproto.TextEditOrInsertReplaceEdit{ TextEdit: &lsproto.TextEdit{ - NewText: "\"a name's all good but it's better with more\"", + NewText: "['\"a name\\'s all good but it\\'s better with more\"']", Range: f.Ranges()[0].LSRange, }, }, diff --git a/internal/fourslash/tests/gen/completionListInvalidMemberNames_escapeQuote_test.go b/internal/fourslash/tests/gen/completionListInvalidMemberNames_escapeQuote_test.go index 1bdbe42994e..52097813bd9 100644 --- a/internal/fourslash/tests/gen/completionListInvalidMemberNames_escapeQuote_test.go +++ b/internal/fourslash/tests/gen/completionListInvalidMemberNames_escapeQuote_test.go @@ -34,7 +34,7 @@ x[|./**/|];` InsertText: new("[\"\\\"'\"]"), TextEdit: &lsproto.TextEditOrInsertReplaceEdit{ TextEdit: &lsproto.TextEdit{ - NewText: "\"'", + NewText: "[\"\\\"'\"]", Range: f.Ranges()[0].LSRange, }, }, @@ -55,7 +55,7 @@ x[|./**/|];` InsertText: new("['\"\\'']"), TextEdit: &lsproto.TextEditOrInsertReplaceEdit{ TextEdit: &lsproto.TextEdit{ - NewText: "\"'", + NewText: "['\"\\'']", Range: f.Ranges()[0].LSRange, }, }, diff --git a/internal/fourslash/tests/gen/completionListInvalidMemberNames_startWithSpace_test.go b/internal/fourslash/tests/gen/completionListInvalidMemberNames_startWithSpace_test.go index a8fb7995c0a..ac93a405eec 100644 --- a/internal/fourslash/tests/gen/completionListInvalidMemberNames_startWithSpace_test.go +++ b/internal/fourslash/tests/gen/completionListInvalidMemberNames_startWithSpace_test.go @@ -33,7 +33,7 @@ x[|./**/|];` InsertText: new("[\"foo \"]"), TextEdit: &lsproto.TextEditOrInsertReplaceEdit{ TextEdit: &lsproto.TextEdit{ - NewText: "foo ", + NewText: "[\"foo \"]", Range: f.Ranges()[0].LSRange, }, }, diff --git a/internal/fourslash/tests/gen/completionListInvalidMemberNames_test.go b/internal/fourslash/tests/gen/completionListInvalidMemberNames_test.go index 7232c046cca..e8ddba535bf 100644 --- a/internal/fourslash/tests/gen/completionListInvalidMemberNames_test.go +++ b/internal/fourslash/tests/gen/completionListInvalidMemberNames_test.go @@ -127,7 +127,7 @@ x["[|/*b*/|]"];` InsertText: new("[\"foo \"]"), TextEdit: &lsproto.TextEditOrInsertReplaceEdit{ TextEdit: &lsproto.TextEdit{ - NewText: "foo ", + NewText: "[\"foo \"]", Range: f.Ranges()[0].LSRange, }, }, @@ -140,7 +140,7 @@ x["[|/*b*/|]"];` InsertText: new("[\"#\"]"), TextEdit: &lsproto.TextEditOrInsertReplaceEdit{ TextEdit: &lsproto.TextEdit{ - NewText: "#", + NewText: "[\"#\"]", Range: f.Ranges()[0].LSRange, }, }, @@ -152,7 +152,7 @@ x["[|/*b*/|]"];` InsertText: new("[\"1b\"]"), TextEdit: &lsproto.TextEditOrInsertReplaceEdit{ TextEdit: &lsproto.TextEdit{ - NewText: "1b", + NewText: "[\"1b\"]", Range: f.Ranges()[0].LSRange, }, }, diff --git a/internal/fourslash/tests/gen/completionNoAutoInsertQuestionDotForThis_test.go b/internal/fourslash/tests/gen/completionNoAutoInsertQuestionDotForThis_test.go index 84ef345ad3a..7ec58c5d8d2 100644 --- a/internal/fourslash/tests/gen/completionNoAutoInsertQuestionDotForThis_test.go +++ b/internal/fourslash/tests/gen/completionNoAutoInsertQuestionDotForThis_test.go @@ -47,7 +47,7 @@ class Address { Detail: new("(property) Address[\"postal code\"]: string"), TextEdit: &lsproto.TextEditOrInsertReplaceEdit{ TextEdit: &lsproto.TextEdit{ - NewText: "postal code", + NewText: "[\"postal code\"]", Range: f.Ranges()[0].LSRange, }, }, diff --git a/internal/fourslash/tests/gen/completionNoAutoInsertQuestionDotForTypeParameter_test.go b/internal/fourslash/tests/gen/completionNoAutoInsertQuestionDotForTypeParameter_test.go index 4635cdb787e..0d863abff49 100644 --- a/internal/fourslash/tests/gen/completionNoAutoInsertQuestionDotForTypeParameter_test.go +++ b/internal/fourslash/tests/gen/completionNoAutoInsertQuestionDotForTypeParameter_test.go @@ -44,7 +44,7 @@ function f(x: T) { Detail: new("(property) Address[\"postal code\"]: string"), TextEdit: &lsproto.TextEditOrInsertReplaceEdit{ TextEdit: &lsproto.TextEdit{ - NewText: "postal code", + NewText: "[\"postal code\"]", Range: f.Ranges()[0].LSRange, }, }, diff --git a/internal/fourslash/tests/gen/completionOfAwaitPromise1_test.go b/internal/fourslash/tests/gen/completionOfAwaitPromise1_test.go index 7e5272c62a5..e7566bf41b4 100644 --- a/internal/fourslash/tests/gen/completionOfAwaitPromise1_test.go +++ b/internal/fourslash/tests/gen/completionOfAwaitPromise1_test.go @@ -35,7 +35,7 @@ func TestCompletionOfAwaitPromise1(t *testing.T) { InsertText: new("(await x).trim"), TextEdit: &lsproto.TextEditOrInsertReplaceEdit{ TextEdit: &lsproto.TextEdit{ - NewText: "trim", + NewText: "(await x).trim", Range: f.Ranges()[0].LSRange, }, }, diff --git a/internal/fourslash/tests/gen/completionOfAwaitPromise2_test.go b/internal/fourslash/tests/gen/completionOfAwaitPromise2_test.go index 80cfff103b4..0119e0d54db 100644 --- a/internal/fourslash/tests/gen/completionOfAwaitPromise2_test.go +++ b/internal/fourslash/tests/gen/completionOfAwaitPromise2_test.go @@ -36,7 +36,7 @@ async function foo(x: Promise) { InsertText: new("(await x).foo"), TextEdit: &lsproto.TextEditOrInsertReplaceEdit{ TextEdit: &lsproto.TextEdit{ - NewText: "foo", + NewText: "(await x).foo", Range: f.Ranges()[0].LSRange, }, }, diff --git a/internal/fourslash/tests/gen/completionOfAwaitPromise3_test.go b/internal/fourslash/tests/gen/completionOfAwaitPromise3_test.go index bfb13bec463..52b158d6bf6 100644 --- a/internal/fourslash/tests/gen/completionOfAwaitPromise3_test.go +++ b/internal/fourslash/tests/gen/completionOfAwaitPromise3_test.go @@ -36,7 +36,7 @@ async function foo(x: Promise) { InsertText: new("(await x)[\"foo-foo\"]"), TextEdit: &lsproto.TextEditOrInsertReplaceEdit{ TextEdit: &lsproto.TextEdit{ - NewText: "foo-foo", + NewText: "(await x)[\"foo-foo\"]", Range: f.Ranges()[0].LSRange, }, }, diff --git a/internal/fourslash/tests/gen/completionOfAwaitPromise5_test.go b/internal/fourslash/tests/gen/completionOfAwaitPromise5_test.go index 1324d06be64..901544fa450 100644 --- a/internal/fourslash/tests/gen/completionOfAwaitPromise5_test.go +++ b/internal/fourslash/tests/gen/completionOfAwaitPromise5_test.go @@ -36,7 +36,7 @@ async function foo(x: (a: number) => Promise) { InsertText: new("(await x(1)).foo"), TextEdit: &lsproto.TextEditOrInsertReplaceEdit{ TextEdit: &lsproto.TextEdit{ - NewText: "foo", + NewText: "(await x(1)).foo", Range: f.Ranges()[0].LSRange, }, }, diff --git a/internal/fourslash/tests/gen/completionOfAwaitPromise7_test.go b/internal/fourslash/tests/gen/completionOfAwaitPromise7_test.go index 4e5399c95be..f3c6d276ff3 100644 --- a/internal/fourslash/tests/gen/completionOfAwaitPromise7_test.go +++ b/internal/fourslash/tests/gen/completionOfAwaitPromise7_test.go @@ -36,7 +36,7 @@ func TestCompletionOfAwaitPromise7(t *testing.T) { InsertText: new(";(await x).trim"), TextEdit: &lsproto.TextEditOrInsertReplaceEdit{ TextEdit: &lsproto.TextEdit{ - NewText: "trim", + NewText: ";(await x).trim", Range: f.Ranges()[0].LSRange, }, }, diff --git a/internal/fourslash/tests/gen/completionsClassMemberImportTypeNodeParameter1_test.go b/internal/fourslash/tests/gen/completionsClassMemberImportTypeNodeParameter1_test.go index 18f81488ff2..db0df36c070 100644 --- a/internal/fourslash/tests/gen/completionsClassMemberImportTypeNodeParameter1_test.go +++ b/internal/fourslash/tests/gen/completionsClassMemberImportTypeNodeParameter1_test.go @@ -6,8 +6,10 @@ package fourslash_test import ( "testing" + "github.com/microsoft/typescript-go/internal/core" "github.com/microsoft/typescript-go/internal/fourslash" . "github.com/microsoft/typescript-go/internal/fourslash/tests/util" + "github.com/microsoft/typescript-go/internal/ls/lsutil" "github.com/microsoft/typescript-go/internal/lsp/lsproto" "github.com/microsoft/typescript-go/internal/testutil" ) @@ -47,5 +49,6 @@ export declare class BlenderbotSmallPreTrainedModel extends PreTrainedModel { }, }, }, + UserPreferences: &lsutil.UserPreferences{IncludeCompletionsWithClassMemberSnippets: core.TSTrue}, }) } diff --git a/internal/fourslash/tests/gen/completionsClassMemberImportTypeNodeParameter2_test.go b/internal/fourslash/tests/gen/completionsClassMemberImportTypeNodeParameter2_test.go index 7d2424beeee..688e166df76 100644 --- a/internal/fourslash/tests/gen/completionsClassMemberImportTypeNodeParameter2_test.go +++ b/internal/fourslash/tests/gen/completionsClassMemberImportTypeNodeParameter2_test.go @@ -6,8 +6,10 @@ package fourslash_test import ( "testing" + "github.com/microsoft/typescript-go/internal/core" "github.com/microsoft/typescript-go/internal/fourslash" . "github.com/microsoft/typescript-go/internal/fourslash/tests/util" + "github.com/microsoft/typescript-go/internal/ls/lsutil" "github.com/microsoft/typescript-go/internal/lsp/lsproto" "github.com/microsoft/typescript-go/internal/testutil" ) @@ -45,5 +47,6 @@ export declare class Derived extends Cls { }, }, }, + UserPreferences: &lsutil.UserPreferences{IncludeCompletionsWithClassMemberSnippets: core.TSTrue}, }) } diff --git a/internal/fourslash/tests/gen/completionsClassMemberImportTypeNodeParameter3_test.go b/internal/fourslash/tests/gen/completionsClassMemberImportTypeNodeParameter3_test.go index 1f72ad9c02e..adbe0480e15 100644 --- a/internal/fourslash/tests/gen/completionsClassMemberImportTypeNodeParameter3_test.go +++ b/internal/fourslash/tests/gen/completionsClassMemberImportTypeNodeParameter3_test.go @@ -6,8 +6,10 @@ package fourslash_test import ( "testing" + "github.com/microsoft/typescript-go/internal/core" "github.com/microsoft/typescript-go/internal/fourslash" . "github.com/microsoft/typescript-go/internal/fourslash/tests/util" + "github.com/microsoft/typescript-go/internal/ls/lsutil" "github.com/microsoft/typescript-go/internal/lsp/lsproto" "github.com/microsoft/typescript-go/internal/testutil" ) @@ -49,5 +51,6 @@ export declare class Derived extends Cls { }, }, }, + UserPreferences: &lsutil.UserPreferences{IncludeCompletionsWithClassMemberSnippets: core.TSTrue}, }) } diff --git a/internal/fourslash/tests/gen/completionsClassMemberImportTypeNodeParameter4_test.go b/internal/fourslash/tests/gen/completionsClassMemberImportTypeNodeParameter4_test.go index d1463ead41c..59e173ea4f0 100644 --- a/internal/fourslash/tests/gen/completionsClassMemberImportTypeNodeParameter4_test.go +++ b/internal/fourslash/tests/gen/completionsClassMemberImportTypeNodeParameter4_test.go @@ -6,8 +6,10 @@ package fourslash_test import ( "testing" + "github.com/microsoft/typescript-go/internal/core" "github.com/microsoft/typescript-go/internal/fourslash" . "github.com/microsoft/typescript-go/internal/fourslash/tests/util" + "github.com/microsoft/typescript-go/internal/ls/lsutil" "github.com/microsoft/typescript-go/internal/lsp/lsproto" "github.com/microsoft/typescript-go/internal/testutil" ) @@ -47,5 +49,6 @@ export declare class Derived extends Cls { }, }, }, + UserPreferences: &lsutil.UserPreferences{IncludeCompletionsWithClassMemberSnippets: core.TSTrue}, }) } diff --git a/internal/fourslash/tests/gen/completionsElementAccessNumeric_test.go b/internal/fourslash/tests/gen/completionsElementAccessNumeric_test.go index aa5de6a2e98..035ac1a25e8 100644 --- a/internal/fourslash/tests/gen/completionsElementAccessNumeric_test.go +++ b/internal/fourslash/tests/gen/completionsElementAccessNumeric_test.go @@ -51,7 +51,7 @@ x[|./**/|]` Detail: new("(property) 0: number (lbl1)"), TextEdit: &lsproto.TextEditOrInsertReplaceEdit{ TextEdit: &lsproto.TextEdit{ - NewText: "0", + NewText: "[0]", Range: f.Ranges()[0].LSRange, }, }, @@ -68,7 +68,7 @@ x[|./**/|]` Detail: new("(property) 1: number (lbl2)"), TextEdit: &lsproto.TextEditOrInsertReplaceEdit{ TextEdit: &lsproto.TextEdit{ - NewText: "1", + NewText: "[1]", Range: f.Ranges()[0].LSRange, }, }, diff --git a/internal/fourslash/tests/gen/completionsJsxAttributeInitializer2_test.go b/internal/fourslash/tests/gen/completionsJsxAttributeInitializer2_test.go index d5ce7a4ac73..0001fec5d52 100644 --- a/internal/fourslash/tests/gen/completionsJsxAttributeInitializer2_test.go +++ b/internal/fourslash/tests/gen/completionsJsxAttributeInitializer2_test.go @@ -44,7 +44,7 @@ const foo = 0; Kind: new(lsproto.CompletionItemKindVariable), TextEdit: &lsproto.TextEditOrInsertReplaceEdit{ TextEdit: &lsproto.TextEdit{ - NewText: "foo", + NewText: "{foo}", Range: f.Ranges()[0].LSRange, }, }, diff --git a/internal/fourslash/tests/gen/completionsJsxExpression_test.go b/internal/fourslash/tests/gen/completionsJsxExpression_test.go index 45e6150d906..58d72c86f89 100644 --- a/internal/fourslash/tests/gen/completionsJsxExpression_test.go +++ b/internal/fourslash/tests/gen/completionsJsxExpression_test.go @@ -6,9 +6,11 @@ package fourslash_test import ( "testing" + "github.com/microsoft/typescript-go/internal/core" "github.com/microsoft/typescript-go/internal/fourslash" . "github.com/microsoft/typescript-go/internal/fourslash/tests/util" "github.com/microsoft/typescript-go/internal/ls" + "github.com/microsoft/typescript-go/internal/ls/lsutil" "github.com/microsoft/typescript-go/internal/lsp/lsproto" "github.com/microsoft/typescript-go/internal/testutil" ) @@ -43,5 +45,6 @@ const value = "test"; }, }, }, + UserPreferences: &lsutil.UserPreferences{IncludeCompletionsWithSnippetText: core.TSTrue, JsxAttributeCompletionStyle: lsutil.JsxAttributeCompletionStyleAuto}, }) } diff --git a/internal/fourslash/tests/gen/completionsObjectLiteralMethod1_test.go b/internal/fourslash/tests/gen/completionsObjectLiteralMethod1_test.go new file mode 100644 index 00000000000..f1075a66b7b --- /dev/null +++ b/internal/fourslash/tests/gen/completionsObjectLiteralMethod1_test.go @@ -0,0 +1,220 @@ +// Code generated by convertFourslash; DO NOT EDIT. +// To modify this test, run "npm run makemanual completionsObjectLiteralMethod1" + +package fourslash_test + +import ( + "testing" + + "github.com/microsoft/typescript-go/internal/core" + "github.com/microsoft/typescript-go/internal/fourslash" + . "github.com/microsoft/typescript-go/internal/fourslash/tests/util" + "github.com/microsoft/typescript-go/internal/ls" + "github.com/microsoft/typescript-go/internal/ls/lsutil" + "github.com/microsoft/typescript-go/internal/lsp/lsproto" + "github.com/microsoft/typescript-go/internal/testutil" +) + +func TestCompletionsObjectLiteralMethod1(t *testing.T) { + fourslash.SkipIfFailing(t) + t.Parallel() + defer testutil.RecoverAndFail(t, "Panic on fourslash test") + const content = `// @newline: LF +// @Filename: a.ts +interface IFoo { + bar(x: number): void; +} + +const obj: IFoo = { + /*a*/ +} +type Foo = { + bar(x: number): void; + foo: (x: string) => string; +} + +const f: Foo = { + /*b*/ +} + +interface Overload { + buzz(a: number): number; + buzz(a: string): string; +} +const o: Overload = { + /*c*/ +} +interface Prop { + "space bar"(): string; +} +const p: Prop = { + /*d*/ +}` + f, done := fourslash.NewFourslash(t, nil /*capabilities*/, content) + defer done() + f.VerifyCompletions(t, "a", &fourslash.CompletionsExpectedList{ + IsIncomplete: false, + ItemDefaults: &fourslash.CompletionsExpectedItemDefaults{ + CommitCharacters: &DefaultCommitCharacters, + EditRange: Ignored, + }, + Items: &fourslash.CompletionsExpectedItems{ + Includes: []fourslash.CompletionsExpectedItem{ + &lsproto.CompletionItem{ + Label: "bar", + SortText: new(string(ls.ObjectLiteralPropertySortText(ls.SortTextLocationPriority, "bar"))), + }, + &lsproto.CompletionItem{ + Label: "bar", + InsertText: new("bar(x) {\n},"), + SortText: new(string(ls.SortBelow(ls.ObjectLiteralPropertySortText(ls.SortTextLocationPriority, "bar")))), + Data: &lsproto.CompletionItemData{ + Source: "ObjectLiteralMethodSnippet/", + }, + LabelDetails: &lsproto.CompletionItemLabelDetails{ + Detail: new("(x)"), + }, + }, + }, + }, + UserPreferences: &lsutil.UserPreferences{IncludeCompletionsWithSnippetText: core.TSFalse, IncludeCompletionsWithObjectLiteralMethodSnippets: core.TSTrue, UseLabelDetailsInCompletionEntries: core.TSTrue}, + }) + f.VerifyCompletions(t, "b", &fourslash.CompletionsExpectedList{ + IsIncomplete: false, + ItemDefaults: &fourslash.CompletionsExpectedItemDefaults{ + CommitCharacters: &DefaultCommitCharacters, + EditRange: Ignored, + }, + Items: &fourslash.CompletionsExpectedItems{ + Includes: []fourslash.CompletionsExpectedItem{ + &lsproto.CompletionItem{ + Label: "bar", + SortText: new(string(ls.ObjectLiteralPropertySortText(ls.SortTextLocationPriority, "bar"))), + }, + &lsproto.CompletionItem{ + Label: "bar", + InsertText: new("bar(x) {\n},"), + SortText: new(string(ls.SortBelow(ls.ObjectLiteralPropertySortText(ls.SortTextLocationPriority, "bar")))), + Data: &lsproto.CompletionItemData{ + Source: "ObjectLiteralMethodSnippet/", + }, + LabelDetails: &lsproto.CompletionItemLabelDetails{ + Detail: new("(x)"), + }, + }, + &lsproto.CompletionItem{ + Label: "foo", + SortText: new(string(ls.ObjectLiteralPropertySortText(ls.SortTextLocationPriority, "foo"))), + }, + &lsproto.CompletionItem{ + Label: "foo", + InsertText: new("foo(x) {\n},"), + SortText: new(string(ls.SortBelow(ls.ObjectLiteralPropertySortText(ls.SortTextLocationPriority, "foo")))), + Data: &lsproto.CompletionItemData{ + Source: "ObjectLiteralMethodSnippet/", + }, + LabelDetails: &lsproto.CompletionItemLabelDetails{ + Detail: new("(x)"), + }, + }, + }, + }, + UserPreferences: &lsutil.UserPreferences{IncludeCompletionsWithSnippetText: core.TSFalse, IncludeCompletionsWithObjectLiteralMethodSnippets: core.TSTrue, UseLabelDetailsInCompletionEntries: core.TSTrue}, + }) + f.VerifyCompletions(t, "c", &fourslash.CompletionsExpectedList{ + IsIncomplete: false, + ItemDefaults: &fourslash.CompletionsExpectedItemDefaults{ + CommitCharacters: &DefaultCommitCharacters, + EditRange: Ignored, + }, + Items: &fourslash.CompletionsExpectedItems{ + Exact: []fourslash.CompletionsExpectedItem{ + &lsproto.CompletionItem{ + Label: "buzz", + SortText: new(string(ls.ObjectLiteralPropertySortText(ls.SortTextLocationPriority, "buzz"))), + }, + }, + }, + UserPreferences: &lsutil.UserPreferences{IncludeCompletionsWithSnippetText: core.TSFalse, IncludeCompletionsWithObjectLiteralMethodSnippets: core.TSTrue}, + }) + f.VerifyCompletions(t, "d", &fourslash.CompletionsExpectedList{ + IsIncomplete: false, + ItemDefaults: &fourslash.CompletionsExpectedItemDefaults{ + CommitCharacters: &DefaultCommitCharacters, + EditRange: Ignored, + }, + Items: &fourslash.CompletionsExpectedItems{ + Includes: []fourslash.CompletionsExpectedItem{ + &lsproto.CompletionItem{ + Label: "\"space bar\"", + SortText: new(string(ls.ObjectLiteralPropertySortText(ls.SortTextLocationPriority, "\"space bar\""))), + }, + &lsproto.CompletionItem{ + Label: "\"space bar\"", + InsertText: new("\"space bar\"() {\n},"), + SortText: new(string(ls.SortBelow(ls.ObjectLiteralPropertySortText(ls.SortTextLocationPriority, "\"space bar\"")))), + Data: &lsproto.CompletionItemData{ + Source: "ObjectLiteralMethodSnippet/", + }, + LabelDetails: &lsproto.CompletionItemLabelDetails{ + Detail: new("()"), + }, + }, + }, + }, + UserPreferences: &lsutil.UserPreferences{IncludeCompletionsWithSnippetText: core.TSFalse, IncludeCompletionsWithObjectLiteralMethodSnippets: core.TSTrue, UseLabelDetailsInCompletionEntries: core.TSTrue}, + }) + f.VerifyCompletions(t, "a", &fourslash.CompletionsExpectedList{ + IsIncomplete: false, + ItemDefaults: &fourslash.CompletionsExpectedItemDefaults{ + CommitCharacters: &DefaultCommitCharacters, + EditRange: Ignored, + }, + Items: &fourslash.CompletionsExpectedItems{ + Includes: []fourslash.CompletionsExpectedItem{ + &lsproto.CompletionItem{ + Label: "bar", + SortText: new(string(ls.ObjectLiteralPropertySortText(ls.SortTextLocationPriority, "bar"))), + }, + &lsproto.CompletionItem{ + Label: "bar", + InsertText: new("bar(x) {\n $0\n},"), + SortText: new(string(ls.SortBelow(ls.ObjectLiteralPropertySortText(ls.SortTextLocationPriority, "bar")))), + Data: &lsproto.CompletionItemData{ + Source: "ObjectLiteralMethodSnippet/", + }, + InsertTextFormat: new(lsproto.InsertTextFormatSnippet), + LabelDetails: &lsproto.CompletionItemLabelDetails{ + Detail: new("(x)"), + }, + }, + }, + }, + UserPreferences: &lsutil.UserPreferences{IncludeCompletionsWithSnippetText: core.TSTrue, IncludeCompletionsWithObjectLiteralMethodSnippets: core.TSTrue, UseLabelDetailsInCompletionEntries: core.TSTrue}, + }) + f.VerifyCompletions(t, "a", &fourslash.CompletionsExpectedList{ + IsIncomplete: false, + ItemDefaults: &fourslash.CompletionsExpectedItemDefaults{ + CommitCharacters: &DefaultCommitCharacters, + EditRange: Ignored, + }, + Items: &fourslash.CompletionsExpectedItems{ + Includes: []fourslash.CompletionsExpectedItem{ + &lsproto.CompletionItem{ + Label: "bar", + SortText: new(string(ls.ObjectLiteralPropertySortText(ls.SortTextLocationPriority, "bar"))), + }, + &lsproto.CompletionItem{ + Label: "bar(x)", + InsertText: new("bar(x) {\n $0\n},"), + SortText: new(string(ls.SortBelow(ls.ObjectLiteralPropertySortText(ls.SortTextLocationPriority, "bar")))), + Data: &lsproto.CompletionItemData{ + Source: "ObjectLiteralMethodSnippet/", + }, + InsertTextFormat: new(lsproto.InsertTextFormatSnippet), + }, + }, + }, + UserPreferences: &lsutil.UserPreferences{IncludeCompletionsWithSnippetText: core.TSTrue, IncludeCompletionsWithObjectLiteralMethodSnippets: core.TSTrue, UseLabelDetailsInCompletionEntries: core.TSFalse}, + }) +} diff --git a/internal/fourslash/tests/gen/completionsObjectLiteralMethod2_test.go b/internal/fourslash/tests/gen/completionsObjectLiteralMethod2_test.go new file mode 100644 index 00000000000..5fec03d32a8 --- /dev/null +++ b/internal/fourslash/tests/gen/completionsObjectLiteralMethod2_test.go @@ -0,0 +1,66 @@ +// Code generated by convertFourslash; DO NOT EDIT. +// To modify this test, run "npm run makemanual completionsObjectLiteralMethod2" + +package fourslash_test + +import ( + "testing" + + "github.com/microsoft/typescript-go/internal/core" + "github.com/microsoft/typescript-go/internal/fourslash" + . "github.com/microsoft/typescript-go/internal/fourslash/tests/util" + "github.com/microsoft/typescript-go/internal/ls" + "github.com/microsoft/typescript-go/internal/ls/lsutil" + "github.com/microsoft/typescript-go/internal/lsp/lsproto" + "github.com/microsoft/typescript-go/internal/testutil" +) + +func TestCompletionsObjectLiteralMethod2(t *testing.T) { + fourslash.SkipIfFailing(t) + t.Parallel() + defer testutil.RecoverAndFail(t, "Panic on fourslash test") + const content = `// @newline: LF +// @Filename: a.ts +export interface IFoo { + bar(x: number): void; +} +// @Filename: b.ts +import { IFoo } from "./a"; +export interface IBar { + foo(f: IFoo): void; +} +// @Filename: c.ts +import { IBar } from "./b"; +const obj: IBar = { + /*a*/ +}` + f, done := fourslash.NewFourslash(t, nil /*capabilities*/, content) + defer done() + f.VerifyCompletions(t, "a", &fourslash.CompletionsExpectedList{ + IsIncomplete: false, + ItemDefaults: &fourslash.CompletionsExpectedItemDefaults{ + CommitCharacters: &DefaultCommitCharacters, + EditRange: Ignored, + }, + Items: &fourslash.CompletionsExpectedItems{ + Includes: []fourslash.CompletionsExpectedItem{ + &lsproto.CompletionItem{ + Label: "foo", + SortText: new(string(ls.ObjectLiteralPropertySortText(ls.SortTextLocationPriority, "foo"))), + }, + &lsproto.CompletionItem{ + Label: "foo", + InsertText: new("foo(f) {\n},"), + SortText: new(string(ls.SortBelow(ls.ObjectLiteralPropertySortText(ls.SortTextLocationPriority, "foo")))), + Data: &lsproto.CompletionItemData{ + Source: "ObjectLiteralMethodSnippet/", + }, + LabelDetails: &lsproto.CompletionItemLabelDetails{ + Detail: new("(f)"), + }, + }, + }, + }, + UserPreferences: &lsutil.UserPreferences{IncludeCompletionsWithSnippetText: core.TSFalse, IncludeCompletionsWithObjectLiteralMethodSnippets: core.TSTrue, UseLabelDetailsInCompletionEntries: core.TSTrue}, + }) +} diff --git a/internal/fourslash/tests/gen/completionsObjectLiteralMethod3_test.go b/internal/fourslash/tests/gen/completionsObjectLiteralMethod3_test.go new file mode 100644 index 00000000000..c5682061372 --- /dev/null +++ b/internal/fourslash/tests/gen/completionsObjectLiteralMethod3_test.go @@ -0,0 +1,172 @@ +// Code generated by convertFourslash; DO NOT EDIT. +// To modify this test, run "npm run makemanual completionsObjectLiteralMethod3" + +package fourslash_test + +import ( + "testing" + + "github.com/microsoft/typescript-go/internal/core" + "github.com/microsoft/typescript-go/internal/fourslash" + . "github.com/microsoft/typescript-go/internal/fourslash/tests/util" + "github.com/microsoft/typescript-go/internal/ls" + "github.com/microsoft/typescript-go/internal/ls/lsutil" + "github.com/microsoft/typescript-go/internal/lsp/lsproto" + "github.com/microsoft/typescript-go/internal/testutil" +) + +func TestCompletionsObjectLiteralMethod3(t *testing.T) { + fourslash.SkipIfFailing(t) + t.Parallel() + defer testutil.RecoverAndFail(t, "Panic on fourslash test") + const content = `// @newline: LF +// @strictNullChecks: true +// @Filename: a.ts +interface I1 { + M(x: number): void; +} +interface I2 { + M(x: number): void; +} +const u: I1 | I2 = { + /*a*/ +} +const i: I1 & I2 = { + /*b*/ +} +interface U1 { + M(x: number): string; +} +interface U2 { + M(x: string): number; +} +const o: U1 | U2 = { + /*c*/ +} +interface Op { + M?(x: number): void; + N: ((x: string) => void) | null | undefined; + O?: () => void; +} +const op: Op = { + /*d*/ +}` + f, done := fourslash.NewFourslash(t, nil /*capabilities*/, content) + defer done() + f.VerifyCompletions(t, "a", &fourslash.CompletionsExpectedList{ + IsIncomplete: false, + ItemDefaults: &fourslash.CompletionsExpectedItemDefaults{ + CommitCharacters: &DefaultCommitCharacters, + EditRange: Ignored, + }, + Items: &fourslash.CompletionsExpectedItems{ + Includes: []fourslash.CompletionsExpectedItem{ + &lsproto.CompletionItem{ + Label: "M", + SortText: new(string(ls.ObjectLiteralPropertySortText(ls.SortTextLocationPriority, "M"))), + }, + &lsproto.CompletionItem{ + Label: "M", + InsertText: new("M(x) {\n},"), + SortText: new(string(ls.SortBelow(ls.ObjectLiteralPropertySortText(ls.SortTextLocationPriority, "M")))), + Data: &lsproto.CompletionItemData{ + Source: "ObjectLiteralMethodSnippet/", + }, + LabelDetails: &lsproto.CompletionItemLabelDetails{ + Detail: new("(x)"), + }, + }, + }, + }, + UserPreferences: &lsutil.UserPreferences{IncludeCompletionsWithSnippetText: core.TSFalse, IncludeCompletionsWithObjectLiteralMethodSnippets: core.TSTrue, UseLabelDetailsInCompletionEntries: core.TSTrue}, + }) + f.VerifyCompletions(t, "b", &fourslash.CompletionsExpectedList{ + IsIncomplete: false, + ItemDefaults: &fourslash.CompletionsExpectedItemDefaults{ + CommitCharacters: &DefaultCommitCharacters, + EditRange: Ignored, + }, + Items: &fourslash.CompletionsExpectedItems{ + Includes: []fourslash.CompletionsExpectedItem{ + &lsproto.CompletionItem{ + Label: "M", + SortText: new(string(ls.ObjectLiteralPropertySortText(ls.SortTextLocationPriority, "M"))), + }, + }, + }, + UserPreferences: &lsutil.UserPreferences{IncludeCompletionsWithSnippetText: core.TSFalse, IncludeCompletionsWithObjectLiteralMethodSnippets: core.TSTrue}, + }) + f.VerifyCompletions(t, "c", &fourslash.CompletionsExpectedList{ + IsIncomplete: false, + ItemDefaults: &fourslash.CompletionsExpectedItemDefaults{ + CommitCharacters: &DefaultCommitCharacters, + EditRange: Ignored, + }, + Items: &fourslash.CompletionsExpectedItems{ + Exact: []fourslash.CompletionsExpectedItem{ + &lsproto.CompletionItem{ + Label: "M", + SortText: new(string(ls.ObjectLiteralPropertySortText(ls.SortTextLocationPriority, "M"))), + }, + }, + }, + UserPreferences: &lsutil.UserPreferences{IncludeCompletionsWithSnippetText: core.TSFalse, IncludeCompletionsWithObjectLiteralMethodSnippets: core.TSTrue}, + }) + f.VerifyCompletions(t, "d", &fourslash.CompletionsExpectedList{ + IsIncomplete: false, + ItemDefaults: &fourslash.CompletionsExpectedItemDefaults{ + CommitCharacters: &DefaultCommitCharacters, + EditRange: Ignored, + }, + Items: &fourslash.CompletionsExpectedItems{ + Includes: []fourslash.CompletionsExpectedItem{ + &lsproto.CompletionItem{ + Label: "M", + SortText: new(string(ls.ObjectLiteralPropertySortText(ls.SortTextOptionalMember, "M"))), + }, + &lsproto.CompletionItem{ + Label: "M", + InsertText: new("M(x) {\n},"), + SortText: new(string(ls.SortBelow(ls.ObjectLiteralPropertySortText(ls.SortTextOptionalMember, "M")))), + Data: &lsproto.CompletionItemData{ + Source: "ObjectLiteralMethodSnippet/", + }, + LabelDetails: &lsproto.CompletionItemLabelDetails{ + Detail: new("(x)"), + }, + }, + &lsproto.CompletionItem{ + Label: "N", + SortText: new(string(ls.ObjectLiteralPropertySortText(ls.SortTextLocationPriority, "N"))), + }, + &lsproto.CompletionItem{ + Label: "N", + InsertText: new("N(x) {\n},"), + SortText: new(string(ls.SortBelow(ls.ObjectLiteralPropertySortText(ls.SortTextLocationPriority, "N")))), + Data: &lsproto.CompletionItemData{ + Source: "ObjectLiteralMethodSnippet/", + }, + LabelDetails: &lsproto.CompletionItemLabelDetails{ + Detail: new("(x)"), + }, + }, + &lsproto.CompletionItem{ + Label: "O", + SortText: new(string(ls.ObjectLiteralPropertySortText(ls.SortTextOptionalMember, "O"))), + }, + &lsproto.CompletionItem{ + Label: "O", + InsertText: new("O() {\n},"), + SortText: new(string(ls.SortBelow(ls.ObjectLiteralPropertySortText(ls.SortTextOptionalMember, "O")))), + Data: &lsproto.CompletionItemData{ + Source: "ObjectLiteralMethodSnippet/", + }, + LabelDetails: &lsproto.CompletionItemLabelDetails{ + Detail: new("()"), + }, + }, + }, + }, + UserPreferences: &lsutil.UserPreferences{IncludeCompletionsWithSnippetText: core.TSFalse, IncludeCompletionsWithObjectLiteralMethodSnippets: core.TSTrue, UseLabelDetailsInCompletionEntries: core.TSTrue}, + }) +} diff --git a/internal/fourslash/tests/gen/completionsObjectLiteralMethod4_test.go b/internal/fourslash/tests/gen/completionsObjectLiteralMethod4_test.go new file mode 100644 index 00000000000..b36f19c1b49 --- /dev/null +++ b/internal/fourslash/tests/gen/completionsObjectLiteralMethod4_test.go @@ -0,0 +1,60 @@ +// Code generated by convertFourslash; DO NOT EDIT. +// To modify this test, run "npm run makemanual completionsObjectLiteralMethod4" + +package fourslash_test + +import ( + "testing" + + "github.com/microsoft/typescript-go/internal/core" + "github.com/microsoft/typescript-go/internal/fourslash" + . "github.com/microsoft/typescript-go/internal/fourslash/tests/util" + "github.com/microsoft/typescript-go/internal/ls" + "github.com/microsoft/typescript-go/internal/ls/lsutil" + "github.com/microsoft/typescript-go/internal/lsp/lsproto" + "github.com/microsoft/typescript-go/internal/testutil" +) + +func TestCompletionsObjectLiteralMethod4(t *testing.T) { + fourslash.SkipIfFailing(t) + t.Parallel() + defer testutil.RecoverAndFail(t, "Panic on fourslash test") + const content = `// @newline: LF +// @Filename: a.ts +interface IFoo { + bar(this: IFoo): void; +} +const obj: IFoo = { + /*1*/ +}` + f, done := fourslash.NewFourslash(t, nil /*capabilities*/, content) + defer done() + f.VerifyCompletions(t, "1", &fourslash.CompletionsExpectedList{ + IsIncomplete: false, + ItemDefaults: &fourslash.CompletionsExpectedItemDefaults{ + CommitCharacters: &DefaultCommitCharacters, + EditRange: Ignored, + }, + Items: &fourslash.CompletionsExpectedItems{ + Includes: []fourslash.CompletionsExpectedItem{ + &lsproto.CompletionItem{ + Label: "bar", + SortText: new(string(ls.ObjectLiteralPropertySortText(ls.SortTextLocationPriority, "bar"))), + }, + &lsproto.CompletionItem{ + Label: "bar", + InsertText: new("bar() {\n $0\n},"), + SortText: new(string(ls.SortBelow(ls.ObjectLiteralPropertySortText(ls.SortTextLocationPriority, "bar")))), + Data: &lsproto.CompletionItemData{ + Source: "ObjectLiteralMethodSnippet/", + }, + InsertTextFormat: new(lsproto.InsertTextFormatSnippet), + LabelDetails: &lsproto.CompletionItemLabelDetails{ + Detail: new("()"), + }, + }, + }, + }, + UserPreferences: &lsutil.UserPreferences{IncludeCompletionsWithSnippetText: core.TSTrue, IncludeCompletionsWithObjectLiteralMethodSnippets: core.TSTrue, UseLabelDetailsInCompletionEntries: core.TSTrue}, + }) +} diff --git a/internal/fourslash/tests/gen/completionsObjectLiteralMethod5_test.go b/internal/fourslash/tests/gen/completionsObjectLiteralMethod5_test.go new file mode 100644 index 00000000000..7441befd682 --- /dev/null +++ b/internal/fourslash/tests/gen/completionsObjectLiteralMethod5_test.go @@ -0,0 +1,60 @@ +// Code generated by convertFourslash; DO NOT EDIT. +// To modify this test, run "npm run makemanual completionsObjectLiteralMethod5" + +package fourslash_test + +import ( + "testing" + + "github.com/microsoft/typescript-go/internal/core" + "github.com/microsoft/typescript-go/internal/fourslash" + . "github.com/microsoft/typescript-go/internal/fourslash/tests/util" + "github.com/microsoft/typescript-go/internal/ls" + "github.com/microsoft/typescript-go/internal/ls/lsutil" + "github.com/microsoft/typescript-go/internal/lsp/lsproto" + "github.com/microsoft/typescript-go/internal/testutil" +) + +func TestCompletionsObjectLiteralMethod5(t *testing.T) { + fourslash.SkipIfFailing(t) + t.Parallel() + defer testutil.RecoverAndFail(t, "Panic on fourslash test") + const content = `// @newline: LF +// @Filename: a.ts +interface Foo { + method(x?: string): void; +} +const foo: Foo = { + /*m*/ +}` + f, done := fourslash.NewFourslash(t, nil /*capabilities*/, content) + defer done() + f.VerifyCompletions(t, "m", &fourslash.CompletionsExpectedList{ + IsIncomplete: false, + ItemDefaults: &fourslash.CompletionsExpectedItemDefaults{ + CommitCharacters: &DefaultCommitCharacters, + EditRange: Ignored, + }, + Items: &fourslash.CompletionsExpectedItems{ + Includes: []fourslash.CompletionsExpectedItem{ + &lsproto.CompletionItem{ + Label: "method", + SortText: new(string(ls.ObjectLiteralPropertySortText(ls.SortTextLocationPriority, "method"))), + }, + &lsproto.CompletionItem{ + Label: "method", + InsertText: new("method(x) {\n $0\n},"), + SortText: new(string(ls.SortBelow(ls.ObjectLiteralPropertySortText(ls.SortTextLocationPriority, "method")))), + Data: &lsproto.CompletionItemData{ + Source: "ObjectLiteralMethodSnippet/", + }, + InsertTextFormat: new(lsproto.InsertTextFormatSnippet), + LabelDetails: &lsproto.CompletionItemLabelDetails{ + Detail: new("(x)"), + }, + }, + }, + }, + UserPreferences: &lsutil.UserPreferences{IncludeCompletionsWithSnippetText: core.TSTrue, IncludeCompletionsWithObjectLiteralMethodSnippets: core.TSTrue, UseLabelDetailsInCompletionEntries: core.TSTrue}, + }) +} diff --git a/internal/fourslash/tests/gen/completionsOverridingMethod0_test.go b/internal/fourslash/tests/gen/completionsOverridingMethod0_test.go new file mode 100644 index 00000000000..9fbf8fb3e53 --- /dev/null +++ b/internal/fourslash/tests/gen/completionsOverridingMethod0_test.go @@ -0,0 +1,301 @@ +// Code generated by convertFourslash; DO NOT EDIT. +// To modify this test, run "npm run makemanual completionsOverridingMethod0" + +package fourslash_test + +import ( + "testing" + + "github.com/microsoft/typescript-go/internal/core" + "github.com/microsoft/typescript-go/internal/fourslash" + . "github.com/microsoft/typescript-go/internal/fourslash/tests/util" + "github.com/microsoft/typescript-go/internal/ls" + "github.com/microsoft/typescript-go/internal/ls/lsutil" + "github.com/microsoft/typescript-go/internal/lsp/lsproto" + "github.com/microsoft/typescript-go/internal/testutil" +) + +func TestCompletionsOverridingMethod0(t *testing.T) { + fourslash.SkipIfFailing(t) + t.Parallel() + defer testutil.RecoverAndFail(t, "Panic on fourslash test") + const content = `// @newline: LF +// @Filename: a.ts +abstract class ABase { + abstract foo(param1: string, param2: boolean): Promise; +} + +class ASub extends ABase { + f/*a*/ +} +// @Filename: b.ts +class BBase { + foo(a: string, b: string): string { + return a + b; + } +} + +class BSub extends BBase { + f/*b*/ +} +// @Filename: c.ts +class CBase { + foo(a: string | number): string { + return a + ""; + } +} + +class CSub extends CBase { + foo(a: string): string { + return add; + } +} + +class CSub2 extends CSub { + f/*c*/ +} +// @Filename: d.ts +abstract class DBase { + abstract foo(a: string): string; +} + +abstract class DSub extends DBase { + f/*d*/ +} +// @Filename: e.ts +interface EBase { + foo(a: string): string; +} + +class ESub implements EBase { + f/*e*/ +} +// @Filename: f.ts +interface FBase { + foo(a: string): string; +} + +abstract class FSub implements FBase { + f/*f*/ +} +// @Filename: g.ts +interface GBase { + foo(a: string): string; + foo(a: undefined, b: number): string; +} + +class GSub implements GBase { + f/*g*/ +} +// @Filename: h.ts +class HBase { + static met(n: number): number { + return n; + } +} + +class HSub extends HBase { + /*h1*/ + static /*h2*/ +} +// @Filename: i.ts +class IBase { + met(t: T): T { + return t; + } + metcons(t: T): T { + return t; + } +} + +class ISub extends IBase { + /*i*/ +}` + f, done := fourslash.NewFourslash(t, nil /*capabilities*/, content) + defer done() + f.VerifyCompletions(t, "a", &fourslash.CompletionsExpectedList{ + IsIncomplete: false, + ItemDefaults: &fourslash.CompletionsExpectedItemDefaults{ + CommitCharacters: &[]string{}, + EditRange: Ignored, + }, + Items: &fourslash.CompletionsExpectedItems{ + Includes: []fourslash.CompletionsExpectedItem{ + &lsproto.CompletionItem{ + Label: "foo", + InsertText: new("foo(param1: string, param2: boolean): Promise {\n}"), + FilterText: new("foo"), + SortText: new(string(ls.SortTextLocationPriority)), + }, + }, + }, + UserPreferences: &lsutil.UserPreferences{IncludeCompletionsWithSnippetText: core.TSFalse, IncludeCompletionsWithClassMemberSnippets: core.TSTrue}, + }) + f.VerifyCompletions(t, "b", &fourslash.CompletionsExpectedList{ + IsIncomplete: false, + ItemDefaults: &fourslash.CompletionsExpectedItemDefaults{ + CommitCharacters: &[]string{}, + EditRange: Ignored, + }, + Items: &fourslash.CompletionsExpectedItems{ + Includes: []fourslash.CompletionsExpectedItem{ + &lsproto.CompletionItem{ + Label: "foo", + InsertText: new("foo(a: string, b: string): string {\n}"), + FilterText: new("foo"), + SortText: new(string(ls.SortTextLocationPriority)), + }, + }, + }, + UserPreferences: &lsutil.UserPreferences{IncludeCompletionsWithSnippetText: core.TSFalse, IncludeCompletionsWithClassMemberSnippets: core.TSTrue}, + }) + f.VerifyCompletions(t, "c", &fourslash.CompletionsExpectedList{ + IsIncomplete: false, + ItemDefaults: &fourslash.CompletionsExpectedItemDefaults{ + CommitCharacters: &[]string{}, + EditRange: Ignored, + }, + Items: &fourslash.CompletionsExpectedItems{ + Includes: []fourslash.CompletionsExpectedItem{ + &lsproto.CompletionItem{ + Label: "foo", + InsertText: new("foo(a: string): string {\n}"), + FilterText: new("foo"), + SortText: new(string(ls.SortTextLocationPriority)), + }, + }, + }, + UserPreferences: &lsutil.UserPreferences{IncludeCompletionsWithSnippetText: core.TSFalse, IncludeCompletionsWithClassMemberSnippets: core.TSTrue}, + }) + f.VerifyCompletions(t, "d", &fourslash.CompletionsExpectedList{ + IsIncomplete: false, + ItemDefaults: &fourslash.CompletionsExpectedItemDefaults{ + CommitCharacters: &[]string{}, + EditRange: Ignored, + }, + Items: &fourslash.CompletionsExpectedItems{ + Includes: []fourslash.CompletionsExpectedItem{ + &lsproto.CompletionItem{ + Label: "foo", + InsertText: new("foo(a: string): string {\n}"), + FilterText: new("foo"), + SortText: new(string(ls.SortTextLocationPriority)), + }, + }, + }, + UserPreferences: &lsutil.UserPreferences{IncludeCompletionsWithSnippetText: core.TSFalse, IncludeCompletionsWithClassMemberSnippets: core.TSTrue}, + }) + f.VerifyCompletions(t, "e", &fourslash.CompletionsExpectedList{ + IsIncomplete: false, + ItemDefaults: &fourslash.CompletionsExpectedItemDefaults{ + CommitCharacters: &[]string{}, + EditRange: Ignored, + }, + Items: &fourslash.CompletionsExpectedItems{ + Includes: []fourslash.CompletionsExpectedItem{ + &lsproto.CompletionItem{ + Label: "foo", + InsertText: new("foo(a: string): string {\n}"), + FilterText: new("foo"), + SortText: new(string(ls.SortTextLocationPriority)), + }, + }, + }, + UserPreferences: &lsutil.UserPreferences{IncludeCompletionsWithSnippetText: core.TSFalse, IncludeCompletionsWithClassMemberSnippets: core.TSTrue}, + }) + f.VerifyCompletions(t, "f", &fourslash.CompletionsExpectedList{ + IsIncomplete: false, + ItemDefaults: &fourslash.CompletionsExpectedItemDefaults{ + CommitCharacters: &[]string{}, + EditRange: Ignored, + }, + Items: &fourslash.CompletionsExpectedItems{ + Includes: []fourslash.CompletionsExpectedItem{ + &lsproto.CompletionItem{ + Label: "foo", + InsertText: new("foo(a: string): string {\n}"), + FilterText: new("foo"), + SortText: new(string(ls.SortTextLocationPriority)), + }, + }, + }, + UserPreferences: &lsutil.UserPreferences{IncludeCompletionsWithSnippetText: core.TSFalse, IncludeCompletionsWithClassMemberSnippets: core.TSTrue}, + }) + f.VerifyCompletions(t, "g", &fourslash.CompletionsExpectedList{ + IsIncomplete: false, + ItemDefaults: &fourslash.CompletionsExpectedItemDefaults{ + CommitCharacters: &[]string{}, + EditRange: Ignored, + }, + Items: &fourslash.CompletionsExpectedItems{ + Includes: []fourslash.CompletionsExpectedItem{ + &lsproto.CompletionItem{ + Label: "foo", + InsertText: new("foo(a: string): string;\nfoo(a: undefined, b: number): string;\nfoo(a: unknown, b?: unknown): string {\n}"), + FilterText: new("foo"), + SortText: new(string(ls.SortTextLocationPriority)), + }, + }, + }, + UserPreferences: &lsutil.UserPreferences{IncludeCompletionsWithSnippetText: core.TSFalse, IncludeCompletionsWithClassMemberSnippets: core.TSTrue}, + }) + f.VerifyCompletions(t, "h1", &fourslash.CompletionsExpectedList{ + IsIncomplete: false, + ItemDefaults: &fourslash.CompletionsExpectedItemDefaults{ + CommitCharacters: &[]string{}, + EditRange: Ignored, + }, + Items: &fourslash.CompletionsExpectedItems{ + Excludes: []string{ + "met", + }, + }, + UserPreferences: &lsutil.UserPreferences{IncludeCompletionsWithSnippetText: core.TSFalse, IncludeCompletionsWithClassMemberSnippets: core.TSTrue}, + }) + f.VerifyCompletions(t, "h2", &fourslash.CompletionsExpectedList{ + IsIncomplete: false, + ItemDefaults: &fourslash.CompletionsExpectedItemDefaults{ + CommitCharacters: &[]string{}, + EditRange: Ignored, + }, + Items: &fourslash.CompletionsExpectedItems{ + Includes: []fourslash.CompletionsExpectedItem{ + &lsproto.CompletionItem{ + Label: "met", + InsertText: new("static met(n: number): number {\n}"), + FilterText: new("met"), + SortText: new(string(ls.SortTextLocationPriority)), + AdditionalTextEdits: fourslash.AnyTextEdits, + Data: &lsproto.CompletionItemData{ + Source: "ClassMemberSnippet/", + }, + }, + }, + }, + UserPreferences: &lsutil.UserPreferences{IncludeCompletionsWithSnippetText: core.TSFalse, IncludeCompletionsWithClassMemberSnippets: core.TSTrue}, + }) + f.VerifyCompletions(t, "i", &fourslash.CompletionsExpectedList{ + IsIncomplete: false, + ItemDefaults: &fourslash.CompletionsExpectedItemDefaults{ + CommitCharacters: &[]string{}, + EditRange: Ignored, + }, + Items: &fourslash.CompletionsExpectedItems{ + Includes: []fourslash.CompletionsExpectedItem{ + &lsproto.CompletionItem{ + Label: "met", + InsertText: new("met(t: T): T {\n}"), + FilterText: new("met"), + SortText: new(string(ls.SortTextLocationPriority)), + }, + &lsproto.CompletionItem{ + Label: "metcons", + InsertText: new("metcons(t: T): T {\n}"), + FilterText: new("metcons"), + SortText: new(string(ls.SortTextLocationPriority)), + }, + }, + }, + UserPreferences: &lsutil.UserPreferences{IncludeCompletionsWithSnippetText: core.TSFalse, IncludeCompletionsWithClassMemberSnippets: core.TSTrue}, + }) +} diff --git a/internal/fourslash/tests/gen/completionsOverridingMethod10_test.go b/internal/fourslash/tests/gen/completionsOverridingMethod10_test.go index f4708e037d1..8d0d09a1fc4 100644 --- a/internal/fourslash/tests/gen/completionsOverridingMethod10_test.go +++ b/internal/fourslash/tests/gen/completionsOverridingMethod10_test.go @@ -6,9 +6,11 @@ package fourslash_test import ( "testing" + "github.com/microsoft/typescript-go/internal/core" "github.com/microsoft/typescript-go/internal/fourslash" . "github.com/microsoft/typescript-go/internal/fourslash/tests/util" "github.com/microsoft/typescript-go/internal/ls" + "github.com/microsoft/typescript-go/internal/ls/lsutil" "github.com/microsoft/typescript-go/internal/lsp/lsproto" "github.com/microsoft/typescript-go/internal/testutil" ) @@ -58,5 +60,6 @@ class Sub implements Base { }, }, }, + UserPreferences: &lsutil.UserPreferences{IncludeCompletionsWithSnippetText: core.TSFalse, IncludeCompletionsWithClassMemberSnippets: core.TSTrue}, }) } diff --git a/internal/fourslash/tests/gen/completionsOverridingMethod11_test.go b/internal/fourslash/tests/gen/completionsOverridingMethod11_test.go index d89ba6090bc..671a5171821 100644 --- a/internal/fourslash/tests/gen/completionsOverridingMethod11_test.go +++ b/internal/fourslash/tests/gen/completionsOverridingMethod11_test.go @@ -6,9 +6,11 @@ package fourslash_test import ( "testing" + "github.com/microsoft/typescript-go/internal/core" "github.com/microsoft/typescript-go/internal/fourslash" . "github.com/microsoft/typescript-go/internal/fourslash/tests/util" "github.com/microsoft/typescript-go/internal/ls" + "github.com/microsoft/typescript-go/internal/ls/lsutil" "github.com/microsoft/typescript-go/internal/lsp/lsproto" "github.com/microsoft/typescript-go/internal/testutil" ) @@ -65,5 +67,6 @@ class Sub implements Base { }, }, }, + UserPreferences: &lsutil.UserPreferences{IncludeCompletionsWithSnippetText: core.TSFalse, IncludeCompletionsWithClassMemberSnippets: core.TSTrue}, }) } diff --git a/internal/fourslash/tests/gen/completionsOverridingMethod12_test.go b/internal/fourslash/tests/gen/completionsOverridingMethod12_test.go new file mode 100644 index 00000000000..d807c6fa963 --- /dev/null +++ b/internal/fourslash/tests/gen/completionsOverridingMethod12_test.go @@ -0,0 +1,101 @@ +// Code generated by convertFourslash; DO NOT EDIT. +// To modify this test, run "npm run makemanual completionsOverridingMethod12" + +package fourslash_test + +import ( + "testing" + + "github.com/microsoft/typescript-go/internal/core" + "github.com/microsoft/typescript-go/internal/fourslash" + . "github.com/microsoft/typescript-go/internal/fourslash/tests/util" + "github.com/microsoft/typescript-go/internal/ls" + "github.com/microsoft/typescript-go/internal/ls/lsutil" + "github.com/microsoft/typescript-go/internal/lsp/lsproto" + "github.com/microsoft/typescript-go/internal/testutil" +) + +func TestCompletionsOverridingMethod12(t *testing.T) { + fourslash.SkipIfFailing(t) + t.Parallel() + defer testutil.RecoverAndFail(t, "Panic on fourslash test") + const content = `// @Filename: a.ts +// @newline: LF +abstract class A { + public get P(): string { + return ""; + } +} + +abstract class B extends A { + abstract /*a*/ +} + +abstract class B1 extends A { + abstract override /*b*/ +}` + f, done := fourslash.NewFourslash(t, nil /*capabilities*/, content) + defer done() + f.VerifyCompletions(t, "a", &fourslash.CompletionsExpectedList{ + IsIncomplete: false, + ItemDefaults: &fourslash.CompletionsExpectedItemDefaults{ + CommitCharacters: &[]string{}, + EditRange: Ignored, + }, + Items: &fourslash.CompletionsExpectedItems{ + Includes: []fourslash.CompletionsExpectedItem{ + &lsproto.CompletionItem{ + Label: "P", + InsertText: new("abstract get P(): string;"), + FilterText: new("P"), + SortText: new(string(ls.SortTextLocationPriority)), + AdditionalTextEdits: fourslash.AnyTextEdits, + Data: &lsproto.CompletionItemData{ + Source: "ClassMemberSnippet/", + }, + }, + }, + }, + UserPreferences: &lsutil.UserPreferences{IncludeCompletionsWithSnippetText: core.TSFalse, IncludeCompletionsWithClassMemberSnippets: core.TSTrue}, + }) + f.VerifyCompletions(t, "b", &fourslash.CompletionsExpectedList{ + IsIncomplete: false, + ItemDefaults: &fourslash.CompletionsExpectedItemDefaults{ + CommitCharacters: &[]string{}, + EditRange: Ignored, + }, + Items: &fourslash.CompletionsExpectedItems{ + Includes: []fourslash.CompletionsExpectedItem{ + &lsproto.CompletionItem{ + Label: "P", + InsertText: new("abstract override get P(): string;"), + FilterText: new("P"), + SortText: new(string(ls.SortTextLocationPriority)), + AdditionalTextEdits: fourslash.AnyTextEdits, + Data: &lsproto.CompletionItemData{ + Source: "ClassMemberSnippet/", + }, + }, + }, + }, + UserPreferences: &lsutil.UserPreferences{IncludeCompletionsWithSnippetText: core.TSFalse, IncludeCompletionsWithClassMemberSnippets: core.TSTrue}, + }) + f.VerifyApplyCodeActionFromCompletion(t, new("b"), &fourslash.ApplyCodeActionFromCompletionOptions{ + Name: "P", + Source: "ClassMemberSnippet/", + Description: "Update modifiers of 'P'", + NewFileContent: new(`abstract class A { + public get P(): string { + return ""; + } +} + +abstract class B extends A { + abstract +} + +abstract class B1 extends A { + +}`), + }) +} diff --git a/internal/fourslash/tests/gen/completionsOverridingMethod14_test.go b/internal/fourslash/tests/gen/completionsOverridingMethod14_test.go index 7b97a2be2c8..2feb22bead0 100644 --- a/internal/fourslash/tests/gen/completionsOverridingMethod14_test.go +++ b/internal/fourslash/tests/gen/completionsOverridingMethod14_test.go @@ -6,9 +6,11 @@ package fourslash_test import ( "testing" + "github.com/microsoft/typescript-go/internal/core" "github.com/microsoft/typescript-go/internal/fourslash" . "github.com/microsoft/typescript-go/internal/fourslash/tests/util" "github.com/microsoft/typescript-go/internal/ls" + "github.com/microsoft/typescript-go/internal/ls/lsutil" "github.com/microsoft/typescript-go/internal/lsp/lsproto" "github.com/microsoft/typescript-go/internal/testutil" ) @@ -44,5 +46,6 @@ class Foo implements IFoo { }, }, }, + UserPreferences: &lsutil.UserPreferences{IncludeCompletionsWithSnippetText: core.TSFalse, IncludeCompletionsWithClassMemberSnippets: core.TSTrue}, }) } diff --git a/internal/fourslash/tests/gen/completionsOverridingMethod17_test.go b/internal/fourslash/tests/gen/completionsOverridingMethod17_test.go index bba6ea21eec..ea892883086 100644 --- a/internal/fourslash/tests/gen/completionsOverridingMethod17_test.go +++ b/internal/fourslash/tests/gen/completionsOverridingMethod17_test.go @@ -6,9 +6,11 @@ package fourslash_test import ( "testing" + "github.com/microsoft/typescript-go/internal/core" "github.com/microsoft/typescript-go/internal/fourslash" . "github.com/microsoft/typescript-go/internal/fourslash/tests/util" "github.com/microsoft/typescript-go/internal/ls" + "github.com/microsoft/typescript-go/internal/ls/lsutil" "github.com/microsoft/typescript-go/internal/lsp/lsproto" "github.com/microsoft/typescript-go/internal/testutil" ) @@ -46,5 +48,6 @@ export class Class implements Interface { }, }, }, + UserPreferences: &lsutil.UserPreferences{IncludeCompletionsWithSnippetText: core.TSFalse, IncludeCompletionsWithClassMemberSnippets: core.TSTrue}, }) } diff --git a/internal/fourslash/tests/gen/completionsOverridingMethod18_test.go b/internal/fourslash/tests/gen/completionsOverridingMethod18_test.go new file mode 100644 index 00000000000..5886479107f --- /dev/null +++ b/internal/fourslash/tests/gen/completionsOverridingMethod18_test.go @@ -0,0 +1,75 @@ +// Code generated by convertFourslash; DO NOT EDIT. +// To modify this test, run "npm run makemanual completionsOverridingMethod18" + +package fourslash_test + +import ( + "testing" + + "github.com/microsoft/typescript-go/internal/core" + "github.com/microsoft/typescript-go/internal/fourslash" + . "github.com/microsoft/typescript-go/internal/fourslash/tests/util" + "github.com/microsoft/typescript-go/internal/ls" + "github.com/microsoft/typescript-go/internal/ls/lsutil" + "github.com/microsoft/typescript-go/internal/lsp/lsproto" + "github.com/microsoft/typescript-go/internal/testutil" +) + +func TestCompletionsOverridingMethod18(t *testing.T) { + fourslash.SkipIfFailing(t) + t.Parallel() + defer testutil.RecoverAndFail(t, "Panic on fourslash test") + const content = `// @Filename: a.ts +// @newline: LF +declare function decorator(...args: any[]): any; +class DecoratorBase { + protected foo(a: string): string; + protected foo(a: number): number; + protected foo(a: any): any { + return a; + } +} +class DecoratorSub extends DecoratorBase { + @decorator protected /**/ +}` + f, done := fourslash.NewFourslash(t, nil /*capabilities*/, content) + defer done() + f.VerifyCompletions(t, "", &fourslash.CompletionsExpectedList{ + IsIncomplete: false, + ItemDefaults: &fourslash.CompletionsExpectedItemDefaults{ + CommitCharacters: &[]string{}, + EditRange: Ignored, + }, + Items: &fourslash.CompletionsExpectedItems{ + Includes: []fourslash.CompletionsExpectedItem{ + &lsproto.CompletionItem{ + Label: "foo", + InsertText: new("protected foo(a: string): string;\nprotected foo(a: number): number;\n@decorator\nprotected foo(a: any) {\n}"), + FilterText: new("foo"), + SortText: new(string(ls.SortTextLocationPriority)), + AdditionalTextEdits: fourslash.AnyTextEdits, + Data: &lsproto.CompletionItemData{ + Source: "ClassMemberSnippet/", + }, + }, + }, + }, + UserPreferences: &lsutil.UserPreferences{IncludeCompletionsWithSnippetText: core.TSFalse, IncludeCompletionsWithClassMemberSnippets: core.TSTrue}, + }) + f.VerifyApplyCodeActionFromCompletion(t, new(""), &fourslash.ApplyCodeActionFromCompletionOptions{ + Name: "foo", + Source: "ClassMemberSnippet/", + Description: "Update modifiers of 'foo'", + NewFileContent: new(`declare function decorator(...args: any[]): any; +class DecoratorBase { + protected foo(a: string): string; + protected foo(a: number): number; + protected foo(a: any): any { + return a; + } +} +class DecoratorSub extends DecoratorBase { + +}`), + }) +} diff --git a/internal/fourslash/tests/gen/completionsOverridingMethod19_test.go b/internal/fourslash/tests/gen/completionsOverridingMethod19_test.go new file mode 100644 index 00000000000..c9e83297ca2 --- /dev/null +++ b/internal/fourslash/tests/gen/completionsOverridingMethod19_test.go @@ -0,0 +1,77 @@ +// Code generated by convertFourslash; DO NOT EDIT. +// To modify this test, run "npm run makemanual completionsOverridingMethod19" + +package fourslash_test + +import ( + "testing" + + "github.com/microsoft/typescript-go/internal/core" + "github.com/microsoft/typescript-go/internal/fourslash" + . "github.com/microsoft/typescript-go/internal/fourslash/tests/util" + "github.com/microsoft/typescript-go/internal/ls" + "github.com/microsoft/typescript-go/internal/ls/lsutil" + "github.com/microsoft/typescript-go/internal/lsp/lsproto" + "github.com/microsoft/typescript-go/internal/testutil" +) + +func TestCompletionsOverridingMethod19(t *testing.T) { + fourslash.SkipIfFailing(t) + t.Parallel() + defer testutil.RecoverAndFail(t, "Panic on fourslash test") + const content = `// @Filename: a.ts +// @newline: LF +class Base { + method() {} + protected prop = 1; +} +class E extends Base { + protected notamodifier override /**/ +}` + f, done := fourslash.NewFourslash(t, nil /*capabilities*/, content) + defer done() + f.VerifyCompletions(t, "", &fourslash.CompletionsExpectedList{ + IsIncomplete: false, + ItemDefaults: &fourslash.CompletionsExpectedItemDefaults{ + CommitCharacters: &[]string{}, + EditRange: Ignored, + }, + Items: &fourslash.CompletionsExpectedItems{ + Includes: []fourslash.CompletionsExpectedItem{ + &lsproto.CompletionItem{ + Label: "method", + InsertText: new("override method(): void {\n}"), + FilterText: new("method"), + SortText: new(string(ls.SortTextLocationPriority)), + AdditionalTextEdits: fourslash.AnyTextEdits, + Data: &lsproto.CompletionItemData{ + Source: "ClassMemberSnippet/", + }, + }, + &lsproto.CompletionItem{ + Label: "prop", + InsertText: new("protected override prop: number;"), + FilterText: new("prop"), + SortText: new(string(ls.SortTextLocationPriority)), + AdditionalTextEdits: fourslash.AnyTextEdits, + Data: &lsproto.CompletionItemData{ + Source: "ClassMemberSnippet/", + }, + }, + }, + }, + UserPreferences: &lsutil.UserPreferences{IncludeCompletionsWithSnippetText: core.TSFalse, IncludeCompletionsWithClassMemberSnippets: core.TSTrue}, + }) + f.VerifyApplyCodeActionFromCompletion(t, new(""), &fourslash.ApplyCodeActionFromCompletionOptions{ + Name: "method", + Source: "ClassMemberSnippet/", + Description: "Update modifiers of 'method'", + NewFileContent: new(`class Base { + method() {} + protected prop = 1; +} +class E extends Base { + protected notamodifier +}`), + }) +} diff --git a/internal/fourslash/tests/gen/completionsOverridingMethod1_test.go b/internal/fourslash/tests/gen/completionsOverridingMethod1_test.go index 841afec9518..42f2a72c67b 100644 --- a/internal/fourslash/tests/gen/completionsOverridingMethod1_test.go +++ b/internal/fourslash/tests/gen/completionsOverridingMethod1_test.go @@ -6,9 +6,11 @@ package fourslash_test import ( "testing" + "github.com/microsoft/typescript-go/internal/core" "github.com/microsoft/typescript-go/internal/fourslash" . "github.com/microsoft/typescript-go/internal/fourslash/tests/util" "github.com/microsoft/typescript-go/internal/ls" + "github.com/microsoft/typescript-go/internal/ls/lsutil" "github.com/microsoft/typescript-go/internal/lsp/lsproto" "github.com/microsoft/typescript-go/internal/testutil" ) @@ -45,5 +47,6 @@ class HSub extends HBase { }, }, }, + UserPreferences: &lsutil.UserPreferences{IncludeCompletionsWithSnippetText: core.TSFalse, IncludeCompletionsWithClassMemberSnippets: core.TSTrue}, }) } diff --git a/internal/fourslash/tests/gen/completionsOverridingMethod20_test.go b/internal/fourslash/tests/gen/completionsOverridingMethod20_test.go new file mode 100644 index 00000000000..60c41e6029e --- /dev/null +++ b/internal/fourslash/tests/gen/completionsOverridingMethod20_test.go @@ -0,0 +1,65 @@ +// Code generated by convertFourslash; DO NOT EDIT. +// To modify this test, run "npm run makemanual completionsOverridingMethod20" + +package fourslash_test + +import ( + "testing" + + "github.com/microsoft/typescript-go/internal/core" + "github.com/microsoft/typescript-go/internal/fourslash" + . "github.com/microsoft/typescript-go/internal/fourslash/tests/util" + "github.com/microsoft/typescript-go/internal/ls" + "github.com/microsoft/typescript-go/internal/ls/lsutil" + "github.com/microsoft/typescript-go/internal/lsp/lsproto" + "github.com/microsoft/typescript-go/internal/testutil" +) + +func TestCompletionsOverridingMethod20(t *testing.T) { + fourslash.SkipIfFailing(t) + t.Parallel() + defer testutil.RecoverAndFail(t, "Panic on fourslash test") + const content = `// @Filename: a.ts +// @newline: LF +abstract class AFoo { + abstract bar(): Promise; +} +class Foo extends AFoo { + async b/*a*/ +}` + f, done := fourslash.NewFourslash(t, nil /*capabilities*/, content) + defer done() + f.VerifyCompletions(t, "a", &fourslash.CompletionsExpectedList{ + IsIncomplete: false, + ItemDefaults: &fourslash.CompletionsExpectedItemDefaults{ + CommitCharacters: &[]string{}, + EditRange: Ignored, + }, + Items: &fourslash.CompletionsExpectedItems{ + Includes: []fourslash.CompletionsExpectedItem{ + &lsproto.CompletionItem{ + Label: "bar", + InsertText: new("async bar(): Promise {\n}"), + FilterText: new("bar"), + SortText: new(string(ls.SortTextLocationPriority)), + AdditionalTextEdits: fourslash.AnyTextEdits, + Data: &lsproto.CompletionItemData{ + Source: "ClassMemberSnippet/", + }, + }, + }, + }, + UserPreferences: &lsutil.UserPreferences{IncludeCompletionsWithSnippetText: core.TSFalse, IncludeCompletionsWithClassMemberSnippets: core.TSTrue}, + }) + f.VerifyApplyCodeActionFromCompletion(t, new("a"), &fourslash.ApplyCodeActionFromCompletionOptions{ + Name: "bar", + Source: "ClassMemberSnippet/", + Description: "Update modifiers of 'bar'", + NewFileContent: new(`abstract class AFoo { + abstract bar(): Promise; +} +class Foo extends AFoo { + b +}`), + }) +} diff --git a/internal/fourslash/tests/gen/completionsOverridingMethod21_test.go b/internal/fourslash/tests/gen/completionsOverridingMethod21_test.go new file mode 100644 index 00000000000..32d97326912 --- /dev/null +++ b/internal/fourslash/tests/gen/completionsOverridingMethod21_test.go @@ -0,0 +1,65 @@ +// Code generated by convertFourslash; DO NOT EDIT. +// To modify this test, run "npm run makemanual completionsOverridingMethod21" + +package fourslash_test + +import ( + "testing" + + "github.com/microsoft/typescript-go/internal/core" + "github.com/microsoft/typescript-go/internal/fourslash" + . "github.com/microsoft/typescript-go/internal/fourslash/tests/util" + "github.com/microsoft/typescript-go/internal/ls" + "github.com/microsoft/typescript-go/internal/ls/lsutil" + "github.com/microsoft/typescript-go/internal/lsp/lsproto" + "github.com/microsoft/typescript-go/internal/testutil" +) + +func TestCompletionsOverridingMethod21(t *testing.T) { + fourslash.SkipIfFailing(t) + t.Parallel() + defer testutil.RecoverAndFail(t, "Panic on fourslash test") + const content = `// @Filename: a.ts +// @newline: LF +abstract class AFoo { + abstract bar(): Promise; +} +class BFoo extends AFoo { + async /*b*/ +}` + f, done := fourslash.NewFourslash(t, nil /*capabilities*/, content) + defer done() + f.VerifyCompletions(t, "b", &fourslash.CompletionsExpectedList{ + IsIncomplete: false, + ItemDefaults: &fourslash.CompletionsExpectedItemDefaults{ + CommitCharacters: &[]string{}, + EditRange: Ignored, + }, + Items: &fourslash.CompletionsExpectedItems{ + Includes: []fourslash.CompletionsExpectedItem{ + &lsproto.CompletionItem{ + Label: "bar", + InsertText: new("async bar(): Promise {\n}"), + FilterText: new("bar"), + SortText: new(string(ls.SortTextLocationPriority)), + AdditionalTextEdits: fourslash.AnyTextEdits, + Data: &lsproto.CompletionItemData{ + Source: "ClassMemberSnippet/", + }, + }, + }, + }, + UserPreferences: &lsutil.UserPreferences{IncludeCompletionsWithSnippetText: core.TSFalse, IncludeCompletionsWithClassMemberSnippets: core.TSTrue}, + }) + f.VerifyApplyCodeActionFromCompletion(t, new("b"), &fourslash.ApplyCodeActionFromCompletionOptions{ + Name: "bar", + Source: "ClassMemberSnippet/", + Description: "Update modifiers of 'bar'", + NewFileContent: new(`abstract class AFoo { + abstract bar(): Promise; +} +class BFoo extends AFoo { + +}`), + }) +} diff --git a/internal/fourslash/tests/gen/completionsOverridingMethod22_test.go b/internal/fourslash/tests/gen/completionsOverridingMethod22_test.go new file mode 100644 index 00000000000..c42567ae7cf --- /dev/null +++ b/internal/fourslash/tests/gen/completionsOverridingMethod22_test.go @@ -0,0 +1,67 @@ +// Code generated by convertFourslash; DO NOT EDIT. +// To modify this test, run "npm run makemanual completionsOverridingMethod22" + +package fourslash_test + +import ( + "testing" + + "github.com/microsoft/typescript-go/internal/core" + "github.com/microsoft/typescript-go/internal/fourslash" + . "github.com/microsoft/typescript-go/internal/fourslash/tests/util" + "github.com/microsoft/typescript-go/internal/ls" + "github.com/microsoft/typescript-go/internal/ls/lsutil" + "github.com/microsoft/typescript-go/internal/lsp/lsproto" + "github.com/microsoft/typescript-go/internal/testutil" +) + +func TestCompletionsOverridingMethod22(t *testing.T) { + fourslash.SkipIfFailing(t) + t.Parallel() + defer testutil.RecoverAndFail(t, "Panic on fourslash test") + const content = `// @newline: LF +// @Filename: b.ts +export type C = { x: number } +export interface ExtShape { + $returnPromise(id: number): Promise; + $return(id: number): C; +} +// @Filename: test.ts +import { ExtShape } from './b'; +abstract class ExtBase implements ExtShape { + public $/**/ +}` + f, done := fourslash.NewFourslash(t, nil /*capabilities*/, content) + defer done() + f.VerifyCompletions(t, "", &fourslash.CompletionsExpectedList{ + IsIncomplete: false, + ItemDefaults: &fourslash.CompletionsExpectedItemDefaults{ + CommitCharacters: &[]string{}, + EditRange: Ignored, + }, + Items: &fourslash.CompletionsExpectedItems{ + Includes: []fourslash.CompletionsExpectedItem{ + &lsproto.CompletionItem{ + Label: "$returnPromise", + InsertText: new("public \\$returnPromise(id: number): Promise {\n}"), + FilterText: new("$returnPromise"), + SortText: new(string(ls.SortTextLocationPriority)), + AdditionalTextEdits: fourslash.AnyTextEdits, + Data: &lsproto.CompletionItemData{ + Source: "ClassMemberSnippet/", + }, + }, + }, + }, + UserPreferences: &lsutil.UserPreferences{IncludeCompletionsWithSnippetText: core.TSFalse, IncludeCompletionsWithClassMemberSnippets: core.TSTrue}, + }) + f.VerifyApplyCodeActionFromCompletion(t, new(""), &fourslash.ApplyCodeActionFromCompletionOptions{ + Name: "$returnPromise", + Source: "ClassMemberSnippet/", + Description: "Includes imports of types referenced by '$returnPromise'", + NewFileContent: new(`import { C, ExtShape } from './b'; +abstract class ExtBase implements ExtShape { + $ +}`), + }) +} diff --git a/internal/fourslash/tests/gen/completionsOverridingMethod2_test.go b/internal/fourslash/tests/gen/completionsOverridingMethod2_test.go index 4c3da16df54..54db90cd6c9 100644 --- a/internal/fourslash/tests/gen/completionsOverridingMethod2_test.go +++ b/internal/fourslash/tests/gen/completionsOverridingMethod2_test.go @@ -6,9 +6,11 @@ package fourslash_test import ( "testing" + "github.com/microsoft/typescript-go/internal/core" "github.com/microsoft/typescript-go/internal/fourslash" . "github.com/microsoft/typescript-go/internal/fourslash/tests/util" "github.com/microsoft/typescript-go/internal/ls" + "github.com/microsoft/typescript-go/internal/ls/lsutil" "github.com/microsoft/typescript-go/internal/lsp/lsproto" "github.com/microsoft/typescript-go/internal/testutil" ) @@ -68,5 +70,6 @@ class USD implements DollarSign { }, }, }, + UserPreferences: &lsutil.UserPreferences{IncludeCompletionsWithSnippetText: core.TSTrue, IncludeCompletionsWithClassMemberSnippets: core.TSTrue}, }) } diff --git a/internal/fourslash/tests/gen/completionsOverridingMethod3_test.go b/internal/fourslash/tests/gen/completionsOverridingMethod3_test.go index 022109aec92..303035ca4c8 100644 --- a/internal/fourslash/tests/gen/completionsOverridingMethod3_test.go +++ b/internal/fourslash/tests/gen/completionsOverridingMethod3_test.go @@ -6,9 +6,11 @@ package fourslash_test import ( "testing" + "github.com/microsoft/typescript-go/internal/core" "github.com/microsoft/typescript-go/internal/fourslash" . "github.com/microsoft/typescript-go/internal/fourslash/tests/util" "github.com/microsoft/typescript-go/internal/ls" + "github.com/microsoft/typescript-go/internal/ls/lsutil" "github.com/microsoft/typescript-go/internal/lsp/lsproto" "github.com/microsoft/typescript-go/internal/testutil" ) @@ -44,5 +46,6 @@ declare class Poltergeist implements Ghost { }, }, }, + UserPreferences: &lsutil.UserPreferences{IncludeCompletionsWithSnippetText: core.TSFalse, IncludeCompletionsWithClassMemberSnippets: core.TSTrue}, }) } diff --git a/internal/fourslash/tests/gen/completionsOverridingMethod4_test.go b/internal/fourslash/tests/gen/completionsOverridingMethod4_test.go index 458570dbe42..18c9cf34c5d 100644 --- a/internal/fourslash/tests/gen/completionsOverridingMethod4_test.go +++ b/internal/fourslash/tests/gen/completionsOverridingMethod4_test.go @@ -6,9 +6,11 @@ package fourslash_test import ( "testing" + "github.com/microsoft/typescript-go/internal/core" "github.com/microsoft/typescript-go/internal/fourslash" . "github.com/microsoft/typescript-go/internal/fourslash/tests/util" "github.com/microsoft/typescript-go/internal/ls" + "github.com/microsoft/typescript-go/internal/ls/lsutil" "github.com/microsoft/typescript-go/internal/lsp/lsproto" "github.com/microsoft/typescript-go/internal/testutil" ) @@ -69,5 +71,6 @@ class Gossip extends Secret { "#secret", }, }, + UserPreferences: &lsutil.UserPreferences{IncludeCompletionsWithSnippetText: core.TSFalse, IncludeCompletionsWithClassMemberSnippets: core.TSTrue}, }) } diff --git a/internal/fourslash/tests/gen/completionsOverridingMethod5_test.go b/internal/fourslash/tests/gen/completionsOverridingMethod5_test.go new file mode 100644 index 00000000000..6c25068c9e4 --- /dev/null +++ b/internal/fourslash/tests/gen/completionsOverridingMethod5_test.go @@ -0,0 +1,126 @@ +// Code generated by convertFourslash; DO NOT EDIT. +// To modify this test, run "npm run makemanual completionsOverridingMethod5" + +package fourslash_test + +import ( + "testing" + + "github.com/microsoft/typescript-go/internal/core" + "github.com/microsoft/typescript-go/internal/fourslash" + . "github.com/microsoft/typescript-go/internal/fourslash/tests/util" + "github.com/microsoft/typescript-go/internal/ls" + "github.com/microsoft/typescript-go/internal/ls/lsutil" + "github.com/microsoft/typescript-go/internal/lsp/lsproto" + "github.com/microsoft/typescript-go/internal/testutil" +) + +func TestCompletionsOverridingMethod5(t *testing.T) { + fourslash.SkipIfFailing(t) + t.Parallel() + defer testutil.RecoverAndFail(t, "Panic on fourslash test") + const content = `// @newline: LF +// @Filename: a.ts +abstract class Ab { + abstract met(n: string): void; + met2(n: number): void { + return; + } +} + +abstract class Abc extends Ab { + /*a*/ + abstract /*b*/ + abstract m/*c*/ +}` + f, done := fourslash.NewFourslash(t, nil /*capabilities*/, content) + defer done() + f.VerifyCompletions(t, "a", &fourslash.CompletionsExpectedList{ + IsIncomplete: false, + ItemDefaults: &fourslash.CompletionsExpectedItemDefaults{ + CommitCharacters: &[]string{}, + EditRange: Ignored, + }, + Items: &fourslash.CompletionsExpectedItems{ + Includes: []fourslash.CompletionsExpectedItem{ + &lsproto.CompletionItem{ + Label: "met", + InsertText: new("met(n: string): void {\n}"), + FilterText: new("met"), + SortText: new(string(ls.SortTextLocationPriority)), + }, + &lsproto.CompletionItem{ + Label: "met2", + InsertText: new("met2(n: number): void {\n}"), + FilterText: new("met2"), + SortText: new(string(ls.SortTextLocationPriority)), + }, + }, + }, + UserPreferences: &lsutil.UserPreferences{IncludeCompletionsWithSnippetText: core.TSFalse, IncludeCompletionsWithClassMemberSnippets: core.TSTrue}, + }) + f.VerifyCompletions(t, "b", &fourslash.CompletionsExpectedList{ + IsIncomplete: false, + ItemDefaults: &fourslash.CompletionsExpectedItemDefaults{ + CommitCharacters: &[]string{}, + EditRange: Ignored, + }, + Items: &fourslash.CompletionsExpectedItems{ + Includes: []fourslash.CompletionsExpectedItem{ + &lsproto.CompletionItem{ + Label: "met", + InsertText: new("abstract met(n: string): void;"), + FilterText: new("met"), + SortText: new(string(ls.SortTextLocationPriority)), + AdditionalTextEdits: fourslash.AnyTextEdits, + Data: &lsproto.CompletionItemData{ + Source: "ClassMemberSnippet/", + }, + }, + &lsproto.CompletionItem{ + Label: "met2", + InsertText: new("abstract met2(n: number): void;"), + FilterText: new("met2"), + SortText: new(string(ls.SortTextLocationPriority)), + AdditionalTextEdits: fourslash.AnyTextEdits, + Data: &lsproto.CompletionItemData{ + Source: "ClassMemberSnippet/", + }, + }, + }, + }, + UserPreferences: &lsutil.UserPreferences{IncludeCompletionsWithSnippetText: core.TSFalse, IncludeCompletionsWithClassMemberSnippets: core.TSTrue}, + }) + f.VerifyCompletions(t, "c", &fourslash.CompletionsExpectedList{ + IsIncomplete: false, + ItemDefaults: &fourslash.CompletionsExpectedItemDefaults{ + CommitCharacters: &[]string{}, + EditRange: Ignored, + }, + Items: &fourslash.CompletionsExpectedItems{ + Includes: []fourslash.CompletionsExpectedItem{ + &lsproto.CompletionItem{ + Label: "met", + InsertText: new("abstract met(n: string): void;"), + FilterText: new("met"), + SortText: new(string(ls.SortTextLocationPriority)), + AdditionalTextEdits: fourslash.AnyTextEdits, + Data: &lsproto.CompletionItemData{ + Source: "ClassMemberSnippet/", + }, + }, + &lsproto.CompletionItem{ + Label: "met2", + InsertText: new("abstract met2(n: number): void;"), + FilterText: new("met2"), + SortText: new(string(ls.SortTextLocationPriority)), + AdditionalTextEdits: fourslash.AnyTextEdits, + Data: &lsproto.CompletionItemData{ + Source: "ClassMemberSnippet/", + }, + }, + }, + }, + UserPreferences: &lsutil.UserPreferences{IncludeCompletionsWithSnippetText: core.TSFalse, IncludeCompletionsWithClassMemberSnippets: core.TSTrue}, + }) +} diff --git a/internal/fourslash/tests/gen/completionsOverridingMethod6_test.go b/internal/fourslash/tests/gen/completionsOverridingMethod6_test.go new file mode 100644 index 00000000000..05b564a1b26 --- /dev/null +++ b/internal/fourslash/tests/gen/completionsOverridingMethod6_test.go @@ -0,0 +1,180 @@ +// Code generated by convertFourslash; DO NOT EDIT. +// To modify this test, run "npm run makemanual completionsOverridingMethod6" + +package fourslash_test + +import ( + "testing" + + "github.com/microsoft/typescript-go/internal/core" + "github.com/microsoft/typescript-go/internal/fourslash" + . "github.com/microsoft/typescript-go/internal/fourslash/tests/util" + "github.com/microsoft/typescript-go/internal/ls" + "github.com/microsoft/typescript-go/internal/ls/lsutil" + "github.com/microsoft/typescript-go/internal/lsp/lsproto" + "github.com/microsoft/typescript-go/internal/testutil" +) + +func TestCompletionsOverridingMethod6(t *testing.T) { + fourslash.SkipIfFailing(t) + t.Parallel() + defer testutil.RecoverAndFail(t, "Panic on fourslash test") + const content = `// @Filename: a.ts +// @newline: LF +class Base { + method() {} + protected prop = 1; +} +class A extends Base { + public abstract /*a*/ +} +abstract class Ab extends Base { + public abstract /*b*/ +} +class B extends Base { + public override m/*c*/ +} +class C extends Base { + override /*d*/ +} +class f extends Base { + protected /*f*/ +}` + f, done := fourslash.NewFourslash(t, nil /*capabilities*/, content) + defer done() + f.VerifyCompletions(t, "a", &fourslash.CompletionsExpectedList{ + IsIncomplete: false, + ItemDefaults: &fourslash.CompletionsExpectedItemDefaults{ + CommitCharacters: &[]string{}, + EditRange: Ignored, + }, + Items: &fourslash.CompletionsExpectedItems{ + Excludes: []string{ + "method", + "prop", + }, + }, + UserPreferences: &lsutil.UserPreferences{IncludeCompletionsWithSnippetText: core.TSFalse, IncludeCompletionsWithClassMemberSnippets: core.TSTrue}, + }) + f.VerifyCompletions(t, "b", &fourslash.CompletionsExpectedList{ + IsIncomplete: false, + ItemDefaults: &fourslash.CompletionsExpectedItemDefaults{ + CommitCharacters: &[]string{}, + EditRange: Ignored, + }, + Items: &fourslash.CompletionsExpectedItems{ + Includes: []fourslash.CompletionsExpectedItem{ + &lsproto.CompletionItem{ + Label: "method", + InsertText: new("public abstract method(): void;"), + FilterText: new("method"), + SortText: new(string(ls.SortTextLocationPriority)), + AdditionalTextEdits: fourslash.AnyTextEdits, + Data: &lsproto.CompletionItemData{ + Source: "ClassMemberSnippet/", + }, + }, + &lsproto.CompletionItem{ + Label: "prop", + InsertText: new("public abstract prop: number;"), + FilterText: new("prop"), + SortText: new(string(ls.SortTextLocationPriority)), + AdditionalTextEdits: fourslash.AnyTextEdits, + Data: &lsproto.CompletionItemData{ + Source: "ClassMemberSnippet/", + }, + }, + }, + }, + UserPreferences: &lsutil.UserPreferences{IncludeCompletionsWithSnippetText: core.TSFalse, IncludeCompletionsWithClassMemberSnippets: core.TSTrue}, + }) + f.VerifyCompletions(t, "c", &fourslash.CompletionsExpectedList{ + IsIncomplete: false, + ItemDefaults: &fourslash.CompletionsExpectedItemDefaults{ + CommitCharacters: &[]string{}, + EditRange: Ignored, + }, + Items: &fourslash.CompletionsExpectedItems{ + Includes: []fourslash.CompletionsExpectedItem{ + &lsproto.CompletionItem{ + Label: "method", + InsertText: new("public override method(): void {\n}"), + FilterText: new("method"), + SortText: new(string(ls.SortTextLocationPriority)), + AdditionalTextEdits: fourslash.AnyTextEdits, + Data: &lsproto.CompletionItemData{ + Source: "ClassMemberSnippet/", + }, + }, + &lsproto.CompletionItem{ + Label: "prop", + InsertText: new("public override prop: number;"), + FilterText: new("prop"), + SortText: new(string(ls.SortTextLocationPriority)), + AdditionalTextEdits: fourslash.AnyTextEdits, + Data: &lsproto.CompletionItemData{ + Source: "ClassMemberSnippet/", + }, + }, + }, + }, + UserPreferences: &lsutil.UserPreferences{IncludeCompletionsWithSnippetText: core.TSFalse, IncludeCompletionsWithClassMemberSnippets: core.TSTrue}, + }) + f.VerifyCompletions(t, "d", &fourslash.CompletionsExpectedList{ + IsIncomplete: false, + ItemDefaults: &fourslash.CompletionsExpectedItemDefaults{ + CommitCharacters: &[]string{}, + EditRange: Ignored, + }, + Items: &fourslash.CompletionsExpectedItems{ + Includes: []fourslash.CompletionsExpectedItem{ + &lsproto.CompletionItem{ + Label: "method", + InsertText: new("override method(): void {\n}"), + FilterText: new("method"), + SortText: new(string(ls.SortTextLocationPriority)), + AdditionalTextEdits: fourslash.AnyTextEdits, + Data: &lsproto.CompletionItemData{ + Source: "ClassMemberSnippet/", + }, + }, + &lsproto.CompletionItem{ + Label: "prop", + InsertText: new("protected override prop: number;"), + FilterText: new("prop"), + SortText: new(string(ls.SortTextLocationPriority)), + AdditionalTextEdits: fourslash.AnyTextEdits, + Data: &lsproto.CompletionItemData{ + Source: "ClassMemberSnippet/", + }, + }, + }, + }, + UserPreferences: &lsutil.UserPreferences{IncludeCompletionsWithSnippetText: core.TSFalse, IncludeCompletionsWithClassMemberSnippets: core.TSTrue}, + }) + f.VerifyCompletions(t, "f", &fourslash.CompletionsExpectedList{ + IsIncomplete: false, + ItemDefaults: &fourslash.CompletionsExpectedItemDefaults{ + CommitCharacters: &[]string{}, + EditRange: Ignored, + }, + Items: &fourslash.CompletionsExpectedItems{ + Includes: []fourslash.CompletionsExpectedItem{ + &lsproto.CompletionItem{ + Label: "prop", + InsertText: new("protected prop: number;"), + FilterText: new("prop"), + SortText: new(string(ls.SortTextLocationPriority)), + AdditionalTextEdits: fourslash.AnyTextEdits, + Data: &lsproto.CompletionItemData{ + Source: "ClassMemberSnippet/", + }, + }, + }, + Excludes: []string{ + "method", + }, + }, + UserPreferences: &lsutil.UserPreferences{IncludeCompletionsWithSnippetText: core.TSFalse, IncludeCompletionsWithClassMemberSnippets: core.TSTrue}, + }) +} diff --git a/internal/fourslash/tests/gen/completionsOverridingMethod7_test.go b/internal/fourslash/tests/gen/completionsOverridingMethod7_test.go new file mode 100644 index 00000000000..8f2c919ffb1 --- /dev/null +++ b/internal/fourslash/tests/gen/completionsOverridingMethod7_test.go @@ -0,0 +1,69 @@ +// Code generated by convertFourslash; DO NOT EDIT. +// To modify this test, run "npm run makemanual completionsOverridingMethod7" + +package fourslash_test + +import ( + "testing" + + "github.com/microsoft/typescript-go/internal/core" + "github.com/microsoft/typescript-go/internal/fourslash" + . "github.com/microsoft/typescript-go/internal/fourslash/tests/util" + "github.com/microsoft/typescript-go/internal/ls" + "github.com/microsoft/typescript-go/internal/ls/lsutil" + "github.com/microsoft/typescript-go/internal/lsp/lsproto" + "github.com/microsoft/typescript-go/internal/testutil" +) + +func TestCompletionsOverridingMethod7(t *testing.T) { + fourslash.SkipIfFailing(t) + t.Parallel() + defer testutil.RecoverAndFail(t, "Panic on fourslash test") + const content = `// @Filename: a.ts +// @newline: LF +abstract class Base { + abstract M(t: T): void; + abstract M(t: T, x: number): void; +} + +abstract class Derived extends Base { + abstract /*a*/ +}` + f, done := fourslash.NewFourslash(t, nil /*capabilities*/, content) + defer done() + f.VerifyCompletions(t, "a", &fourslash.CompletionsExpectedList{ + IsIncomplete: false, + ItemDefaults: &fourslash.CompletionsExpectedItemDefaults{ + CommitCharacters: &[]string{}, + EditRange: Ignored, + }, + Items: &fourslash.CompletionsExpectedItems{ + Includes: []fourslash.CompletionsExpectedItem{ + &lsproto.CompletionItem{ + Label: "M", + InsertText: new("abstract M(t: T): void;\nabstract M(t: T, x: number): void;"), + FilterText: new("M"), + SortText: new(string(ls.SortTextLocationPriority)), + AdditionalTextEdits: fourslash.AnyTextEdits, + Data: &lsproto.CompletionItemData{ + Source: "ClassMemberSnippet/", + }, + }, + }, + }, + UserPreferences: &lsutil.UserPreferences{IncludeCompletionsWithSnippetText: core.TSFalse, IncludeCompletionsWithClassMemberSnippets: core.TSTrue}, + }) + f.VerifyApplyCodeActionFromCompletion(t, new("a"), &fourslash.ApplyCodeActionFromCompletionOptions{ + Name: "M", + Source: "ClassMemberSnippet/", + Description: "Update modifiers of 'M'", + NewFileContent: new(`abstract class Base { + abstract M(t: T): void; + abstract M(t: T, x: number): void; +} + +abstract class Derived extends Base { + +}`), + }) +} diff --git a/internal/fourslash/tests/gen/completionsOverridingMethod8_test.go b/internal/fourslash/tests/gen/completionsOverridingMethod8_test.go new file mode 100644 index 00000000000..8ccb7cb1c8b --- /dev/null +++ b/internal/fourslash/tests/gen/completionsOverridingMethod8_test.go @@ -0,0 +1,68 @@ +// Code generated by convertFourslash; DO NOT EDIT. +// To modify this test, run "npm run makemanual completionsOverridingMethod8" + +package fourslash_test + +import ( + "testing" + + "github.com/microsoft/typescript-go/internal/core" + "github.com/microsoft/typescript-go/internal/fourslash" + . "github.com/microsoft/typescript-go/internal/fourslash/tests/util" + "github.com/microsoft/typescript-go/internal/ls" + "github.com/microsoft/typescript-go/internal/ls/lsutil" + "github.com/microsoft/typescript-go/internal/lsp/lsproto" + "github.com/microsoft/typescript-go/internal/testutil" +) + +func TestCompletionsOverridingMethod8(t *testing.T) { + fourslash.SkipIfFailing(t) + t.Parallel() + defer testutil.RecoverAndFail(t, "Panic on fourslash test") + const content = `// @newline: LF +// @Filename: /types1.ts +export interface I { foo: string } +// @Filename: /types2.ts +import { I } from "./types1"; +export interface Base { method(p: I): void } +// @Filename: /index.ts +import { Base } from "./types2"; +export class C implements Base { + /**/ +}` + f, done := fourslash.NewFourslash(t, nil /*capabilities*/, content) + defer done() + f.GoToMarker(t, "") + f.VerifyCompletions(t, "", &fourslash.CompletionsExpectedList{ + IsIncomplete: false, + ItemDefaults: &fourslash.CompletionsExpectedItemDefaults{ + CommitCharacters: &[]string{}, + EditRange: Ignored, + }, + Items: &fourslash.CompletionsExpectedItems{ + Includes: []fourslash.CompletionsExpectedItem{ + &lsproto.CompletionItem{ + Label: "method", + InsertText: new("method(p: I): void {\n}"), + FilterText: new("method"), + SortText: new(string(ls.SortTextLocationPriority)), + AdditionalTextEdits: fourslash.AnyTextEdits, + Data: &lsproto.CompletionItemData{ + Source: "ClassMemberSnippet/", + }, + }, + }, + }, + UserPreferences: &lsutil.UserPreferences{IncludeCompletionsWithSnippetText: core.TSFalse, IncludeCompletionsWithClassMemberSnippets: core.TSTrue}, + }) + f.VerifyApplyCodeActionFromCompletion(t, new(""), &fourslash.ApplyCodeActionFromCompletionOptions{ + Name: "method", + Source: "ClassMemberSnippet/", + Description: "Includes imports of types referenced by 'method'", + NewFileContent: new(`import { I } from "./types1"; +import { Base } from "./types2"; +export class C implements Base { + +}`), + }) +} diff --git a/internal/fourslash/tests/gen/completionsOverridingMethod9_test.go b/internal/fourslash/tests/gen/completionsOverridingMethod9_test.go index 756fb9d1a18..29af539d281 100644 --- a/internal/fourslash/tests/gen/completionsOverridingMethod9_test.go +++ b/internal/fourslash/tests/gen/completionsOverridingMethod9_test.go @@ -6,9 +6,11 @@ package fourslash_test import ( "testing" + "github.com/microsoft/typescript-go/internal/core" "github.com/microsoft/typescript-go/internal/fourslash" . "github.com/microsoft/typescript-go/internal/fourslash/tests/util" "github.com/microsoft/typescript-go/internal/ls" + "github.com/microsoft/typescript-go/internal/ls/lsutil" "github.com/microsoft/typescript-go/internal/lsp/lsproto" "github.com/microsoft/typescript-go/internal/testutil" ) @@ -51,5 +53,6 @@ class Foo implements IFoo { }, }, }, + UserPreferences: &lsutil.UserPreferences{IncludeCompletionsWithSnippetText: core.TSFalse, IncludeCompletionsWithClassMemberSnippets: core.TSTrue}, }) } diff --git a/internal/fourslash/tests/gen/completionsOverridingMethodCrash1_test.go b/internal/fourslash/tests/gen/completionsOverridingMethodCrash1_test.go index a0dddb614e0..fb3e15df50a 100644 --- a/internal/fourslash/tests/gen/completionsOverridingMethodCrash1_test.go +++ b/internal/fourslash/tests/gen/completionsOverridingMethodCrash1_test.go @@ -6,9 +6,11 @@ package fourslash_test import ( "testing" + "github.com/microsoft/typescript-go/internal/core" "github.com/microsoft/typescript-go/internal/fourslash" . "github.com/microsoft/typescript-go/internal/fourslash/tests/util" "github.com/microsoft/typescript-go/internal/ls" + "github.com/microsoft/typescript-go/internal/ls/lsutil" "github.com/microsoft/typescript-go/internal/lsp/lsproto" "github.com/microsoft/typescript-go/internal/testutil" ) @@ -44,5 +46,6 @@ class SubComponent extends Component<{}> { }, }, }, + UserPreferences: &lsutil.UserPreferences{IncludeCompletionsWithSnippetText: core.TSFalse, IncludeCompletionsWithClassMemberSnippets: core.TSTrue}, }) } diff --git a/internal/fourslash/tests/gen/completionsOverridingMethodCrash2_test.go b/internal/fourslash/tests/gen/completionsOverridingMethodCrash2_test.go new file mode 100644 index 00000000000..7fc4812186e --- /dev/null +++ b/internal/fourslash/tests/gen/completionsOverridingMethodCrash2_test.go @@ -0,0 +1,96 @@ +// Code generated by convertFourslash; DO NOT EDIT. +// To modify this test, run "npm run makemanual completionsOverridingMethodCrash2" + +package fourslash_test + +import ( + "testing" + + "github.com/microsoft/typescript-go/internal/core" + "github.com/microsoft/typescript-go/internal/fourslash" + . "github.com/microsoft/typescript-go/internal/fourslash/tests/util" + "github.com/microsoft/typescript-go/internal/ls" + "github.com/microsoft/typescript-go/internal/ls/lsutil" + "github.com/microsoft/typescript-go/internal/lsp/lsproto" + "github.com/microsoft/typescript-go/internal/testutil" +) + +func TestCompletionsOverridingMethodCrash2(t *testing.T) { + fourslash.SkipIfFailing(t) + t.Parallel() + defer testutil.RecoverAndFail(t, "Panic on fourslash test") + const content = `// @Filename: /home/src/workspaces/project/tsconfig.json +{ + "compilerOptions": { + "module": "nodenext", + "lib": ["es5"] + } +} +// @Filename: /home/src/workspaces/project/utils.ts +export class Element { + // ... +} + +export abstract class Component { + abstract render(): Element; +} +// @Filename: /home/src/workspaces/project/classes.ts +import { Component } from "./utils.js"; + +export class MyComponent extends Component { + render/**/ +}` + f, done := fourslash.NewFourslash(t, nil /*capabilities*/, content) + defer done() + f.MarkTestAsStradaServer() + f.GoToMarker(t, "") + f.VerifyCompletions(t, "", &fourslash.CompletionsExpectedList{ + IsIncomplete: false, + ItemDefaults: &fourslash.CompletionsExpectedItemDefaults{ + CommitCharacters: &[]string{}, + EditRange: Ignored, + }, + Items: &fourslash.CompletionsExpectedItems{ + Includes: []fourslash.CompletionsExpectedItem{ + &lsproto.CompletionItem{ + Label: "render", + InsertText: new("render(): Element {\r\n $0\r\n}"), + FilterText: new("render"), + SortText: new(string(ls.SortTextLocationPriority)), + InsertTextFormat: new(lsproto.InsertTextFormatSnippet), + AdditionalTextEdits: fourslash.AnyTextEdits, + Data: &lsproto.CompletionItemData{ + Source: "ClassMemberSnippet/", + }, + }, + }, + }, + UserPreferences: &lsutil.UserPreferences{IncludeCompletionsWithSnippetText: core.TSTrue, IncludeCompletionsWithClassMemberSnippets: core.TSTrue}, + }) + f.GoToFile(t, "/home/src/workspaces/project/utils.ts") + f.GoToMarker(t, "") + f.Backspace(t, 1) + f.VerifyCompletions(t, "", &fourslash.CompletionsExpectedList{ + IsIncomplete: false, + ItemDefaults: &fourslash.CompletionsExpectedItemDefaults{ + CommitCharacters: &[]string{}, + EditRange: Ignored, + }, + Items: &fourslash.CompletionsExpectedItems{ + Includes: []fourslash.CompletionsExpectedItem{ + &lsproto.CompletionItem{ + Label: "render", + InsertText: new("render(): Element {\r\n $0\r\n}"), + FilterText: new("render"), + SortText: new(string(ls.SortTextLocationPriority)), + InsertTextFormat: new(lsproto.InsertTextFormatSnippet), + AdditionalTextEdits: fourslash.AnyTextEdits, + Data: &lsproto.CompletionItemData{ + Source: "ClassMemberSnippet/", + }, + }, + }, + }, + UserPreferences: &lsutil.UserPreferences{IncludeCompletionsWithSnippetText: core.TSTrue, IncludeCompletionsWithClassMemberSnippets: core.TSTrue}, + }) +} diff --git a/internal/fourslash/tests/gen/completionsOverridingMethodDefaultExported_test.go b/internal/fourslash/tests/gen/completionsOverridingMethodDefaultExported_test.go new file mode 100644 index 00000000000..356b7d8b100 --- /dev/null +++ b/internal/fourslash/tests/gen/completionsOverridingMethodDefaultExported_test.go @@ -0,0 +1,60 @@ +// Code generated by convertFourslash; DO NOT EDIT. +// To modify this test, run "npm run makemanual completionsOverridingMethodDefaultExported" + +package fourslash_test + +import ( + "testing" + + "github.com/microsoft/typescript-go/internal/core" + "github.com/microsoft/typescript-go/internal/fourslash" + . "github.com/microsoft/typescript-go/internal/fourslash/tests/util" + "github.com/microsoft/typescript-go/internal/ls" + "github.com/microsoft/typescript-go/internal/ls/lsutil" + "github.com/microsoft/typescript-go/internal/lsp/lsproto" + "github.com/microsoft/typescript-go/internal/testutil" +) + +func TestCompletionsOverridingMethodDefaultExported(t *testing.T) { + fourslash.SkipIfFailing(t) + t.Parallel() + defer testutil.RecoverAndFail(t, "Panic on fourslash test") + const content = `// @filename: other.ts +export default class Other {} +// @filename: base.ts +import Other from "./other"; +export class Base { + foo(): Other { + throw new Error(""); + } +} +// @filename: derived.ts +import { Base } from "./base"; +export class Derived extends Base { + /**/ +}` + f, done := fourslash.NewFourslash(t, nil /*capabilities*/, content) + defer done() + f.VerifyCompletions(t, "", &fourslash.CompletionsExpectedList{ + IsIncomplete: false, + ItemDefaults: &fourslash.CompletionsExpectedItemDefaults{ + CommitCharacters: &[]string{}, + EditRange: Ignored, + }, + Items: &fourslash.CompletionsExpectedItems{ + Includes: []fourslash.CompletionsExpectedItem{ + &lsproto.CompletionItem{ + Label: "foo", + InsertText: new("foo(): Other {\n}"), + FilterText: new("foo"), + SortText: new(string(ls.SortTextLocationPriority)), + AdditionalTextEdits: fourslash.AnyTextEdits, + Data: &lsproto.CompletionItemData{ + Source: "ClassMemberSnippet/", + }, + }, + }, + }, + UserPreferences: &lsutil.UserPreferences{IncludeCompletionsWithClassMemberSnippets: core.TSTrue}, + }) +} diff --git a/internal/fourslash/tests/gen/completionsOverridingProperties1_test.go b/internal/fourslash/tests/gen/completionsOverridingProperties1_test.go index 0f6cb5917a6..eade37313c6 100644 --- a/internal/fourslash/tests/gen/completionsOverridingProperties1_test.go +++ b/internal/fourslash/tests/gen/completionsOverridingProperties1_test.go @@ -6,9 +6,11 @@ package fourslash_test import ( "testing" + "github.com/microsoft/typescript-go/internal/core" "github.com/microsoft/typescript-go/internal/fourslash" . "github.com/microsoft/typescript-go/internal/fourslash/tests/util" "github.com/microsoft/typescript-go/internal/ls" + "github.com/microsoft/typescript-go/internal/ls/lsutil" "github.com/microsoft/typescript-go/internal/lsp/lsproto" "github.com/microsoft/typescript-go/internal/testutil" ) @@ -44,5 +46,6 @@ class Sub extends Base { }, }, }, + UserPreferences: &lsutil.UserPreferences{IncludeCompletionsWithSnippetText: core.TSFalse, IncludeCompletionsWithClassMemberSnippets: core.TSTrue}, }) } diff --git a/internal/fourslash/tests/gen/completionsOverridingProperties2_test.go b/internal/fourslash/tests/gen/completionsOverridingProperties2_test.go index 7cc374bd4a5..e8747983bd5 100644 --- a/internal/fourslash/tests/gen/completionsOverridingProperties2_test.go +++ b/internal/fourslash/tests/gen/completionsOverridingProperties2_test.go @@ -6,8 +6,10 @@ package fourslash_test import ( "testing" + "github.com/microsoft/typescript-go/internal/core" "github.com/microsoft/typescript-go/internal/fourslash" . "github.com/microsoft/typescript-go/internal/fourslash/tests/util" + "github.com/microsoft/typescript-go/internal/ls/lsutil" "github.com/microsoft/typescript-go/internal/lsp/lsproto" "github.com/microsoft/typescript-go/internal/testutil" ) @@ -37,5 +39,6 @@ class C implements I { }, }, }, + UserPreferences: &lsutil.UserPreferences{IncludeCompletionsWithSnippetText: core.TSTrue, IncludeCompletionsWithClassMemberSnippets: core.TSTrue}, }) } diff --git a/internal/fourslash/tests/gen/completionsOverridingProperties3_test.go b/internal/fourslash/tests/gen/completionsOverridingProperties3_test.go index 57bff440c62..5bc1d4605fc 100644 --- a/internal/fourslash/tests/gen/completionsOverridingProperties3_test.go +++ b/internal/fourslash/tests/gen/completionsOverridingProperties3_test.go @@ -6,8 +6,10 @@ package fourslash_test import ( "testing" + "github.com/microsoft/typescript-go/internal/core" "github.com/microsoft/typescript-go/internal/fourslash" . "github.com/microsoft/typescript-go/internal/fourslash/tests/util" + "github.com/microsoft/typescript-go/internal/ls/lsutil" "github.com/microsoft/typescript-go/internal/lsp/lsproto" "github.com/microsoft/typescript-go/internal/testutil" ) @@ -37,5 +39,6 @@ class C implements I { }, }, }, + UserPreferences: &lsutil.UserPreferences{IncludeCompletionsWithSnippetText: core.TSTrue, IncludeCompletionsWithClassMemberSnippets: core.TSTrue}, }) } diff --git a/internal/fourslash/tests/gen/completionsSymbolMembers_test.go b/internal/fourslash/tests/gen/completionsSymbolMembers_test.go index 331d45024be..3a23f7cb95d 100644 --- a/internal/fourslash/tests/gen/completionsSymbolMembers_test.go +++ b/internal/fourslash/tests/gen/completionsSymbolMembers_test.go @@ -43,7 +43,7 @@ j[|./*j*/|];` SortText: new(string(ls.SortTextGlobalsOrKeywords)), TextEdit: &lsproto.TextEditOrInsertReplaceEdit{ TextEdit: &lsproto.TextEdit{ - NewText: "s", + NewText: "[s]", Range: f.Ranges()[0].LSRange, }, }, @@ -65,7 +65,7 @@ j[|./*j*/|];` SortText: new(string(ls.SortTextGlobalsOrKeywords)), TextEdit: &lsproto.TextEditOrInsertReplaceEdit{ TextEdit: &lsproto.TextEdit{ - NewText: "N", + NewText: "[N]", Range: f.Ranges()[1].LSRange, }, }, diff --git a/internal/fourslash/tests/gen/completionsTuple_test.go b/internal/fourslash/tests/gen/completionsTuple_test.go index 48be50badff..8ce2ac2599b 100644 --- a/internal/fourslash/tests/gen/completionsTuple_test.go +++ b/internal/fourslash/tests/gen/completionsTuple_test.go @@ -33,7 +33,7 @@ x[|./**/|];` InsertText: new("[0]"), TextEdit: &lsproto.TextEditOrInsertReplaceEdit{ TextEdit: &lsproto.TextEdit{ - NewText: "0", + NewText: "[0]", Range: f.Ranges()[0].LSRange, }, }, @@ -43,7 +43,7 @@ x[|./**/|];` InsertText: new("[1]"), TextEdit: &lsproto.TextEditOrInsertReplaceEdit{ TextEdit: &lsproto.TextEdit{ - NewText: "1", + NewText: "[1]", Range: f.Ranges()[0].LSRange, }, }, diff --git a/internal/fourslash/tests/gen/completionsUniqueSymbol1_test.go b/internal/fourslash/tests/gen/completionsUniqueSymbol1_test.go index 17595f48198..a4769df58ba 100644 --- a/internal/fourslash/tests/gen/completionsUniqueSymbol1_test.go +++ b/internal/fourslash/tests/gen/completionsUniqueSymbol1_test.go @@ -47,7 +47,7 @@ i[|./**/|];` SortText: new(string(ls.SortTextGlobalsOrKeywords)), TextEdit: &lsproto.TextEditOrInsertReplaceEdit{ TextEdit: &lsproto.TextEdit{ - NewText: "M", + NewText: "[M]", Range: f.Ranges()[0].LSRange, }, }, diff --git a/internal/fourslash/tests/gen/completionsUniqueSymbol_import_test.go b/internal/fourslash/tests/gen/completionsUniqueSymbol_import_test.go index 07c07671669..49ee59ec9eb 100644 --- a/internal/fourslash/tests/gen/completionsUniqueSymbol_import_test.go +++ b/internal/fourslash/tests/gen/completionsUniqueSymbol_import_test.go @@ -56,7 +56,7 @@ i[|./**/|];` AdditionalTextEdits: fourslash.AnyTextEdits, TextEdit: &lsproto.TextEditOrInsertReplaceEdit{ TextEdit: &lsproto.TextEdit{ - NewText: "publicSym", + NewText: "[publicSym]", Range: f.Ranges()[0].LSRange, }, }, diff --git a/internal/fourslash/tests/gen/importStatementCompletions_esModuleInterop1_test.go b/internal/fourslash/tests/gen/importStatementCompletions_esModuleInterop1_test.go index bf25a30e926..9eed82962c3 100644 --- a/internal/fourslash/tests/gen/importStatementCompletions_esModuleInterop1_test.go +++ b/internal/fourslash/tests/gen/importStatementCompletions_esModuleInterop1_test.go @@ -6,9 +6,11 @@ package fourslash_test import ( "testing" + "github.com/microsoft/typescript-go/internal/core" "github.com/microsoft/typescript-go/internal/fourslash" . "github.com/microsoft/typescript-go/internal/fourslash/tests/util" "github.com/microsoft/typescript-go/internal/ls" + "github.com/microsoft/typescript-go/internal/ls/lsutil" "github.com/microsoft/typescript-go/internal/lsp/lsproto" "github.com/microsoft/typescript-go/internal/testutil" ) @@ -46,7 +48,7 @@ export = foo; InsertTextFormat: new(lsproto.InsertTextFormatSnippet), TextEdit: &lsproto.TextEditOrInsertReplaceEdit{ TextEdit: &lsproto.TextEdit{ - NewText: "foo", + NewText: "import foo$1 = require(\"./mod\");", Range: f.Ranges()[0].LSRange, }, }, @@ -57,5 +59,6 @@ export = foo; }, }, }, + UserPreferences: &lsutil.UserPreferences{IncludeCompletionsWithSnippetText: core.TSTrue}, }) } diff --git a/internal/fourslash/tests/gen/importStatementCompletions_esModuleInterop2_test.go b/internal/fourslash/tests/gen/importStatementCompletions_esModuleInterop2_test.go index 5187b4232d2..680ab425d8f 100644 --- a/internal/fourslash/tests/gen/importStatementCompletions_esModuleInterop2_test.go +++ b/internal/fourslash/tests/gen/importStatementCompletions_esModuleInterop2_test.go @@ -6,9 +6,11 @@ package fourslash_test import ( "testing" + "github.com/microsoft/typescript-go/internal/core" "github.com/microsoft/typescript-go/internal/fourslash" . "github.com/microsoft/typescript-go/internal/fourslash/tests/util" "github.com/microsoft/typescript-go/internal/ls" + "github.com/microsoft/typescript-go/internal/ls/lsutil" "github.com/microsoft/typescript-go/internal/lsp/lsproto" "github.com/microsoft/typescript-go/internal/testutil" ) @@ -44,7 +46,7 @@ export = foo; InsertTextFormat: new(lsproto.InsertTextFormatSnippet), TextEdit: &lsproto.TextEditOrInsertReplaceEdit{ TextEdit: &lsproto.TextEdit{ - NewText: "foo", + NewText: "import foo$1 from \"./mod\";", Range: f.Ranges()[0].LSRange, }, }, @@ -55,5 +57,6 @@ export = foo; }, }, }, + UserPreferences: &lsutil.UserPreferences{IncludeCompletionsWithSnippetText: core.TSTrue}, }) } diff --git a/internal/fourslash/tests/gen/importStatementCompletions_js2_test.go b/internal/fourslash/tests/gen/importStatementCompletions_js2_test.go index 25ad4677565..73bd7c28fb5 100644 --- a/internal/fourslash/tests/gen/importStatementCompletions_js2_test.go +++ b/internal/fourslash/tests/gen/importStatementCompletions_js2_test.go @@ -6,8 +6,10 @@ package fourslash_test import ( "testing" + "github.com/microsoft/typescript-go/internal/core" "github.com/microsoft/typescript-go/internal/fourslash" . "github.com/microsoft/typescript-go/internal/fourslash/tests/util" + "github.com/microsoft/typescript-go/internal/ls/lsutil" "github.com/microsoft/typescript-go/internal/lsp/lsproto" "github.com/microsoft/typescript-go/internal/testutil" ) @@ -51,12 +53,13 @@ export = React; InsertTextFormat: new(lsproto.InsertTextFormatSnippet), TextEdit: &lsproto.TextEditOrInsertReplaceEdit{ TextEdit: &lsproto.TextEdit{ - NewText: "React", + NewText: "import * as React from \"react\";", Range: f.Ranges()[0].LSRange, }, }, }, }, }, + UserPreferences: &lsutil.UserPreferences{IncludeCompletionsWithSnippetText: core.TSTrue}, }) } diff --git a/internal/fourslash/tests/gen/importStatementCompletions_js_test.go b/internal/fourslash/tests/gen/importStatementCompletions_js_test.go index 2b22a3214ba..df938416f53 100644 --- a/internal/fourslash/tests/gen/importStatementCompletions_js_test.go +++ b/internal/fourslash/tests/gen/importStatementCompletions_js_test.go @@ -6,8 +6,10 @@ package fourslash_test import ( "testing" + "github.com/microsoft/typescript-go/internal/core" "github.com/microsoft/typescript-go/internal/fourslash" . "github.com/microsoft/typescript-go/internal/fourslash/tests/util" + "github.com/microsoft/typescript-go/internal/ls/lsutil" "github.com/microsoft/typescript-go/internal/lsp/lsproto" "github.com/microsoft/typescript-go/internal/testutil" ) @@ -50,12 +52,13 @@ export = React; InsertTextFormat: new(lsproto.InsertTextFormatSnippet), TextEdit: &lsproto.TextEditOrInsertReplaceEdit{ TextEdit: &lsproto.TextEdit{ - NewText: "React", + NewText: "import React$1 from \"react\";", Range: f.Ranges()[0].LSRange, }, }, }, }, }, + UserPreferences: &lsutil.UserPreferences{IncludeCompletionsWithSnippetText: core.TSTrue}, }) } diff --git a/internal/fourslash/tests/gen/importStatementCompletions_noPatternAmbient_test.go b/internal/fourslash/tests/gen/importStatementCompletions_noPatternAmbient_test.go index 678e8c766e3..04e9dd6e3d6 100644 --- a/internal/fourslash/tests/gen/importStatementCompletions_noPatternAmbient_test.go +++ b/internal/fourslash/tests/gen/importStatementCompletions_noPatternAmbient_test.go @@ -6,9 +6,11 @@ package fourslash_test import ( "testing" + "github.com/microsoft/typescript-go/internal/core" "github.com/microsoft/typescript-go/internal/fourslash" . "github.com/microsoft/typescript-go/internal/fourslash/tests/util" "github.com/microsoft/typescript-go/internal/ls" + "github.com/microsoft/typescript-go/internal/ls/lsutil" "github.com/microsoft/typescript-go/internal/lsp/lsproto" "github.com/microsoft/typescript-go/internal/testutil" ) @@ -40,5 +42,6 @@ import style/**/` }, }, }, + UserPreferences: &lsutil.UserPreferences{IncludeCompletionsWithSnippetText: core.TSTrue}, }) } diff --git a/internal/fourslash/tests/gen/importStatementCompletions_noSnippet_test.go b/internal/fourslash/tests/gen/importStatementCompletions_noSnippet_test.go index 1f3e6fb3907..fb383c653b1 100644 --- a/internal/fourslash/tests/gen/importStatementCompletions_noSnippet_test.go +++ b/internal/fourslash/tests/gen/importStatementCompletions_noSnippet_test.go @@ -6,9 +6,11 @@ package fourslash_test import ( "testing" + "github.com/microsoft/typescript-go/internal/core" "github.com/microsoft/typescript-go/internal/fourslash" . "github.com/microsoft/typescript-go/internal/fourslash/tests/util" "github.com/microsoft/typescript-go/internal/ls" + "github.com/microsoft/typescript-go/internal/ls/lsutil" "github.com/microsoft/typescript-go/internal/lsp/lsproto" "github.com/microsoft/typescript-go/internal/testutil" ) @@ -41,7 +43,7 @@ export const foo = 0; }, TextEdit: &lsproto.TextEditOrInsertReplaceEdit{ TextEdit: &lsproto.TextEdit{ - NewText: "foo", + NewText: "import { foo } from \"./mod\";", Range: f.Ranges()[0].LSRange, }, }, @@ -52,5 +54,6 @@ export const foo = 0; }, }, }, + UserPreferences: &lsutil.UserPreferences{IncludeCompletionsWithSnippetText: core.TSFalse}, }) } diff --git a/internal/fourslash/tests/gen/importStatementCompletions_pnpm1_test.go b/internal/fourslash/tests/gen/importStatementCompletions_pnpm1_test.go index 19dbe8af0e2..109c579b598 100644 --- a/internal/fourslash/tests/gen/importStatementCompletions_pnpm1_test.go +++ b/internal/fourslash/tests/gen/importStatementCompletions_pnpm1_test.go @@ -6,9 +6,11 @@ package fourslash_test import ( "testing" + "github.com/microsoft/typescript-go/internal/core" "github.com/microsoft/typescript-go/internal/fourslash" . "github.com/microsoft/typescript-go/internal/fourslash/tests/util" "github.com/microsoft/typescript-go/internal/ls" + "github.com/microsoft/typescript-go/internal/ls/lsutil" "github.com/microsoft/typescript-go/internal/lsp/lsproto" "github.com/microsoft/typescript-go/internal/testutil" ) @@ -47,7 +49,7 @@ export declare function Component(): void; InsertTextFormat: new(lsproto.InsertTextFormatSnippet), TextEdit: &lsproto.TextEditOrInsertReplaceEdit{ TextEdit: &lsproto.TextEdit{ - NewText: "Component", + NewText: "import { Component$1 } from \"react\";", Range: f.Ranges()[0].LSRange, }, }, @@ -58,5 +60,6 @@ export declare function Component(): void; }, }, }, + UserPreferences: &lsutil.UserPreferences{IncludeCompletionsWithSnippetText: core.TSTrue}, }) } diff --git a/internal/fourslash/tests/gen/importStatementCompletions_pnpmTransitive_test.go b/internal/fourslash/tests/gen/importStatementCompletions_pnpmTransitive_test.go index 54d3b8d3806..a7a5e0526ed 100644 --- a/internal/fourslash/tests/gen/importStatementCompletions_pnpmTransitive_test.go +++ b/internal/fourslash/tests/gen/importStatementCompletions_pnpmTransitive_test.go @@ -6,9 +6,11 @@ package fourslash_test import ( "testing" + "github.com/microsoft/typescript-go/internal/core" "github.com/microsoft/typescript-go/internal/fourslash" . "github.com/microsoft/typescript-go/internal/fourslash/tests/util" "github.com/microsoft/typescript-go/internal/ls" + "github.com/microsoft/typescript-go/internal/ls/lsutil" "github.com/microsoft/typescript-go/internal/lsp/lsproto" "github.com/microsoft/typescript-go/internal/testutil" ) @@ -46,5 +48,6 @@ export interface SvgProperties {} }, }, }, + UserPreferences: &lsutil.UserPreferences{IncludeCompletionsWithSnippetText: core.TSTrue}, }) } diff --git a/internal/fourslash/tests/gen/importStatementCompletions_quotes_test.go b/internal/fourslash/tests/gen/importStatementCompletions_quotes_test.go index 95e612e0579..604b48c82aa 100644 --- a/internal/fourslash/tests/gen/importStatementCompletions_quotes_test.go +++ b/internal/fourslash/tests/gen/importStatementCompletions_quotes_test.go @@ -6,9 +6,11 @@ package fourslash_test import ( "testing" + "github.com/microsoft/typescript-go/internal/core" "github.com/microsoft/typescript-go/internal/fourslash" . "github.com/microsoft/typescript-go/internal/fourslash/tests/util" "github.com/microsoft/typescript-go/internal/ls" + "github.com/microsoft/typescript-go/internal/ls/lsutil" "github.com/microsoft/typescript-go/internal/lsp/lsproto" "github.com/microsoft/typescript-go/internal/testutil" ) @@ -43,7 +45,7 @@ import * as fs from 'fs'; InsertTextFormat: new(lsproto.InsertTextFormatSnippet), TextEdit: &lsproto.TextEditOrInsertReplaceEdit{ TextEdit: &lsproto.TextEdit{ - NewText: "foo", + NewText: "import { foo$1 } from './mod';", Range: f.Ranges()[0].LSRange, }, }, @@ -54,5 +56,6 @@ import * as fs from 'fs'; }, }, }, + UserPreferences: &lsutil.UserPreferences{IncludeCompletionsWithSnippetText: core.TSTrue}, }) } diff --git a/internal/fourslash/tests/gen/importStatementCompletions_semicolons_test.go b/internal/fourslash/tests/gen/importStatementCompletions_semicolons_test.go index b00aa629235..8a0fa366945 100644 --- a/internal/fourslash/tests/gen/importStatementCompletions_semicolons_test.go +++ b/internal/fourslash/tests/gen/importStatementCompletions_semicolons_test.go @@ -6,9 +6,11 @@ package fourslash_test import ( "testing" + "github.com/microsoft/typescript-go/internal/core" "github.com/microsoft/typescript-go/internal/fourslash" . "github.com/microsoft/typescript-go/internal/fourslash/tests/util" "github.com/microsoft/typescript-go/internal/ls" + "github.com/microsoft/typescript-go/internal/ls/lsutil" "github.com/microsoft/typescript-go/internal/lsp/lsproto" "github.com/microsoft/typescript-go/internal/testutil" ) @@ -43,7 +45,7 @@ import * as fs from "fs" InsertTextFormat: new(lsproto.InsertTextFormatSnippet), TextEdit: &lsproto.TextEditOrInsertReplaceEdit{ TextEdit: &lsproto.TextEdit{ - NewText: "foo", + NewText: "import { foo$1 } from \"./mod\"", Range: f.Ranges()[0].LSRange, }, }, @@ -54,5 +56,6 @@ import * as fs from "fs" }, }, }, + UserPreferences: &lsutil.UserPreferences{IncludeCompletionsWithSnippetText: core.TSTrue}, }) } diff --git a/internal/fourslash/tests/gen/importTypeCompletions1_test.go b/internal/fourslash/tests/gen/importTypeCompletions1_test.go index f0657544fdd..e5ea9e37729 100644 --- a/internal/fourslash/tests/gen/importTypeCompletions1_test.go +++ b/internal/fourslash/tests/gen/importTypeCompletions1_test.go @@ -42,7 +42,7 @@ export interface Foo {} }, TextEdit: &lsproto.TextEditOrInsertReplaceEdit{ TextEdit: &lsproto.TextEdit{ - NewText: "Foo", + NewText: "import type { Foo } from \"./foo\";", Range: f.Ranges()[0].LSRange, }, }, diff --git a/internal/fourslash/tests/gen/importTypeCompletions3_test.go b/internal/fourslash/tests/gen/importTypeCompletions3_test.go index 8ba5379f738..71256bac1ec 100644 --- a/internal/fourslash/tests/gen/importTypeCompletions3_test.go +++ b/internal/fourslash/tests/gen/importTypeCompletions3_test.go @@ -42,7 +42,7 @@ export interface Foo {} }, TextEdit: &lsproto.TextEditOrInsertReplaceEdit{ TextEdit: &lsproto.TextEdit{ - NewText: "Foo", + NewText: "import type { Foo } from \"./foo\";", Range: f.Ranges()[0].LSRange, }, }, diff --git a/internal/fourslash/tests/gen/importTypeCompletions4_test.go b/internal/fourslash/tests/gen/importTypeCompletions4_test.go index 9ec83d7c3b4..402d7314ab1 100644 --- a/internal/fourslash/tests/gen/importTypeCompletions4_test.go +++ b/internal/fourslash/tests/gen/importTypeCompletions4_test.go @@ -43,7 +43,7 @@ export = Foo; }, TextEdit: &lsproto.TextEditOrInsertReplaceEdit{ TextEdit: &lsproto.TextEdit{ - NewText: "Foo", + NewText: "import type Foo from \"./foo\";", Range: f.Ranges()[0].LSRange, }, }, diff --git a/internal/fourslash/tests/gen/importTypeCompletions5_test.go b/internal/fourslash/tests/gen/importTypeCompletions5_test.go index 14fd0d5ca1e..8537cf2ea54 100644 --- a/internal/fourslash/tests/gen/importTypeCompletions5_test.go +++ b/internal/fourslash/tests/gen/importTypeCompletions5_test.go @@ -45,7 +45,7 @@ export = Foo; }, TextEdit: &lsproto.TextEditOrInsertReplaceEdit{ TextEdit: &lsproto.TextEdit{ - NewText: "Foo", + NewText: "import type Foo = require(\"./foo\");", Range: f.Ranges()[0].LSRange, }, }, diff --git a/internal/fourslash/tests/gen/importTypeCompletions6_test.go b/internal/fourslash/tests/gen/importTypeCompletions6_test.go index 565e20ccb8e..32af80f8d6a 100644 --- a/internal/fourslash/tests/gen/importTypeCompletions6_test.go +++ b/internal/fourslash/tests/gen/importTypeCompletions6_test.go @@ -43,7 +43,7 @@ export interface Foo { }; }, TextEdit: &lsproto.TextEditOrInsertReplaceEdit{ TextEdit: &lsproto.TextEdit{ - NewText: "Foo", + NewText: "import type { Foo } from \"./foo\";", Range: f.Ranges()[0].LSRange, }, }, diff --git a/internal/fourslash/tests/gen/importTypeCompletions7_test.go b/internal/fourslash/tests/gen/importTypeCompletions7_test.go index 4515be787fb..c36566c10dd 100644 --- a/internal/fourslash/tests/gen/importTypeCompletions7_test.go +++ b/internal/fourslash/tests/gen/importTypeCompletions7_test.go @@ -45,7 +45,7 @@ export = Foo; }, TextEdit: &lsproto.TextEditOrInsertReplaceEdit{ TextEdit: &lsproto.TextEdit{ - NewText: "Foo", + NewText: "import Foo from \"./foo\";", Range: f.Ranges()[0].LSRange, }, }, diff --git a/internal/fourslash/tests/gen/importTypeCompletions8_test.go b/internal/fourslash/tests/gen/importTypeCompletions8_test.go index 7aa63147ff9..08a5db7f79a 100644 --- a/internal/fourslash/tests/gen/importTypeCompletions8_test.go +++ b/internal/fourslash/tests/gen/importTypeCompletions8_test.go @@ -42,7 +42,7 @@ export interface Foo {} }, TextEdit: &lsproto.TextEditOrInsertReplaceEdit{ TextEdit: &lsproto.TextEdit{ - NewText: "Foo", + NewText: "import { type Foo } from \"./foo\";", Range: f.Ranges()[0].LSRange, }, }, diff --git a/internal/fourslash/tests/gen/importTypeCompletions9_test.go b/internal/fourslash/tests/gen/importTypeCompletions9_test.go index 5f921f871ca..c0f07d701e9 100644 --- a/internal/fourslash/tests/gen/importTypeCompletions9_test.go +++ b/internal/fourslash/tests/gen/importTypeCompletions9_test.go @@ -42,7 +42,7 @@ export interface Foo {} }, TextEdit: &lsproto.TextEditOrInsertReplaceEdit{ TextEdit: &lsproto.TextEdit{ - NewText: "Foo", + NewText: "import { type Foo } from \"./foo\";", Range: f.Ranges()[0].LSRange, }, }, diff --git a/internal/fourslash/tests/gen/jsxAttributeCompletionStyleAuto_test.go b/internal/fourslash/tests/gen/jsxAttributeCompletionStyleAuto_test.go index 8e514fc0d7b..357ab610704 100644 --- a/internal/fourslash/tests/gen/jsxAttributeCompletionStyleAuto_test.go +++ b/internal/fourslash/tests/gen/jsxAttributeCompletionStyleAuto_test.go @@ -6,9 +6,11 @@ package fourslash_test import ( "testing" + "github.com/microsoft/typescript-go/internal/core" "github.com/microsoft/typescript-go/internal/fourslash" . "github.com/microsoft/typescript-go/internal/fourslash/tests/util" "github.com/microsoft/typescript-go/internal/ls" + "github.com/microsoft/typescript-go/internal/ls/lsutil" "github.com/microsoft/typescript-go/internal/lsp/lsproto" "github.com/microsoft/typescript-go/internal/testutil" ) @@ -108,5 +110,6 @@ declare namespace JSX { }, }, }, + UserPreferences: &lsutil.UserPreferences{JsxAttributeCompletionStyle: lsutil.JsxAttributeCompletionStyleAuto, IncludeCompletionsWithSnippetText: core.TSTrue}, }) } diff --git a/internal/fourslash/tests/gen/jsxAttributeCompletionStyleBraces_test.go b/internal/fourslash/tests/gen/jsxAttributeCompletionStyleBraces_test.go index b22acec4bd9..1182975c307 100644 --- a/internal/fourslash/tests/gen/jsxAttributeCompletionStyleBraces_test.go +++ b/internal/fourslash/tests/gen/jsxAttributeCompletionStyleBraces_test.go @@ -6,9 +6,11 @@ package fourslash_test import ( "testing" + "github.com/microsoft/typescript-go/internal/core" "github.com/microsoft/typescript-go/internal/fourslash" . "github.com/microsoft/typescript-go/internal/fourslash/tests/util" "github.com/microsoft/typescript-go/internal/ls" + "github.com/microsoft/typescript-go/internal/ls/lsutil" "github.com/microsoft/typescript-go/internal/lsp/lsproto" "github.com/microsoft/typescript-go/internal/testutil" ) @@ -105,5 +107,6 @@ declare namespace JSX { }, }, }, + UserPreferences: &lsutil.UserPreferences{JsxAttributeCompletionStyle: lsutil.JsxAttributeCompletionStyleBraces, IncludeCompletionsWithSnippetText: core.TSTrue}, }) } diff --git a/internal/fourslash/tests/gen/jsxAttributeCompletionStyleDefault_test.go b/internal/fourslash/tests/gen/jsxAttributeCompletionStyleDefault_test.go index f79e65f041c..d57ddf9ea00 100644 --- a/internal/fourslash/tests/gen/jsxAttributeCompletionStyleDefault_test.go +++ b/internal/fourslash/tests/gen/jsxAttributeCompletionStyleDefault_test.go @@ -6,9 +6,11 @@ package fourslash_test import ( "testing" + "github.com/microsoft/typescript-go/internal/core" "github.com/microsoft/typescript-go/internal/fourslash" . "github.com/microsoft/typescript-go/internal/fourslash/tests/util" "github.com/microsoft/typescript-go/internal/ls" + "github.com/microsoft/typescript-go/internal/ls/lsutil" "github.com/microsoft/typescript-go/internal/lsp/lsproto" "github.com/microsoft/typescript-go/internal/testutil" ) @@ -88,5 +90,6 @@ declare namespace JSX { }, }, }, + UserPreferences: &lsutil.UserPreferences{IncludeCompletionsWithSnippetText: core.TSTrue}, }) } diff --git a/internal/fourslash/tests/gen/jsxAttributeCompletionStyleNoSnippet_test.go b/internal/fourslash/tests/gen/jsxAttributeCompletionStyleNoSnippet_test.go index 7fc1a0a7aa5..6595180794d 100644 --- a/internal/fourslash/tests/gen/jsxAttributeCompletionStyleNoSnippet_test.go +++ b/internal/fourslash/tests/gen/jsxAttributeCompletionStyleNoSnippet_test.go @@ -6,9 +6,11 @@ package fourslash_test import ( "testing" + "github.com/microsoft/typescript-go/internal/core" "github.com/microsoft/typescript-go/internal/fourslash" . "github.com/microsoft/typescript-go/internal/fourslash/tests/util" "github.com/microsoft/typescript-go/internal/ls" + "github.com/microsoft/typescript-go/internal/ls/lsutil" "github.com/microsoft/typescript-go/internal/lsp/lsproto" "github.com/microsoft/typescript-go/internal/testutil" ) @@ -88,5 +90,6 @@ declare namespace JSX { }, }, }, + UserPreferences: &lsutil.UserPreferences{JsxAttributeCompletionStyle: lsutil.JsxAttributeCompletionStyleAuto, IncludeCompletionsWithSnippetText: core.TSFalse}, }) } diff --git a/internal/fourslash/tests/gen/jsxAttributeCompletionStyleNone_test.go b/internal/fourslash/tests/gen/jsxAttributeCompletionStyleNone_test.go index eb432053578..c5daf10fa4d 100644 --- a/internal/fourslash/tests/gen/jsxAttributeCompletionStyleNone_test.go +++ b/internal/fourslash/tests/gen/jsxAttributeCompletionStyleNone_test.go @@ -6,9 +6,11 @@ package fourslash_test import ( "testing" + "github.com/microsoft/typescript-go/internal/core" "github.com/microsoft/typescript-go/internal/fourslash" . "github.com/microsoft/typescript-go/internal/fourslash/tests/util" "github.com/microsoft/typescript-go/internal/ls" + "github.com/microsoft/typescript-go/internal/ls/lsutil" "github.com/microsoft/typescript-go/internal/lsp/lsproto" "github.com/microsoft/typescript-go/internal/testutil" ) @@ -88,5 +90,6 @@ declare namespace JSX { }, }, }, + UserPreferences: &lsutil.UserPreferences{JsxAttributeCompletionStyle: lsutil.JsxAttributeCompletionStyleNone, IncludeCompletionsWithSnippetText: core.TSTrue}, }) } diff --git a/internal/fourslash/tests/gen/jsxAttributeSnippetCompletionAfterTypeArgs_test.go b/internal/fourslash/tests/gen/jsxAttributeSnippetCompletionAfterTypeArgs_test.go index db0244fb036..0bdae4bbd1e 100644 --- a/internal/fourslash/tests/gen/jsxAttributeSnippetCompletionAfterTypeArgs_test.go +++ b/internal/fourslash/tests/gen/jsxAttributeSnippetCompletionAfterTypeArgs_test.go @@ -6,9 +6,11 @@ package fourslash_test import ( "testing" + "github.com/microsoft/typescript-go/internal/core" "github.com/microsoft/typescript-go/internal/fourslash" . "github.com/microsoft/typescript-go/internal/fourslash/tests/util" "github.com/microsoft/typescript-go/internal/ls" + "github.com/microsoft/typescript-go/internal/ls/lsutil" "github.com/microsoft/typescript-go/internal/lsp/lsproto" "github.com/microsoft/typescript-go/internal/testutil" ) @@ -73,5 +75,6 @@ function fn4() { }, }, }, + UserPreferences: &lsutil.UserPreferences{JsxAttributeCompletionStyle: lsutil.JsxAttributeCompletionStyleBraces, IncludeCompletionsWithSnippetText: core.TSTrue}, }) } diff --git a/internal/fourslash/tests/gen/jsxAttributeSnippetCompletionClosed_test.go b/internal/fourslash/tests/gen/jsxAttributeSnippetCompletionClosed_test.go index 785767d7b59..39949fa440d 100644 --- a/internal/fourslash/tests/gen/jsxAttributeSnippetCompletionClosed_test.go +++ b/internal/fourslash/tests/gen/jsxAttributeSnippetCompletionClosed_test.go @@ -6,9 +6,11 @@ package fourslash_test import ( "testing" + "github.com/microsoft/typescript-go/internal/core" "github.com/microsoft/typescript-go/internal/fourslash" . "github.com/microsoft/typescript-go/internal/fourslash/tests/util" "github.com/microsoft/typescript-go/internal/ls" + "github.com/microsoft/typescript-go/internal/ls/lsutil" "github.com/microsoft/typescript-go/internal/lsp/lsproto" "github.com/microsoft/typescript-go/internal/testutil" ) @@ -106,6 +108,7 @@ function fn16() { }, }, }, + UserPreferences: &lsutil.UserPreferences{JsxAttributeCompletionStyle: lsutil.JsxAttributeCompletionStyleBraces, IncludeCompletionsWithSnippetText: core.TSTrue}, }) f.VerifyCompletions(t, "2", &fourslash.CompletionsExpectedList{ IsIncomplete: false, @@ -125,6 +128,7 @@ function fn16() { }, }, }, + UserPreferences: &lsutil.UserPreferences{JsxAttributeCompletionStyle: lsutil.JsxAttributeCompletionStyleBraces, IncludeCompletionsWithSnippetText: core.TSTrue}, }) f.VerifyCompletions(t, "3", &fourslash.CompletionsExpectedList{ IsIncomplete: false, @@ -144,6 +148,7 @@ function fn16() { }, }, }, + UserPreferences: &lsutil.UserPreferences{JsxAttributeCompletionStyle: lsutil.JsxAttributeCompletionStyleBraces, IncludeCompletionsWithSnippetText: core.TSTrue}, }) f.VerifyCompletions(t, "4", &fourslash.CompletionsExpectedList{ IsIncomplete: false, @@ -163,6 +168,7 @@ function fn16() { }, }, }, + UserPreferences: &lsutil.UserPreferences{JsxAttributeCompletionStyle: lsutil.JsxAttributeCompletionStyleBraces, IncludeCompletionsWithSnippetText: core.TSTrue}, }) f.VerifyCompletions(t, "5", &fourslash.CompletionsExpectedList{ IsIncomplete: false, @@ -182,6 +188,7 @@ function fn16() { }, }, }, + UserPreferences: &lsutil.UserPreferences{JsxAttributeCompletionStyle: lsutil.JsxAttributeCompletionStyleBraces, IncludeCompletionsWithSnippetText: core.TSTrue}, }) f.VerifyCompletions(t, "6", &fourslash.CompletionsExpectedList{ IsIncomplete: false, @@ -201,6 +208,7 @@ function fn16() { }, }, }, + UserPreferences: &lsutil.UserPreferences{JsxAttributeCompletionStyle: lsutil.JsxAttributeCompletionStyleBraces, IncludeCompletionsWithSnippetText: core.TSTrue}, }) f.VerifyCompletions(t, "7", &fourslash.CompletionsExpectedList{ IsIncomplete: false, @@ -220,6 +228,7 @@ function fn16() { }, }, }, + UserPreferences: &lsutil.UserPreferences{JsxAttributeCompletionStyle: lsutil.JsxAttributeCompletionStyleBraces, IncludeCompletionsWithSnippetText: core.TSTrue}, }) f.VerifyCompletions(t, "8", &fourslash.CompletionsExpectedList{ IsIncomplete: false, @@ -239,6 +248,7 @@ function fn16() { }, }, }, + UserPreferences: &lsutil.UserPreferences{JsxAttributeCompletionStyle: lsutil.JsxAttributeCompletionStyleBraces, IncludeCompletionsWithSnippetText: core.TSTrue}, }) f.VerifyCompletions(t, "9", &fourslash.CompletionsExpectedList{ IsIncomplete: false, @@ -258,6 +268,7 @@ function fn16() { }, }, }, + UserPreferences: &lsutil.UserPreferences{JsxAttributeCompletionStyle: lsutil.JsxAttributeCompletionStyleBraces, IncludeCompletionsWithSnippetText: core.TSTrue}, }) f.VerifyCompletions(t, "10", &fourslash.CompletionsExpectedList{ IsIncomplete: false, @@ -277,6 +288,7 @@ function fn16() { }, }, }, + UserPreferences: &lsutil.UserPreferences{JsxAttributeCompletionStyle: lsutil.JsxAttributeCompletionStyleBraces, IncludeCompletionsWithSnippetText: core.TSTrue}, }) f.VerifyCompletions(t, "11", &fourslash.CompletionsExpectedList{ IsIncomplete: false, @@ -296,6 +308,7 @@ function fn16() { }, }, }, + UserPreferences: &lsutil.UserPreferences{JsxAttributeCompletionStyle: lsutil.JsxAttributeCompletionStyleBraces, IncludeCompletionsWithSnippetText: core.TSTrue}, }) f.VerifyCompletions(t, "12", &fourslash.CompletionsExpectedList{ IsIncomplete: false, @@ -315,6 +328,7 @@ function fn16() { }, }, }, + UserPreferences: &lsutil.UserPreferences{JsxAttributeCompletionStyle: lsutil.JsxAttributeCompletionStyleBraces, IncludeCompletionsWithSnippetText: core.TSTrue}, }) f.VerifyCompletions(t, "13", &fourslash.CompletionsExpectedList{ IsIncomplete: false, @@ -334,6 +348,7 @@ function fn16() { }, }, }, + UserPreferences: &lsutil.UserPreferences{JsxAttributeCompletionStyle: lsutil.JsxAttributeCompletionStyleBraces, IncludeCompletionsWithSnippetText: core.TSTrue}, }) f.VerifyCompletions(t, "14", &fourslash.CompletionsExpectedList{ IsIncomplete: false, @@ -353,6 +368,7 @@ function fn16() { }, }, }, + UserPreferences: &lsutil.UserPreferences{JsxAttributeCompletionStyle: lsutil.JsxAttributeCompletionStyleBraces, IncludeCompletionsWithSnippetText: core.TSTrue}, }) f.VerifyCompletions(t, "15", &fourslash.CompletionsExpectedList{ IsIncomplete: false, @@ -371,6 +387,7 @@ function fn16() { }, }, }, + UserPreferences: &lsutil.UserPreferences{JsxAttributeCompletionStyle: lsutil.JsxAttributeCompletionStyleBraces, IncludeCompletionsWithSnippetText: core.TSTrue}, }) f.VerifyCompletions(t, "16", &fourslash.CompletionsExpectedList{ IsIncomplete: false, @@ -389,5 +406,6 @@ function fn16() { }, }, }, + UserPreferences: &lsutil.UserPreferences{JsxAttributeCompletionStyle: lsutil.JsxAttributeCompletionStyleBraces, IncludeCompletionsWithSnippetText: core.TSTrue}, }) } diff --git a/internal/fourslash/tests/gen/jsxAttributeSnippetCompletionUnclosed_test.go b/internal/fourslash/tests/gen/jsxAttributeSnippetCompletionUnclosed_test.go index 17bed69a483..ec0b71c77ac 100644 --- a/internal/fourslash/tests/gen/jsxAttributeSnippetCompletionUnclosed_test.go +++ b/internal/fourslash/tests/gen/jsxAttributeSnippetCompletionUnclosed_test.go @@ -6,9 +6,11 @@ package fourslash_test import ( "testing" + "github.com/microsoft/typescript-go/internal/core" "github.com/microsoft/typescript-go/internal/fourslash" . "github.com/microsoft/typescript-go/internal/fourslash/tests/util" "github.com/microsoft/typescript-go/internal/ls" + "github.com/microsoft/typescript-go/internal/ls/lsutil" "github.com/microsoft/typescript-go/internal/lsp/lsproto" "github.com/microsoft/typescript-go/internal/testutil" ) @@ -91,6 +93,7 @@ function fn11() { }, }, }, + UserPreferences: &lsutil.UserPreferences{JsxAttributeCompletionStyle: lsutil.JsxAttributeCompletionStyleBraces, IncludeCompletionsWithSnippetText: core.TSTrue}, }) f.VerifyCompletions(t, "2", &fourslash.CompletionsExpectedList{ IsIncomplete: false, @@ -110,6 +113,7 @@ function fn11() { }, }, }, + UserPreferences: &lsutil.UserPreferences{JsxAttributeCompletionStyle: lsutil.JsxAttributeCompletionStyleBraces, IncludeCompletionsWithSnippetText: core.TSTrue}, }) f.VerifyCompletions(t, "3", &fourslash.CompletionsExpectedList{ IsIncomplete: false, @@ -129,6 +133,7 @@ function fn11() { }, }, }, + UserPreferences: &lsutil.UserPreferences{JsxAttributeCompletionStyle: lsutil.JsxAttributeCompletionStyleBraces, IncludeCompletionsWithSnippetText: core.TSTrue}, }) f.VerifyCompletions(t, "4", &fourslash.CompletionsExpectedList{ IsIncomplete: false, @@ -148,6 +153,7 @@ function fn11() { }, }, }, + UserPreferences: &lsutil.UserPreferences{JsxAttributeCompletionStyle: lsutil.JsxAttributeCompletionStyleBraces, IncludeCompletionsWithSnippetText: core.TSTrue}, }) f.VerifyCompletions(t, "5", &fourslash.CompletionsExpectedList{ IsIncomplete: false, @@ -167,6 +173,7 @@ function fn11() { }, }, }, + UserPreferences: &lsutil.UserPreferences{JsxAttributeCompletionStyle: lsutil.JsxAttributeCompletionStyleBraces, IncludeCompletionsWithSnippetText: core.TSTrue}, }) f.VerifyCompletions(t, "6", &fourslash.CompletionsExpectedList{ IsIncomplete: false, @@ -186,6 +193,7 @@ function fn11() { }, }, }, + UserPreferences: &lsutil.UserPreferences{JsxAttributeCompletionStyle: lsutil.JsxAttributeCompletionStyleBraces, IncludeCompletionsWithSnippetText: core.TSTrue}, }) f.VerifyCompletions(t, "7", &fourslash.CompletionsExpectedList{ IsIncomplete: false, @@ -205,6 +213,7 @@ function fn11() { }, }, }, + UserPreferences: &lsutil.UserPreferences{JsxAttributeCompletionStyle: lsutil.JsxAttributeCompletionStyleBraces, IncludeCompletionsWithSnippetText: core.TSTrue}, }) f.VerifyCompletions(t, "8", &fourslash.CompletionsExpectedList{ IsIncomplete: false, @@ -224,6 +233,7 @@ function fn11() { }, }, }, + UserPreferences: &lsutil.UserPreferences{JsxAttributeCompletionStyle: lsutil.JsxAttributeCompletionStyleBraces, IncludeCompletionsWithSnippetText: core.TSTrue}, }) f.VerifyCompletions(t, "9", &fourslash.CompletionsExpectedList{ IsIncomplete: false, @@ -243,6 +253,7 @@ function fn11() { }, }, }, + UserPreferences: &lsutil.UserPreferences{JsxAttributeCompletionStyle: lsutil.JsxAttributeCompletionStyleBraces, IncludeCompletionsWithSnippetText: core.TSTrue}, }) f.VerifyCompletions(t, "10", &fourslash.CompletionsExpectedList{ IsIncomplete: false, @@ -262,6 +273,7 @@ function fn11() { }, }, }, + UserPreferences: &lsutil.UserPreferences{JsxAttributeCompletionStyle: lsutil.JsxAttributeCompletionStyleBraces, IncludeCompletionsWithSnippetText: core.TSTrue}, }) f.VerifyCompletions(t, "11", &fourslash.CompletionsExpectedList{ IsIncomplete: false, @@ -281,5 +293,6 @@ function fn11() { }, }, }, + UserPreferences: &lsutil.UserPreferences{JsxAttributeCompletionStyle: lsutil.JsxAttributeCompletionStyleBraces, IncludeCompletionsWithSnippetText: core.TSTrue}, }) } diff --git a/internal/fourslash/tests/gen/jsxTagNameCompletionClosed_test.go b/internal/fourslash/tests/gen/jsxTagNameCompletionClosed_test.go index 96cfa5e051d..b74a4bc17b7 100644 --- a/internal/fourslash/tests/gen/jsxTagNameCompletionClosed_test.go +++ b/internal/fourslash/tests/gen/jsxTagNameCompletionClosed_test.go @@ -6,8 +6,10 @@ package fourslash_test import ( "testing" + "github.com/microsoft/typescript-go/internal/core" "github.com/microsoft/typescript-go/internal/fourslash" . "github.com/microsoft/typescript-go/internal/fourslash/tests/util" + "github.com/microsoft/typescript-go/internal/ls/lsutil" "github.com/microsoft/typescript-go/internal/lsp/lsproto" "github.com/microsoft/typescript-go/internal/testutil" ) @@ -70,6 +72,7 @@ function fn6() { }, }, }, + UserPreferences: &lsutil.UserPreferences{JsxAttributeCompletionStyle: lsutil.JsxAttributeCompletionStyleBraces, IncludeCompletionsWithSnippetText: core.TSTrue}, }) f.VerifyCompletions(t, "2", &fourslash.CompletionsExpectedList{ IsIncomplete: false, @@ -85,6 +88,7 @@ function fn6() { }, }, }, + UserPreferences: &lsutil.UserPreferences{JsxAttributeCompletionStyle: lsutil.JsxAttributeCompletionStyleBraces, IncludeCompletionsWithSnippetText: core.TSTrue}, }) f.VerifyCompletions(t, "3", &fourslash.CompletionsExpectedList{ IsIncomplete: false, @@ -100,6 +104,7 @@ function fn6() { }, }, }, + UserPreferences: &lsutil.UserPreferences{JsxAttributeCompletionStyle: lsutil.JsxAttributeCompletionStyleBraces, IncludeCompletionsWithSnippetText: core.TSTrue}, }) f.VerifyCompletions(t, "4", &fourslash.CompletionsExpectedList{ IsIncomplete: false, @@ -115,6 +120,7 @@ function fn6() { }, }, }, + UserPreferences: &lsutil.UserPreferences{JsxAttributeCompletionStyle: lsutil.JsxAttributeCompletionStyleBraces, IncludeCompletionsWithSnippetText: core.TSTrue}, }) f.VerifyCompletions(t, "5", &fourslash.CompletionsExpectedList{ IsIncomplete: false, @@ -130,6 +136,7 @@ function fn6() { }, }, }, + UserPreferences: &lsutil.UserPreferences{JsxAttributeCompletionStyle: lsutil.JsxAttributeCompletionStyleBraces, IncludeCompletionsWithSnippetText: core.TSTrue}, }) f.VerifyCompletions(t, "6", &fourslash.CompletionsExpectedList{ IsIncomplete: false, @@ -145,5 +152,6 @@ function fn6() { }, }, }, + UserPreferences: &lsutil.UserPreferences{JsxAttributeCompletionStyle: lsutil.JsxAttributeCompletionStyleBraces, IncludeCompletionsWithSnippetText: core.TSTrue}, }) } diff --git a/internal/fourslash/tests/gen/jsxTagNameCompletionUnclosed_test.go b/internal/fourslash/tests/gen/jsxTagNameCompletionUnclosed_test.go index 06a026150f8..58a1b02c277 100644 --- a/internal/fourslash/tests/gen/jsxTagNameCompletionUnclosed_test.go +++ b/internal/fourslash/tests/gen/jsxTagNameCompletionUnclosed_test.go @@ -6,8 +6,10 @@ package fourslash_test import ( "testing" + "github.com/microsoft/typescript-go/internal/core" "github.com/microsoft/typescript-go/internal/fourslash" . "github.com/microsoft/typescript-go/internal/fourslash/tests/util" + "github.com/microsoft/typescript-go/internal/ls/lsutil" "github.com/microsoft/typescript-go/internal/lsp/lsproto" "github.com/microsoft/typescript-go/internal/testutil" ) @@ -70,6 +72,7 @@ function fn6() { }, }, }, + UserPreferences: &lsutil.UserPreferences{JsxAttributeCompletionStyle: lsutil.JsxAttributeCompletionStyleBraces, IncludeCompletionsWithSnippetText: core.TSTrue}, }) f.VerifyCompletions(t, "2", &fourslash.CompletionsExpectedList{ IsIncomplete: false, @@ -85,6 +88,7 @@ function fn6() { }, }, }, + UserPreferences: &lsutil.UserPreferences{JsxAttributeCompletionStyle: lsutil.JsxAttributeCompletionStyleBraces, IncludeCompletionsWithSnippetText: core.TSTrue}, }) f.VerifyCompletions(t, "3", &fourslash.CompletionsExpectedList{ IsIncomplete: false, @@ -100,6 +104,7 @@ function fn6() { }, }, }, + UserPreferences: &lsutil.UserPreferences{JsxAttributeCompletionStyle: lsutil.JsxAttributeCompletionStyleBraces, IncludeCompletionsWithSnippetText: core.TSTrue}, }) f.VerifyCompletions(t, "4", &fourslash.CompletionsExpectedList{ IsIncomplete: false, @@ -115,6 +120,7 @@ function fn6() { }, }, }, + UserPreferences: &lsutil.UserPreferences{JsxAttributeCompletionStyle: lsutil.JsxAttributeCompletionStyleBraces, IncludeCompletionsWithSnippetText: core.TSTrue}, }) f.VerifyCompletions(t, "5", &fourslash.CompletionsExpectedList{ IsIncomplete: false, @@ -130,6 +136,7 @@ function fn6() { }, }, }, + UserPreferences: &lsutil.UserPreferences{JsxAttributeCompletionStyle: lsutil.JsxAttributeCompletionStyleBraces, IncludeCompletionsWithSnippetText: core.TSTrue}, }) f.VerifyCompletions(t, "6", &fourslash.CompletionsExpectedList{ IsIncomplete: false, @@ -145,5 +152,6 @@ function fn6() { }, }, }, + UserPreferences: &lsutil.UserPreferences{JsxAttributeCompletionStyle: lsutil.JsxAttributeCompletionStyleBraces, IncludeCompletionsWithSnippetText: core.TSTrue}, }) } diff --git a/internal/fourslash/tests/gen/jsxTagNameCompletionUnderElementClosed_test.go b/internal/fourslash/tests/gen/jsxTagNameCompletionUnderElementClosed_test.go index b46408debd4..592051e555d 100644 --- a/internal/fourslash/tests/gen/jsxTagNameCompletionUnderElementClosed_test.go +++ b/internal/fourslash/tests/gen/jsxTagNameCompletionUnderElementClosed_test.go @@ -6,8 +6,10 @@ package fourslash_test import ( "testing" + "github.com/microsoft/typescript-go/internal/core" "github.com/microsoft/typescript-go/internal/fourslash" . "github.com/microsoft/typescript-go/internal/fourslash/tests/util" + "github.com/microsoft/typescript-go/internal/ls/lsutil" "github.com/microsoft/typescript-go/internal/lsp/lsproto" "github.com/microsoft/typescript-go/internal/testutil" ) @@ -54,6 +56,7 @@ function fn3() { }, }, }, + UserPreferences: &lsutil.UserPreferences{JsxAttributeCompletionStyle: lsutil.JsxAttributeCompletionStyleBraces, IncludeCompletionsWithSnippetText: core.TSTrue}, }) f.VerifyCompletions(t, "2", &fourslash.CompletionsExpectedList{ IsIncomplete: false, @@ -69,6 +72,7 @@ function fn3() { }, }, }, + UserPreferences: &lsutil.UserPreferences{JsxAttributeCompletionStyle: lsutil.JsxAttributeCompletionStyleBraces, IncludeCompletionsWithSnippetText: core.TSTrue}, }) f.VerifyCompletions(t, "3", &fourslash.CompletionsExpectedList{ IsIncomplete: false, @@ -84,5 +88,6 @@ function fn3() { }, }, }, + UserPreferences: &lsutil.UserPreferences{JsxAttributeCompletionStyle: lsutil.JsxAttributeCompletionStyleBraces, IncludeCompletionsWithSnippetText: core.TSTrue}, }) } diff --git a/internal/fourslash/tests/gen/jsxTagNameCompletionUnderElementUnclosed_test.go b/internal/fourslash/tests/gen/jsxTagNameCompletionUnderElementUnclosed_test.go index 08c1b602b95..a25f0e00c5d 100644 --- a/internal/fourslash/tests/gen/jsxTagNameCompletionUnderElementUnclosed_test.go +++ b/internal/fourslash/tests/gen/jsxTagNameCompletionUnderElementUnclosed_test.go @@ -6,8 +6,10 @@ package fourslash_test import ( "testing" + "github.com/microsoft/typescript-go/internal/core" "github.com/microsoft/typescript-go/internal/fourslash" . "github.com/microsoft/typescript-go/internal/fourslash/tests/util" + "github.com/microsoft/typescript-go/internal/ls/lsutil" "github.com/microsoft/typescript-go/internal/lsp/lsproto" "github.com/microsoft/typescript-go/internal/testutil" ) @@ -54,6 +56,7 @@ function fn3() { }, }, }, + UserPreferences: &lsutil.UserPreferences{JsxAttributeCompletionStyle: lsutil.JsxAttributeCompletionStyleBraces, IncludeCompletionsWithSnippetText: core.TSTrue}, }) f.VerifyCompletions(t, "2", &fourslash.CompletionsExpectedList{ IsIncomplete: false, @@ -69,6 +72,7 @@ function fn3() { }, }, }, + UserPreferences: &lsutil.UserPreferences{JsxAttributeCompletionStyle: lsutil.JsxAttributeCompletionStyleBraces, IncludeCompletionsWithSnippetText: core.TSTrue}, }) f.VerifyCompletions(t, "3", &fourslash.CompletionsExpectedList{ IsIncomplete: false, @@ -84,5 +88,6 @@ function fn3() { }, }, }, + UserPreferences: &lsutil.UserPreferences{JsxAttributeCompletionStyle: lsutil.JsxAttributeCompletionStyleBraces, IncludeCompletionsWithSnippetText: core.TSTrue}, }) } diff --git a/internal/fourslash/tests/gen/jsxTagNameCompletionWithExistingJsxInitializer_test.go b/internal/fourslash/tests/gen/jsxTagNameCompletionWithExistingJsxInitializer_test.go index 59a5bce4259..df8b413ef30 100644 --- a/internal/fourslash/tests/gen/jsxTagNameCompletionWithExistingJsxInitializer_test.go +++ b/internal/fourslash/tests/gen/jsxTagNameCompletionWithExistingJsxInitializer_test.go @@ -6,8 +6,10 @@ package fourslash_test import ( "testing" + "github.com/microsoft/typescript-go/internal/core" "github.com/microsoft/typescript-go/internal/fourslash" . "github.com/microsoft/typescript-go/internal/fourslash/tests/util" + "github.com/microsoft/typescript-go/internal/ls/lsutil" "github.com/microsoft/typescript-go/internal/lsp/lsproto" "github.com/microsoft/typescript-go/internal/testutil" ) @@ -42,5 +44,6 @@ declare namespace JSX { }, }, }, + UserPreferences: &lsutil.UserPreferences{JsxAttributeCompletionStyle: lsutil.JsxAttributeCompletionStyleBraces, IncludeCompletionsWithSnippetText: core.TSTrue}, }) } diff --git a/internal/ls/autoimport/extract.go b/internal/ls/autoimport/extract.go index dc0a1db7e44..5f80b5800d0 100644 --- a/internal/ls/autoimport/extract.go +++ b/internal/ls/autoimport/extract.go @@ -108,20 +108,32 @@ func (e *exportExtractor) extractFromFile(file *ast.SourceFile) []*Export { return e.extractFromModule(file) } if len(file.AmbientModuleNames) > 0 { - moduleDeclarations := core.Filter(file.Statements.Nodes, ast.IsModuleWithStringLiteralName) var exportCount int - for _, decl := range moduleDeclarations { - exportCount += len(decl.AsModuleDeclaration().Symbol.Exports) + for _, statement := range file.Statements.Nodes { + if ast.IsModuleWithStringLiteralName(statement) && isNonPatternAmbientModuleDeclaration(file, statement.AsModuleDeclaration()) { + exportCount += len(statement.AsModuleDeclaration().Symbol.Exports) + } } exports := make([]*Export, 0, exportCount) - for _, decl := range moduleDeclarations { - e.extractFromModuleDeclaration(decl.AsModuleDeclaration(), file, ModuleID(decl.Name().Text()), "", &exports) + for _, statement := range file.Statements.Nodes { + if ast.IsModuleWithStringLiteralName(statement) && isNonPatternAmbientModuleDeclaration(file, statement.AsModuleDeclaration()) { + e.extractFromModuleDeclaration(statement.AsModuleDeclaration(), file, ModuleID(statement.Name().Text()), "", &exports) + } } return exports } return nil } +func isNonPatternAmbientModuleDeclaration(file *ast.SourceFile, decl *ast.ModuleDeclaration) bool { + for _, module := range file.PatternAmbientModules { + if module.Symbol == decl.Symbol { + return false + } + } + return true +} + func (e *exportExtractor) extractFromModule(file *ast.SourceFile) []*Export { moduleAugmentations := core.MapNonNil(file.ModuleAugmentations, func(name *ast.ModuleName) *ast.ModuleDeclaration { decl := name.Parent diff --git a/internal/ls/autoimport/import_adder.go b/internal/ls/autoimport/import_adder.go index ab0603d65be..884ab79ecc9 100644 --- a/internal/ls/autoimport/import_adder.go +++ b/internal/ls/autoimport/import_adder.go @@ -369,13 +369,13 @@ func (adder *importAdder) getNewImportEntry(moduleSpecifier string, importKind l return newEntry } -func (adder *importAdder) getAllExportsForSymbol( - symbol *ast.Symbol, -) []*Export { - if export := SymbolToExport(symbol, adder.checker); export != nil { - return adder.view.SearchByExportID(export.ExportID) +func (adder *importAdder) getAllExportsForSymbol(symbol *ast.Symbol) []*Export { + export := SymbolToExport(symbol, adder.checker) + if export == nil { + return nil } - return nil + exports := adder.view.SearchByExportIDIfAvailable(export.ExportID) + return core.IfElse(len(exports) > 0, exports, []*Export{export}) } func TypeToAutoImportableTypeNode( diff --git a/internal/ls/autoimport/view.go b/internal/ls/autoimport/view.go index 35441eeded6..08050149903 100644 --- a/internal/ls/autoimport/view.go +++ b/internal/ls/autoimport/view.go @@ -96,6 +96,17 @@ func (v *View) SearchByExportID(id ExportID) []*Export { return v.search(search) } +func (v *View) SearchByExportIDIfAvailable(id ExportID) []*Export { + if v == nil || v.registry == nil { + return nil + } + bucket := v.registry.projects[v.projectKey] + if bucket == nil || bucket.Index == nil { + return nil + } + return v.SearchByExportID(id) +} + func (v *View) search(searchFn func(*RegistryBucket) []*Export) []*Export { var results []*Export diff --git a/internal/ls/change/trackerimpl.go b/internal/ls/change/trackerimpl.go index e9e0ae717e2..437c37e062e 100644 --- a/internal/ls/change/trackerimpl.go +++ b/internal/ls/change/trackerimpl.go @@ -92,7 +92,7 @@ func (t *Tracker) computeNewText(change *trackerEdit, targetSourceFile *ast.Sour func (t *Tracker) getFormattedTextOfNode(nodeIn *ast.Node, targetSourceFile *ast.SourceFile, sourceFile *ast.SourceFile, pos int, options NodeOptions) string { text, sourceFileLike := t.getNonformattedText(nodeIn, targetSourceFile) // !!! if (validate) validate(node, text); - formatOptions := getFormatCodeSettingsForWriting(t.formatSettings, targetSourceFile) + formatOptions := GetFormatCodeSettingsForWriting(t.formatSettings, targetSourceFile) var initialIndentation, delta int if options.indentation == nil { @@ -111,7 +111,7 @@ func (t *Tracker) getFormattedTextOfNode(nodeIn *ast.Node, targetSourceFile *ast return core.ApplyBulkEdits(text, changes) } -func getFormatCodeSettingsForWriting(options lsutil.FormatCodeSettings, sourceFile *ast.SourceFile) lsutil.FormatCodeSettings { +func GetFormatCodeSettingsForWriting(options lsutil.FormatCodeSettings, sourceFile *ast.SourceFile) lsutil.FormatCodeSettings { shouldAutoDetectSemicolonPreference := options.Semicolons == lsutil.SemicolonPreferenceIgnore shouldRemoveSemicolons := options.Semicolons == lsutil.SemicolonPreferenceRemove || shouldAutoDetectSemicolonPreference && !lsutil.ProbablyUsesSemicolons(sourceFile) if shouldRemoveSemicolons { diff --git a/internal/ls/codeactions_fixclassincorrectlyimplementsinterface.go b/internal/ls/codeactions_fixclassincorrectlyimplementsinterface.go index 756b1b340a0..feb50ac4a11 100644 --- a/internal/ls/codeactions_fixclassincorrectlyimplementsinterface.go +++ b/internal/ls/codeactions_fixclassincorrectlyimplementsinterface.go @@ -126,7 +126,7 @@ func addChanges(context context.Context, fixContext *CodeFixContext, changeTrack missingMembers := getMissingMembers(typeChecker, classDeclaration, []*checker.Type{implementedType}) for _, member := range missingMembers { - memberNodes := missingMemberFixer.createMemberFromSymbol(member, classDeclaration, fixContext.SourceFile, nil /*body*/, preserveOptionalFlagsAll) + memberNodes := missingMemberFixer.createMemberFromSymbol(member, classDeclaration, fixContext.SourceFile, nil /*body*/, preserveOptionalFlagsAll, false /*abstract*/) for _, memberNode := range memberNodes { insertInterfaceMemberNode(changeTracker, fixContext.SourceFile, classDeclaration, constructor, memberNode) } diff --git a/internal/ls/codeactions_missingmemberfixer.go b/internal/ls/codeactions_missingmemberfixer.go index 17da2f56d80..de0e02acb6e 100644 --- a/internal/ls/codeactions_missingmemberfixer.go +++ b/internal/ls/codeactions_missingmemberfixer.go @@ -49,7 +49,7 @@ func (f *missingMemberFixer) createNodeBuilder() (*checker.NodeBuilder, map[*ast return nodeBuilder, idToSymbol } -func (f *missingMemberFixer) createMemberFromSymbol(symbol *ast.Symbol, enclosingDeclaration *ast.Node, sourceFile *ast.SourceFile, body *ast.FunctionBody, preserveOptional preserveOptionalFlags) []*ast.Node { +func (f *missingMemberFixer) createMemberFromSymbol(symbol *ast.Symbol, enclosingDeclaration *ast.Node, sourceFile *ast.SourceFile, body *ast.FunctionBody, preserveOptional preserveOptionalFlags, abstract bool) []*ast.Node { declarations := symbol.Declarations declaration := core.FirstOrNil(declarations) @@ -74,7 +74,7 @@ func (f *missingMemberFixer) createMemberFromSymbol(symbol *ast.Symbol, enclosin switch kind { case ast.KindPropertySignature, ast.KindPropertyDeclaration: nodeBuilder, idToSymbol := f.createNodeBuilder() - typeNode := f.createTypeNode(t, enclosingDeclaration, flags, nodeBuilder, idToSymbol) + typeNode := f.createTypeNode(t, sourceFile, enclosingDeclaration, flags, nodeBuilder, idToSymbol) var questionToken *ast.TokenNode if optional && preserveOptional&preserveOptionalFlagsProperty != 0 { questionToken = f.changeTracker.NodeFactory.NewToken(ast.KindQuestionToken) @@ -96,7 +96,7 @@ func (f *missingMemberFixer) createMemberFromSymbol(symbol *ast.Symbol, enclosin nodes = append(nodes, f.changeTracker.NodeFactory.NewGetAccessorDeclaration( modifiers, createPropertyName(f.changeTracker.NodeFactory, declarationName, quotePreference), - nil /*typeParameters*/, nil /*parameters*/, f.createTypeNode(t, enclosingDeclaration, flags, nodeBuilder, idToSymbol), nil /*fullSignature*/, f.createBody(body, ambient, quotePreference)), + nil /*typeParameters*/, nil /*parameters*/, f.createTypeNode(t, sourceFile, enclosingDeclaration, flags, nodeBuilder, idToSymbol), nil /*fullSignature*/, f.createBody(body, ambient || abstract, quotePreference)), ) } @@ -108,8 +108,8 @@ func (f *missingMemberFixer) createMemberFromSymbol(symbol *ast.Symbol, enclosin nodes = append(nodes, f.changeTracker.NodeFactory.NewSetAccessorDeclaration( modifiers, createPropertyName(f.changeTracker.NodeFactory, declarationName, quotePreference), - nil /*typeParameters*/, createDummyParameters(f.changeTracker.NodeFactory, 1, []string{parameter.Name().Text()}, []*ast.TypeNode{f.createTypeNode(t, enclosingDeclaration, flags, nodeBuilder, idToSymbol)}, 1, ast.IsInJSFile(enclosingDeclaration)), - nil /*type*/, nil /*fullSignature*/, f.createBody(body, ambient, quotePreference)), + nil /*typeParameters*/, createDummyParameters(f.changeTracker.NodeFactory, 1, []string{parameter.Name().Text()}, []*ast.TypeNode{f.createTypeNode(t, sourceFile, enclosingDeclaration, flags, nodeBuilder, idToSymbol)}, 1, ast.IsInJSFile(enclosingDeclaration)), + nil /*type*/, nil /*fullSignature*/, f.createBody(body, ambient || abstract, quotePreference)), ) } } @@ -123,7 +123,7 @@ func (f *missingMemberFixer) createMemberFromSymbol(symbol *ast.Symbol, enclosin } if len(declarations) == 1 { - method := f.createSignatureDeclarationFromSignature(core.FirstOrNil(signatures), ast.KindMethodDeclaration, sourceFile, enclosingDeclaration, f.createBody(body, ambient, quotePreference), modifiers, declarationName, preserveOptional) + method := f.createSignatureDeclarationFromSignature(core.FirstOrNil(signatures), ast.KindMethodDeclaration, sourceFile, enclosingDeclaration, f.createBody(body, ambient || abstract, quotePreference), modifiers, declarationName, preserveOptional) if method != nil { nodes = append(nodes, method) } @@ -141,18 +141,18 @@ func (f *missingMemberFixer) createMemberFromSymbol(symbol *ast.Symbol, enclosin } } - if ambient { + if ambient || abstract { return nodes } if len(declarations) > len(signatures) { signature := f.typeChecker.GetSignatureFromDeclaration(core.LastOrNil(declarations)) - method := f.createSignatureDeclarationFromSignature(signature, ast.KindMethodDeclaration, sourceFile, enclosingDeclaration, f.createBody(body, ambient, quotePreference), modifiers, declarationName, preserveOptional) + method := f.createSignatureDeclarationFromSignature(signature, ast.KindMethodDeclaration, sourceFile, enclosingDeclaration, f.createBody(body, ambient || abstract, quotePreference), modifiers, declarationName, preserveOptional) if method != nil { nodes = append(nodes, method) } } else { - method := f.createSignatureDeclarationFromSignatures(signatures, declarationName, preserveOptional, modifiers, quotePreference, body, enclosingDeclaration) + method := f.createSignatureDeclarationFromSignatures(sourceFile, signatures, declarationName, preserveOptional, modifiers, quotePreference, core.IfElse(abstract, nil, body), enclosingDeclaration) if method != nil { nodes = append(nodes, method) } @@ -170,8 +170,8 @@ func (f *missingMemberFixer) getCallSignatures(t *checker.Type) []*checker.Signa return f.typeChecker.GetCallSignatures(t) } -func (f *missingMemberFixer) createTypeNode(t *checker.Type, enclosingDeclaration *ast.Node, flags nodebuilder.Flags, nodeBuilder *checker.NodeBuilder, idToSymbol map[*ast.IdentifierNode]*ast.Symbol) *ast.TypeNode { - return f.importTypeNode(nodeBuilder.TypeToTypeNode(t, enclosingDeclaration, flags, nodebuilder.InternalFlagsNone, nil /*tracker*/), idToSymbol) +func (f *missingMemberFixer) createTypeNode(t *checker.Type, sourceFile *ast.SourceFile, enclosingDeclaration *ast.Node, flags nodebuilder.Flags, nodeBuilder *checker.NodeBuilder, idToSymbol map[*ast.IdentifierNode]*ast.Symbol) *ast.TypeNode { + return f.importTypeNode(nodeBuilder.TypeToTypeNode(t, enclosingDeclaration, flags, nodebuilder.InternalFlagsNone, nil /*tracker*/), sourceFile, idToSymbol) } func (f *missingMemberFixer) createModifiers(symbol *ast.Symbol, declaration *ast.Node) *ast.ModifierList { @@ -198,7 +198,7 @@ func (f *missingMemberFixer) createModifiers(symbol *ast.Symbol, declaration *as } func (f *missingMemberFixer) shouldAddOverrideKeyword(declaration *ast.Node) bool { - return declaration != nil && f.program.Options().NoImplicitOverride.IsTrue() && ast.HasAbstractModifier(declaration) + return declaration != nil && f.program.Options().NoImplicitOverride.IsTrue() && ast.IsClassElement(declaration) } func (f *missingMemberFixer) createSignatureDeclarationFromSignature(signature *checker.Signature, kind ast.Kind, sourceFile *ast.SourceFile, enclosingDeclaration *ast.Node, body *ast.FunctionBody, modifiers *ast.ModifierList, name *ast.PropertyName, optional bool) *ast.Node { @@ -231,12 +231,12 @@ func (f *missingMemberFixer) createSignatureDeclarationFromSignature(signature * constraint := typeParameter.Constraint if constraint != nil { - constraint = f.importTypeNode(constraint, idToSymbol) + constraint = f.importTypeNode(constraint, sourceFile, idToSymbol) } defaultType := typeParameter.DefaultType if defaultType != nil { - defaultType = f.importTypeNode(defaultType, idToSymbol) + defaultType = f.importTypeNode(defaultType, sourceFile, idToSymbol) } nodes = append(nodes, @@ -258,7 +258,7 @@ func (f *missingMemberFixer) createSignatureDeclarationFromSignature(signature * parameter := p.AsParameterDeclaration() parameterTypeNode := parameter.Type if parameterTypeNode != nil { - parameterTypeNode = f.importTypeNode(parameterTypeNode, idToSymbol) + parameterTypeNode = f.importTypeNode(parameterTypeNode, sourceFile, idToSymbol) } nodes = append(nodes, @@ -268,7 +268,7 @@ func (f *missingMemberFixer) createSignatureDeclarationFromSignature(signature * } if typeNode != nil { - typeNode = f.importTypeNode(typeNode, idToSymbol) + typeNode = f.importTypeNode(typeNode, sourceFile, idToSymbol) } var questionToken *ast.TokenNode @@ -298,7 +298,7 @@ func (f *missingMemberFixer) createSignatureDeclarationFromSignature(signature * return nil } -func (f *missingMemberFixer) createSignatureDeclarationFromSignatures(signatures []*checker.Signature, name *ast.PropertyName, optional bool, modifiers *ast.ModifierList, quotePreference lsutil.QuotePreference, body *ast.FunctionBody, enclosingDeclaration *ast.Node) *ast.Node { +func (f *missingMemberFixer) createSignatureDeclarationFromSignatures(sourceFile *ast.SourceFile, signatures []*checker.Signature, name *ast.PropertyName, optional bool, modifiers *ast.ModifierList, quotePreference lsutil.QuotePreference, body *ast.FunctionBody, enclosingDeclaration *ast.Node) *ast.Node { if len(signatures) == 0 { return nil } @@ -347,12 +347,12 @@ func (f *missingMemberFixer) createSignatureDeclarationFromSignatures(signatures return f.changeTracker.NodeFactory.NewMethodDeclaration( modifiers, nil /*asteriskToken*/, methodName, core.IfElse(optional, f.changeTracker.NodeFactory.NewToken(ast.KindQuestionToken), nil), - nil /*typeParameters*/, parameters, f.getReturnTypeFromSignatures(signatures, enclosingDeclaration, nodeBuilder, idToSymbol), + nil /*typeParameters*/, parameters, f.getReturnTypeFromSignatures(sourceFile, signatures, enclosingDeclaration, nodeBuilder, idToSymbol), nil /*fullSignature*/, f.createBody(body, false /*ambient*/, quotePreference), ) } -func (f *missingMemberFixer) getReturnTypeFromSignatures(signatures []*checker.Signature, enclosingDeclaration *ast.Node, nodeBuilder *checker.NodeBuilder, idToSymbol map[*ast.IdentifierNode]*ast.Symbol) *ast.TypeNode { +func (f *missingMemberFixer) getReturnTypeFromSignatures(sourceFile *ast.SourceFile, signatures []*checker.Signature, enclosingDeclaration *ast.Node, nodeBuilder *checker.NodeBuilder, idToSymbol map[*ast.IdentifierNode]*ast.Symbol) *ast.TypeNode { if len(signatures) == 0 { return nil } @@ -363,18 +363,22 @@ func (f *missingMemberFixer) getReturnTypeFromSignatures(signatures []*checker.S } unionType := f.typeChecker.GetUnionType(returnTypes) - return f.importTypeNode(nodeBuilder.TypeToTypeNode(unionType, enclosingDeclaration, nodebuilder.FlagsNoTruncation, nodebuilder.InternalFlagsAllowUnresolvedNames, nil /*typeArguments*/), idToSymbol) + return f.importTypeNode(nodeBuilder.TypeToTypeNode(unionType, enclosingDeclaration, nodebuilder.FlagsNoTruncation, nodebuilder.InternalFlagsAllowUnresolvedNames, nil /*typeArguments*/), sourceFile, idToSymbol) } -func (f *missingMemberFixer) importTypeNode(typeNode *ast.TypeNode, idToSymbol map[*ast.IdentifierNode]*ast.Symbol) *ast.TypeNode { - if typeNode == nil || f.importAdder == nil { +func (f *missingMemberFixer) importTypeNode(typeNode *ast.TypeNode, sourceFile *ast.SourceFile, idToSymbol map[*ast.IdentifierNode]*ast.Symbol) *ast.TypeNode { + if typeNode == nil || f.importAdder == nil || sourceFile.IsDeclarationFile { return typeNode } importedTypeNode, symbols := autoimport.TryGetAutoImportableReferenceFromTypeNode(typeNode, idToSymbol) if importedTypeNode != nil { for _, symbol := range symbols { - f.importAdder.AddImportFromExportedSymbol(symbol, true /*isValidTypeOnlyUseSite*/) + exportSymbol := f.getExportedSymbol(symbol) + if exportSymbol == nil { + continue + } + f.importAdder.AddImportFromExportedSymbol(exportSymbol, true /*isValidTypeOnlyUseSite*/) } return importedTypeNode } @@ -385,11 +389,23 @@ func (f *missingMemberFixer) importTypeNode(typeNode *ast.TypeNode, idToSymbol m continue } seen[symbol] = true - f.importAdder.AddImportFromExportedSymbol(symbol, true /*isValidTypeOnlyUseSite*/) + exportSymbol := f.getExportedSymbol(symbol) + if exportSymbol == nil { + continue + } + f.importAdder.AddImportFromExportedSymbol(exportSymbol, true /*isValidTypeOnlyUseSite*/) } return typeNode } +func (f *missingMemberFixer) getExportedSymbol(symbol *ast.Symbol) *ast.Symbol { + symbol = f.typeChecker.GetExportSymbolOfSymbol(symbol) + if symbol == nil || symbol.Parent == nil { + return nil + } + return symbol +} + func (f *missingMemberFixer) createIndexSignatureDeclarationFromType(classDeclaration *ast.Node, implementedType *checker.Type, keyType *checker.Type) *ast.Node { indexInfo := f.typeChecker.GetIndexInfoOfType(implementedType, keyType) if indexInfo == nil { diff --git a/internal/ls/completions.go b/internal/ls/completions.go index 91a72e4c5d7..a98cfbbcb45 100644 --- a/internal/ls/completions.go +++ b/internal/ls/completions.go @@ -17,9 +17,12 @@ import ( "github.com/microsoft/typescript-go/internal/compiler" "github.com/microsoft/typescript-go/internal/core" "github.com/microsoft/typescript-go/internal/debug" + "github.com/microsoft/typescript-go/internal/diagnostics" "github.com/microsoft/typescript-go/internal/format" "github.com/microsoft/typescript-go/internal/jsnum" + "github.com/microsoft/typescript-go/internal/locale" "github.com/microsoft/typescript-go/internal/ls/autoimport" + "github.com/microsoft/typescript-go/internal/ls/change" "github.com/microsoft/typescript-go/internal/ls/lsutil" "github.com/microsoft/typescript-go/internal/lsp/lsproto" "github.com/microsoft/typescript-go/internal/nodebuilder" @@ -197,7 +200,11 @@ func DeprecateSortText(original SortText) SortText { return "z" + original } -func sortBelow(original SortText) SortText { +func ObjectLiteralPropertySortText(presetSortText SortText, symbolDisplayName string) SortText { + return presetSortText + "\x00" + SortText(symbolDisplayName) + "\x00" +} + +func SortBelow(original SortText) SortText { return original + "1" } @@ -546,7 +553,7 @@ func (l *LanguageService) getCompletionData( isNewIdentifierLocation = importStatementCompletionInfo.isNewIdentifierLocation } // Bail out if this is a known invalid completion location. - if isCompletionListBlocker(contextToken, previousToken, location, file, position, typeChecker) { + if importStatementCompletionInfo.replacementSpan == nil && isCompletionListBlocker(contextToken, previousToken, location, file, position, typeChecker) { if keywordFilters != KeywordCompletionFiltersNone { isNewIdentifierLocation, _ := computeCommitCharactersAndIsNewIdentifier(contextToken, file, position) return keywordCompletionData(keywordFilters, isJSOnlyLocation, isNewIdentifierLocation), nil @@ -589,7 +596,7 @@ func (l *LanguageService) getCompletionData( // or leading into a '...' token. Just bail out instead. return nil, nil } - } else { // !!! else if (!importStatementCompletion) + } else if importStatementCompletion == nil { // // If the tagname is a property access expression, we will then walk up to the top most of property access expression. // Then, try to get a JSX container and its associated attributes type. @@ -1062,7 +1069,18 @@ func (l *LanguageService) getCompletionData( } } if transformObjectLiteralMembers { - // !!! object literal member snippet completions + if displayName := getObjectLiteralPropertyCompletionName(member); displayName != "" { + originalSortText := core.OrElse(symbolToSortTextMap[symbolId], SortTextLocationPriority) + symbolToSortTextMap[symbolId] = ObjectLiteralPropertySortText(originalSortText, displayName) + } + entry := l.getEntryForObjectLiteralMethodCompletion(ctx, typeChecker, member, objectLikeContainer, file) + if entry != nil { + symbolToOriginInfoMap[len(symbols)] = &symbolOriginInfo{ + kind: symbolOriginInfoKindObjectLiteralMethod, + data: entry, + } + symbols = append(symbols, member) + } } } } @@ -1819,6 +1837,7 @@ func (l *LanguageService) getCompletionEntriesFromSymbols( ) (uniqueNames collections.Set[string], sortedEntries []*lsproto.CompletionItem) { closestSymbolDeclaration := getClosestSymbolDeclaration(data.contextToken, data.location) useSemicolons := lsutil.ProbablyUsesSemicolons(file) + preferences := l.UserPreferences() isMemberCompletion := isMemberCompletionKind(data.completionKind) sortedEntries = slices.Grow(sortedEntries, len(data.symbols)+len(data.autoImports)) // Tracks unique names. @@ -1889,9 +1908,22 @@ func (l *LanguageService) getCompletionEntriesFromSymbols( // !!! check for type-only in JS // !!! deprecation + replacementSpan := (*lsproto.Range)(nil) + insertText := "" + isSnippet := false + sortText := SortTextAutoImportSuggestions + if data.importStatementCompletion != nil { - // !!! - continue + isSnippet = clientSupportsItemSnippet(ctx) && preferences.IncludeCompletionsWithSnippetText.IsTrue() + insertText, replacementSpan = getInsertTextAndReplacementSpanForImportCompletion( + autoImport.Fix, + data.importStatementCompletion, + useSemicolons, + file, + preferences, + isSnippet, + ) + sortText = SortTextLocationPriority } // Non-contextual keywords (e.g., `function`, `class`, `const`) cannot be used as identifiers, @@ -1915,10 +1947,10 @@ func (l *LanguageService) getCompletionEntriesFromSymbols( autoImport.Fix.Name, "", "", - SortTextAutoImportSuggestions, + sortText, autoImport.Export.ScriptElementKind, autoImport.Export.ScriptElementKindModifiers, - nil, + replacementSpan, nil, &lsproto.CompletionItemLabelDetails{ Description: new(autoImport.Fix.ModuleSpecifier), @@ -1926,14 +1958,19 @@ func (l *LanguageService) getCompletionEntriesFromSymbols( file, position, false, /*isMemberCompletion*/ - false, /*isSnippet*/ + isSnippet, true, /*hasAction*/ false, /*preselect*/ autoImport.Fix.ModuleSpecifier, autoImport.Fix.AutoImportFix, + nil, /*additionalTextEdits*/ nil, /*detail*/ ) + if insertText != "" { + setNewText(entry, insertText) + } + if isShadowed, _ := uniques[autoImport.Fix.Name]; !isShadowed { uniques[autoImport.Fix.Name] = false sortedEntries = append(sortedEntries, entry) @@ -1964,6 +2001,28 @@ func completionNameForLiteral( panic(fmt.Sprintf("Unhandled literal value: %v", literal)) } +func getInsertTextAndReplacementSpanForImportCompletion(fix *autoimport.Fix, importStatementCompletion *importStatementCompletionInfo, useSemicolons bool, file *ast.SourceFile, preferences lsutil.UserPreferences, isSnippet bool) (insertText string, replacementSpan *lsproto.Range) { + quotedModuleSpecifier := escapeSnippetText(quote(file, preferences, fix.ModuleSpecifier)) + tabStop := core.IfElse(isSnippet, "$1", "") + suffix := core.IfElse(useSemicolons, ";", "") + topLevelTypeOnlyText := core.IfElse(importStatementCompletion.isTopLevelTypeOnly, " "+scanner.TokenToString(ast.KindTypeKeyword)+" ", " ") + name := escapeSnippetText(fix.Name) + replacementSpan = importStatementCompletion.replacementSpan + + switch fix.ImportKind { + case lsproto.ImportKindCommonJS: + return fmt.Sprintf("import%s%s%s = require(%s)%s", topLevelTypeOnlyText, name, tabStop, quotedModuleSpecifier, suffix), replacementSpan + case lsproto.ImportKindDefault: + return fmt.Sprintf("import%s%s%s from %s%s", topLevelTypeOnlyText, name, tabStop, quotedModuleSpecifier, suffix), replacementSpan + case lsproto.ImportKindNamespace: + return fmt.Sprintf("import%s* as %s from %s%s", topLevelTypeOnlyText, name, quotedModuleSpecifier, suffix), replacementSpan + case lsproto.ImportKindNamed: + return fmt.Sprintf("import%s{ %s%s%s } from %s%s", topLevelTypeOnlyText, core.IfElse(importStatementCompletion.couldBeTypeOnlyImportSpecifier, scanner.TokenToString(ast.KindTypeKeyword)+" ", ""), name, tabStop, quotedModuleSpecifier, suffix), replacementSpan + default: + panic("unhandled import kind: " + fix.ImportKind.String()) + } +} + func createCompletionItemForLiteral( file *ast.SourceFile, preferences lsutil.UserPreferences, @@ -2120,27 +2179,40 @@ func (l *LanguageService) createCompletionItem( } } - if preferences.IncludeCompletionsWithClassMemberSnippets.IsTrue() && - data.completionKind == CompletionKindMemberLike && - isClassLikeMemberCompletion(symbol, data.location, file) { - // !!! class member completions + var additionalTextEdits *[]*lsproto.TextEdit + isClassMemberSnippetCompletion := false + if preferences.IncludeCompletionsWithClassMemberSnippets.IsTrueOrUnknown() && data.completionKind == CompletionKindMemberLike && isClassLikeMemberCompletion(symbol, data.location, file) { + memberCompletionEntry := l.getEntryForMemberCompletion(ctx, typeChecker, symbol, name, data.location, position, contextToken, file) + if memberCompletionEntry == nil { + return nil + } + isClassMemberSnippetCompletion = true + insertText = memberCompletionEntry.insertText + filterText = memberCompletionEntry.filterText + isSnippet = memberCompletionEntry.isSnippet + if len(memberCompletionEntry.additionalTextEdits) > 0 || memberCompletionEntry.eraseRange != nil { + additionalTextEdits = &memberCompletionEntry.additionalTextEdits + hasAction = true + source = string(completionSourceClassMemberSnippet) + } } if originIsObjectLiteralMethod(origin) { insertText = origin.asObjectLiteralMethod().insertText isSnippet = origin.asObjectLiteralMethod().isSnippet - labelDetails = origin.asObjectLiteralMethod().labelDetails // !!! check if this can conflict with case above where we set label details - if !clientSupportsItemLabelDetails(ctx) { + labelDetails = origin.asObjectLiteralMethod().labelDetails + if !clientSupportsItemLabelDetails(ctx) || preferences.UseLabelDetailsInCompletionEntries.IsFalse() { name = name + *origin.asObjectLiteralMethod().labelDetails.Detail labelDetails = nil } source = string(completionSourceObjectLiteralMethodSnippet) - sortText = sortBelow(sortText) + sortText = SortBelow(sortText) } if data.isJsxIdentifierExpected && !data.isRightOfOpenTag && clientSupportsItemSnippet(ctx) && + preferences.IncludeCompletionsWithSnippetText.IsTrue() && preferences.JsxAttributeCompletionStyle != lsutil.JsxAttributeCompletionStyleNone && !(data.location.Parent != nil && ast.IsJsxAttribute(data.location.Parent) && data.location.Parent.Initializer() != nil) { useBraces := preferences.JsxAttributeCompletionStyle == lsutil.JsxAttributeCompletionStyleBraces @@ -2212,6 +2284,11 @@ func (l *LanguageService) createCompletionItem( preselect := isRecommendedCompletionMatch(symbol, data.recommendedCompletion, typeChecker) kindModifiers := lsutil.GetSymbolModifiers(typeChecker, symbol) + if isClassMemberSnippetCompletion || + data.completionKind == CompletionKindObjectPropertyDeclaration && + preferences.IncludeCompletionsWithObjectLiteralMethodSnippets.IsTrue() { + kindModifiers &^= lsutil.ScriptElementKindModifierOptional + } return l.createLSPCompletionItem( ctx, @@ -2232,10 +2309,367 @@ func (l *LanguageService) createCompletionItem( preselect, source, nil, /*autoImportFix*/ + additionalTextEdits, nil, /*detail*/ ) } +type memberCompletionEntry struct { + insertText string + filterText string + isSnippet bool + additionalTextEdits []*lsproto.TextEdit + hasImportEdits bool + eraseRange *lsproto.Range +} + +func (l *LanguageService) getEntryForObjectLiteralMethodCompletion(ctx context.Context, typeChecker *checker.Checker, symbol *ast.Symbol, enclosingDeclaration *ast.Node, file *ast.SourceFile) *symbolOriginInfoObjectLiteralMethod { + method := l.createObjectLiteralMethod(typeChecker, symbol, enclosingDeclaration, file) + if method == nil { + return nil + } + + snippetPrinter := createSnippetPrinter(printer.PrinterOptions{ + RemoveComments: true, + NewLine: core.GetNewLineKind(l.FormatOptions().NewLineCharacter), + Target: l.GetProgram().Options().GetEmitScriptTarget(), + }) + + isSnippet := clientSupportsItemSnippet(ctx) && l.UserPreferences().IncludeCompletionsWithSnippetText.IsTrue() + insertText := snippetPrinter.printAndFormatNodeWithSettings(ctx, method, file, change.GetFormatCodeSettingsForWriting(l.FormatOptions(), file)) + if isSnippet { + insertText = addClassMemberSnippet(insertText, l.FormatOptions().NewLineCharacter) + } + insertText += "," + + return &symbolOriginInfoObjectLiteralMethod{ + insertText: insertText, + labelDetails: &lsproto.CompletionItemLabelDetails{ + Detail: new(l.printObjectLiteralMethodLabelDetail(method, file, snippetPrinter.factory)), + }, + isSnippet: isSnippet, + } +} + +func (l *LanguageService) createObjectLiteralMethod(typeChecker *checker.Checker, symbol *ast.Symbol, enclosingDeclaration *ast.Node, file *ast.SourceFile) *ast.Node { + declaration := core.FirstOrNil(symbol.Declarations) + if !isObjectLiteralMethodCompletionCandidateDeclaration(declaration) { + return nil + } + + effectiveType := typeChecker.GetWidenedType(typeChecker.GetTypeOfSymbolAtLocation(symbol, enclosingDeclaration)) + if effectiveType.Flags()&checker.TypeFlagsUnion != 0 && len(effectiveType.Types()) < 10 { + effectiveType = typeChecker.GetUnionTypeEx(effectiveType.Types(), checker.UnionReductionSubtype) + } + if effectiveType.Flags()&checker.TypeFlagsUnion != 0 { + var functionType *checker.Type + for _, unionType := range effectiveType.Types() { + if len(typeChecker.GetSignaturesOfType(unionType, checker.SignatureKindCall)) == 0 { + continue + } + if functionType != nil { + return nil + } + functionType = unionType + } + if functionType == nil { + return nil + } + effectiveType = functionType + } + + signatures := typeChecker.GetSignaturesOfType(effectiveType, checker.SignatureKindCall) + if len(signatures) != 1 { + return nil + } + + flags := nodebuilder.FlagsOmitThisParameter + if lsutil.GetQuotePreference(file, l.UserPreferences()) == lsutil.QuotePreferenceSingle { + flags |= nodebuilder.FlagsUseSingleQuotesForStringLiteralType + } + typeNode := typeChecker.TypeToTypeNode(effectiveType, enclosingDeclaration, flags, nil /*idToSymbol*/) + if typeNode == nil || typeNode.Kind != ast.KindFunctionType { + return nil + } + + factory := ast.NewNodeFactory(ast.NodeFactoryHooks{}) + parameters := make([]*ast.Node, 0, len(typeNode.AsFunctionTypeNode().Parameters.Nodes)) + for _, parameter := range typeNode.AsFunctionTypeNode().Parameters.Nodes { + parameters = append(parameters, factory.NewParameterDeclaration( + nil, /*modifiers*/ + parameter.AsParameterDeclaration().DotDotDotToken, + parameter.Name().Clone(factory), + nil, /*questionToken*/ + nil, /*typeNode*/ + parameter.AsParameterDeclaration().Initializer, + )) + } + + return factory.NewMethodDeclaration( + nil, /*modifiers*/ + nil, /*asteriskToken*/ + declaration.Name().Clone(factory), + nil, /*postfixToken*/ + nil, /*typeParameters*/ + factory.NewNodeList(parameters), + nil, /*typeNode*/ + nil, /*fullSignature*/ + factory.NewBlock(factory.NewNodeList(nil /*nodes*/), true /*multiLine*/), + ) +} + +func isObjectLiteralMethodCompletionCandidateDeclaration(declaration *ast.Node) bool { + if declaration == nil { + return false + } + switch declaration.Kind { + case ast.KindPropertySignature, ast.KindPropertyDeclaration, ast.KindMethodSignature, ast.KindMethodDeclaration: + return true + default: + return false + } +} + +func (l *LanguageService) printObjectLiteralMethodLabelDetail(method *ast.Node, file *ast.SourceFile, factory *ast.NodeFactory) string { + methodDeclaration := method.AsMethodDeclaration() + methodSignature := factory.NewMethodSignatureDeclaration( + nil, /*modifiers*/ + factory.NewIdentifier(""), + methodDeclaration.PostfixToken, + methodDeclaration.TypeParameters, + methodDeclaration.Parameters, + methodDeclaration.Type, + ) + signaturePrinter := printer.NewPrinter(printer.PrinterOptions{ + RemoveComments: true, + NewLine: core.GetNewLineKind(l.FormatOptions().NewLineCharacter), + Target: l.GetProgram().Options().GetEmitScriptTarget(), + }, printer.PrintHandlers{}, nil /*emitContext*/) + return strings.TrimSuffix(signaturePrinter.Emit(methodSignature, file), ";") +} + +func (l *LanguageService) getEntryForMemberCompletion(ctx context.Context, typeChecker *checker.Checker, symbol *ast.Symbol, name string, location *ast.Node, position int, contextToken *ast.Node, file *ast.SourceFile) *memberCompletionEntry { + classLikeDeclaration := ast.FindAncestor(location, ast.IsClassLike) + if classLikeDeclaration == nil { + return nil + } + + changeTracker := change.NewTracker(ctx, l.GetProgram().Options(), l.FormatOptions(), l.converters) + importAdder := l.createImportAdder(ctx, typeChecker, file) + fixer := newMissingMemberFixer(changeTracker, l.GetProgram(), typeChecker, l.UserPreferences(), importAdder, locale.FromContext(ctx)) + + presentModifiers := l.getPresentMemberModifiers(contextToken, file, position) + abstract := presentModifiers.modifiers&ast.ModifierFlagsAbstract != 0 && classLikeDeclaration.ModifierFlags()&ast.ModifierFlagsAbstract != 0 + body := changeTracker.NodeFactory.NewBlock(changeTracker.NodeFactory.NewNodeList(nil), true /*multiLine*/) + nodes := fixer.createMemberFromSymbol(symbol, classLikeDeclaration, file, body, preserveOptionalFlagsProperty, abstract) + if len(nodes) == 0 { + return nil + } + + isSnippet := clientSupportsItemSnippet(ctx) && l.UserPreferences().IncludeCompletionsWithSnippetText.IsTrue() + modifiers := ast.ModifierFlagsNone + + completionNodes := make([]*ast.Node, 0, len(nodes)) + for _, node := range nodes { + if node == nil { + continue + } + if len(completionNodes) == 0 { + modifiers = node.ModifierFlags() + if abstract { + modifiers |= ast.ModifierFlagsAbstract + } + } + completionNodes = append(completionNodes, node) + } + + if len(completionNodes) == 0 { + return nil + } + + allowedModifiers := modifiers | ast.ModifierFlagsOverride | ast.ModifierFlagsPublic + if symbol.Flags&ast.SymbolFlagsMethod != 0 { + allowedModifiers |= ast.ModifierFlagsAsync + } else { + allowedModifiers |= ast.ModifierFlagsAmbient | ast.ModifierFlagsReadonly + } + + allowedAndPresent := presentModifiers.modifiers & allowedModifiers + if presentModifiers.modifiers&^allowedModifiers != 0 { + return nil + } + + if modifiers&ast.ModifierFlagsProtected != 0 && allowedAndPresent&ast.ModifierFlagsPublic != 0 { + modifiers &^= ast.ModifierFlagsProtected + } + + if allowedAndPresent != ast.ModifierFlagsNone && allowedAndPresent&ast.ModifierFlagsPublic == 0 { + modifiers &^= ast.ModifierFlagsPublic + } + + modifiers |= allowedAndPresent + newLine := l.FormatOptions().NewLineCharacter + snippetPrinter := createSnippetPrinter(printer.PrinterOptions{ + RemoveComments: true, + NewLine: core.GetNewLineKind(newLine), + Target: l.GetProgram().Options().GetEmitScriptTarget(), + }) + + var decoratedNode *ast.Node + if len(presentModifiers.decorators) > 0 { + lastNodeIndex := len(completionNodes) - 1 + if ast.CanHaveDecorators(completionNodes[lastNodeIndex]) { + decoratedNode = completionNodes[lastNodeIndex] + } + } + + texts := make([]string, 0, len(completionNodes)) + for _, node := range completionNodes { + node = ast.ReplaceModifiers(changeTracker.NodeFactory, node, createModifierList(changeTracker.NodeFactory, modifiers, core.IfElse(node == decoratedNode, presentModifiers.decorators, nil))) + text := snippetPrinter.printAndFormatNodeWithSettings(ctx, node, file, change.GetFormatCodeSettingsForWriting(l.FormatOptions(), file)) + + if isSnippet { + text = addClassMemberSnippet(text, newLine) + } + + texts = append(texts, text) + } + + insertText := strings.Join(texts, newLine) + if insertText == "" { + return nil + } + + var additionalTextEdits []*lsproto.TextEdit + hasImportEdits := false + if importAdder != nil && importAdder.HasFixes() { + additionalTextEdits = importAdder.Edits() + hasImportEdits = len(additionalTextEdits) > 0 + } + + if presentModifiers.eraseRange != nil { + additionalTextEdits = append(additionalTextEdits, &lsproto.TextEdit{ + Range: *presentModifiers.eraseRange, + NewText: "", + }) + } + + return &memberCompletionEntry{ + insertText: insertText, + filterText: name, + isSnippet: isSnippet, + additionalTextEdits: additionalTextEdits, + hasImportEdits: hasImportEdits, + eraseRange: presentModifiers.eraseRange, + } +} + +type presentMemberModifiers struct { + modifiers ast.ModifierFlags + decorators []*ast.Node + eraseRange *lsproto.Range +} + +func (l *LanguageService) getPresentMemberModifiers(contextToken *ast.Node, file *ast.SourceFile, position int) presentMemberModifiers { + if contextToken == nil || getLineOfPosition(file, position) > getLineOfPosition(file, contextToken.End()) { + return presentMemberModifiers{} + } + + var modifiers ast.ModifierFlags + var decorators []*ast.Node + rangePos := position + rangeEnd := position + + if ast.IsPropertyDeclaration(contextToken.Parent) { + contextModifierKind := modifierLikeKind(contextToken) + if contextModifierKind == ast.KindUnknown { + return presentMemberModifiers{} + } + + modifierNodes := contextToken.Parent.ModifierNodes() + if len(modifierNodes) > 0 { + modifiers |= ast.ModifiersToFlags(modifierNodes) & ast.ModifierFlagsModifier + for _, modifier := range modifierNodes { + if ast.IsDecorator(modifier) { + decorators = append(decorators, modifier) + } + rangePos = min(rangePos, scanner.GetTokenPosOfNode(modifier, file, false /*includeJSDoc*/)) + } + } + + contextModifierFlag := ast.ModifierToFlag(contextModifierKind) + if modifiers&contextModifierFlag == 0 { + modifiers |= contextModifierFlag + rangePos = min(rangePos, astnav.GetStartOfNode(contextToken, file, false /*includeJSDoc*/)) + } + + if contextToken.Parent.Name() != contextToken { + rangeEnd = astnav.GetStartOfNode(contextToken.Parent.Name(), file, false /*includeJSDoc*/) + } + } + + var eraseRange *lsproto.Range + if rangePos < rangeEnd { + eraseRange = new(l.createLspRangeFromBounds(rangePos, rangeEnd, file)) + } + + return presentMemberModifiers{ + modifiers: modifiers, + decorators: decorators, + eraseRange: eraseRange, + } +} + +func modifierLikeKind(node *ast.Node) ast.Kind { + if node == nil { + return ast.KindUnknown + } + if ast.IsModifier(node) { + return node.Kind + } + if ast.IsIdentifier(node) { + keywordKind := scanner.IdentifierToKeywordKind(node.AsIdentifier()) + if keywordKind != ast.KindUnknown && ast.IsModifierKind(keywordKind) { + return keywordKind + } + } + return ast.KindUnknown +} + +func createModifierList(factory *ast.NodeFactory, flags ast.ModifierFlags, decorators []*ast.Node) *ast.ModifierList { + var nodes []*ast.Node + for _, decorator := range decorators { + nodes = append(nodes, decorator.Clone(factory)) + } + nodes = append(nodes, ast.CreateModifiersFromModifierFlags(flags, factory.NewModifier)...) + if len(nodes) == 0 { + return nil + } + return factory.NewModifierList(nodes) +} + +func addClassMemberSnippet(text string, newLine string) string { + emptyBody := "{" + newLine + "}" + if strings.Contains(text, emptyBody) { + return strings.Replace(text, emptyBody, "{"+newLine+" $0"+newLine+"}", 1) + } + return text +} + +func (l *LanguageService) createImportAdder(ctx context.Context, typeChecker *checker.Checker, file *ast.SourceFile) autoimport.ImportAdder { + if tspath.IsDynamicFileName(file.FileName()) { + return nil + } + view, err := l.getPreparedAutoImportView(file) + if err != nil { + view = l.getCurrentAutoImportView(file) + } + if view == nil { + return nil + } + return autoimport.NewImportAdder(ctx, l.GetProgram(), typeChecker, file, view, l.FormatOptions(), l.converters, l.UserPreferences()) +} + func isRecommendedCompletionMatch(localSymbol *ast.Symbol, recommendedCompletion *ast.Symbol, typeChecker *checker.Checker) bool { return localSymbol == recommendedCompletion || localSymbol.Flags&ast.SymbolFlagsExportValue != 0 && typeChecker.GetExportSymbolOfSymbol(localSymbol) == recommendedCompletion @@ -2387,6 +2821,17 @@ func strPtrTo(v string) *string { return &v } +func setNewText(item *lsproto.CompletionItem, insertText string) { + item.InsertText = &insertText + if item.TextEdit != nil { + if item.TextEdit.TextEdit != nil { + item.TextEdit.TextEdit.NewText = insertText + } else if item.TextEdit.InsertReplaceEdit != nil { + item.TextEdit.InsertReplaceEdit.NewText = insertText + } + } +} + func boolToPtr(v bool) *bool { if v { return new(true) @@ -2416,8 +2861,14 @@ func getLineEndOfPosition(file *ast.SourceFile, pos int) int { } func isClassLikeMemberCompletion(symbol *ast.Symbol, location *ast.Node, file *ast.SourceFile) bool { - // !!! class member completions - return false + if ast.IsInJSFile(location) { + return false + } + memberFlags := ast.SymbolFlagsClassMember & ast.SymbolFlagsEnumMemberExcludes + return symbol.Flags&memberFlags != 0 && + (ast.IsClassLike(location) || + (location.Parent != nil && location.Parent.Parent != nil && ast.IsClassElement(location.Parent) && location == location.Parent.Name() && lsutil.GetLastToken(location.Parent, file) == location.Parent.Name() && ast.IsClassLike(location.Parent.Parent)) || + (location.Parent != nil && ast.IsSyntaxList(location) && ast.IsClassLike(location.Parent))) } func symbolAppearsToBeTypeOnly(symbol *ast.Symbol, typeChecker *checker.Checker) bool { @@ -2579,6 +3030,22 @@ func getCompletionEntryDisplayNameForSymbol( } } +func getObjectLiteralPropertyCompletionName(symbol *ast.Symbol) string { + name := ast.SymbolName(symbol) + if name == "" || + symbol.Flags&ast.SymbolFlagsModule != 0 && startsWithQuote(name) || + checker.IsKnownSymbol(symbol) { + return "" + } + if scanner.IsIdentifierText(name, core.LanguageVariantStandard) || + symbol.ValueDeclaration != nil && ast.IsPrivateIdentifierClassElementDeclaration(symbol.ValueDeclaration) || + symbol.Flags&ast.SymbolFlagsAlias != 0 { + return name + } + escapedName, _ := core.StringifyJson(name, "" /*prefix*/, "" /*indent*/) + return escapedName +} + // !!! refactor symbolOriginInfo so that we can tell the difference between flags and the kind of data it has func originIsIgnore(origin *symbolOriginInfo) bool { return origin != nil && origin.kind&symbolOriginInfoKindIgnore != 0 @@ -4327,6 +4794,7 @@ func (l *LanguageService) getJsxClosingTagCompletion( false, /*preselect*/ "", /*source*/ nil, /*autoImportEntryData*/ // !!! jsx autoimports + nil, /*additionalTextEdits*/ nil, /*detail*/ ) items := []*lsproto.CompletionItem{item} @@ -4365,6 +4833,7 @@ func (l *LanguageService) createLSPCompletionItem( preselect bool, source string, autoImportFix *lsproto.AutoImportFix, + additionalTextEdits *[]*lsproto.TextEdit, detail *string, ) *lsproto.CompletionItem { kind := getCompletionsSymbolKind(elementKind) @@ -4403,7 +4872,7 @@ func (l *LanguageService) createLSPCompletionItem( if insertText == "" { insertText = name } - if filterText == "" { + if filterText == "" || isSnippet { filterText = name } name = name + "?" @@ -4423,19 +4892,20 @@ func (l *LanguageService) createLSPCompletionItem( } return &lsproto.CompletionItem{ - Label: name, - LabelDetails: labelDetails, - Kind: &kind, - Tags: tags, - Detail: detail, - Preselect: boolToPtr(preselect), - SortText: new(string(sortText)), - FilterText: strPtrTo(filterText), - InsertText: strPtrTo(insertText), - InsertTextFormat: insertTextFormat, - TextEdit: textEdit, - CommitCharacters: commitCharacters, - Data: data, + Label: name, + LabelDetails: labelDetails, + Kind: &kind, + Tags: tags, + Detail: detail, + Preselect: boolToPtr(preselect), + SortText: new(string(sortText)), + FilterText: strPtrTo(filterText), + InsertText: strPtrTo(insertText), + InsertTextFormat: insertTextFormat, + TextEdit: textEdit, + CommitCharacters: commitCharacters, + AdditionalTextEdits: additionalTextEdits, + Data: data, } } @@ -4502,6 +4972,7 @@ func (l *LanguageService) getLabelStatementCompletions( false, /*preselect*/ "", /*source*/ nil, /*autoImportEntryData*/ + nil, /*additionalTextEdits*/ nil, /*detail*/ )) } @@ -4891,6 +5362,18 @@ func (l *LanguageService) getCompletionItemDetails( } case symbolCompletion.symbol != nil: symbolDetails := symbolCompletion.symbol + if data.Source == string(completionSourceClassMemberSnippet) { + memberCompletion := l.getEntryForMemberCompletion(ctx, checker, symbolDetails.symbol, data.Name, symbolDetails.location, position, symbolDetails.contextToken, file) + if memberCompletion != nil && len(memberCompletion.additionalTextEdits) > 0 { + item.AdditionalTextEdits = &memberCompletion.additionalTextEdits + if memberCompletion.hasImportEdits { + item.Detail = strPtrTo(diagnostics.Includes_imports_of_types_referenced_by_0.Localize(locale.FromContext(ctx), data.Name)) + } else { + item.Detail = strPtrTo(diagnostics.Update_modifiers_of_0.Localize(locale.FromContext(ctx), data.Name)) + } + return item + } + } return l.createCompletionDetailsForSymbol( item, symbolDetails.symbol, @@ -6098,9 +6581,14 @@ func (p *snippetPrinter) printUnescapedNode(node *ast.Node) string { } func (p *snippetPrinter) printAndFormatNode(ctx context.Context, node *ast.Node, sourceFile *ast.SourceFile) string { + return p.printAndFormatNodeWithSettings(ctx, node, sourceFile, format.GetFormatCodeSettingsFromContext(ctx)) +} + +func (p *snippetPrinter) printAndFormatNodeWithSettings(ctx context.Context, node *ast.Node, sourceFile *ast.SourceFile, formatOptions lsutil.FormatCodeSettings) string { text := p.printUnescapedNode(node) nodeWithPos := p.baseWriter.AssignPositionsToNode(node, p.factory) syntheticFile := p.createSyntheticFile(nodeWithPos, text, sourceFile) + ctx = format.WithFormatCodeSettings(ctx, formatOptions, formatOptions.NewLineCharacter) changes := format.FormatNodeGivenIndentation( ctx, nodeWithPos, diff --git a/internal/ls/lsutil/userpreferences.go b/internal/ls/lsutil/userpreferences.go index 2b54bda0158..93f4e9000d7 100644 --- a/internal/ls/lsutil/userpreferences.go +++ b/internal/ls/lsutil/userpreferences.go @@ -64,12 +64,16 @@ type UserPreferences struct { // a whole declaration for the member. // E.g., `class A { f| }` could be completed to `class A { foo(): number {} }`, instead of // `class A { foo }`. - IncludeCompletionsWithClassMemberSnippets core.Tristate `raw:"includeCompletionsWithClassMemberSnippets" config:"suggest.classMemberSnippets.enabled"` // !!! + IncludeCompletionsWithClassMemberSnippets core.Tristate `raw:"includeCompletionsWithClassMemberSnippets" config:"suggest.classMemberSnippets.enabled"` + // If enabled, completion entries that support placeholders will return snippet text. + IncludeCompletionsWithSnippetText core.Tristate `raw:"includeCompletionsWithSnippetText" config:"suggest.snippets.enabled"` + // If enabled, completion entries that support label details will return them separately from the label. + UseLabelDetailsInCompletionEntries core.Tristate `raw:"useLabelDetailsInCompletionEntries"` // If enabled, object literal methods will have a method declaration completion entry in addition // to the regular completion entry containing just the method name. // E.g., `const objectLiteral: T = { f| }` could be completed to `const objectLiteral: T = { foo(): void {} }`, // in addition to `const objectLiteral: T = { foo }`. - IncludeCompletionsWithObjectLiteralMethodSnippets core.Tristate `raw:"includeCompletionsWithObjectLiteralMethodSnippets" config:"suggest.objectLiteralMethodSnippets.enabled"` // !!! + IncludeCompletionsWithObjectLiteralMethodSnippets core.Tristate `raw:"includeCompletionsWithObjectLiteralMethodSnippets" config:"suggest.objectLiteralMethodSnippets.enabled"` JsxAttributeCompletionStyle JsxAttributeCompletionStyle `raw:"jsxAttributeCompletionStyle" config:"preferences.jsxAttributeCompletionStyle"` // ------- AutoImports -------- diff --git a/internal/ls/string_completions.go b/internal/ls/string_completions.go index 0c5b489db48..d8b6096eff0 100644 --- a/internal/ls/string_completions.go +++ b/internal/ls/string_completions.go @@ -167,6 +167,7 @@ func (l *LanguageService) convertStringLiteralCompletions( false, /*preselect*/ "", /*source*/ nil, /*autoImportEntryData*/ + nil, /*additionalTextEdits*/ nil, /*detail*/ ) }) @@ -225,6 +226,7 @@ func (l *LanguageService) convertPathCompletions( false, /*preselect*/ "", /*source*/ nil, /*autoImportEntryData*/ + nil, /*additionalTextEdits*/ &detail, ) }) diff --git a/internal/ls/utilities.go b/internal/ls/utilities.go index c42fa556bf8..8af32d513ef 100644 --- a/internal/ls/utilities.go +++ b/internal/ls/utilities.go @@ -309,7 +309,7 @@ func quote(file *ast.SourceFile, preferences lsutil.UserPreferences, text string quotePreference := lsutil.GetQuotePreference(file, preferences) quoted, _ := core.StringifyJson(text, "" /*prefix*/, "" /*indent*/) if quotePreference == lsutil.QuotePreferenceSingle { - quoted = quoteReplacer.Replace(stringutil.StripQuotes(quoted)) + quoted = "'" + quoteReplacer.Replace(stringutil.StripQuotes(quoted)) + "'" } return quoted }