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:
Aleksey Pivovarov
2016-10-10 20:27:29 +03:00
parent 45e05ea649
commit 34c2d4d479
4 changed files with 10 additions and 80 deletions
@@ -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;
@@ -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"/>