/******************************************************************************* * Copyright (c) 2000, 2011 IBM Corporation and others. * 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: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.che.ide.ext.java.jdt.internal.ui; import org.eclipse.che.ide.ext.java.jdt.core.dom.IBinding; import org.eclipse.che.ide.ext.java.jdt.core.dom.IMethodBinding; import org.eclipse.che.ide.ext.java.jdt.core.dom.IPackageBinding; import org.eclipse.che.ide.ext.java.jdt.core.dom.ITypeBinding; import org.eclipse.che.ide.ext.java.jdt.core.dom.IVariableBinding; /** * Label provider to render bindings in viewers. * * @since 3.1 */ public class BindingLabelProvider { // private static int getAdornmentFlags(IBinding binding) // { // int adornments = 0; // // final int modifiers= binding.getModifiers(); // // if (Modifier.isAbstract(modifiers)) // // adornments|= JavaElementImageDescriptor.ABSTRACT; // // if (Modifier.isFinal(modifiers)) // // adornments|= JavaElementImageDescriptor.FINAL; // // if (Modifier.isStatic(modifiers)) // // adornments|= JavaElementImageDescriptor.STATIC; // // // // if (binding.isDeprecated()) // // adornments|= JavaElementImageDescriptor.DEPRECATED; // // // // if (binding instanceof IMethodBinding) { // // if (((IMethodBinding) binding).isConstructor()) // // adornments|= JavaElementImageDescriptor.CONSTRUCTOR; // // if (Modifier.isSynchronized(modifiers)) // // adornments|= JavaElementImageDescriptor.SYNCHRONIZED; // // if (Modifier.isNative(modifiers)) // // adornments|= JavaElementImageDescriptor.NATIVE; // // } // // if (binding instanceof IVariableBinding && ((IVariableBinding) binding).isField()) { // // if (Modifier.isTransient(modifiers)) // // adornments|= JavaElementImageDescriptor.TRANSIENT; // // if (Modifier.isVolatile(modifiers)) // // adornments|= JavaElementImageDescriptor.VOLATILE; // // } // return adornments; // } // private static ImageResource getBaseImageDescriptor(IBinding binding, int flags) // { // if (binding instanceof ITypeBinding) // { // ITypeBinding typeBinding = (ITypeBinding)binding; // if (typeBinding.isArray()) // { // typeBinding = typeBinding.getElementType(); // } // if (typeBinding.isCapture()) // { // typeBinding.getWildcard(); // } // return getTypeImageDescriptor(typeBinding.getDeclaringClass() != null, typeBinding, flags); // } // else if (binding instanceof IMethodBinding) // { // ITypeBinding type = ((IMethodBinding)binding).getDeclaringClass(); // int modifiers = binding.getModifiers(); // if (type.isEnum() // && (!Modifier.isPublic(modifiers) && !Modifier.isProtected(modifiers) && !Modifier.isPrivate(modifiers)) // && ((IMethodBinding)binding).isConstructor()) // return JavaPluginImages.DESC_MISC_PRIVATE; // return getMethodImageDescriptor(binding.getModifiers()); // } // else if (binding instanceof IVariableBinding) // return getFieldImageDescriptor((IVariableBinding)binding); // return JavaPluginImages.DESC_OBJS_UNKNOWN; // } // private static ImageResource getClassImageDescriptor(int modifiers) // { // if (Modifier.isPublic(modifiers) || Modifier.isProtected(modifiers) || Modifier.isPrivate(modifiers)) // return JavaPluginImages.DESC_OBJS_CLASS; // else // return JavaPluginImages.DESC_OBJS_CLASS_DEFAULT; // } // // private static ImageResource getFieldImageDescriptor(IVariableBinding binding) // { // final int modifiers = binding.getModifiers(); // if (Modifier.isPublic(modifiers) || binding.isEnumConstant()) // return JavaPluginImages.DESC_FIELD_PUBLIC; // if (Modifier.isProtected(modifiers)) // return JavaPluginImages.DESC_FIELD_PROTECTED; // if (Modifier.isPrivate(modifiers)) // return JavaPluginImages.DESC_FIELD_PRIVATE; // // return JavaPluginImages.DESC_FIELD_DEFAULT; // } private static void getFieldLabel(IVariableBinding binding, long flags, StringBuffer buffer) { if (((flags & JavaElementLabels.F_PRE_TYPE_SIGNATURE) != 0) && !binding.isEnumConstant()) { getTypeLabel(binding.getType(), (flags & JavaElementLabels.T_TYPE_PARAMETERS), buffer); buffer.append(' '); } // qualification if ((flags & JavaElementLabels.F_FULLY_QUALIFIED) != 0) { ITypeBinding declaringClass = binding.getDeclaringClass(); if (declaringClass != null) { // test for array.length getTypeLabel(declaringClass, JavaElementLabels.T_FULLY_QUALIFIED | (flags & JavaElementLabels.P_COMPRESSED), buffer); buffer.append('.'); } } buffer.append(binding.getName()); if (((flags & JavaElementLabels.F_APP_TYPE_SIGNATURE) != 0) && !binding.isEnumConstant()) { buffer.append(JavaElementLabels.DECL_STRING); getTypeLabel(binding.getType(), (flags & JavaElementLabels.T_TYPE_PARAMETERS), buffer); } // post qualification if ((flags & JavaElementLabels.F_POST_QUALIFIED) != 0) { ITypeBinding declaringClass = binding.getDeclaringClass(); if (declaringClass != null) { // test for array.length buffer.append(JavaElementLabels.CONCAT_STRING); getTypeLabel(declaringClass, JavaElementLabels.T_FULLY_QUALIFIED | (flags & JavaElementLabels.P_COMPRESSED), buffer); } } } private static void getLocalVariableLabel(IVariableBinding binding, long flags, StringBuffer buffer) { if (((flags & JavaElementLabels.F_PRE_TYPE_SIGNATURE) != 0)) { getTypeLabel(binding.getType(), (flags & JavaElementLabels.T_TYPE_PARAMETERS), buffer); buffer.append(' '); } if (((flags & JavaElementLabels.F_FULLY_QUALIFIED) != 0)) { IMethodBinding declaringMethod = binding.getDeclaringMethod(); if (declaringMethod != null) { getMethodLabel(declaringMethod, flags, buffer); buffer.append('.'); } } buffer.append(binding.getName()); if (((flags & JavaElementLabels.F_APP_TYPE_SIGNATURE) != 0)) { buffer.append(JavaElementLabels.DECL_STRING); getTypeLabel(binding.getType(), (flags & JavaElementLabels.T_TYPE_PARAMETERS), buffer); } } // private static ImageResource getInnerClassImageDescriptor(int modifiers) // { // if (Modifier.isPublic(modifiers)) // return JavaPluginImages.DESC_OBJS_INNER_CLASS_PUBLIC; // else if (Modifier.isPrivate(modifiers)) // return JavaPluginImages.DESC_OBJS_INNER_CLASS_PRIVATE; // else if (Modifier.isProtected(modifiers)) // return JavaPluginImages.DESC_OBJS_INNER_CLASS_PROTECTED; // else // return JavaPluginImages.DESC_OBJS_INNER_CLASS_DEFAULT; // } // // private static ImageResource getInnerInterfaceImageDescriptor(int modifiers) // { // if (Modifier.isPublic(modifiers)) // return JavaPluginImages.DESC_OBJS_INNER_INTERFACE_PUBLIC; // else if (Modifier.isPrivate(modifiers)) // return JavaPluginImages.DESC_OBJS_INNER_INTERFACE_PRIVATE; // else if (Modifier.isProtected(modifiers)) // return JavaPluginImages.DESC_OBJS_INNER_INTERFACE_PROTECTED; // else // return JavaPluginImages.DESC_OBJS_INTERFACE_DEFAULT; // } // // private static ImageResource getInterfaceImageDescriptor(int modifiers) // { // if (Modifier.isPublic(modifiers) || Modifier.isProtected(modifiers) || Modifier.isPrivate(modifiers)) // return JavaPluginImages.DESC_OBJS_INTERFACE; // else // return JavaPluginImages.DESC_OBJS_INTERFACE_DEFAULT; // } // private static ImageResource getMethodImageDescriptor(int modifiers) // { // if (Modifier.isPublic(modifiers)) // return JavaPluginImages.DESC_MISC_PUBLIC; // if (Modifier.isProtected(modifiers)) // return JavaPluginImages.DESC_MISC_PROTECTED; // if (Modifier.isPrivate(modifiers)) // return JavaPluginImages.DESC_MISC_PRIVATE; // // return JavaPluginImages.DESC_MISC_DEFAULT; // } private static void appendDimensions(int dim, StringBuffer buffer) { for (int i = 0; i < dim; i++) { buffer.append('[').append(']'); } } private static void getMethodLabel(IMethodBinding binding, long flags, StringBuffer buffer) { // return type if ((flags & JavaElementLabels.M_PRE_TYPE_PARAMETERS) != 0) { if (binding.isGenericMethod()) { ITypeBinding[] typeParameters = binding.getTypeParameters(); if (typeParameters.length > 0) { getTypeParametersLabel(typeParameters, buffer); buffer.append(' '); } } } // return type if (((flags & JavaElementLabels.M_PRE_RETURNTYPE) != 0) && !binding.isConstructor()) { getTypeLabel(binding.getReturnType(), (flags & JavaElementLabels.T_TYPE_PARAMETERS), buffer); buffer.append(' '); } // qualification if ((flags & JavaElementLabels.M_FULLY_QUALIFIED) != 0) { getTypeLabel(binding.getDeclaringClass(), JavaElementLabels.T_FULLY_QUALIFIED | (flags & JavaElementLabels.P_COMPRESSED), buffer); buffer.append('.'); } buffer.append(binding.getName()); if ((flags & JavaElementLabels.M_APP_TYPE_PARAMETERS) != 0) { if (binding.isParameterizedMethod()) { ITypeBinding[] typeArguments = binding.getTypeArguments(); if (typeArguments.length > 0) { buffer.append(' '); getTypeArgumentsLabel(typeArguments, (flags & JavaElementLabels.T_TYPE_PARAMETERS), buffer); } } } // parameters buffer.append('('); if ((flags & JavaElementLabels.M_PARAMETER_TYPES | JavaElementLabels.M_PARAMETER_NAMES) != 0) { ITypeBinding[] parameters = ((flags & JavaElementLabels.M_PARAMETER_TYPES) != 0) ? binding.getParameterTypes() : null; if (parameters != null) { for (int index = 0; index < parameters.length; index++) { if (index > 0) { buffer.append(JavaElementLabels.COMMA_STRING); } ITypeBinding paramType = parameters[index]; if (binding.isVarargs() && (index == parameters.length - 1)) { getTypeLabel(paramType.getElementType(), (flags & JavaElementLabels.T_TYPE_PARAMETERS), buffer); appendDimensions(paramType.getDimensions() - 1, buffer); buffer.append(JavaElementLabels.ELLIPSIS_STRING); } else { getTypeLabel(paramType, (flags & JavaElementLabels.T_TYPE_PARAMETERS), buffer); } } } } else { if (binding.getParameterTypes().length > 0) { buffer.append(JavaElementLabels.ELLIPSIS_STRING); } } buffer.append(')'); if ((flags & JavaElementLabels.M_EXCEPTIONS) != 0) { ITypeBinding[] exceptions = binding.getExceptionTypes(); if (exceptions.length > 0) { buffer.append(" throws "); //$NON-NLS-1$ for (int index = 0; index < exceptions.length; index++) { if (index > 0) { buffer.append(JavaElementLabels.COMMA_STRING); } getTypeLabel(exceptions[index], (flags & JavaElementLabels.T_TYPE_PARAMETERS), buffer); } } } if ((flags & JavaElementLabels.M_APP_TYPE_PARAMETERS) != 0) { if (binding.isGenericMethod()) { ITypeBinding[] typeParameters = binding.getTypeParameters(); if (typeParameters.length > 0) { buffer.append(' '); getTypeParametersLabel(typeParameters, buffer); } } } if (((flags & JavaElementLabels.M_APP_RETURNTYPE) != 0) && !binding.isConstructor()) { buffer.append(JavaElementLabels.DECL_STRING); getTypeLabel(binding.getReturnType(), (flags & JavaElementLabels.T_TYPE_PARAMETERS), buffer); } // post qualification if ((flags & JavaElementLabels.M_POST_QUALIFIED) != 0) { buffer.append(JavaElementLabels.CONCAT_STRING); getTypeLabel(binding.getDeclaringClass(), JavaElementLabels.T_FULLY_QUALIFIED | (flags & JavaElementLabels.P_COMPRESSED), buffer); } } // private static ImageResource getTypeImageDescriptor(boolean inner, ITypeBinding binding, int flags) // { // if (binding.isEnum()) // return JavaPluginImages.DESC_OBJS_ENUM; // else if (binding.isAnnotation()) // return JavaPluginImages.DESC_OBJS_ANNOTATION; // else if (binding.isInterface()) // { // if ((flags & JavaElementImageProvider.LIGHT_TYPE_ICONS) != 0) // return JavaPluginImages.DESC_OBJS_INTERFACEALT; // if (inner) // return getInnerInterfaceImageDescriptor(binding.getModifiers()); // return getInterfaceImageDescriptor(binding.getModifiers()); // } // else if (binding.isClass()) // { // if ((flags & JavaElementImageProvider.LIGHT_TYPE_ICONS) != 0) // return JavaPluginImages.DESC_OBJS_CLASSALT; // if (inner) // return getInnerClassImageDescriptor(binding.getModifiers()); // return getClassImageDescriptor(binding.getModifiers()); // } // else if (binding.isTypeVariable()) // { // return JavaPluginImages.DESC_OBJS_TYPEVARIABLE; // } // // primitive type, wildcard // return null; // } private static void getTypeLabel(ITypeBinding binding, long flags, StringBuffer buffer) { if ((flags & JavaElementLabels.T_FULLY_QUALIFIED) != 0) { final IPackageBinding pack = binding.getPackage(); if (pack != null && !pack.isUnnamed()) { buffer.append(pack.getName()); buffer.append('.'); } } if ((flags & (JavaElementLabels.T_FULLY_QUALIFIED | JavaElementLabels.T_CONTAINER_QUALIFIED)) != 0) { final ITypeBinding declaring = binding.getDeclaringClass(); if (declaring != null) { getTypeLabel(declaring, JavaElementLabels.T_CONTAINER_QUALIFIED | (flags & JavaElementLabels.P_COMPRESSED), buffer); buffer.append('.'); } final IMethodBinding declaringMethod = binding.getDeclaringMethod(); if (declaringMethod != null) { getMethodLabel(declaringMethod, 0, buffer); buffer.append('.'); } } if (binding.isCapture()) { getTypeLabel(binding.getWildcard(), flags & JavaElementLabels.T_TYPE_PARAMETERS, buffer); } else if (binding.isWildcardType()) { buffer.append('?'); ITypeBinding bound = binding.getBound(); if (bound != null) { if (binding.isUpperbound()) { buffer.append(" extends "); //$NON-NLS-1$ } else { buffer.append(" super "); //$NON-NLS-1$ } getTypeLabel(bound, flags & JavaElementLabels.T_TYPE_PARAMETERS, buffer); } } else if (binding.isArray()) { getTypeLabel(binding.getElementType(), flags & JavaElementLabels.T_TYPE_PARAMETERS, buffer); appendDimensions(binding.getDimensions(), buffer); } else { // type variables, primitive, reftype String name = binding.getTypeDeclaration().getName(); if (name.length() == 0) { if (binding.isEnum()) { buffer.append('{' + JavaElementLabels.ELLIPSIS_STRING + '}'); } else if (binding.isAnonymous()) { ITypeBinding[] superInterfaces = binding.getInterfaces(); ITypeBinding baseType; if (superInterfaces.length > 0) { baseType = superInterfaces[0]; } else { baseType = binding.getSuperclass(); } if (baseType != null) { StringBuffer anonymBaseType = new StringBuffer(); getTypeLabel(baseType, flags & JavaElementLabels.T_TYPE_PARAMETERS, anonymBaseType); buffer.append("new ").append(anonymBaseType.toString()).append("() '{'...} "); } else { buffer.append("new Anonymous"); } } else { buffer.append("UNKNOWN"); //$NON-NLS-1$ } } else { buffer.append(name); } if ((flags & JavaElementLabels.T_TYPE_PARAMETERS) != 0) { if (binding.isGenericType()) { getTypeParametersLabel(binding.getTypeParameters(), buffer); } else if (binding.isParameterizedType()) { getTypeArgumentsLabel(binding.getTypeArguments(), flags, buffer); } } } if ((flags & JavaElementLabels.T_POST_QUALIFIED) != 0) { final IMethodBinding declaringMethod = binding.getDeclaringMethod(); final ITypeBinding declaringType = binding.getDeclaringClass(); if (declaringMethod != null) { buffer.append(JavaElementLabels.CONCAT_STRING); getMethodLabel(declaringMethod, JavaElementLabels.T_FULLY_QUALIFIED | (flags & JavaElementLabels.P_COMPRESSED), buffer); } else if (declaringType != null) { buffer.append(JavaElementLabels.CONCAT_STRING); getTypeLabel(declaringType, JavaElementLabels.T_FULLY_QUALIFIED | (flags & JavaElementLabels.P_COMPRESSED), buffer); } else { final IPackageBinding pack = binding.getPackage(); if (pack != null && !pack.isUnnamed()) { buffer.append(JavaElementLabels.CONCAT_STRING); buffer.append(pack.getName()); } } } } private static void getTypeArgumentsLabel(ITypeBinding[] typeArgs, long flags, StringBuffer buf) { if (typeArgs.length > 0) { buf.append('<'); for (int i = 0; i < typeArgs.length; i++) { if (i > 0) { buf.append(JavaElementLabels.COMMA_STRING); } getTypeLabel(typeArgs[i], flags & JavaElementLabels.T_TYPE_PARAMETERS, buf); } buf.append('>'); } } private static void getTypeParametersLabel(ITypeBinding[] typeParameters, StringBuffer buffer) { if (typeParameters.length > 0) { buffer.append('<'); for (int index = 0; index < typeParameters.length; index++) { if (index > 0) { buffer.append(JavaElementLabels.COMMA_STRING); } buffer.append(typeParameters[index].getName()); } buffer.append('>'); } } /** * Returns the label for a Java element with the flags as defined by {@link JavaElementLabels}. * * @param binding * The binding to render. * @param flags * The text flags as defined in {@link JavaElementLabels} * @return the label of the binding */ public static String getBindingLabel(IBinding binding, long flags) { StringBuffer buffer = new StringBuffer(60); if (binding instanceof ITypeBinding) { getTypeLabel(((ITypeBinding)binding), flags, buffer); } else if (binding instanceof IMethodBinding) { getMethodLabel(((IMethodBinding)binding), flags, buffer); } else if (binding instanceof IVariableBinding) { final IVariableBinding variable = (IVariableBinding)binding; if (variable.isField()) getFieldLabel(variable, flags, buffer); else getLocalVariableLabel(variable, flags, buffer); } return buffer.toString(); } // /** // * Returns the image descriptor for a binding with the flags as defined by {@link JavaElementImageProvider}. // * @param binding The binding to get the image for. // * @param imageFlags The image flags as defined in {@link JavaElementImageProvider}. // * @return the image of the binding or null if there is no image // */ // public static ImageResource getBindingImageDescriptor(IBinding binding, int imageFlags) // { // ImageResource baseImage = getBaseImageDescriptor(binding, imageFlags); // if (baseImage != null) // { // int adornmentFlags = getAdornmentFlags(binding); // Point size = // ((imageFlags & JavaElementImageProvider.SMALL_ICONS) != 0) ? JavaElementImageProvider.SMALL_SIZE // : JavaElementImageProvider.BIG_SIZE; // return new JavaElementImageDescriptor(baseImage, adornmentFlags, size); // } // return null; // } public static final long DEFAULT_TEXTFLAGS = JavaElementLabels.ALL_DEFAULT; // public static final int DEFAULT_IMAGEFLAGS= JavaElementImageProvider.OVERLAY_ICONS; final private long fTextFlags; final private int fImageFlags; // private ImageDescriptorRegistry fRegistry; // /** // * Creates a new binding label provider with default text and image flags // */ // public BindingLabelProvider() // { // this(DEFAULT_TEXTFLAGS, DEFAULT_IMAGEFLAGS); // } /** * @param textFlags * Flags defined in {@link JavaElementLabels}. * @param imageFlags * Flags defined in {@link JavaElementImageProvider}. */ public BindingLabelProvider(final long textFlags, final int imageFlags) { fImageFlags = imageFlags; fTextFlags = textFlags; } // /* // * @see org.eclipse.jface.viewers.ILabelProvider#getImage(java.lang.Object) // */ // public Image getImage(Object element) // { // if (element instanceof IBinding) // { // ImageResource baseImage = getBindingImageDescriptor((IBinding)element, fImageFlags); // if (baseImage != null) // { // return new Image(baseImage); // } // } // //TODO // return new Image(); // // return super.getImage(element); // } // private ImageDescriptorRegistry getRegistry() { // if (fRegistry == null) // fRegistry= JavaPlugin.getImageDescriptorRegistry(); // return fRegistry; // } /* * @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object) */ public String getText(Object element) { if (element instanceof IBinding) { return getBindingLabel((IBinding)element, fTextFlags); } //TODO // return super.getText(element); return element.toString(); } }