Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions internal/diagnostics/diagnostics_generated.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 4 additions & 0 deletions internal/diagnostics/extraDiagnosticMessages.json
Original file line number Diff line number Diff line change
Expand Up @@ -122,5 +122,9 @@
"Sort Imports": {
"category": "Message",
"code": 100018
},
"File rename is not supported by the editor": {
"category": "Error",
"code": 8040
}
}
90 changes: 90 additions & 0 deletions internal/fourslash/_scripts/convertFourslash.mts
Original file line number Diff line number Diff line change
Expand Up @@ -330,6 +330,8 @@ function parseFourslashStatement(statement: ts.Statement): Cmd[] {
case "renameInfoSucceeded":
case "renameInfoFailed":
return parseRenameInfo(func.text, callExpression.arguments);
case "getEditsForFileRename":
return parseGetEditsForFileRename(callExpression.arguments);
case "getSemanticDiagnostics":
case "getSuggestionDiagnostics":
case "getSyntacticDiagnostics":
Expand Down Expand Up @@ -1429,6 +1431,83 @@ function parseRenameInfo(funcName: "renameInfoSucceeded" | "renameInfoFailed", a
return [{ kind: funcName, preferences }];
}

function parseGetEditsForFileRename(args: readonly ts.Expression[]): [VerifyGetEditsForFileRenameCmd] {
if (args.length !== 1 || !ts.isObjectLiteralExpression(args[0])) {
throw new Error(`Expected a single object literal argument in verify.getEditsForFileRename, got ${args.map(arg => arg.getText()).join(", ")}`);
}

let oldPath: string | undefined;
let newPath: string | undefined;
let newFileContents = "map[string]string{}";
let preferences = "nil /*preferences*/";

for (const prop of args[0].properties) {
if (!ts.isPropertyAssignment(prop)) {
throw new Error(`Expected property assignment in verify.getEditsForFileRename argument, got ${prop.getText()}`);
}
const name = prop.name.getText();
switch (name) {
case "oldPath": {
const value = getStringLiteralLike(prop.initializer);
if (!value) {
throw new Error(`Expected string literal for oldPath, got ${prop.initializer.getText()}`);
}
oldPath = getGoStringLiteral(value.text);
break;
}
case "newPath": {
const value = getStringLiteralLike(prop.initializer);
if (!value) {
throw new Error(`Expected string literal for newPath, got ${prop.initializer.getText()}`);
}
newPath = getGoStringLiteral(value.text);
break;
}
case "newFileContents": {
const obj = getObjectLiteralExpression(prop.initializer);
if (!obj) {
throw new Error(`Expected object literal for newFileContents, got ${prop.initializer.getText()}`);
}
const entries: string[] = [];
for (const entry of obj.properties) {
if (!ts.isPropertyAssignment(entry)) {
throw new Error(`Expected property assignment in verify.getEditsForFileRename argument, got ${prop.getText()}`);
}
const key = getStringLiteralLike(entry.name);
const value = getStringLiteralLike(entry.initializer);
if (!key || !value) {
throw new Error(`Expected string literal key/value in newFileContents, got ${entry.getText()}`);
}
entries.push(`${getGoStringLiteral(key.text)}: ${getGoMultiLineStringLiteral(value.text)}`);
}
newFileContents = entries.length === 0
? "map[string]string{}"
: `map[string]string{\n${entries.join(",\n")},\n}`;
break;
}
case "preferences": {
if (!ts.isObjectLiteralExpression(prop.initializer)) {
throw new Error(`Expected object literal for preferences, got ${prop.initializer.getText()}`);
}
preferences = parseUserPreferences(prop.initializer);
break;
}
}
}

if (!oldPath || !newPath) {
throw new Error(`Expected oldPath and newPath in verify.getEditsForFileRename`);
}

return [{
kind: "verifyGetEditsForFileRename",
oldPath,
newPath,
newFileContents,
preferences,
}];
}

function parseBaselineRenameArgs(funcName: string, args: readonly ts.Expression[]): [VerifyBaselineRenameCmd] {
let newArgs: string[] = [];
let preferences: string | undefined;
Expand Down Expand Up @@ -3261,6 +3340,14 @@ interface VerifyRenameInfoCmd {
preferences: string;
}

interface VerifyGetEditsForFileRenameCmd {
kind: "verifyGetEditsForFileRename";
oldPath: string;
newPath: string;
newFileContents: string;
preferences: string;
}

interface VerifyBaselineLinkedEditingCmd {
kind: "verifyBaselineLinkedEditing";
}
Expand Down Expand Up @@ -3413,6 +3500,7 @@ type Cmd =
| VerifyOrganizeImportsCmd
| VerifyBaselineRenameCmd
| VerifyRenameInfoCmd
| VerifyGetEditsForFileRenameCmd
| VerifyBaselineLinkedEditingCmd
| VerifyLinkedEditingCmd
| VerifyNavToCmd
Expand Down Expand Up @@ -3744,6 +3832,8 @@ function generateCmd(cmd: Cmd, imports: Set<string>): string {
return `f.VerifyRenameSucceeded(t, ${cmd.preferences})`;
case "renameInfoFailed":
return `f.VerifyRenameFailed(t, ${cmd.preferences})`;
case "verifyGetEditsForFileRename":
return `f.VerifyWillRenameFilesEdits(t, ${cmd.oldPath}, ${cmd.newPath}, ${cmd.newFileContents}, ${cmd.preferences})`;
case "verifyBaselineInlayHints":
return generateBaselineInlayHints(cmd);
case "verifyBaselineLinkedEditing":
Expand Down
2 changes: 0 additions & 2 deletions internal/fourslash/_scripts/failingTests.txt
Original file line number Diff line number Diff line change
Expand Up @@ -238,8 +238,6 @@ TestImportNameCodeFix_reExportDefault
TestImportNameCodeFix_require
TestImportNameCodeFix_require_addToExisting
TestImportNameCodeFix_require_importVsRequire_addToExistingWins
TestImportNameCodeFix_symlink_own_package
TestImportNameCodeFix_symlink_own_package_2
TestImportNameCodeFix_uriStyleNodeCoreModules2
TestImportNameCodeFix_uriStyleNodeCoreModules3
TestImportNameCodeFixDefaultExport4
Expand Down
10 changes: 10 additions & 0 deletions internal/fourslash/_scripts/manualTests.txt
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,16 @@ exhaustiveCaseCompletions6
exhaustiveCaseCompletions7
exhaustiveCaseCompletions8
formatOnEnterInComment
getEditsForFileRename_caseInsensitive
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Some tests are manual because we needed to specify case insensitivity, but most are because I changed fourslash such that the expected file content map uses file names after the rename.

getEditsForFileRename_directory_down
getEditsForFileRename_directory_up
getEditsForFileRename_jsExtension
getEditsForFileRename_preferences
getEditsForFileRename_preservePathEnding
getEditsForFileRename_resolveJsonModule
getEditsForFileRename_shortenRelativePaths
getEditsForFileRename_subDir
getEditsForFileRename_unaffectedNonRelativePath
getOutliningSpans
importNameCodeFix_uriStyleNodeCoreModules1
importNameCodeFixDefaultExport7
Expand Down
29 changes: 0 additions & 29 deletions internal/fourslash/_scripts/unparsedTests.txt
Original file line number Diff line number Diff line change
Expand Up @@ -1664,35 +1664,6 @@ fsEditMarkerPositions.ts parse error: "Unrecognized verify content function: tex
functionRenamingErrorRecovery.ts parse error: "Unrecognized fourslash statement: verify.not.errorExistsAfterMarker(...)"
getCompletionEntryDetails.ts parse error: "Expected property access expression, got check"
getCompletionEntryDetails2.ts parse error: "Expected property assignment with identifier name, got exact"
getEditsForFileRename_ambientModule.ts parse error: "Unrecognized fourslash statement: verify.getEditsForFileRename(...)"
getEditsForFileRename_amd.ts parse error: "Unrecognized fourslash statement: verify.getEditsForFileRename(...)"
getEditsForFileRename_caseInsensitive.ts parse error: "Unrecognized fourslash statement: verify.getEditsForFileRename(...)"
getEditsForFileRename_casing.ts parse error: "Unrecognized fourslash statement: verify.getEditsForFileRename(...)"
getEditsForFileRename_directory_down.ts parse error: "Unrecognized fourslash statement: verify.getEditsForFileRename(...)"
getEditsForFileRename_directory_noUpdateNodeModulesImport.ts parse error: "Unrecognized fourslash statement: verify.getEditsForFileRename(...)"
getEditsForFileRename_directory_up.ts parse error: "Unrecognized fourslash statement: verify.getEditsForFileRename(...)"
getEditsForFileRename_directory.ts parse error: "Unrecognized fourslash statement: verify.getEditsForFileRename(...)"
getEditsForFileRename_js_simple.ts parse error: "Unrecognized fourslash statement: verify.getEditsForFileRename(...)"
getEditsForFileRename_jsExtension.ts parse error: "Unrecognized fourslash statement: verify.getEditsForFileRename(...)"
getEditsForFileRename_keepFileExtensions.ts parse error: "Unrecognized fourslash statement: verify.getEditsForFileRename(...)"
getEditsForFileRename_nodeModuleDirectoryCase.ts parse error: "Unrecognized fourslash statement: verify.getEditsForFileRename(...)"
getEditsForFileRename_notAffectedByJsFile.ts parse error: "Unrecognized fourslash statement: verify.getEditsForFileRename(...)"
getEditsForFileRename_preferences.ts parse error: "Unrecognized fourslash statement: verify.getEditsForFileRename(...)"
getEditsForFileRename_preservePathEnding.ts parse error: "Unrecognized fourslash statement: verify.getEditsForFileRename(...)"
getEditsForFileRename_renameFromIndex.ts parse error: "Unrecognized fourslash statement: verify.getEditsForFileRename(...)"
getEditsForFileRename_renameToIndex.ts parse error: "Unrecognized fourslash statement: verify.getEditsForFileRename(...)"
getEditsForFileRename_resolveJsonModule.ts parse error: "Unrecognized fourslash statement: verify.getEditsForFileRename(...)"
getEditsForFileRename_shortenRelativePaths.ts parse error: "Unrecognized fourslash statement: verify.getEditsForFileRename(...)"
getEditsForFileRename_subDir.ts parse error: "Unrecognized fourslash statement: verify.getEditsForFileRename(...)"
getEditsForFileRename_symlink.ts parse error: "Unrecognized fourslash statement: verify.getEditsForFileRename(...)"
getEditsForFileRename_tsconfig_empty_include.ts parse error: "Unrecognized fourslash statement: verify.getEditsForFileRename(...)"
getEditsForFileRename_tsconfig_include_add.ts parse error: "Unrecognized fourslash statement: verify.getEditsForFileRename(...)"
getEditsForFileRename_tsconfig_include_noChange.ts parse error: "Unrecognized fourslash statement: verify.getEditsForFileRename(...)"
getEditsForFileRename_tsconfig.ts parse error: "Unrecognized fourslash statement: verify.getEditsForFileRename(...)"
getEditsForFileRename_unaffectedNonRelativePath.ts parse error: "Unrecognized fourslash statement: verify.getEditsForFileRename(...)"
getEditsForFileRename_unresolvableImport.ts parse error: "Unrecognized fourslash statement: verify.getEditsForFileRename(...)"
getEditsForFileRename_unresolvableNodeModule.ts parse error: "Unrecognized fourslash statement: verify.getEditsForFileRename(...)"
getEditsForFileRename.ts parse error: "Unrecognized fourslash statement: verify.getEditsForFileRename(...)"
getEmitOutputDeclarationMultiFiles.ts parse error: "Unrecognized fourslash statement: verify.baselineGetEmitOutput(...)"
getEmitOutputDeclarationSingleFile.ts parse error: "Unrecognized fourslash statement: verify.baselineGetEmitOutput(...)"
getEmitOutputExternalModule.ts parse error: "Unrecognized fourslash statement: verify.baselineGetEmitOutput(...)"
Expand Down
Loading
Loading