From 85c897981d55a400f875bf2248240da656eea74e Mon Sep 17 00:00:00 2001 From: "Gregory.Shrago" Date: Thu, 3 May 2018 22:55:34 +0300 Subject: [PATCH] IDEA-190937 Change scratch language not always updates file extension 2 Support scratches with 1. no extension (e.g. scratch1) 2. multipart extension (e.g. blade) 3. undetectable extensions (e.g. ApacheConfig) --- .../com/intellij/ide/scratch/ScratchUtil.java | 32 ++++++++++++------- 1 file changed, 21 insertions(+), 11 deletions(-) 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; } }