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)
This commit is contained in:
Gregory.Shrago
2018-05-03 22:56:49 +03:00
parent 48b2701a76
commit 85c897981d
@@ -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;
}
}