From 7559dfc36052662ed643ff9b075f9042ed719c89 Mon Sep 17 00:00:00 2001 From: Rustam Vishnyakov Date: Fri, 20 Sep 2013 16:11:01 +0400 Subject: [PATCH] Semantic highlighting level to avoid conflicts with "unused symbol" annotations [CR-IC-2435], for WI-19396, WI-20126 (cherry picked from commit 56d66dc) --- .../lang/annotation/HighlightSeverity.java | 2 ++ .../annotation/SemanticAnnotationHolder.java | 24 +++++++++++++++++++ .../daemon/impl/AnnotationHolderImpl.java | 19 +++++++++++---- .../daemon/impl/UpdateHighlightersUtil.java | 3 +++ .../editor/markup/HighlighterLayer.java | 1 + .../ExpectedHighlightingData.java | 6 +++++ .../fixtures/CodeInsightTestFixture.java | 6 +++++ .../impl/CodeInsightTestFixtureImpl.java | 21 ++++++++++++++-- 8 files changed, 75 insertions(+), 7 deletions(-) create mode 100644 platform/analysis-api/src/com/intellij/lang/annotation/SemanticAnnotationHolder.java diff --git a/platform/analysis-api/src/com/intellij/lang/annotation/HighlightSeverity.java b/platform/analysis-api/src/com/intellij/lang/annotation/HighlightSeverity.java index 7e6ea0f3b5b4..7d7f751426e5 100644 --- a/platform/analysis-api/src/com/intellij/lang/annotation/HighlightSeverity.java +++ b/platform/analysis-api/src/com/intellij/lang/annotation/HighlightSeverity.java @@ -34,6 +34,8 @@ public class HighlightSeverity implements Comparable, JDOMExt public String myName; public int myVal; + public static final HighlightSeverity SEMANTIC = new HighlightSeverity("SEMANTIC", 5); + /** * The standard severity level for information annotations. */ diff --git a/platform/analysis-api/src/com/intellij/lang/annotation/SemanticAnnotationHolder.java b/platform/analysis-api/src/com/intellij/lang/annotation/SemanticAnnotationHolder.java new file mode 100644 index 000000000000..b0c84a176b8f --- /dev/null +++ b/platform/analysis-api/src/com/intellij/lang/annotation/SemanticAnnotationHolder.java @@ -0,0 +1,24 @@ +package com.intellij.lang.annotation; + +import com.intellij.openapi.editor.colors.TextAttributesKey; +import com.intellij.openapi.util.TextRange; +import org.jetbrains.annotations.NotNull; + +/** + * Allows to crate semantic annotations to highlight similar PSI elements differently depending on their actual meaning. For example, + * static members vs. instance fields and etc. Semantic annotations have lower highlighting level than infos, weak warnings etc. but + * higher than regular syntax. + * + * @author Rustam Vishnyakov + */ +public interface SemanticAnnotationHolder extends AnnotationHolder { + + /** + * Creates annotation with a semantic highlighting level. + * + * @param range The text range over which the annotation is created. + * @param attributesKey The attributes key to use for the annotation. + * @return the annotation (which can be modified to set additional annotation parameters). + */ + Annotation createSemanticAnnotation(@NotNull TextRange range, @NotNull TextAttributesKey attributesKey); +} diff --git a/platform/analysis-impl/src/com/intellij/codeInsight/daemon/impl/AnnotationHolderImpl.java b/platform/analysis-impl/src/com/intellij/codeInsight/daemon/impl/AnnotationHolderImpl.java index 533f62a95e73..3d1839120e22 100644 --- a/platform/analysis-impl/src/com/intellij/codeInsight/daemon/impl/AnnotationHolderImpl.java +++ b/platform/analysis-impl/src/com/intellij/codeInsight/daemon/impl/AnnotationHolderImpl.java @@ -17,11 +17,10 @@ package com.intellij.codeInsight.daemon.impl; import com.intellij.lang.ASTNode; -import com.intellij.lang.annotation.Annotation; -import com.intellij.lang.annotation.AnnotationHolder; -import com.intellij.lang.annotation.AnnotationSession; -import com.intellij.lang.annotation.HighlightSeverity; +import com.intellij.lang.annotation.*; +import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.editor.colors.TextAttributesKey; import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.TextRange; import com.intellij.openapi.vfs.VirtualFile; @@ -36,10 +35,12 @@ import org.jetbrains.annotations.Nullable; /** * @author max */ -public class AnnotationHolderImpl extends SmartList implements AnnotationHolder { +public class AnnotationHolderImpl extends SmartList implements SemanticAnnotationHolder { private static final Logger LOG = Logger.getInstance("#com.intellij.codeInsight.daemon.impl.AnnotationHolderImpl"); private final AnnotationSession myAnnotationSession; + private final static boolean isUnitTestMode = ApplicationManager.getApplication().isUnitTestMode(); + private final boolean myBatchMode; public AnnotationHolderImpl(@NotNull AnnotationSession session) { @@ -157,4 +158,12 @@ public class AnnotationHolderImpl extends SmartList implements Annot public AnnotationSession getCurrentAnnotationSession() { return myAnnotationSession; } + + @Override + public Annotation createSemanticAnnotation(@NotNull TextRange range, @NotNull TextAttributesKey key) { + String description = isUnitTestMode ? key.getExternalName() : null; + Annotation annotation = createAnnotation(range, HighlightSeverity.SEMANTIC, description); + annotation.setTextAttributes(key); + return annotation; + } } diff --git a/platform/analysis-impl/src/com/intellij/codeInsight/daemon/impl/UpdateHighlightersUtil.java b/platform/analysis-impl/src/com/intellij/codeInsight/daemon/impl/UpdateHighlightersUtil.java index 783b01b3d93d..e0bd0ddb6142 100644 --- a/platform/analysis-impl/src/com/intellij/codeInsight/daemon/impl/UpdateHighlightersUtil.java +++ b/platform/analysis-impl/src/com/intellij/codeInsight/daemon/impl/UpdateHighlightersUtil.java @@ -423,6 +423,9 @@ public class UpdateHighlightersUtil { else if (severity == HighlightInfoType.INJECTED_FRAGMENT_SEVERITY) { layer = HighlighterLayer.CARET_ROW-1; } + else if (severity == HighlightSeverity.SEMANTIC) { + layer = HighlighterLayer.SEMANTIC; + } else { layer = HighlighterLayer.ADDITIONAL_SYNTAX; } diff --git a/platform/editor-ui-api/src/com/intellij/openapi/editor/markup/HighlighterLayer.java b/platform/editor-ui-api/src/com/intellij/openapi/editor/markup/HighlighterLayer.java index da21cde7e1e3..4bab3e0c3986 100644 --- a/platform/editor-ui-api/src/com/intellij/openapi/editor/markup/HighlighterLayer.java +++ b/platform/editor-ui-api/src/com/intellij/openapi/editor/markup/HighlighterLayer.java @@ -18,6 +18,7 @@ package com.intellij.openapi.editor.markup; public interface HighlighterLayer { int CARET_ROW = 1000; int SYNTAX = 2000; + int SEMANTIC = 2500; int ADDITIONAL_SYNTAX = 3000; int GUARDED_BLOCKS = 3500; int WARNING = 4000; diff --git a/platform/testFramework/src/com/intellij/testFramework/ExpectedHighlightingData.java b/platform/testFramework/src/com/intellij/testFramework/ExpectedHighlightingData.java index 4ae3f36e9ad3..9901171bd90d 100644 --- a/platform/testFramework/src/com/intellij/testFramework/ExpectedHighlightingData.java +++ b/platform/testFramework/src/com/intellij/testFramework/ExpectedHighlightingData.java @@ -72,6 +72,7 @@ public class ExpectedHighlightingData { @NonNls private static final String END_LINE_HIGHLIGHT_MARKER = "EOLError"; @NonNls private static final String END_LINE_WARNING_MARKER = "EOLWarning"; @NonNls private static final String LINE_MARKER = "lineMarker"; + @NonNls private static final String SEMANTIC_MARKER = "semantic"; @NotNull private final Document myDocument; private final PsiFile myFile; @@ -133,6 +134,7 @@ public class ExpectedHighlightingData { highlightingTypes.put("inject", new ExpectedHighlightingSet(HighlightInfoType.INJECTED_FRAGMENT_SEVERITY, false, checkInfos)); highlightingTypes.put(INFO_MARKER, new ExpectedHighlightingSet(HighlightSeverity.INFORMATION, false, checkInfos)); highlightingTypes.put("symbolName", new ExpectedHighlightingSet(HighlightInfoType.SYMBOL_TYPE_SEVERITY, false, false)); + highlightingTypes.put(SEMANTIC_MARKER, new ExpectedHighlightingSet(HighlightSeverity.SEMANTIC, false, false)); for (SeveritiesProvider provider : Extensions.getExtensions(SeveritiesProvider.EP_NAME)) { for (HighlightInfoType type : provider.getSeveritiesHighlightInfoTypes()) { final HighlightSeverity severity = type.getSeverity(null); @@ -173,6 +175,10 @@ public class ExpectedHighlightingData { highlightingTypes.put("symbolName", new ExpectedHighlightingSet(HighlightInfoType.SYMBOL_TYPE_SEVERITY, false, true)); } + public void checkSemantics() { + highlightingTypes.put(SEMANTIC_MARKER, new ExpectedHighlightingSet(HighlightSeverity.SEMANTIC, false, true)); + } + private void refreshLineMarkers() { for (Map.Entry entry : lineMarkerInfos.entrySet()) { RangeMarker rangeMarker = entry.getKey(); diff --git a/platform/testFramework/src/com/intellij/testFramework/fixtures/CodeInsightTestFixture.java b/platform/testFramework/src/com/intellij/testFramework/fixtures/CodeInsightTestFixture.java index 1ee830e8281e..7e76fe666dd4 100644 --- a/platform/testFramework/src/com/intellij/testFramework/fixtures/CodeInsightTestFixture.java +++ b/platform/testFramework/src/com/intellij/testFramework/fixtures/CodeInsightTestFixture.java @@ -252,6 +252,12 @@ public interface CodeInsightTestFixture extends IdeaProjectTestFixture { */ long testHighlighting(boolean checkWarnings, boolean checkInfos, boolean checkWeakWarnings, @TestDataFile @NonNls String... filePaths); + long testHighlighting(boolean checkWarnings, + boolean checkInfos, + boolean checkWeakWarnings, + boolean checkSemantics, + @TestDataFile @NonNls String... filePaths); + long testHighlightingAllFiles(boolean checkWarnings, boolean checkInfos, boolean checkWeakWarnings, @TestDataFile @NonNls String... filePaths); long testHighlightingAllFiles(boolean checkWarnings, boolean checkInfos, boolean checkWeakWarnings, @TestDataFile @NonNls VirtualFile... files); diff --git a/platform/testFramework/src/com/intellij/testFramework/fixtures/impl/CodeInsightTestFixtureImpl.java b/platform/testFramework/src/com/intellij/testFramework/fixtures/impl/CodeInsightTestFixtureImpl.java index 153b2939914d..68162c79806f 100644 --- a/platform/testFramework/src/com/intellij/testFramework/fixtures/impl/CodeInsightTestFixtureImpl.java +++ b/platform/testFramework/src/com/intellij/testFramework/fixtures/impl/CodeInsightTestFixtureImpl.java @@ -326,11 +326,21 @@ public class CodeInsightTestFixtureImpl extends BaseFixture implements CodeInsig final boolean checkInfos, final boolean checkWeakWarnings, final String... filePaths) { + return testHighlighting(checkWarnings, checkInfos, checkWeakWarnings, false, filePaths); + } + + + @Override + public long testHighlighting(boolean checkWarnings, + boolean checkInfos, + boolean checkWeakWarnings, + boolean checkSemantics, + @TestDataFile @NonNls String... filePaths) { if (filePaths.length > 0) { configureByFilesInner(filePaths); } try { - return collectAndCheckHighlighting(checkWarnings, checkInfos, checkWeakWarnings); + return collectAndCheckHighlighting(checkWarnings, checkInfos, checkWeakWarnings, checkSemantics); } catch (Exception e) { throw new RuntimeException(e); @@ -1409,7 +1419,14 @@ public class CodeInsightTestFixtureImpl extends BaseFixture implements CodeInsig } private long collectAndCheckHighlighting(boolean checkWarnings, boolean checkInfos, boolean checkWeakWarnings) throws Exception { - ExpectedHighlightingData data = new ExpectedHighlightingData(myEditor.getDocument(), checkWarnings, checkWeakWarnings, checkInfos, getHostFile()); + return collectAndCheckHighlighting(checkWarnings, checkInfos, checkWeakWarnings, false); + } + + private long collectAndCheckHighlighting(boolean checkWarnings, boolean checkInfos, boolean checkWeakWarnings, boolean checkSemantics) + throws Exception { + ExpectedHighlightingData data = + new ExpectedHighlightingData(myEditor.getDocument(), checkWarnings, checkWeakWarnings, checkInfos, getHostFile()); + if (checkSemantics) data.checkSemantics(); data.init(); return collectAndCheckHighlighting(data); }