mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
IDEA-162307 diff: do not use custom FileType for highlighting
* cause: reqursive LanguageSubstitutors are not supported * enable highlighting for NonPhysicalFileSystems instead
This commit is contained in:
@@ -18,6 +18,7 @@ package com.intellij.openapi.roots;
|
||||
import com.intellij.openapi.module.Module;
|
||||
import com.intellij.openapi.module.ModuleManager;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.vfs.NonPhysicalFileSystem;
|
||||
import com.intellij.openapi.vfs.VirtualFile;
|
||||
import com.intellij.psi.PsiCodeFragment;
|
||||
import com.intellij.psi.PsiFile;
|
||||
@@ -42,6 +43,7 @@ public class JavaProjectRootsUtil {
|
||||
if (psiFile instanceof PsiCodeFragment) return false;
|
||||
final VirtualFile file = psiFile.getVirtualFile();
|
||||
if (file == null) return false;
|
||||
if (file.getFileSystem() instanceof NonPhysicalFileSystem) return false;
|
||||
final ProjectFileIndex projectFileIndex = ProjectRootManager.getInstance(psiFile.getProject()).getFileIndex();
|
||||
return !projectFileIndex.isUnderSourceRootOfType(file, JavaModuleSourceRootTypes.SOURCES) && !projectFileIndex.isInLibrarySource(file)
|
||||
&& !projectFileIndex.isInLibraryClasses(file);
|
||||
|
||||
@@ -423,10 +423,10 @@ public class DiffContentFactoryImpl extends DiffContentFactoryEx {
|
||||
@NotNull String fileName,
|
||||
boolean readOnly) {
|
||||
return ReadAction.compute(() -> {
|
||||
LightVirtualFile file = new LightVirtualFile(fileName, DiffPsiFileType.INSTANCE, content);
|
||||
LightVirtualFile file = new LightVirtualFile(fileName, fileType, content);
|
||||
file.setWritable(!readOnly);
|
||||
|
||||
file.putUserData(DiffPsiFileType.ORIGINAL_FILE_TYPE_KEY, fileType);
|
||||
file.putUserData(DiffPsiFileSupport.KEY, true);
|
||||
|
||||
Document document = FileDocumentManager.getInstance().getDocument(file);
|
||||
if (document == null) return null;
|
||||
|
||||
+3
-74
@@ -21,81 +21,16 @@ import com.intellij.codeInsight.daemon.impl.IntentionActionFilter;
|
||||
import com.intellij.codeInsight.daemon.impl.analysis.DefaultHighlightingSettingProvider;
|
||||
import com.intellij.codeInsight.daemon.impl.analysis.FileHighlightingSetting;
|
||||
import com.intellij.codeInsight.intention.IntentionAction;
|
||||
import com.intellij.icons.AllIcons;
|
||||
import com.intellij.lang.Language;
|
||||
import com.intellij.lang.annotation.HighlightSeverity;
|
||||
import com.intellij.openapi.fileTypes.*;
|
||||
import com.intellij.openapi.fileTypes.ex.FileTypeIdentifiableByVirtualFile;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.util.Key;
|
||||
import com.intellij.openapi.vfs.VirtualFile;
|
||||
import com.intellij.psi.LanguageSubstitutor;
|
||||
import com.intellij.psi.PsiFile;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import javax.swing.*;
|
||||
|
||||
public class DiffPsiFileType extends LanguageFileType implements FileTypeIdentifiableByVirtualFile, PeripheralFileType {
|
||||
public static final Key<FileType> ORIGINAL_FILE_TYPE_KEY = Key.create("Diff.DiffPsiFileType.OriginalFileTypeKey");
|
||||
public static final LanguageFileType INSTANCE = new DiffPsiFileType();
|
||||
|
||||
DiffPsiFileType() {
|
||||
super(PlainTextLanguage.INSTANCE);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isMyFileType(@NotNull VirtualFile file) {
|
||||
return isDiffFile(file);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public String getName() {
|
||||
return "Diff";
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public String getDescription() {
|
||||
return "Diff";
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public String getDefaultExtension() {
|
||||
return "";
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public Icon getIcon() {
|
||||
return AllIcons.Diff.Diff;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isReadOnly() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public String getCharset(@NotNull VirtualFile file, @NotNull byte[] content) {
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
public static class Substitutor extends LanguageSubstitutor {
|
||||
@Nullable
|
||||
@Override
|
||||
public Language getLanguage(@NotNull VirtualFile file, @NotNull Project project) {
|
||||
FileType originalType = getOriginalFileType(file);
|
||||
if (originalType instanceof LanguageFileType) {
|
||||
return ((LanguageFileType)originalType).getLanguage();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
public class DiffPsiFileSupport {
|
||||
public static final Key<Boolean> KEY = Key.create("Diff.DiffPsiFileSupport");
|
||||
|
||||
public static class HighlightFilter implements HighlightInfoFilter {
|
||||
@Override
|
||||
@@ -128,12 +63,6 @@ public class DiffPsiFileType extends LanguageFileType implements FileTypeIdentif
|
||||
}
|
||||
|
||||
private static boolean isDiffFile(@Nullable VirtualFile file) {
|
||||
return file != null && getOriginalFileType(file) != null;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private static FileType getOriginalFileType(@NotNull VirtualFile file) {
|
||||
FileType fileType = file.getUserData(ORIGINAL_FILE_TYPE_KEY);
|
||||
return fileType instanceof DiffPsiFileType ? null : fileType;
|
||||
return file != null && file.getUserData(KEY) == Boolean.TRUE;
|
||||
}
|
||||
}
|
||||
@@ -107,11 +107,10 @@
|
||||
<colorAndFontPanelFactory implementation="com.intellij.openapi.diff.impl.settings.DiffColorsPageFactory"/>
|
||||
<colorAndFontDescriptorProvider implementation="com.intellij.openapi.diff.impl.settings.DiffColorsPageFactory"/>
|
||||
|
||||
<lang.substitutor language="TEXT" implementationClass="com.intellij.diff.contents.DiffPsiFileType$Substitutor" order="first"/>
|
||||
<daemon.highlightInfoFilter implementation="com.intellij.diff.contents.DiffPsiFileType$HighlightFilter"/>
|
||||
<daemon.intentionActionFilter implementation="com.intellij.diff.contents.DiffPsiFileType$IntentionFilter"/>
|
||||
<daemon.highlightInfoFilter implementation="com.intellij.diff.contents.DiffPsiFileSupport$HighlightFilter"/>
|
||||
<daemon.intentionActionFilter implementation="com.intellij.diff.contents.DiffPsiFileSupport$IntentionFilter"/>
|
||||
<defaultHighlightingSettingProvider id="GeneratedSourcesHighlightingSettingProvider"
|
||||
implementation="com.intellij.diff.contents.DiffPsiFileType$HighlightingSettingProvider"/>
|
||||
implementation="com.intellij.diff.contents.DiffPsiFileSupport$HighlightingSettingProvider"/>
|
||||
|
||||
<applicationService serviceInterface="com.intellij.ui.SystemNotifications"
|
||||
serviceImplementation="com.intellij.ui.SystemNotificationsImpl"/>
|
||||
|
||||
Reference in New Issue
Block a user