diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/annotator/GroovyAnnotator.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/annotator/GroovyAnnotator.java index ded4e33da138..0c80b0d05c5d 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/annotator/GroovyAnnotator.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/annotator/GroovyAnnotator.java @@ -88,6 +88,7 @@ import org.jetbrains.plugins.groovy.lang.psi.impl.statements.expressions.TypesUt import org.jetbrains.plugins.groovy.lang.psi.impl.synthetic.GrLightParameter; import org.jetbrains.plugins.groovy.lang.psi.impl.synthetic.GroovyScriptClass; import org.jetbrains.plugins.groovy.lang.psi.impl.types.GrClosureSignatureUtil; +import org.jetbrains.plugins.groovy.lang.psi.util.GroovyPropertyUtils; import org.jetbrains.plugins.groovy.lang.psi.util.PsiUtil; import org.jetbrains.plugins.groovy.lang.resolve.ResolveUtil; import org.jetbrains.plugins.groovy.lang.resolve.noncode.GrInheritConstructorContributor; @@ -1439,12 +1440,22 @@ public class GroovyAnnotator extends GroovyElementVisitor implements Annotator { final PsiElement refNameElement = getElementToHighlight(refExpr); Annotation annotation = holder.createInfoAnnotation(refNameElement, null); - if (member instanceof PsiField || member instanceof GrAccessorMethod) { + if (member instanceof PsiField) { annotation.setTextAttributes(isStatic ? DefaultHighlighter.STATIC_FIELD : DefaultHighlighter.INSTANCE_FIELD); return; } + else if (member instanceof GrAccessorMethod) { + annotation.setTextAttributes(isStatic ? DefaultHighlighter.STATIC_PROPERTY_REFERENCE : DefaultHighlighter.INSTANCE_PROPERTY_REFERENCE); + return; + } if (member instanceof PsiMethod) { - annotation.setTextAttributes(!isStatic ? DefaultHighlighter.METHOD_CALL : DefaultHighlighter.STATIC_METHOD_ACCESS); + if (GroovyPropertyUtils.isSimplePropertyAccessor((PsiMethod)member)) { + annotation + .setTextAttributes(isStatic ? DefaultHighlighter.STATIC_PROPERTY_REFERENCE : DefaultHighlighter.INSTANCE_PROPERTY_REFERENCE); + } + else { + annotation.setTextAttributes(isStatic ? DefaultHighlighter.STATIC_METHOD_ACCESS : DefaultHighlighter.METHOD_CALL); + } } if (member instanceof PsiClass) { highligtClassReference(holder, refExpr); diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/highlighter/DefaultHighlighter.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/highlighter/DefaultHighlighter.java index ccd8127030bb..e8ba1f3f4142 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/highlighter/DefaultHighlighter.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/highlighter/DefaultHighlighter.java @@ -76,7 +76,10 @@ public class DefaultHighlighter { static final String STATIC_METHOD_ACCESS_ID = "Static method access"; @NonNls static final String CLASS_REFERENCE_ID = "Class"; - + @NonNls + static final String INSTANCE_PROPERTY_REFERENCE_ID = "Instance property reference ID"; + @NonNls + static final String STATIC_PROPERTY_REFERENCE_ID = "Static property reference ID"; @NonNls static final String MAP_KEY_ID = "Map key"; @@ -115,6 +118,18 @@ public class DefaultHighlighter { public static TextAttributesKey CLASS_REFERENCE = TextAttributesKey.createTextAttributesKey(CLASS_REFERENCE_ID, HighlighterColors.TEXT.getDefaultAttributes().clone()); + public static final TextAttributes INSTANCE_PROPERTY_REFERENCE_ATTRIBUTES = INSTANCE_FIELD.getDefaultAttributes().clone(); + public static final TextAttributes STATIC_PROPERTY_REFERENCE_ATTRIBUTES = STATIC_FIELD.getDefaultAttributes().clone(); + static { + INSTANCE_PROPERTY_REFERENCE_ATTRIBUTES.setFontType(Font.PLAIN); + STATIC_PROPERTY_REFERENCE_ATTRIBUTES.setFontType(Font.ITALIC); + } + public static TextAttributesKey INSTANCE_PROPERTY_REFERENCE = + TextAttributesKey.createTextAttributesKey(INSTANCE_PROPERTY_REFERENCE_ID, INSTANCE_PROPERTY_REFERENCE_ATTRIBUTES); + + public static TextAttributesKey STATIC_PROPERTY_REFERENCE = + TextAttributesKey.createTextAttributesKey(STATIC_PROPERTY_REFERENCE_ID, STATIC_PROPERTY_REFERENCE_ATTRIBUTES); + public static final TextAttributes KEYWORD_ATTRIBUTES = SyntaxHighlighterColors.KEYWORD.getDefaultAttributes().clone(); static{ diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/highlighter/GroovyColorsAndFontsPage.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/highlighter/GroovyColorsAndFontsPage.java index 194a5318b54a..46d7d091a58d 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/highlighter/GroovyColorsAndFontsPage.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/highlighter/GroovyColorsAndFontsPage.java @@ -72,6 +72,8 @@ public class GroovyColorsAndFontsPage implements ColorSettingsPage { new AttributesDescriptor(DefaultHighlighter.INSTANCE_FIELD_ID, DefaultHighlighter.INSTANCE_FIELD), new AttributesDescriptor(DefaultHighlighter.CLASS_REFERENCE_ID, DefaultHighlighter.CLASS_REFERENCE), new AttributesDescriptor(DefaultHighlighter.MAP_KEY_ID, DefaultHighlighter.MAP_KEY), + new AttributesDescriptor(DefaultHighlighter.INSTANCE_PROPERTY_REFERENCE_ID, DefaultHighlighter.INSTANCE_PROPERTY_REFERENCE), + new AttributesDescriptor(DefaultHighlighter.STATIC_PROPERTY_REFERENCE_ID, DefaultHighlighter.STATIC_PROPERTY_REFERENCE), }; @NotNull @@ -111,7 +113,8 @@ public class GroovyColorsAndFontsPage implements ColorSettingsPage { "'JetBrains'.matches(/Jw+Bw+/) \n" + "def x=1 + unresolved\n" + "def f1 = []\n" + - "File f=['path']" + "File f=['path']\n" + + "print new Demo().property" ; } @@ -128,6 +131,8 @@ public class GroovyColorsAndFontsPage implements ColorSettingsPage { map.put("classref", DefaultHighlighter.CLASS_REFERENCE); map.put("literal", DefaultHighlighter.LITERAL_CONVERSION); map.put("mapkey", DefaultHighlighter.MAP_KEY); + map.put("prop", DefaultHighlighter.INSTANCE_PROPERTY_REFERENCE); + map.put("staticprop", DefaultHighlighter.STATIC_PROPERTY_REFERENCE); return map; } }