Added highlighting for properties depending on their container and presence of backing field.
This commit is contained in:
@@ -1,68 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2010-2012 JetBrains s.r.o.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.jetbrains.jet.plugin.highlighter;
|
|
||||||
|
|
||||||
import com.intellij.lang.annotation.AnnotationHolder;
|
|
||||||
import com.intellij.psi.PsiElement;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
|
||||||
import org.jetbrains.jet.lang.descriptors.PropertyDescriptor;
|
|
||||||
import org.jetbrains.jet.lang.descriptors.VariableDescriptor;
|
|
||||||
import org.jetbrains.jet.lang.psi.*;
|
|
||||||
import org.jetbrains.jet.lang.resolve.BindingContext;
|
|
||||||
|
|
||||||
class BackingFieldHighlightingVisitor extends AfterAnalysisHighlightingVisitor {
|
|
||||||
BackingFieldHighlightingVisitor(AnnotationHolder holder, BindingContext bindingContext) {
|
|
||||||
super(holder, bindingContext);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void visitProperty(@NotNull JetProperty property) {
|
|
||||||
VariableDescriptor propertyDescriptor = bindingContext.get(BindingContext.VARIABLE, property);
|
|
||||||
if (propertyDescriptor instanceof PropertyDescriptor) {
|
|
||||||
Boolean backingFieldRequired = bindingContext.get(BindingContext.BACKING_FIELD_REQUIRED, (PropertyDescriptor)propertyDescriptor);
|
|
||||||
if (Boolean.TRUE.equals(backingFieldRequired)) {
|
|
||||||
putBackingFieldAnnotation(holder, property);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void visitParameter(@NotNull JetParameter parameter) {
|
|
||||||
PropertyDescriptor propertyDescriptor = bindingContext.get(BindingContext.PRIMARY_CONSTRUCTOR_PARAMETER, parameter);
|
|
||||||
if (propertyDescriptor != null) {
|
|
||||||
Boolean backingFieldRequired = bindingContext.get(BindingContext.BACKING_FIELD_REQUIRED, propertyDescriptor);
|
|
||||||
if (Boolean.TRUE.equals(backingFieldRequired)) {
|
|
||||||
putBackingFieldAnnotation(holder, parameter);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void visitJetElement(@NotNull JetElement element) {
|
|
||||||
element.acceptChildren(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void putBackingFieldAnnotation(@NotNull AnnotationHolder holder, @NotNull JetNamedDeclaration element) {
|
|
||||||
PsiElement nameIdentifier = element.getNameIdentifier();
|
|
||||||
if (nameIdentifier != null) {
|
|
||||||
holder.createInfoAnnotation(
|
|
||||||
nameIdentifier,
|
|
||||||
"This property has a backing field")
|
|
||||||
.setTextAttributes(JetHighlightingColors.INSTANCE_PROPERTY_WITH_BACKING_FIELD);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -133,9 +133,14 @@ public class JetColorSettingsPage implements ColorSettingsPage {
|
|||||||
new AttributesDescriptor("Read-only local variable (val)", JetHighlightingColors.LOCAL_VAL),
|
new AttributesDescriptor("Read-only local variable (val)", JetHighlightingColors.LOCAL_VAL),
|
||||||
new AttributesDescriptor("Mutable local variable (var)", JetHighlightingColors.LOCAL_VAR),
|
new AttributesDescriptor("Mutable local variable (var)", JetHighlightingColors.LOCAL_VAR),
|
||||||
|
|
||||||
|
new AttributesDescriptor("Instance property", JetHighlightingColors.INSTANCE_PROPERTY),
|
||||||
new AttributesDescriptor("Instance property with backing field", JetHighlightingColors.INSTANCE_PROPERTY_WITH_BACKING_FIELD),
|
new AttributesDescriptor("Instance property with backing field", JetHighlightingColors.INSTANCE_PROPERTY_WITH_BACKING_FIELD),
|
||||||
new AttributesDescriptor("Instance property backing field access", JetHighlightingColors.INSTANCE_BACKING_FIELD_ACCESS),
|
new AttributesDescriptor("Instance property backing field access", JetHighlightingColors.INSTANCE_BACKING_FIELD_ACCESS),
|
||||||
|
|
||||||
|
new AttributesDescriptor("Namespace property", JetHighlightingColors.NAMESPACE_PROPERTY),
|
||||||
|
new AttributesDescriptor("Namespace property with backing field", JetHighlightingColors.NAMESPACE_PROPERTY_WITH_BACKING_FIELD),
|
||||||
|
new AttributesDescriptor("Namespace property backing field access", JetHighlightingColors.NAMESPACE_BACKING_FIELD_ACCESS),
|
||||||
|
|
||||||
new AttributesDescriptor("Function literal default parameter", JetHighlightingColors.FUNCTION_LITERAL_DEFAULT_PARAMETER),
|
new AttributesDescriptor("Function literal default parameter", JetHighlightingColors.FUNCTION_LITERAL_DEFAULT_PARAMETER),
|
||||||
|
|
||||||
new AttributesDescriptor(OptionsBundle.message("options.java.attribute.descriptor.bad.character"), JetHighlightingColors.BAD_CHARACTER),
|
new AttributesDescriptor(OptionsBundle.message("options.java.attribute.descriptor.bad.character"), JetHighlightingColors.BAD_CHARACTER),
|
||||||
|
|||||||
@@ -56,7 +56,6 @@ public class JetHighlighter extends SyntaxHighlighterBase {
|
|||||||
keys1.put(JetTokens.AS_SAFE, JetHighlightingColors.KEYWORD);
|
keys1.put(JetTokens.AS_SAFE, JetHighlightingColors.KEYWORD);
|
||||||
keys1.put(JetTokens.LABEL_IDENTIFIER, JetHighlightingColors.LABEL);
|
keys1.put(JetTokens.LABEL_IDENTIFIER, JetHighlightingColors.LABEL);
|
||||||
keys1.put(JetTokens.ATAT, JetHighlightingColors.LABEL);
|
keys1.put(JetTokens.ATAT, JetHighlightingColors.LABEL);
|
||||||
keys1.put(JetTokens.FIELD_IDENTIFIER, JetHighlightingColors.INSTANCE_BACKING_FIELD_ACCESS);
|
|
||||||
keys1.put(JetTokens.INTEGER_LITERAL, JetHighlightingColors.NUMBER);
|
keys1.put(JetTokens.INTEGER_LITERAL, JetHighlightingColors.NUMBER);
|
||||||
keys1.put(JetTokens.FLOAT_LITERAL, JetHighlightingColors.NUMBER);
|
keys1.put(JetTokens.FLOAT_LITERAL, JetHighlightingColors.NUMBER);
|
||||||
|
|
||||||
|
|||||||
@@ -176,9 +176,17 @@ public class JetHighlightingColors {
|
|||||||
CodeInsightColors.IMPLICIT_ANONYMOUS_CLASS_PARAMETER_ATTRIBUTES.getDefaultAttributes()
|
CodeInsightColors.IMPLICIT_ANONYMOUS_CLASS_PARAMETER_ATTRIBUTES.getDefaultAttributes()
|
||||||
);
|
);
|
||||||
|
|
||||||
|
public static final TextAttributesKey INSTANCE_PROPERTY = TextAttributesKey.createTextAttributesKey(
|
||||||
|
"KOTLIN_INSTANCE_PROPERTY",
|
||||||
|
CodeInsightColors.INSTANCE_FIELD_ATTRIBUTES.getDefaultAttributes()
|
||||||
|
);
|
||||||
|
|
||||||
public static final TextAttributesKey INSTANCE_PROPERTY_WITH_BACKING_FIELD = TextAttributesKey.createTextAttributesKey(
|
public static final TextAttributesKey INSTANCE_PROPERTY_WITH_BACKING_FIELD = TextAttributesKey.createTextAttributesKey(
|
||||||
"KOTLIN_INSTANCE_PROPERTY_WITH_BACKING_FIELD",
|
"KOTLIN_INSTANCE_PROPERTY_WITH_BACKING_FIELD",
|
||||||
CodeInsightColors.INSTANCE_FIELD_ATTRIBUTES.getDefaultAttributes()
|
TextAttributes
|
||||||
|
.fromFlyweight(CodeInsightColors.INSTANCE_FIELD_ATTRIBUTES.getDefaultAttributes()
|
||||||
|
.getFlyweight().withEffectType(EffectType.BOLD_DOTTED_LINE).withEffectColor(
|
||||||
|
CodeInsightColors.INSTANCE_FIELD_ATTRIBUTES.getDefaultAttributes().getForegroundColor()))
|
||||||
);
|
);
|
||||||
|
|
||||||
public static final TextAttributesKey INSTANCE_BACKING_FIELD_ACCESS = TextAttributesKey.createTextAttributesKey(
|
public static final TextAttributesKey INSTANCE_BACKING_FIELD_ACCESS = TextAttributesKey.createTextAttributesKey(
|
||||||
@@ -186,6 +194,22 @@ public class JetHighlightingColors {
|
|||||||
CodeInsightColors.INSTANCE_FIELD_ATTRIBUTES.getDefaultAttributes()
|
CodeInsightColors.INSTANCE_FIELD_ATTRIBUTES.getDefaultAttributes()
|
||||||
);
|
);
|
||||||
|
|
||||||
|
public static final TextAttributesKey NAMESPACE_PROPERTY = TextAttributesKey.createTextAttributesKey(
|
||||||
|
"KOTLIN_NAMESPACE_PROPERTY",
|
||||||
|
CodeInsightColors.STATIC_FIELD_ATTRIBUTES.getDefaultAttributes()
|
||||||
|
);
|
||||||
|
|
||||||
|
public static final TextAttributesKey NAMESPACE_PROPERTY_WITH_BACKING_FIELD = TextAttributesKey.createTextAttributesKey(
|
||||||
|
"KOTLIN_NAMESPACE_PROPERTY_WITH_BACKING_FIELD",
|
||||||
|
TextAttributes.fromFlyweight(CodeInsightColors.STATIC_FIELD_ATTRIBUTES.getDefaultAttributes()
|
||||||
|
.getFlyweight().withEffectType(EffectType.BOLD_DOTTED_LINE).withEffectColor(
|
||||||
|
CodeInsightColors.STATIC_FIELD_ATTRIBUTES.getDefaultAttributes().getForegroundColor())) );
|
||||||
|
|
||||||
|
public static final TextAttributesKey NAMESPACE_BACKING_FIELD_ACCESS = TextAttributesKey.createTextAttributesKey(
|
||||||
|
"KOTLIN_NAMESPACE_BACKING_FIELD_ACCESS",
|
||||||
|
CodeInsightColors.INSTANCE_FIELD_ATTRIBUTES.getDefaultAttributes()
|
||||||
|
);
|
||||||
|
|
||||||
public static final TextAttributesKey FUNCTION_LITERAL_DEFAULT_PARAMETER = TextAttributesKey.createTextAttributesKey(
|
public static final TextAttributesKey FUNCTION_LITERAL_DEFAULT_PARAMETER = TextAttributesKey.createTextAttributesKey(
|
||||||
"KOTLIN_CLOSURE_DEFAULT_PARAMETER",
|
"KOTLIN_CLOSURE_DEFAULT_PARAMETER",
|
||||||
new TextAttributes(null, null, null, null, Font.BOLD)
|
new TextAttributes(null, null, null, null, Font.BOLD)
|
||||||
@@ -203,7 +227,7 @@ public class JetHighlightingColors {
|
|||||||
|
|
||||||
public static final TextAttributesKey LABEL = TextAttributesKey.createTextAttributesKey(
|
public static final TextAttributesKey LABEL = TextAttributesKey.createTextAttributesKey(
|
||||||
"KOTLIN_LABEL",
|
"KOTLIN_LABEL",
|
||||||
new TextAttributes(new Color(74, 134, 232), null, null, null, Font.PLAIN)
|
new TextAttributes(new Color(0x4a86e8), null, null, null, Font.PLAIN)
|
||||||
);
|
);
|
||||||
|
|
||||||
public static final TextAttributesKey DEBUG_INFO = TextAttributesKey.createTextAttributesKey(
|
public static final TextAttributesKey DEBUG_INFO = TextAttributesKey.createTextAttributesKey(
|
||||||
|
|||||||
@@ -65,7 +65,7 @@ public class JetPsiChecker implements Annotator {
|
|||||||
|
|
||||||
private static HighlightingVisitor[] getAfterAnalysisVisitor(AnnotationHolder holder, BindingContext bindingContext) {
|
private static HighlightingVisitor[] getAfterAnalysisVisitor(AnnotationHolder holder, BindingContext bindingContext) {
|
||||||
return new AfterAnalysisHighlightingVisitor[]{
|
return new AfterAnalysisHighlightingVisitor[]{
|
||||||
new BackingFieldHighlightingVisitor(holder, bindingContext),
|
new PropertiesHighlightingVisitor(holder, bindingContext),
|
||||||
new VariablesHighlightingVisitor(holder, bindingContext),
|
new VariablesHighlightingVisitor(holder, bindingContext),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,95 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2012 JetBrains s.r.o.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.jet.plugin.highlighter;
|
||||||
|
|
||||||
|
import com.intellij.lang.annotation.AnnotationHolder;
|
||||||
|
import com.intellij.psi.PsiElement;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
|
||||||
|
import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor;
|
||||||
|
import org.jetbrains.jet.lang.descriptors.PropertyDescriptor;
|
||||||
|
import org.jetbrains.jet.lang.descriptors.VariableDescriptor;
|
||||||
|
import org.jetbrains.jet.lang.psi.*;
|
||||||
|
import org.jetbrains.jet.lang.resolve.BindingContext;
|
||||||
|
import org.jetbrains.jet.lexer.JetTokens;
|
||||||
|
|
||||||
|
class PropertiesHighlightingVisitor extends AfterAnalysisHighlightingVisitor {
|
||||||
|
PropertiesHighlightingVisitor(AnnotationHolder holder, BindingContext bindingContext) {
|
||||||
|
super(holder, bindingContext);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visitSimpleNameExpression(JetSimpleNameExpression expression) {
|
||||||
|
// TODO highlight extension properties
|
||||||
|
DeclarationDescriptor target = bindingContext.get(BindingContext.REFERENCE_TARGET, expression);
|
||||||
|
if (!(target instanceof PropertyDescriptor)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean namespace = target.getContainingDeclaration() instanceof NamespaceDescriptor;
|
||||||
|
if (expression.getReferencedNameElementType() == JetTokens.FIELD_IDENTIFIER) {
|
||||||
|
holder.createInfoAnnotation(expression, null).setTextAttributes(
|
||||||
|
(namespace ?
|
||||||
|
JetHighlightingColors.NAMESPACE_BACKING_FIELD_ACCESS :
|
||||||
|
JetHighlightingColors.INSTANCE_BACKING_FIELD_ACCESS)
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
putPropertyAnnotation(expression, namespace, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visitProperty(@NotNull JetProperty property) {
|
||||||
|
PsiElement nameIdentifier = property.getNameIdentifier();
|
||||||
|
if (nameIdentifier == null) return;
|
||||||
|
VariableDescriptor propertyDescriptor = bindingContext.get(BindingContext.VARIABLE, property);
|
||||||
|
if (propertyDescriptor instanceof PropertyDescriptor) {
|
||||||
|
Boolean backingFieldRequired = bindingContext.get(BindingContext.BACKING_FIELD_REQUIRED, (PropertyDescriptor)propertyDescriptor);
|
||||||
|
boolean namespace = propertyDescriptor.getContainingDeclaration() instanceof NamespaceDescriptor;
|
||||||
|
putPropertyAnnotation(nameIdentifier, namespace, Boolean.TRUE.equals(backingFieldRequired));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visitParameter(@NotNull JetParameter parameter) {
|
||||||
|
PsiElement nameIdentifier = parameter.getNameIdentifier();
|
||||||
|
if (nameIdentifier == null) return;
|
||||||
|
PropertyDescriptor propertyDescriptor = bindingContext.get(BindingContext.PRIMARY_CONSTRUCTOR_PARAMETER, parameter);
|
||||||
|
if (propertyDescriptor != null) {
|
||||||
|
Boolean backingFieldRequired = bindingContext.get(BindingContext.BACKING_FIELD_REQUIRED, propertyDescriptor);
|
||||||
|
putPropertyAnnotation(nameIdentifier, false, Boolean.TRUE.equals(backingFieldRequired));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visitJetElement(@NotNull JetElement element) {
|
||||||
|
element.acceptChildren(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void putPropertyAnnotation(@NotNull PsiElement elementToHighlight, boolean namespace, boolean withBackingField) {
|
||||||
|
holder.createInfoAnnotation(
|
||||||
|
elementToHighlight,
|
||||||
|
"This property has a backing field")
|
||||||
|
.setTextAttributes(withBackingField ?
|
||||||
|
(namespace
|
||||||
|
? JetHighlightingColors.NAMESPACE_PROPERTY_WITH_BACKING_FIELD
|
||||||
|
: JetHighlightingColors.INSTANCE_PROPERTY_WITH_BACKING_FIELD) :
|
||||||
|
(namespace
|
||||||
|
? JetHighlightingColors.NAMESPACE_PROPERTY
|
||||||
|
: JetHighlightingColors.INSTANCE_PROPERTY));
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user