IDEA-CR-58091: light edit: avoid instantiating LightEditService in a regular IDE, drop persisting overridden files types

Also, don't show "Register New File Type Association" dialog when opening files in Light Edit.

(cherry picked from commit 0971d55c01ea255a81343df992209b928099af94)

GitOrigin-RevId: 798b7da8681c8d08c91d4a282f67d30c87ac459b
This commit is contained in:
Sergey Simonchik
2020-02-10 19:03:25 +00:00
committed by intellij-monorepo-bot
parent 6330b3fd05
commit 5376e6e8c9
7 changed files with 38 additions and 43 deletions
@@ -2,7 +2,6 @@
package com.intellij.ide.lightEdit;
import com.intellij.openapi.components.ServiceManager;
import com.intellij.openapi.fileTypes.FileType;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VirtualFile;
import org.jetbrains.annotations.ApiStatus;
@@ -39,8 +38,5 @@ public interface LightEditService {
@Nullable
VirtualFile getSelectedFile();
@Nullable
FileType getExplicitFileType(@NotNull VirtualFile virtualFile);
void updateFileStatus(@NotNull Collection<VirtualFile> files);
}
@@ -8,6 +8,7 @@ import com.intellij.ide.highlighter.ProjectFileType;
import com.intellij.ide.impl.OpenProjectTask;
import com.intellij.ide.impl.ProjectUtil;
import com.intellij.ide.lightEdit.LightEdit;
import com.intellij.ide.lightEdit.LightEditUtil;
import com.intellij.ide.util.PsiNavigationSupport;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
@@ -119,6 +120,7 @@ public class OpenFileAction extends AnAction implements DumbAware {
return;
}
}
LightEditUtil.markUnknownFileTypeAsPlainTextIfNeeded(project, file);
FileType type = FileTypeChooser.getKnownFileTypeOrAssociate(file, project);
if (type == null) return;
@@ -1,10 +1,6 @@
// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package com.intellij.ide.lightEdit;
import java.util.HashMap;
import java.util.Map;
class LightEditConfiguration {
public boolean autosaveMode = false;
public Map<String, String> pathToExtensionMap = new HashMap<>();
}
@@ -2,14 +2,32 @@
package com.intellij.ide.lightEdit;
import com.intellij.openapi.fileTypes.FileType;
import com.intellij.openapi.fileTypes.FileTypes;
import com.intellij.openapi.fileTypes.PlainTextFileType;
import com.intellij.openapi.fileTypes.impl.FileTypeOverrider;
import com.intellij.openapi.util.Key;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.vfs.newvfs.impl.CachedFileType;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public class LightEditFileTypeOverrider implements FileTypeOverrider {
private static final Key<Boolean> KEY = Key.create("LightEdit.PlainText");
@Override
public @Nullable FileType getOverriddenFileType(@NotNull VirtualFile file) {
return LightEditService.getInstance().getExplicitFileType(file);
return isPlainText(file) ? PlainTextFileType.INSTANCE : null;
}
private static boolean isPlainText(@NotNull VirtualFile file) {
return file.getUserData(KEY) == Boolean.TRUE;
}
static void markUnknownFileTypeAsPlainText(@NotNull VirtualFile file) {
if (file.getFileType() == FileTypes.UNKNOWN) {
file.putUserData(KEY, Boolean.TRUE);
CachedFileType.clearCache(); // refresh com.intellij.openapi.vfs.newvfs.impl.VirtualFileSystemEntry.getFileType
}
}
}
@@ -13,19 +13,12 @@ import com.intellij.openapi.components.State;
import com.intellij.openapi.components.Storage;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.fileEditor.FileDocumentManager;
import com.intellij.openapi.fileTypes.FileType;
import com.intellij.openapi.fileTypes.FileTypeManager;
import com.intellij.openapi.fileTypes.PlainTextFileType;
import com.intellij.openapi.fileTypes.UnknownFileType;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.project.ProjectManager;
import com.intellij.openapi.util.Disposer;
import com.intellij.openapi.util.registry.Registry;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.vfs.encoding.EncodingManager;
import com.intellij.openapi.vfs.encoding.EncodingManagerImpl;
import com.intellij.openapi.vfs.newvfs.impl.CachedFileType;
import com.intellij.openapi.vfs.newvfs.impl.StubVirtualFile;
import com.intellij.openapi.wm.impl.welcomeScreen.WelcomeFrame;
import com.intellij.util.ObjectUtils;
import com.intellij.util.concurrency.NonUrgentExecutor;
@@ -50,8 +43,6 @@ public class LightEditServiceImpl implements LightEditService,
PersistentStateComponent<LightEditConfiguration> {
private static final Logger LOG = Logger.getInstance(LightEditServiceImpl.class);
private static final String ENABLED_FILE_OPEN_KEY = "light.edit.file.open.enabled";
private LightEditFrameWrapper myFrameWrapper;
private final LightEditorManagerImpl myEditorManager;
private final LightEditConfiguration myConfiguration = new LightEditConfiguration();
@@ -112,7 +103,7 @@ public class LightEditServiceImpl implements LightEditService,
@Override
public boolean openFile(@NotNull VirtualFile file) {
if (Registry.is(ENABLED_FILE_OPEN_KEY)) {
if (LightEditUtil.isLightEditEnabled()) {
doWhenActionManagerInitialized(() -> {
doOpenFile(file);
});
@@ -324,29 +315,6 @@ public class LightEditServiceImpl implements LightEditService,
myLightEditProjectManager.close();
}
@Override
@Nullable
public FileType getExplicitFileType(@NotNull VirtualFile virtualFile) {
if (virtualFile instanceof StubVirtualFile) return null;
final String url = virtualFile.getPresentableUrl();
if (myConfiguration.pathToExtensionMap.containsKey(url)) {
String name = virtualFile.getNameWithoutExtension();
return FileTypeManager.getInstance().getFileTypeByFileName(name + "." + myConfiguration.pathToExtensionMap.get(url));
}
return null;
}
void overrideUnknownFileType(@NotNull VirtualFile virtualFile) {
if (virtualFile.getFileType() instanceof UnknownFileType) {
registerFileType(virtualFile, PlainTextFileType.INSTANCE);
CachedFileType.clearCache();
}
}
void registerFileType(@NotNull VirtualFile virtualFile, @NotNull FileType fileType) {
myConfiguration.pathToExtensionMap.put(virtualFile.getPresentableUrl(), fileType.getDefaultExtension());
}
@Override
public void appClosing() {
((EncodingManagerImpl)EncodingManager.getInstance()).clearDocumentQueue();
@@ -8,6 +8,7 @@ import com.intellij.openapi.fileChooser.FileSaverDialog;
import com.intellij.openapi.fileTypes.FileTypeManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.util.registry.Registry;
import com.intellij.openapi.vfs.VfsUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.vfs.VirtualFileWrapper;
@@ -21,6 +22,7 @@ import java.util.stream.Collectors;
import java.util.stream.Stream;
public class LightEditUtil {
private static final String ENABLED_FILE_OPEN_KEY = "light.edit.file.open.enabled";
private LightEditUtil() {
}
@@ -95,4 +97,17 @@ public class LightEditUtil {
private static String getCloseCancel() {
return ApplicationBundle.message("light.edit.close.cancel");
}
public static void markUnknownFileTypeAsPlainTextIfNeeded(@Nullable Project project, @NotNull VirtualFile file) {
if (project != null && !project.isDefault() && !LightEdit.owns(project)) {
return;
}
if (isLightEditEnabled()) {
LightEditFileTypeOverrider.markUnknownFileTypeAsPlainText(file);
}
}
static boolean isLightEditEnabled() {
return Registry.is(ENABLED_FILE_OPEN_KEY);
}
}
@@ -93,7 +93,7 @@ public class LightEditorManagerImpl implements LightEditorManager, Disposable {
@Override
@Nullable
public LightEditorInfo createEditor(@NotNull VirtualFile file) {
myLightEditService.overrideUnknownFileType(file);
LightEditFileTypeOverrider.markUnknownFileTypeAsPlainText(file);
Document document = FileDocumentManager.getInstance().getDocument(file);
if (document != null) {
document.putUserData(NO_IMPLICIT_SAVE, true);