CPP-778 Support for semantic per-variable highlighting (abstract class -> interface...
authorAlexey Utkin <alexey.utkin@jetbrains.com>
Thu, 30 Jun 2016 10:04:36 +0000 (13:04 +0300)
committerAlexey Utkin <alexey.utkin@jetbrains.com>
Thu, 30 Jun 2016 10:13:31 +0000 (13:13 +0300)
platform/analysis-impl/src/com/intellij/codeHighlighting/RainbowHighlighter.java
platform/analysis-impl/src/com/intellij/codeInsight/daemon/RainbowProvider.java
platform/analysis-impl/src/com/intellij/codeInsight/daemon/impl/HighlightInfo.java

index 30718ede0a2cacf7e205432a554e57e2a8da4e46..d44c5c9b7de5561ae2019b74915d0015976ae949 100644 (file)
  */
 package com.intellij.codeHighlighting;
 
-import com.intellij.codeInsight.daemon.RainbowProvider;
 import com.intellij.codeInsight.daemon.impl.HighlightInfo;
 import com.intellij.codeInsight.daemon.impl.HighlightInfoType;
-import com.intellij.lang.Language;
 import com.intellij.lang.annotation.HighlightSeverity;
 import com.intellij.openapi.editor.DefaultLanguageHighlighterColors;
 import com.intellij.openapi.editor.HighlighterColors;
@@ -30,7 +28,6 @@ import com.intellij.openapi.util.registry.Registry;
 import com.intellij.openapi.util.text.StringHash;
 import com.intellij.openapi.util.text.StringUtil;
 import com.intellij.psi.PsiElement;
-import com.intellij.util.containers.hash.HashSet;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
@@ -41,11 +38,6 @@ public class RainbowHighlighter {
   @NotNull private final EditorColorsScheme myColorsScheme;
   @NotNull private final Color myDefaultBackground;
 
-  private static final HashSet<Language> BY_PASS_LANGUAGES = new HashSet<Language>();
-  static {
-    RainbowProvider.initRainbow();
-  }
-
   public RainbowHighlighter(@Nullable EditorColorsScheme colorsScheme, @Nullable Color background) {
     myColorsScheme = colorsScheme != null ? colorsScheme : EditorColorsManager.getInstance().getGlobalScheme();
     myDefaultBackground = background != null ? background : myColorsScheme.getDefaultBackground();
@@ -60,14 +52,6 @@ public class RainbowHighlighter {
     return Registry.is("editor.rainbow.identifiers", false);
   }
 
-  public static void registerByPassLanguage(@NotNull Language language) {
-    BY_PASS_LANGUAGES.add(language);
-  }
-
-  public static boolean isByPassLanguage(@Nullable Language language) {
-    return BY_PASS_LANGUAGES.contains(language);
-  }
-
   @NotNull
   public TextAttributes getAttributes(@NotNull String name, @NotNull TextAttributes origin) {
     int hash = StringHash.murmur(name, 0);
index 0939626683d361b76c0a0745fa72a5574ea52f3c..7b6b88697f275d158163ef38593baafeaa448cea 100644 (file)
@@ -25,25 +25,17 @@ import org.jetbrains.annotations.NotNull;
 
 import java.util.List;
 
-public abstract class RainbowProvider {
-  static ExtensionPointName<RainbowProvider> EP_NAME = ExtensionPointName.create("com.intellij.rainbowProvider");
+public interface RainbowProvider {
+  ExtensionPointName<RainbowProvider> EP_NAME = ExtensionPointName.create("com.intellij.rainbowProvider");
 
   @NotNull
-  public static RainbowProvider[] getRainbowFileProcessors() {
+  static RainbowProvider[] getRainbowFileProcessors() {
     return Extensions.getExtensions(EP_NAME);
   }
 
-  public static void initRainbow() {
-    for (RainbowProvider processor : getRainbowFileProcessors()) {
-      processor.init();
-    }
-  }
-
-  public abstract void init();
-
-  public abstract boolean isValidContext(@NotNull final PsiFile file);
+  boolean isValidContext(@NotNull final PsiFile file);
 
-  public abstract List<HighlightInfo> getHighlights(@NotNull PsiFile file,
-                                                    @NotNull RainbowHighlighter highlighter,
-                                                    @NotNull ProgressIndicator progress);
+  List<HighlightInfo> getHighlights(@NotNull PsiFile file,
+                                    @NotNull RainbowHighlighter highlighter,
+                                    @NotNull ProgressIndicator progress);
 }
index 2fc95e221254ae18a3b30103e493db770ff09b20..f1417bbad2c12560fff931c866c14d62dfb69791 100644 (file)
@@ -19,6 +19,7 @@ package com.intellij.codeInsight.daemon.impl;
 import com.intellij.codeHighlighting.RainbowHighlighter;
 import com.intellij.codeInsight.daemon.GutterMark;
 import com.intellij.codeInsight.daemon.HighlightDisplayKey;
+import com.intellij.codeInsight.daemon.RainbowProvider;
 import com.intellij.codeInsight.intention.IntentionAction;
 import com.intellij.codeInsight.intention.IntentionManager;
 import com.intellij.codeInspection.*;
@@ -48,6 +49,7 @@ import com.intellij.util.BitUtil;
 import com.intellij.util.containers.ContainerUtil;
 import com.intellij.xml.util.XmlStringUtil;
 import org.intellij.lang.annotations.MagicConstant;
+import org.jetbrains.annotations.Contract;
 import org.jetbrains.annotations.NonNls;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
@@ -181,7 +183,7 @@ public class HighlightInfo implements Segment {
     TextAttributes attributes = getAttributesByType(element, type, colorsScheme);
     if (element != null &&
         RainbowHighlighter.isRainbowEnabled() &&
-        !RainbowHighlighter.isByPassLanguage(element.getLanguage()) &&
+        !isByPass(element) &&
         isLikeVariable(type.getAttributesKey())) {
       String text = element.getContainingFile().getText();
       String name = text.substring(startOffset, endOffset);
@@ -190,6 +192,17 @@ public class HighlightInfo implements Segment {
     return attributes;
   }
 
+  @Contract("null -> false")
+  public static boolean isByPass(@Nullable PsiElement element) {
+    if (element == null) return false;
+    PsiFile containingFile = element.getContainingFile();
+    for (RainbowProvider processor : RainbowProvider.getRainbowFileProcessors()) {
+      if (processor.isValidContext(containingFile)) return true;
+    }
+    return false;
+  }
+
+  @Contract("null -> false")
   private static boolean isLikeVariable(TextAttributesKey key) {
     if (key == null) return false;
     TextAttributesKey fallbackAttributeKey = key.getFallbackAttributeKey();