| /******************************************************************************* |
| * Copyright (c) 2018 IBM Corporation and others. |
| * |
| * This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License 2.0 |
| * which accompanies this distribution, and is available at |
| * https://www.eclipse.org/legal/epl-2.0/ |
| * |
| * SPDX-License-Identifier: EPL-2.0 |
| * |
| * Copied from org.eclipse.jdt.ui/src/org/eclipse/jdt/internal/ui/viewsupport/BindingLabelProvider.java |
| * |
| * Contributors: |
| * IBM Corporation - initial API and implementation |
| * Red Hat Inc. - copy to BindingLabelProviderCore |
| *******************************************************************************/ |
| package org.eclipse.jdt.internal.core.manipulation; |
| |
| |
| import org.eclipse.jdt.core.dom.IBinding; |
| import org.eclipse.jdt.core.dom.IMethodBinding; |
| import org.eclipse.jdt.core.dom.IModuleBinding; |
| import org.eclipse.jdt.core.dom.IPackageBinding; |
| import org.eclipse.jdt.core.dom.ITypeBinding; |
| import org.eclipse.jdt.core.dom.IVariableBinding; |
| |
| import org.eclipse.jdt.internal.core.manipulation.util.Strings; |
| |
| |
| /** |
| * Label provider to render bindings in viewers. |
| */ |
| public class BindingLabelProviderCore { |
| |
| |
| |
| private static void getFieldLabel(IVariableBinding binding, long flags, StringBuffer buffer) { |
| if (((flags & JavaElementLabelsCore.F_PRE_TYPE_SIGNATURE) != 0) && !binding.isEnumConstant()) { |
| getTypeLabel(binding.getType(), (flags & JavaElementLabelsCore.T_TYPE_PARAMETERS), buffer); |
| buffer.append(' '); |
| } |
| // qualification |
| |
| if ((flags & JavaElementLabelsCore.F_FULLY_QUALIFIED) != 0) { |
| ITypeBinding declaringClass= binding.getDeclaringClass(); |
| if (declaringClass != null) { // test for array.length |
| getTypeLabel(declaringClass, JavaElementLabelsCore.T_FULLY_QUALIFIED | (flags & JavaElementLabelsCore.P_COMPRESSED), buffer); |
| buffer.append('.'); |
| } |
| } |
| buffer.append(binding.getName()); |
| if (((flags & JavaElementLabelsCore.F_APP_TYPE_SIGNATURE) != 0) && !binding.isEnumConstant()) { |
| buffer.append(JavaElementLabelsCore.DECL_STRING); |
| getTypeLabel(binding.getType(), (flags & JavaElementLabelsCore.T_TYPE_PARAMETERS), buffer); |
| } |
| // post qualification |
| if ((flags & JavaElementLabelsCore.F_POST_QUALIFIED) != 0) { |
| ITypeBinding declaringClass= binding.getDeclaringClass(); |
| if (declaringClass != null) { // test for array.length |
| buffer.append(JavaElementLabelsCore.CONCAT_STRING); |
| getTypeLabel(declaringClass, JavaElementLabelsCore.T_FULLY_QUALIFIED | (flags & JavaElementLabelsCore.P_COMPRESSED), buffer); |
| } |
| } |
| } |
| |
| private static void getLocalVariableLabel(IVariableBinding binding, long flags, StringBuffer buffer) { |
| if (((flags & JavaElementLabelsCore.F_PRE_TYPE_SIGNATURE) != 0)) { |
| getTypeLabel(binding.getType(), (flags & JavaElementLabelsCore.T_TYPE_PARAMETERS), buffer); |
| buffer.append(' '); |
| } |
| if (((flags & JavaElementLabelsCore.F_FULLY_QUALIFIED) != 0)) { |
| IMethodBinding declaringMethod= binding.getDeclaringMethod(); |
| if (declaringMethod != null) { |
| getMethodLabel(declaringMethod, flags, buffer); |
| buffer.append('.'); |
| } |
| } |
| buffer.append(binding.getName()); |
| if (((flags & JavaElementLabelsCore.F_APP_TYPE_SIGNATURE) != 0)) { |
| buffer.append(JavaElementLabelsCore.DECL_STRING); |
| getTypeLabel(binding.getType(), (flags & JavaElementLabelsCore.T_TYPE_PARAMETERS), buffer); |
| } |
| } |
| |
| 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 & JavaElementLabelsCore.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 & JavaElementLabelsCore.M_PRE_RETURNTYPE) != 0) && !binding.isConstructor()) { |
| getTypeLabel(binding.getReturnType(), (flags & JavaElementLabelsCore.T_TYPE_PARAMETERS), buffer); |
| buffer.append(' '); |
| } |
| // qualification |
| if ((flags & JavaElementLabelsCore.M_FULLY_QUALIFIED) != 0) { |
| getTypeLabel(binding.getDeclaringClass(), JavaElementLabelsCore.T_FULLY_QUALIFIED | (flags & JavaElementLabelsCore.P_COMPRESSED), buffer); |
| buffer.append('.'); |
| } |
| buffer.append(binding.getName()); |
| if ((flags & JavaElementLabelsCore.M_APP_TYPE_PARAMETERS) != 0) { |
| if (binding.isParameterizedMethod()) { |
| ITypeBinding[] typeArguments= binding.getTypeArguments(); |
| if (typeArguments.length > 0) { |
| buffer.append(' '); |
| getTypeArgumentsLabel(typeArguments, (flags & JavaElementLabelsCore.T_TYPE_PARAMETERS), buffer); |
| } |
| } |
| } |
| |
| |
| // parameters |
| buffer.append('('); |
| if ((flags & (JavaElementLabelsCore.M_PARAMETER_TYPES | JavaElementLabelsCore.M_PARAMETER_NAMES)) != 0) { |
| ITypeBinding[] parameters= ((flags & JavaElementLabelsCore.M_PARAMETER_TYPES) != 0) ? binding.getParameterTypes() : null; |
| if (parameters != null) { |
| for (int index= 0; index < parameters.length; index++) { |
| if (index > 0) { |
| buffer.append(JavaElementLabelsCore.COMMA_STRING); |
| } |
| ITypeBinding paramType= parameters[index]; |
| if (binding.isVarargs() && (index == parameters.length - 1)) { |
| getTypeLabel(paramType.getElementType(), (flags & JavaElementLabelsCore.T_TYPE_PARAMETERS), buffer); |
| appendDimensions(paramType.getDimensions() - 1, buffer); |
| buffer.append(JavaElementLabelsCore.ELLIPSIS_STRING); |
| } else { |
| getTypeLabel(paramType, (flags & JavaElementLabelsCore.T_TYPE_PARAMETERS), buffer); |
| } |
| } |
| } |
| } else { |
| if (binding.getParameterTypes().length > 0) { |
| buffer.append(JavaElementLabelsCore.ELLIPSIS_STRING); |
| } |
| } |
| buffer.append(')'); |
| |
| if ((flags & JavaElementLabelsCore.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(JavaElementLabelsCore.COMMA_STRING); |
| } |
| getTypeLabel(exceptions[index], (flags & JavaElementLabelsCore.T_TYPE_PARAMETERS), buffer); |
| } |
| } |
| } |
| if ((flags & JavaElementLabelsCore.M_APP_TYPE_PARAMETERS) != 0) { |
| if (binding.isGenericMethod()) { |
| ITypeBinding[] typeParameters= binding.getTypeParameters(); |
| if (typeParameters.length > 0) { |
| buffer.append(' '); |
| getTypeParametersLabel(typeParameters, buffer); |
| } |
| } |
| } |
| if (((flags & JavaElementLabelsCore.M_APP_RETURNTYPE) != 0) && !binding.isConstructor()) { |
| buffer.append(JavaElementLabelsCore.DECL_STRING); |
| getTypeLabel(binding.getReturnType(), (flags & JavaElementLabelsCore.T_TYPE_PARAMETERS), buffer); |
| } |
| // post qualification |
| if ((flags & JavaElementLabelsCore.M_POST_QUALIFIED) != 0) { |
| buffer.append(JavaElementLabelsCore.CONCAT_STRING); |
| getTypeLabel(binding.getDeclaringClass(), JavaElementLabelsCore.T_FULLY_QUALIFIED | (flags & JavaElementLabelsCore.P_COMPRESSED), buffer); |
| } |
| } |
| |
| |
| private static void getTypeLabel(ITypeBinding binding, long flags, StringBuffer buffer) { |
| if ((flags & JavaElementLabelsCore.T_FULLY_QUALIFIED) != 0) { |
| final IPackageBinding pack= binding.getPackage(); |
| if (pack != null && !pack.isUnnamed()) { |
| buffer.append(pack.getName()); |
| buffer.append('.'); |
| } |
| } |
| if ((flags & (JavaElementLabelsCore.T_FULLY_QUALIFIED | JavaElementLabelsCore.T_CONTAINER_QUALIFIED)) != 0) { |
| final ITypeBinding declaring= binding.getDeclaringClass(); |
| if (declaring != null) { |
| getTypeLabel(declaring, JavaElementLabelsCore.T_CONTAINER_QUALIFIED | (flags & JavaElementLabelsCore.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 & JavaElementLabelsCore.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 & JavaElementLabelsCore.T_TYPE_PARAMETERS, buffer); |
| } |
| } else if (binding.isArray()) { |
| getTypeLabel(binding.getElementType(), flags & JavaElementLabelsCore.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('{' + JavaElementLabelsCore.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 & JavaElementLabelsCore.T_TYPE_PARAMETERS, anonymBaseType); |
| buffer.append(Messages.format(JavaElementLabelsMessages.JavaElementLabels_anonym_type, anonymBaseType.toString())); |
| } else { |
| buffer.append(JavaElementLabelsMessages.JavaElementLabels_anonym); |
| } |
| } else { |
| buffer.append("UNKNOWN"); //$NON-NLS-1$ |
| } |
| } else { |
| buffer.append(name); |
| } |
| |
| if ((flags & JavaElementLabelsCore.T_TYPE_PARAMETERS) != 0) { |
| if (binding.isGenericType()) { |
| getTypeParametersLabel(binding.getTypeParameters(), buffer); |
| } else if (binding.isParameterizedType()) { |
| getTypeArgumentsLabel(binding.getTypeArguments(), flags, buffer); |
| } |
| } |
| } |
| |
| |
| if ((flags & JavaElementLabelsCore.T_POST_QUALIFIED) != 0) { |
| final IMethodBinding declaringMethod= binding.getDeclaringMethod(); |
| final ITypeBinding declaringType= binding.getDeclaringClass(); |
| if (declaringMethod != null) { |
| buffer.append(JavaElementLabelsCore.CONCAT_STRING); |
| getMethodLabel(declaringMethod, JavaElementLabelsCore.T_FULLY_QUALIFIED | (flags & JavaElementLabelsCore.P_COMPRESSED), buffer); |
| } else if (declaringType != null) { |
| buffer.append(JavaElementLabelsCore.CONCAT_STRING); |
| getTypeLabel(declaringType, JavaElementLabelsCore.T_FULLY_QUALIFIED | (flags & JavaElementLabelsCore.P_COMPRESSED), buffer); |
| } else { |
| final IPackageBinding pack= binding.getPackage(); |
| if (pack != null && !pack.isUnnamed()) { |
| buffer.append(JavaElementLabelsCore.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(JavaElementLabelsCore.COMMA_STRING); |
| } |
| getTypeLabel(typeArgs[i], flags & JavaElementLabelsCore.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(JavaElementLabelsCore.COMMA_STRING); |
| } |
| buffer.append(typeParameters[index].getName()); |
| } |
| buffer.append('>'); |
| } |
| } |
| |
| private static void getModuleLabel(IModuleBinding moduleBinding, @SuppressWarnings("unused") long flags, StringBuffer buffer) { |
| buffer.append(moduleBinding.getName()); |
| } |
| |
| /** |
| * Returns the label for a Java element with the flags as defined by {@link JavaElementLabelsCore}. |
| * @param binding The binding to render. |
| * @param flags The text flags as defined in {@link JavaElementLabelsCore} |
| * @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 IModuleBinding) { |
| getModuleLabel(((IModuleBinding) 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 Strings.markLTR(buffer.toString()); |
| } |
| |
| |
| public static final long DEFAULT_TEXTFLAGS= JavaElementLabelsCore.ALL_DEFAULT; |
| |
| private BindingLabelProviderCore() { |
| } |
| } |