From 5376e6e8c9ba4272db7bdba9947a99be604172e7 Mon Sep 17 00:00:00 2001 From: Sergey Simonchik Date: Wed, 5 Feb 2020 16:59:16 +0300 Subject: [PATCH] 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 --- .../ide/lightEdit/LightEditService.java | 4 --- .../intellij/ide/actions/OpenFileAction.java | 2 ++ .../ide/lightEdit/LightEditConfiguration.java | 4 --- .../lightEdit/LightEditFileTypeOverrider.java | 20 ++++++++++- .../ide/lightEdit/LightEditServiceImpl.java | 34 +------------------ .../intellij/ide/lightEdit/LightEditUtil.java | 15 ++++++++ .../ide/lightEdit/LightEditorManagerImpl.java | 2 +- 7 files changed, 38 insertions(+), 43 deletions(-) diff --git a/platform/editor-ui-api/src/com/intellij/ide/lightEdit/LightEditService.java b/platform/editor-ui-api/src/com/intellij/ide/lightEdit/LightEditService.java index fc2667f56b5f..475d0cf34a62 100644 --- a/platform/editor-ui-api/src/com/intellij/ide/lightEdit/LightEditService.java +++ b/platform/editor-ui-api/src/com/intellij/ide/lightEdit/LightEditService.java @@ -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 files); } diff --git a/platform/platform-impl/src/com/intellij/ide/actions/OpenFileAction.java b/platform/platform-impl/src/com/intellij/ide/actions/OpenFileAction.java index 85dbb146200b..b21374a4de9a 100644 --- a/platform/platform-impl/src/com/intellij/ide/actions/OpenFileAction.java +++ b/platform/platform-impl/src/com/intellij/ide/actions/OpenFileAction.java @@ -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; diff --git a/platform/platform-impl/src/com/intellij/ide/lightEdit/LightEditConfiguration.java b/platform/platform-impl/src/com/intellij/ide/lightEdit/LightEditConfiguration.java index 83ab317051d1..65ae78dbd394 100644 --- a/platform/platform-impl/src/com/intellij/ide/lightEdit/LightEditConfiguration.java +++ b/platform/platform-impl/src/com/intellij/ide/lightEdit/LightEditConfiguration.java @@ -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 pathToExtensionMap = new HashMap<>(); } diff --git a/platform/platform-impl/src/com/intellij/ide/lightEdit/LightEditFileTypeOverrider.java b/platform/platform-impl/src/com/intellij/ide/lightEdit/LightEditFileTypeOverrider.java index 72bb4b63760a..e55d0cb50c47 100644 --- a/platform/platform-impl/src/com/intellij/ide/lightEdit/LightEditFileTypeOverrider.java +++ b/platform/platform-impl/src/com/intellij/ide/lightEdit/LightEditFileTypeOverrider.java @@ -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 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 + } } } diff --git a/platform/platform-impl/src/com/intellij/ide/lightEdit/LightEditServiceImpl.java b/platform/platform-impl/src/com/intellij/ide/lightEdit/LightEditServiceImpl.java index 551ff2d0b13c..95ec20c88404 100644 --- a/platform/platform-impl/src/com/intellij/ide/lightEdit/LightEditServiceImpl.java +++ b/platform/platform-impl/src/com/intellij/ide/lightEdit/LightEditServiceImpl.java @@ -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 { 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(); diff --git a/platform/platform-impl/src/com/intellij/ide/lightEdit/LightEditUtil.java b/platform/platform-impl/src/com/intellij/ide/lightEdit/LightEditUtil.java index 5903accd26cb..9925abba53bd 100644 --- a/platform/platform-impl/src/com/intellij/ide/lightEdit/LightEditUtil.java +++ b/platform/platform-impl/src/com/intellij/ide/lightEdit/LightEditUtil.java @@ -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); + } } diff --git a/platform/platform-impl/src/com/intellij/ide/lightEdit/LightEditorManagerImpl.java b/platform/platform-impl/src/com/intellij/ide/lightEdit/LightEditorManagerImpl.java index 5be7f0c42a61..c2d5d55f66f8 100644 --- a/platform/platform-impl/src/com/intellij/ide/lightEdit/LightEditorManagerImpl.java +++ b/platform/platform-impl/src/com/intellij/ide/lightEdit/LightEditorManagerImpl.java @@ -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);