/*******************************************************************************
* Copyright (c) 2012-2015 Codenvy, S.A.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Codenvy, S.A. - initial API and implementation
*******************************************************************************/
package org.eclipse.che.jdt.javaeditor;
import org.eclipse.che.ide.ext.java.shared.dto.HighlightedPosition;
import org.eclipse.jdt.internal.corext.dom.ASTNodes;
import org.eclipse.jdt.internal.corext.dom.Bindings;
import org.eclipse.jdt.core.dom.ASTNode;
import org.eclipse.jdt.core.dom.AnnotationTypeMemberDeclaration;
import org.eclipse.jdt.core.dom.ArrayAccess;
import org.eclipse.jdt.core.dom.CastExpression;
import org.eclipse.jdt.core.dom.ClassInstanceCreation;
import org.eclipse.jdt.core.dom.ConditionalExpression;
import org.eclipse.jdt.core.dom.Expression;
import org.eclipse.jdt.core.dom.FieldDeclaration;
import org.eclipse.jdt.core.dom.IBinding;
import org.eclipse.jdt.core.dom.IMethodBinding;
import org.eclipse.jdt.core.dom.ITypeBinding;
import org.eclipse.jdt.core.dom.IVariableBinding;
import org.eclipse.jdt.core.dom.InfixExpression;
import org.eclipse.jdt.core.dom.MemberValuePair;
import org.eclipse.jdt.core.dom.MethodDeclaration;
import org.eclipse.jdt.core.dom.Modifier;
import org.eclipse.jdt.core.dom.NameQualifiedType;
import org.eclipse.jdt.core.dom.ParameterizedType;
import org.eclipse.jdt.core.dom.PrefixExpression;
import org.eclipse.jdt.core.dom.QualifiedName;
import org.eclipse.jdt.core.dom.SimpleName;
import org.eclipse.jdt.core.dom.SimpleType;
import org.eclipse.jdt.core.dom.SingleVariableDeclaration;
import org.eclipse.jdt.core.dom.StructuralPropertyDescriptor;
import org.eclipse.jdt.core.dom.VariableDeclaration;
import org.eclipse.jdt.core.dom.VariableDeclarationFragment;
/**
* Semantic highlightings
*
* @since 3.0
*/
public class SemanticHighlightings {
/**
* A named preference part that controls the highlighting of static final fields.
*/
public static final String STATIC_FINAL_FIELD = "staticFinalField"; //$NON-NLS-1$
/**
* A named preference part that controls the highlighting of static fields.
*/
public static final String STATIC_FIELD = "staticField"; //$NON-NLS-1$
/**
* A named preference part that controls the highlighting of fields.
*/
public static final String FIELD = "field"; //$NON-NLS-1$
/**
* A named preference part that controls the highlighting of method declarations.
*/
public static final String METHOD_DECLARATION = "methodDeclarationName"; //$NON-NLS-1$
/**
* A named preference part that controls the highlighting of static method invocations.
*/
public static final String STATIC_METHOD_INVOCATION = "staticMethodInvocation"; //$NON-NLS-1$
/**
* A named preference part that controls the highlighting of inherited method invocations.
*/
public static final String INHERITED_METHOD_INVOCATION = "inheritedMethodInvocation"; //$NON-NLS-1$
/**
* A named preference part that controls the highlighting of annotation element references.
*
* @since 3.1
*/
public static final String ANNOTATION_ELEMENT_REFERENCE = "annotationElementReference"; //$NON-NLS-1$
/**
* A named preference part that controls the highlighting of abstract method invocations.
*/
public static final String ABSTRACT_METHOD_INVOCATION = "abstractMethodInvocation"; //$NON-NLS-1$
/**
* A named preference part that controls the highlighting of local variables.
*/
public static final String LOCAL_VARIABLE_DECLARATION = "localVariableDeclaration"; //$NON-NLS-1$
/**
* A named preference part that controls the highlighting of local variables.
*/
public static final String LOCAL_VARIABLE = "localVariable"; //$NON-NLS-1$
/**
* A named preference part that controls the highlighting of parameter variables.
*/
public static final String PARAMETER_VARIABLE = "parameterVariable"; //$NON-NLS-1$
/**
* A named preference part that controls the highlighting of deprecated members.
*/
public static final String DEPRECATED_MEMBER = "deprecatedMember"; //$NON-NLS-1$
/**
* A named preference part that controls the highlighting of type parameters.
*
* @since 3.1
*/
public static final String TYPE_VARIABLE = "typeParameter"; //$NON-NLS-1$
/**
* A named preference part that controls the highlighting of methods
* (invocations and declarations).
*
* @since 3.1
*/
public static final String METHOD = "method"; //$NON-NLS-1$
/**
* A named preference part that controls the highlighting of auto(un)boxed
* expressions.
*
* @since 3.1
*/
public static final String AUTOBOXING = "autoboxing"; //$NON-NLS-1$
/**
* A named preference part that controls the highlighting of classes.
*
* @since 3.2
*/
public static final String CLASS = "class"; //$NON-NLS-1$
/**
* A named preference part that controls the highlighting of enums.
*
* @since 3.2
*/
public static final String ENUM = "enum"; //$NON-NLS-1$
/**
* A named preference part that controls the highlighting of interfaces.
*
* @since 3.2
*/
public static final String INTERFACE = "interface"; //$NON-NLS-1$
/**
* A named preference part that controls the highlighting of annotations.
*
* @since 3.2
*/
public static final String ANNOTATION = "annotation"; //$NON-NLS-1$
/**
* A named preference part that controls the highlighting of type arguments.
*
* @since 3.2
*/
public static final String TYPE_ARGUMENT = "typeArgument"; //$NON-NLS-1$
/**
* A named preference part that controls the highlighting of numbers.
*
* @since 3.4
*/
public static final String NUMBER = "number"; //$NON-NLS-1$
/**
* A named preference part that controls the highlighting of abstract classes.
*
* @since 3.7
*/
public static final String ABSTRACT_CLASS = "abstractClass"; //$NON-NLS-1$
/**
* A named preference part that controls the highlighting of inherited fields.
*
* @since 3.8
*/
public static final String INHERITED_FIELD = "inheritedField"; //$NON-NLS-1$
/**
* Semantic highlightings
*/
private static SemanticHighlighting[] fgSemanticHighlightings;
/**
* Do not instantiate
*/
private SemanticHighlightings() {
}
/**
* @return The semantic highlightings, the order defines the precedence of matches, the first match wins.
*/
public static SemanticHighlighting[] getSemanticHighlightings() {
if (fgSemanticHighlightings == null)
fgSemanticHighlightings = new SemanticHighlighting[]{
new DeprecatedMemberHighlighting(),
// new AutoboxHighlighting(),
new StaticFinalFieldHighlighting(),
new StaticFieldHighlighting(),
// new InheritedFieldHighlighting(),
new FieldHighlighting(),
new MethodDeclarationHighlighting(),
new StaticMethodInvocationHighlighting(),
// new AbstractMethodInvocationHighlighting(),
// new AnnotationElementReferenceHighlighting(),
// new InheritedMethodInvocationHighlighting(),
// new ParameterVariableHighlighting(),
// new LocalVariableDeclarationHighlighting(),
// new LocalVariableHighlighting(),
new TypeVariableHighlighting(), // before type arguments!
// new MethodHighlighting(), // before types to get ctors
// new TypeArgumentHighlighting(), // before other types
// new AbstractClassHighlighting(), // before classes
// new ClassHighlighting(),
// new EnumHighlighting(),
// new AnnotationHighlighting(), // before interfaces
// new InterfaceHighlighting(),
// new NumberHighlighting(),
};
return fgSemanticHighlightings;
}
/**
* Extracts the binding from the token's simple name.
* Works around bug 62605 to return the correct constructor binding in a ClassInstanceCreation.
*
* @param token
* the token to extract the binding from
* @return the token's binding, or <code>null</code>
*/
private static IBinding getBinding(SemanticToken token) {
ASTNode node = token.getNode();
ASTNode normalized = ASTNodes.getNormalizedNode(node);
if (normalized.getLocationInParent() == ClassInstanceCreation.TYPE_PROPERTY) {
// work around: https://bugs.eclipse.org/bugs/show_bug.cgi?id=62605
return ((ClassInstanceCreation)normalized.getParent()).resolveConstructorBinding();
}
return token.getBinding();
}
/**
* Semantic highlighting for static final fields.
*/
private static final class StaticFinalFieldHighlighting extends SemanticHighlighting {
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#getPreferenceKey()
// */
// @Override
// public String getPreferenceKey() {
// return STATIC_FINAL_FIELD;
// }
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.ISemanticHighlighting#getDefaultTextColor()
// */
// @Override
// public RGB getDefaultDefaultTextColor() {
// return new RGB(0, 0, 192);
// }
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.ISemanticHighlighting#getDefaultTextStyleBold()
// */
// @Override
// public boolean isBoldByDefault() {
// return true;
// }
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#isItalicByDefault()
// */
// @Override
// public boolean isItalicByDefault() {
// return true;
// }
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#isEnabledByDefault()
// */
// @Override
// public boolean isEnabledByDefault() {
// return true;
// }
/*
* @see org.eclipse.jdt.internal.ui.javaeditor.ISemanticHighlighting#getType()
*/
@Override
public String getType() {
return HighlightedPosition.STATIC_FINAL_FIELD;
}
/*
* @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#consumes(org.eclipse.jdt.internal.ui.javaeditor.SemanticToken)
*/
@Override
public boolean consumes(SemanticToken token) {
IBinding binding = token.getBinding();
return binding != null && binding.getKind() == IBinding.VARIABLE && ((IVariableBinding)binding).isField() &&
(binding.getModifiers() & (
Modifier.FINAL | Modifier.STATIC)) == (Modifier.FINAL | Modifier.STATIC);
}
}
/**
* Semantic highlighting for static fields.
*/
private static final class StaticFieldHighlighting extends SemanticHighlighting {
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#getPreferenceKey()
// */
// @Override
// public String getPreferenceKey() {
// return STATIC_FIELD;
// }
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.ISemanticHighlighting#getDefaultTextColor()
// */
// @Override
// public RGB getDefaultDefaultTextColor() {
// return new RGB(0, 0, 192);
// }
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.ISemanticHighlighting#getDefaultTextStyleBold()
// */
// @Override
// public boolean isBoldByDefault() {
// return false;
// }
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#isItalicByDefault()
// */
// @Override
// public boolean isItalicByDefault() {
// return true;
// }
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#isEnabledByDefault()
// */
// @Override
// public boolean isEnabledByDefault() {
// return true;
// }
/*
* @see org.eclipse.jdt.internal.ui.javaeditor.ISemanticHighlighting#getType()
*/
@Override
public String getType() {
return HighlightedPosition.STATIC_FIELD;
}
/*
* @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#consumes(org.eclipse.jdt.internal.ui.javaeditor.SemanticToken)
*/
@Override
public boolean consumes(SemanticToken token) {
IBinding binding = token.getBinding();
return binding != null && binding.getKind() == IBinding.VARIABLE && ((IVariableBinding)binding).isField() &&
(binding.getModifiers() & Modifier.STATIC) == Modifier.STATIC;
}
}
/**
* Semantic highlighting for fields.
*/
private static final class FieldHighlighting extends SemanticHighlighting {
/*
// * @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#getPreferenceKey()
// */
// @Override
// public String getPreferenceKey() {
// return FIELD;
// }
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.ISemanticHighlighting#getDefaultTextColor()
// */
// @Override
// public RGB getDefaultDefaultTextColor() {
// return new RGB(0, 0, 192);
// }
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.ISemanticHighlighting#getDefaultTextStyleBold()
// */
// @Override
// public boolean isBoldByDefault() {
// return false;
// }
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#isItalicByDefault()
// */
// @Override
// public boolean isItalicByDefault() {
// return false;
// }
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#isEnabledByDefault()
// */
// @Override
// public boolean isEnabledByDefault() {
// return true;
// }
/*
* @see org.eclipse.jdt.internal.ui.javaeditor.ISemanticHighlighting#getType()
*/
@Override
public String getType() {
return HighlightedPosition.FIELD;
}
/*
* @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#consumes(org.eclipse.jdt.internal.ui.javaeditor.SemanticToken)
*/
@Override
public boolean consumes(SemanticToken token) {
IBinding binding = token.getBinding();
return binding != null && binding.getKind() == IBinding.VARIABLE && ((IVariableBinding)binding).isField();
}
}
/**
* Semantic highlighting for auto(un)boxed expressions.
*/
private static final class AutoboxHighlighting extends SemanticHighlighting {
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#getPreferenceKey()
// */
// @Override
// public String getPreferenceKey() {
// return AUTOBOXING;
// }
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.ISemanticHighlighting#getDefaultTextColor()
// */
// @Override
// public RGB getDefaultDefaultTextColor() {
// return new RGB(171, 48, 0);
// }
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.ISemanticHighlighting#getDefaultTextStyleBold()
// */
// @Override
// public boolean isBoldByDefault() {
// return false;
// }
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#isItalicByDefault()
// */
// @Override
// public boolean isItalicByDefault() {
// return false;
// }
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#isEnabledByDefault()
// */
// @Override
// public boolean isEnabledByDefault() {
// return false;
// }
/*
* @see org.eclipse.jdt.internal.ui.javaeditor.ISemanticHighlighting#getType()
*/
@Override
public String getType() {
return AUTOBOXING;
}
/*
* @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#consumesLiteral(org.eclipse.jdt.internal.ui.javaeditor
* .SemanticToken)
*/
@Override
public boolean consumesLiteral(SemanticToken token) {
return isAutoUnBoxing(token.getLiteral());
}
/*
* @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#consumes(org.eclipse.jdt.internal.ui.javaeditor.SemanticToken)
*/
@Override
public boolean consumes(SemanticToken token) {
return isAutoUnBoxing(token.getNode());
}
private boolean isAutoUnBoxing(Expression node) {
if (isAutoUnBoxingExpression(node))
return true;
// special cases: the autoboxing conversions happens at a
// location that is not mapped directly to a simple name
// or a literal, but can still be mapped somehow
// A) expressions
StructuralPropertyDescriptor desc = node.getLocationInParent();
if (desc == ArrayAccess.ARRAY_PROPERTY
|| desc == InfixExpression.LEFT_OPERAND_PROPERTY
|| desc == InfixExpression.RIGHT_OPERAND_PROPERTY
|| desc == ConditionalExpression.THEN_EXPRESSION_PROPERTY
|| desc == PrefixExpression.OPERAND_PROPERTY
|| desc == CastExpression.EXPRESSION_PROPERTY
|| desc == ConditionalExpression.ELSE_EXPRESSION_PROPERTY) {
ASTNode parent = node.getParent();
if (parent instanceof Expression)
return isAutoUnBoxingExpression((Expression)parent);
}
// B) constructor invocations
if (desc == QualifiedName.NAME_PROPERTY) {
node = (Expression)node.getParent();
desc = node.getLocationInParent();
}
if (desc == SimpleType.NAME_PROPERTY || desc == NameQualifiedType.NAME_PROPERTY) {
ASTNode parent = node.getParent();
if (parent != null && parent.getLocationInParent() == ClassInstanceCreation.TYPE_PROPERTY) {
parent = parent.getParent();
return isAutoUnBoxingExpression((ClassInstanceCreation)parent);
}
}
return false;
}
private boolean isAutoUnBoxingExpression(Expression expression) {
return expression.resolveBoxing() || expression.resolveUnboxing();
}
}
/**
* Semantic highlighting for method declarations.
*/
private static final class MethodDeclarationHighlighting extends SemanticHighlighting {
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#getPreferenceKey()
// */
// @Override
// public String getPreferenceKey() {
// return METHOD_DECLARATION;
// }
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.ISemanticHighlighting#getDefaultTextColor()
// */
// @Override
// public RGB getDefaultDefaultTextColor() {
// return new RGB(0, 0, 0);
// }
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.ISemanticHighlighting#getDefaultTextStyleBold()
// */
// @Override
// public boolean isBoldByDefault() {
// return true;
// }
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#isItalicByDefault()
// */
// @Override
// public boolean isItalicByDefault() {
// return false;
// }
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#isEnabledByDefault()
// */
// @Override
// public boolean isEnabledByDefault() {
// return false;
// }
/*
* @see org.eclipse.jdt.internal.ui.javaeditor.ISemanticHighlighting#getType()
*/
@Override
public String getType() {
return HighlightedPosition.METHOD_DECLARATION;
}
/*
* @see org.eclipse.jdt.internal.ui.javaeditor.ISemanticHighlighting#isMatched(org.eclipse.jdt.core.dom.ASTNode)
*/
@Override
public boolean consumes(SemanticToken token) {
StructuralPropertyDescriptor location = token.getNode().getLocationInParent();
return location == MethodDeclaration.NAME_PROPERTY || location == AnnotationTypeMemberDeclaration.NAME_PROPERTY;
}
}
/**
* Semantic highlighting for static method invocations.
*/
private static final class StaticMethodInvocationHighlighting extends SemanticHighlighting {
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#getPreferenceKey()
// */
// @Override
// public String getPreferenceKey() {
// return STATIC_METHOD_INVOCATION;
// }
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.ISemanticHighlighting#getDefaultTextColor()
// */
// @Override
// public RGB getDefaultDefaultTextColor() {
// return new RGB(0, 0, 0);
// }
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.ISemanticHighlighting#getDefaultTextStyleBold()
// */
// @Override
// public boolean isBoldByDefault() {
// return false;
// }
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#isItalicByDefault()
// */
// @Override
// public boolean isItalicByDefault() {
// return true;
// }
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#isEnabledByDefault()
// */
// @Override
// public boolean isEnabledByDefault() {
// return true;
// }
/*
* @see org.eclipse.jdt.internal.ui.javaeditor.ISemanticHighlighting#getType()
*/
@Override
public String getType() {
return HighlightedPosition.STATIC_METHOD_INVOCATION;
}
/*
* @see org.eclipse.jdt.internal.ui.javaeditor.ISemanticHighlighting#isMatched(org.eclipse.jdt.core.dom.ASTNode)
*/
@Override
public boolean consumes(SemanticToken token) {
SimpleName node = token.getNode();
if (node.isDeclaration())
return false;
IBinding binding = token.getBinding();
return binding != null && binding.getKind() == IBinding.METHOD && (binding.getModifiers() & Modifier.STATIC) == Modifier.STATIC;
}
}
/**
* Semantic highlighting for annotation element references.
*
* @since 3.1
*/
private static final class AnnotationElementReferenceHighlighting extends SemanticHighlighting {
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#getPreferenceKey()
// */
// @Override
// public String getPreferenceKey() {
// return ANNOTATION_ELEMENT_REFERENCE;
// }
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.ISemanticHighlighting#getDefaultTextColor()
// */
// @Override
// public RGB getDefaultDefaultTextColor() {
// return new RGB(0, 0, 0);
// }
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.ISemanticHighlighting#getDefaultTextStyleBold()
// */
// @Override
// public boolean isBoldByDefault() {
// return false;
// }
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#isItalicByDefault()
// */
// @Override
// public boolean isItalicByDefault() {
// return false;
// }
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#isEnabledByDefault()
// */
// @Override
// public boolean isEnabledByDefault() {
// return false;
// }
/*
* @see org.eclipse.jdt.internal.ui.javaeditor.ISemanticHighlighting#getType()
*/
@Override
public String getType() {
return ANNOTATION_ELEMENT_REFERENCE;
}
/*
* @see org.eclipse.jdt.internal.ui.javaeditor.ISemanticHighlighting#isMatched(org.eclipse.jdt.core.dom.ASTNode)
*/
@Override
public boolean consumes(SemanticToken token) {
SimpleName node = token.getNode();
if (node.getParent() instanceof MemberValuePair) {
IBinding binding = token.getBinding();
boolean isAnnotationElement = binding != null && binding.getKind() == IBinding.METHOD;
return isAnnotationElement;
}
return false;
}
}
/**
* Semantic highlighting for abstract method invocations.
*/
private static final class AbstractMethodInvocationHighlighting extends SemanticHighlighting {
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#getPreferenceKey()
// */
// @Override
// public String getPreferenceKey() {
// return ABSTRACT_METHOD_INVOCATION;
// }
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.ISemanticHighlighting#getDefaultTextColor()
// */
// @Override
// public RGB getDefaultDefaultTextColor() {
// return new RGB(0, 0, 0);
// }
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.ISemanticHighlighting#getDefaultTextStyleBold()
// */
// @Override
// public boolean isBoldByDefault() {
// return false;
// }
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#isItalicByDefault()
// */
// @Override
// public boolean isItalicByDefault() {
// return false;
// }
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#isEnabledByDefault()
// */
// @Override
// public boolean isEnabledByDefault() {
// return false;
// }
/*
* @see org.eclipse.jdt.internal.ui.javaeditor.ISemanticHighlighting#getType()
*/
@Override
public String getType() {
return ABSTRACT_METHOD_INVOCATION;
}
/*
* @see org.eclipse.jdt.internal.ui.javaeditor.ISemanticHighlighting#isMatched(org.eclipse.jdt.core.dom.ASTNode)
*/
@Override
public boolean consumes(SemanticToken token) {
SimpleName node = token.getNode();
if (node.isDeclaration())
return false;
IBinding binding = token.getBinding();
boolean isAbstractMethod = binding != null && binding.getKind() == IBinding.METHOD &&
(binding.getModifiers() & Modifier.ABSTRACT) == Modifier.ABSTRACT;
if (!isAbstractMethod)
return false;
// filter out annotation value references
if (binding != null) {
ITypeBinding declaringType = ((IMethodBinding)binding).getDeclaringClass();
if (declaringType.isAnnotation())
return false;
}
return true;
}
}
/**
* Semantic highlighting for inherited method invocations.
*/
private static final class InheritedMethodInvocationHighlighting extends SemanticHighlighting {
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#getPreferenceKey()
// */
// @Override
// public String getPreferenceKey() {
// return INHERITED_METHOD_INVOCATION;
// }
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.ISemanticHighlighting#getDefaultTextColor()
// */
// @Override
// public RGB getDefaultDefaultTextColor() {
// return new RGB(0, 0, 0);
// }
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.ISemanticHighlighting#getDefaultTextStyleBold()
// */
// @Override
// public boolean isBoldByDefault() {
// return false;
// }
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#isItalicByDefault()
// */
// @Override
// public boolean isItalicByDefault() {
// return false;
// }
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#isEnabledByDefault()
// */
// @Override
// public boolean isEnabledByDefault() {
// return false;
// }
/*
* @see org.eclipse.jdt.internal.ui.javaeditor.ISemanticHighlighting#getType()
*/
@Override
public String getType() {
return INHERITED_METHOD_INVOCATION;
}
/*
* @see org.eclipse.jdt.internal.ui.javaeditor.ISemanticHighlighting#isMatched(org.eclipse.jdt.core.dom.ASTNode)
*/
@Override
public boolean consumes(SemanticToken token) {
SimpleName node = token.getNode();
if (node.isDeclaration())
return false;
IBinding binding = token.getBinding();
if (binding == null || binding.getKind() != IBinding.METHOD)
return false;
ITypeBinding currentType = Bindings.getBindingOfParentType(node);
ITypeBinding declaringType = ((IMethodBinding)binding).getDeclaringClass();
if (currentType == declaringType || currentType == null)
return false;
return Bindings.isSuperType(declaringType, currentType);
}
}
/**
* Semantic highlighting for inherited method invocations.
*/
private static final class MethodHighlighting extends SemanticHighlighting {
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#getPreferenceKey()
// */
// @Override
// public String getPreferenceKey() {
// return METHOD;
// }
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.ISemanticHighlighting#getDefaultTextColor()
// */
// @Override
// public RGB getDefaultDefaultTextColor() {
// return new RGB(0, 0, 0);
// }
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.ISemanticHighlighting#getDefaultTextStyleBold()
// */
// @Override
// public boolean isBoldByDefault() {
// return false;
// }
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#isItalicByDefault()
// */
// @Override
// public boolean isItalicByDefault() {
// return false;
// }
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#isEnabledByDefault()
// */
// @Override
// public boolean isEnabledByDefault() {
// return false;
// }
/*
* @see org.eclipse.jdt.internal.ui.javaeditor.ISemanticHighlighting#getType()
*/
@Override
public String getType() {
return METHOD;
}
/*
* @see org.eclipse.jdt.internal.ui.javaeditor.ISemanticHighlighting#isMatched(org.eclipse.jdt.core.dom.ASTNode)
*/
@Override
public boolean consumes(SemanticToken token) {
IBinding binding = getBinding(token);
return binding != null && binding.getKind() == IBinding.METHOD;
}
}
/**
* Semantic highlighting for local variable declarations.
*/
private static final class LocalVariableDeclarationHighlighting extends SemanticHighlighting {
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#getPreferenceKey()
// */
// @Override
// public String getPreferenceKey() {
// return LOCAL_VARIABLE_DECLARATION;
// }
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.ISemanticHighlighting#getDefaultTextColor()
// */
// @Override
// public RGB getDefaultDefaultTextColor() {
// return new RGB(106, 62, 62);
// }
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.ISemanticHighlighting#getDefaultTextStyleBold()
// */
// @Override
// public boolean isBoldByDefault() {
// return true;
// }
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#isItalicByDefault()
// */
// @Override
// public boolean isItalicByDefault() {
// return false;
// }
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#isEnabledByDefault()
// */
// @Override
// public boolean isEnabledByDefault() {
// return false;
// }
/*
* @see org.eclipse.jdt.internal.ui.javaeditor.ISemanticHighlighting#getType()
*/
@Override
public String getType() {
return LOCAL_VARIABLE_DECLARATION;
}
/*
* @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#consumes(org.eclipse.jdt.internal.ui.javaeditor.SemanticToken)
*/
@Override
public boolean consumes(SemanticToken token) {
SimpleName node = token.getNode();
StructuralPropertyDescriptor location = node.getLocationInParent();
if (location == VariableDeclarationFragment.NAME_PROPERTY || location == SingleVariableDeclaration.NAME_PROPERTY) {
ASTNode parent = node.getParent();
if (parent instanceof VariableDeclaration) {
parent = parent.getParent();
return parent == null || !(parent instanceof FieldDeclaration);
}
}
return false;
}
}
/**
* Semantic highlighting for local variables.
*/
private static final class LocalVariableHighlighting extends SemanticHighlighting {
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#getPreferenceKey()
// */
// @Override
// public String getPreferenceKey() {
// return LOCAL_VARIABLE;
// }
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.ISemanticHighlighting#getDefaultTextColor()
// */
// @Override
// public RGB getDefaultDefaultTextColor() {
// return new RGB(106, 62, 62);
// }
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.ISemanticHighlighting#getDefaultTextStyleBold()
// */
// @Override
// public boolean isBoldByDefault() {
// return false;
// }
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#isItalicByDefault()
// */
// @Override
// public boolean isItalicByDefault() {
// return false;
// }
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#isEnabledByDefault()
// */
// @Override
// public boolean isEnabledByDefault() {
// return true;
// }
/*
* @see org.eclipse.jdt.internal.ui.javaeditor.ISemanticHighlighting#getType()
*/
@Override
public String getType() {
return LOCAL_VARIABLE;
}
/*
* @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#consumes(org.eclipse.jdt.internal.ui.javaeditor.SemanticToken)
*/
@Override
public boolean consumes(SemanticToken token) {
IBinding binding = token.getBinding();
if (binding != null && binding.getKind() == IBinding.VARIABLE && !((IVariableBinding)binding).isField()) {
ASTNode decl = token.getRoot().findDeclaringNode(binding);
return decl instanceof VariableDeclaration;
}
return false;
}
}
/**
* Semantic highlighting for parameter variables.
*/
private static final class ParameterVariableHighlighting extends SemanticHighlighting {
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#getPreferenceKey()
// */
// @Override
// public String getPreferenceKey() {
// return PARAMETER_VARIABLE;
// }
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.ISemanticHighlighting#getDefaultTextColor()
// */
// @Override
// public RGB getDefaultDefaultTextColor() {
// return new RGB(106, 62, 62);
// }
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.ISemanticHighlighting#getDefaultTextStyleBold()
// */
// @Override
// public boolean isBoldByDefault() {
// return false;
// }
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#isItalicByDefault()
// */
// @Override
// public boolean isItalicByDefault() {
// return false;
// }
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#isEnabledByDefault()
// */
// @Override
// public boolean isEnabledByDefault() {
// return false;
// }
/*
* @see org.eclipse.jdt.internal.ui.javaeditor.ISemanticHighlighting#getType()
*/
@Override
public String getType() {
return PARAMETER_VARIABLE;
}
/*
* @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#consumes(org.eclipse.jdt.internal.ui.javaeditor.SemanticToken)
*/
@Override
public boolean consumes(SemanticToken token) {
IBinding binding = token.getBinding();
if (binding != null && binding.getKind() == IBinding.VARIABLE && !((IVariableBinding)binding).isField()) {
ASTNode decl = token.getRoot().findDeclaringNode(binding);
return decl != null && decl.getLocationInParent() == MethodDeclaration.PARAMETERS_PROPERTY;
}
return false;
}
}
/**
* Semantic highlighting for deprecated members.
*/
static final class DeprecatedMemberHighlighting extends SemanticHighlighting {
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#getPreferenceKey()
// */
// @Override
// public String getPreferenceKey() {
// return DEPRECATED_MEMBER;
// }
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.ISemanticHighlighting#getDefaultTextColor()
// */
// @Override
// public RGB getDefaultDefaultTextColor() {
// return new RGB(0, 0, 0);
// }
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.ISemanticHighlighting#getDefaultTextStyleBold()
// */
// @Override
// public boolean isBoldByDefault() {
// return false;
// }
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#isItalicByDefault()
// */
// @Override
// public boolean isItalicByDefault() {
// return false;
// }
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#isStrikethroughByDefault()
// * @since 3.1
// */
// @Override
// public boolean isStrikethroughByDefault() {
// return true;
// }
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#isEnabledByDefault()
// */
// @Override
// public boolean isEnabledByDefault() {
// return true;
// }
/*
* @see org.eclipse.jdt.internal.ui.javaeditor.ISemanticHighlighting#getType()
*/
@Override
public String getType() {
return HighlightedPosition.DEPRECATED_MEMBER;
}
/*
* @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#consumes(org.eclipse.jdt.internal.ui.javaeditor.SemanticToken)
*/
@Override
public boolean consumes(SemanticToken token) {
IBinding binding = getBinding(token);
if (binding != null) {
if (binding.isDeprecated())
return true;
if (binding instanceof IMethodBinding) {
IMethodBinding methodBinding = (IMethodBinding)binding;
if (methodBinding.isConstructor() && methodBinding.getJavaElement() == null) {
ITypeBinding declaringClass = methodBinding.getDeclaringClass();
if (declaringClass.isAnonymous()) {
ITypeBinding[] interfaces = declaringClass.getInterfaces();
if (interfaces.length > 0)
return interfaces[0].isDeprecated();
else
return declaringClass.getSuperclass().isDeprecated();
}
return declaringClass.isDeprecated();
}
}
}
return false;
}
}
/**
* Semantic highlighting for type variables.
*
* @since 3.1
*/
private static final class TypeVariableHighlighting extends SemanticHighlighting {
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#getPreferenceKey()
// */
// @Override
// public String getPreferenceKey() {
// return TYPE_VARIABLE;
// }
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.ISemanticHighlighting#getDefaultTextColor()
// */
// @Override
// public RGB getDefaultDefaultTextColor() {
// return new RGB(100, 70, 50);
// }
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.ISemanticHighlighting#getDefaultTextStyleBold()
// */
// @Override
// public boolean isBoldByDefault() {
// return true;
// }
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#isItalicByDefault()
// */
// @Override
// public boolean isItalicByDefault() {
// return false;
// }
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#isEnabledByDefault()
// */
// @Override
// public boolean isEnabledByDefault() {
// return false;
// }
/*
* @see org.eclipse.jdt.internal.ui.javaeditor.ISemanticHighlighting#getType()
*/
@Override
public String getType() {
return HighlightedPosition.TYPE_VARIABLE;
}
/*
* @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#consumes(org.eclipse.jdt.internal.ui.javaeditor.SemanticToken)
*/
@Override
public boolean consumes(SemanticToken token) {
// 1: match types in type parameter lists
SimpleName name = token.getNode();
ASTNode node = name.getParent();
if (node.getNodeType() != ASTNode.SIMPLE_TYPE && node.getNodeType() != ASTNode.TYPE_PARAMETER)
return false;
// 2: match generic type variable references
IBinding binding = token.getBinding();
return binding instanceof ITypeBinding && ((ITypeBinding)binding).isTypeVariable();
}
}
/**
* Semantic highlighting for classes.
*
* @since 3.2
*/
private static final class ClassHighlighting extends SemanticHighlighting {
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#getPreferenceKey()
// */
// @Override
// public String getPreferenceKey() {
// return CLASS;
// }
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.ISemanticHighlighting#getDefaultTextColor()
// */
// @Override
// public RGB getDefaultDefaultTextColor() {
// return new RGB(0, 80, 50);
// }
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.ISemanticHighlighting#getDefaultTextStyleBold()
// */
// @Override
// public boolean isBoldByDefault() {
// return false;
// }
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#isItalicByDefault()
// */
// @Override
// public boolean isItalicByDefault() {
// return false;
// }
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#isEnabledByDefault()
// */
// @Override
// public boolean isEnabledByDefault() {
// return false;
// }
/*
* @see org.eclipse.jdt.internal.ui.javaeditor.ISemanticHighlighting#getType()
*/
@Override
public String getType() {
return CLASS;
}
/*
* @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#consumes(org.eclipse.jdt.internal.ui.javaeditor.SemanticToken)
*/
@Override
public boolean consumes(SemanticToken token) {
// 1: match types
SimpleName name = token.getNode();
ASTNode node = name.getParent();
int nodeType = node.getNodeType();
if (nodeType != ASTNode.SIMPLE_TYPE && nodeType != ASTNode.THIS_EXPRESSION && nodeType != ASTNode.QUALIFIED_TYPE &&
nodeType != ASTNode.QUALIFIED_NAME && nodeType != ASTNode.TYPE_DECLARATION && nodeType != ASTNode.METHOD_INVOCATION)
return false;
while (nodeType == ASTNode.QUALIFIED_NAME) {
node = node.getParent();
nodeType = node.getNodeType();
if (nodeType == ASTNode.IMPORT_DECLARATION)
return false;
}
// 2: match classes
IBinding binding = token.getBinding();
return binding instanceof ITypeBinding && ((ITypeBinding)binding).isClass();
}
}
/**
* Semantic highlighting for enums.
*
* @since 3.2
*/
private static final class EnumHighlighting extends SemanticHighlighting {
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#getPreferenceKey()
// */
// @Override
// public String getPreferenceKey() {
// return ENUM;
// }
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.ISemanticHighlighting#getDefaultTextColor()
// */
// @Override
// public RGB getDefaultDefaultTextColor() {
// return new RGB(100, 70, 50);
// }
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.ISemanticHighlighting#getDefaultTextStyleBold()
// */
// @Override
// public boolean isBoldByDefault() {
// return false;
// }
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#isItalicByDefault()
// */
// @Override
// public boolean isItalicByDefault() {
// return false;
// }
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#isEnabledByDefault()
// */
// @Override
// public boolean isEnabledByDefault() {
// return false;
// }
/*
* @see org.eclipse.jdt.internal.ui.javaeditor.ISemanticHighlighting#getType()
*/
@Override
public String getType() {
return ENUM;
}
/*
* @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#consumes(org.eclipse.jdt.internal.ui.javaeditor.SemanticToken)
*/
@Override
public boolean consumes(SemanticToken token) {
// 1: match types
SimpleName name = token.getNode();
ASTNode node = name.getParent();
int nodeType = node.getNodeType();
if (nodeType != ASTNode.METHOD_INVOCATION && nodeType != ASTNode.SIMPLE_TYPE && nodeType != ASTNode.QUALIFIED_TYPE &&
nodeType != ASTNode.QUALIFIED_NAME
&& nodeType != ASTNode.QUALIFIED_NAME && nodeType != ASTNode.ENUM_DECLARATION)
return false;
while (nodeType == ASTNode.QUALIFIED_NAME) {
node = node.getParent();
nodeType = node.getNodeType();
if (nodeType == ASTNode.IMPORT_DECLARATION)
return false;
}
// 2: match enums
IBinding binding = token.getBinding();
return binding instanceof ITypeBinding && ((ITypeBinding)binding).isEnum();
}
}
/**
* Semantic highlighting for interfaces.
*
* @since 3.2
*/
private static final class InterfaceHighlighting extends SemanticHighlighting {
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#getPreferenceKey()
// */
// @Override
// public String getPreferenceKey() {
// return INTERFACE;
// }
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.ISemanticHighlighting#getDefaultTextColor()
// */
// @Override
// public RGB getDefaultDefaultTextColor() {
// return new RGB(50, 63, 112);
// }
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.ISemanticHighlighting#getDefaultTextStyleBold()
// */
// @Override
// public boolean isBoldByDefault() {
// return false;
// }
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#isItalicByDefault()
// */
// @Override
// public boolean isItalicByDefault() {
// return false;
// }
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#isEnabledByDefault()
// */
// @Override
// public boolean isEnabledByDefault() {
// return false;
// }
/*
* @see org.eclipse.jdt.internal.ui.javaeditor.ISemanticHighlighting#getType()
*/
@Override
public String getType() {
return INTERFACE;
}
/*
* @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#consumes(org.eclipse.jdt.internal.ui.javaeditor.SemanticToken)
*/
@Override
public boolean consumes(SemanticToken token) {
// 1: match types
SimpleName name = token.getNode();
ASTNode node = name.getParent();
int nodeType = node.getNodeType();
if (nodeType != ASTNode.SIMPLE_TYPE && nodeType != ASTNode.QUALIFIED_TYPE && nodeType != ASTNode.QUALIFIED_NAME &&
nodeType != ASTNode.TYPE_DECLARATION)
return false;
while (nodeType == ASTNode.QUALIFIED_NAME) {
node = node.getParent();
nodeType = node.getNodeType();
if (nodeType == ASTNode.IMPORT_DECLARATION)
return false;
}
// 2: match interfaces
IBinding binding = token.getBinding();
return binding instanceof ITypeBinding && ((ITypeBinding)binding).isInterface();
}
}
/**
* Semantic highlighting for annotation types.
*
* @since 3.2
*/
private static final class AnnotationHighlighting extends SemanticHighlighting {
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#getPreferenceKey()
// */
// @Override
// public String getPreferenceKey() {
// return ANNOTATION;
// }
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.ISemanticHighlighting#getDefaultTextColor()
// */
// @Override
// public RGB getDefaultDefaultTextColor() {
// return new RGB(100, 100, 100);
// }
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.ISemanticHighlighting#getDefaultTextStyleBold()
// */
// @Override
// public boolean isBoldByDefault() {
// return false;
// }
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#isItalicByDefault()
// */
// @Override
// public boolean isItalicByDefault() {
// return false;
// }
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#isEnabledByDefault()
// */
// @Override
// public boolean isEnabledByDefault() {
// return true; // as it replaces the syntax based highlighting which is always enabled
// }
/*
* @see org.eclipse.jdt.internal.ui.javaeditor.ISemanticHighlighting#getType()
*/
@Override
public String getType() {
return ANNOTATION;
}
/*
* @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#consumes(org.eclipse.jdt.internal.ui.javaeditor.SemanticToken)
*/
@Override
public boolean consumes(SemanticToken token) {
// 1: match types
SimpleName name = token.getNode();
ASTNode node = name.getParent();
int nodeType = node.getNodeType();
if (nodeType != ASTNode.SIMPLE_TYPE && nodeType != ASTNode.QUALIFIED_TYPE && nodeType != ASTNode.QUALIFIED_NAME &&
nodeType != ASTNode.ANNOTATION_TYPE_DECLARATION
&& nodeType != ASTNode.MARKER_ANNOTATION && nodeType != ASTNode.NORMAL_ANNOTATION && nodeType != ASTNode
.SINGLE_MEMBER_ANNOTATION)
return false;
while (nodeType == ASTNode.QUALIFIED_NAME) {
node = node.getParent();
nodeType = node.getNodeType();
if (nodeType == ASTNode.IMPORT_DECLARATION)
return false;
}
// 2: match annotations
IBinding binding = token.getBinding();
return binding instanceof ITypeBinding && ((ITypeBinding)binding).isAnnotation();
}
}
/**
* Semantic highlighting for annotation types.
*
* @since 3.2
*/
private static final class TypeArgumentHighlighting extends SemanticHighlighting {
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#getPreferenceKey()
// */
// @Override
// public String getPreferenceKey() {
// return TYPE_ARGUMENT;
// }
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.ISemanticHighlighting#getDefaultTextColor()
// */
// @Override
// public RGB getDefaultDefaultTextColor() {
// return new RGB(13, 100, 0);
// }
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.ISemanticHighlighting#getDefaultTextStyleBold()
// */
// @Override
// public boolean isBoldByDefault() {
// return false;
// }
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#isItalicByDefault()
// */
// @Override
// public boolean isItalicByDefault() {
// return false;
// }
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#isEnabledByDefault()
// */
// @Override
// public boolean isEnabledByDefault() {
// return false;
// }
/*
* @see org.eclipse.jdt.internal.ui.javaeditor.ISemanticHighlighting#getType()
*/
@Override
public String getType() {
return TYPE_ARGUMENT;
}
/*
* @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#consumes(org.eclipse.jdt.internal.ui.javaeditor.SemanticToken)
*/
@Override
public boolean consumes(SemanticToken token) {
// 1: match types
SimpleName name = token.getNode();
ASTNode node = name.getParent();
int nodeType = node.getNodeType();
if (nodeType != ASTNode.SIMPLE_TYPE && nodeType != ASTNode.QUALIFIED_TYPE)
return false;
// 2: match type arguments
StructuralPropertyDescriptor locationInParent = node.getLocationInParent();
if (locationInParent == ParameterizedType.TYPE_ARGUMENTS_PROPERTY)
return true;
return false;
}
}
/**
* Semantic highlighting for numbers.
*
* @since 3.4
*/
private static final class NumberHighlighting extends SemanticHighlighting {
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#getPreferenceKey()
// */
// @Override
// public String getPreferenceKey() {
// return NUMBER;
// }
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.ISemanticHighlighting#getDefaultTextColor()
// */
// @Override
// public RGB getDefaultDefaultTextColor() {
// return new RGB(42, 0, 255);
// }
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.ISemanticHighlighting#getDefaultTextStyleBold()
// */
// @Override
// public boolean isBoldByDefault() {
// return false;
// }
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#isItalicByDefault()
// */
// @Override
// public boolean isItalicByDefault() {
// return false;
// }
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#isEnabledByDefault()
// */
// @Override
// public boolean isEnabledByDefault() {
// return false;
// }
/*
* @see org.eclipse.jdt.internal.ui.javaeditor.ISemanticHighlighting#getType()
*/
@Override
public String getType() {
return NUMBER;
}
/*
* @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#consumes(org.eclipse.jdt.internal.ui.javaeditor.SemanticToken)
*/
@Override
public boolean consumes(SemanticToken token) {
return false;
}
/*
* @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#consumesLiteral(org.eclipse.jdt.internal.ui.javaeditor
* .SemanticToken)
*/
@Override
public boolean consumesLiteral(SemanticToken token) {
Expression expr = token.getLiteral();
return expr != null && expr.getNodeType() == ASTNode.NUMBER_LITERAL;
}
}
/**
* Semantic highlighting for classes.
*
* @since 3.7
*/
private static final class AbstractClassHighlighting extends SemanticHighlighting {
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#getPreferenceKey()
// */
// @Override
// public String getPreferenceKey() {
// return ABSTRACT_CLASS;
// }
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.ISemanticHighlighting#getDefaultTextColor()
// */
// @Override
// public RGB getDefaultDefaultTextColor() {
// return new RGB(139, 136, 22);
// }
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.ISemanticHighlighting#getDefaultTextStyleBold()
// */
// @Override
// public boolean isBoldByDefault() {
// return false;
// }
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#isItalicByDefault()
// */
// @Override
// public boolean isItalicByDefault() {
// return false;
// }
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#isEnabledByDefault()
// */
// @Override
// public boolean isEnabledByDefault() {
// return false;
// }
/*
* @see org.eclipse.jdt.internal.ui.javaeditor.ISemanticHighlighting#getType()
*/
@Override
public String getType() {
return ABSTRACT_CLASS;
}
/*
* @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#consumes(org.eclipse.jdt.internal.ui.javaeditor.SemanticToken)
*/
@Override
public boolean consumes(SemanticToken token) {
// 1: match types
SimpleName name = token.getNode();
ASTNode node = name.getParent();
int nodeType = node.getNodeType();
if (nodeType != ASTNode.SIMPLE_TYPE && nodeType != ASTNode.THIS_EXPRESSION && nodeType != ASTNode.QUALIFIED_TYPE &&
nodeType != ASTNode.QUALIFIED_NAME && nodeType != ASTNode.TYPE_DECLARATION && nodeType != ASTNode.METHOD_INVOCATION)
return false;
while (nodeType == ASTNode.QUALIFIED_NAME) {
node = node.getParent();
nodeType = node.getNodeType();
if (nodeType == ASTNode.IMPORT_DECLARATION)
return false;
}
// 2: match classes
IBinding binding = token.getBinding();
if (binding instanceof ITypeBinding) {
ITypeBinding typeBinding = (ITypeBinding)binding;
// see also ClassHighlighting
return typeBinding.isClass() && (typeBinding.getModifiers() & Modifier.ABSTRACT) != 0;
}
return false;
}
}
/**
* Semantic highlighting for inherited field access.
*
* @since 3.8
*/
private static final class InheritedFieldHighlighting extends SemanticHighlighting {
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#getPreferenceKey()
// */
// @Override
// public String getPreferenceKey() {
// return INHERITED_FIELD;
// }
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.ISemanticHighlighting#getDefaultTextColor()
// */
// @Override
// public RGB getDefaultDefaultTextColor() {
// return new RGB(0, 0, 192);
// }
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.ISemanticHighlighting#getDefaultTextStyleBold()
// */
// @Override
// public boolean isBoldByDefault() {
// return false;
// }
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#isItalicByDefault()
// */
// @Override
// public boolean isItalicByDefault() {
// return false;
// }
//
// /*
// * @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#isEnabledByDefault()
// */
// @Override
// public boolean isEnabledByDefault() {
// return false;
// }
/*
* @see org.eclipse.jdt.internal.ui.javaeditor.ISemanticHighlighting#getType()
*/
@Override
public String getType() {
return INHERITED_FIELD;
}
/*
* @see org.eclipse.jdt.internal.ui.javaeditor.ISemanticHighlighting#isMatched(org.eclipse.jdt.core.dom.ASTNode)
*/
@Override
public boolean consumes(final SemanticToken token) {
final SimpleName node = token.getNode();
if (node.isDeclaration()) {
return false;
}
final IBinding binding = token.getBinding();
if (binding == null || binding.getKind() != IBinding.VARIABLE) {
return false;
}
ITypeBinding currentType = Bindings.getBindingOfParentType(node);
ITypeBinding declaringType = ((IVariableBinding)binding).getDeclaringClass();
if (declaringType == null || currentType == declaringType)
return false;
return Bindings.isSuperType(declaringType, currentType);
}
}
}