diff --git a/platform/lang-impl/src/com/intellij/ide/scratch/ScratchUtil.java b/platform/lang-impl/src/com/intellij/ide/scratch/ScratchUtil.java index f56462b664a9..14ddca6483d2 100644 --- a/platform/lang-impl/src/com/intellij/ide/scratch/ScratchUtil.java +++ b/platform/lang-impl/src/com/intellij/ide/scratch/ScratchUtil.java @@ -21,6 +21,7 @@ import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.command.CommandProcessor; import com.intellij.openapi.fileTypes.FileType; import com.intellij.openapi.fileTypes.FileTypeManager; +import com.intellij.openapi.fileTypes.UnknownFileType; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VfsUtil; @@ -56,28 +57,37 @@ public class ScratchUtil { if (file == null) return; Language language = LanguageUtil.getLanguageForPsi(project, file); - FileType expected = getFileTypeFromName(file); - FileType actual = language == null ? null : language.getAssociatedFileType(); - if (expected == actual || actual == null) return; - String ext = actual.getDefaultExtension(); - if (StringUtil.isEmpty(ext)) return; - + FileType prevType = getFileTypeFromName(file); + FileType currType = language == null ? null : language.getAssociatedFileType(); + if (prevType == currType) return; + String prevExt = PathUtil.makeFileName("", prevType == null ? "" : prevType.getDefaultExtension()); + String currExt = currType == null ? "" : currType.getDefaultExtension(); + // support multipart extensions like *.blade.php + String nameWithoutExtension = prevExt.length() > 0 && file.getName().endsWith(prevExt) ? + StringUtil.trimEnd(file.getName(), prevExt) : file.getNameWithoutExtension(); VirtualFile parent = file.getParent(); - String newName = parent != null ? VfsUtil.getNextAvailableName(parent, file.getNameWithoutExtension(), ext) : - PathUtil.makeFileName(file.getNameWithoutExtension(), ext); + String newName = parent != null ? VfsUtil.getNextAvailableName(parent, nameWithoutExtension, currExt) : + PathUtil.makeFileName(nameWithoutExtension, currExt); file.rename(ScratchUtil.class, newName); } public static boolean hasMatchingExtension(@NotNull Project project, @NotNull VirtualFile file) { + if (file.getExtension() == null) return true; FileType expected = getFileTypeFromName(file); Language language = LanguageUtil.getLanguageForPsi(project, file); FileType actual = language == null ? null : language.getAssociatedFileType(); - return expected == actual && actual != null; + if (expected != null && expected == actual) return true; + String ext = actual == null ? "" : actual.getDefaultExtension(); + return ext.length() > 0 && file.getName().endsWith(ext); } @Nullable private static FileType getFileTypeFromName(@NotNull VirtualFile file) { - String extension = file.getExtension(); - return extension == null ? null : FileTypeManager.getInstance().getFileTypeByExtension(extension); + if (file.getExtension() == null) return null; + FileType result = FileTypeManager.getInstance().getFileTypeByFileName(file.getName()); + if (result == UnknownFileType.INSTANCE || StringUtil.isEmpty(result.getDefaultExtension())) { + return null; + } + return result; } }