| /******************************************************************************* |
| * Copyright (c) 2015, 2016 Google, Inc 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 |
| * |
| * Contributors: |
| * Stefan Xenos (Google) - Initial implementation |
| *******************************************************************************/ |
| package org.eclipse.jdt.internal.compiler.classfmt; |
| |
| import org.eclipse.jdt.internal.compiler.env.IBinaryAnnotation; |
| import org.eclipse.jdt.internal.compiler.env.IBinaryElementValuePair; |
| import org.eclipse.jdt.internal.compiler.env.IBinaryMethod; |
| import org.eclipse.jdt.internal.compiler.env.IBinaryTypeAnnotation; |
| import org.eclipse.jdt.internal.compiler.util.Util; |
| |
| public class BinaryTypeFormatter { |
| |
| public static String annotationToString(IBinaryAnnotation annotation) { |
| StringBuffer buffer = new StringBuffer(); |
| buffer.append('@'); |
| buffer.append(annotation.getTypeName()); |
| IBinaryElementValuePair[] valuePairs = annotation.getElementValuePairs(); |
| if (valuePairs != null) { |
| buffer.append('('); |
| buffer.append("\n\t"); //$NON-NLS-1$ |
| for (int i = 0, len = valuePairs.length; i < len; i++) { |
| if (i > 0) |
| buffer.append(",\n\t"); //$NON-NLS-1$ |
| buffer.append(valuePairs[i]); |
| } |
| buffer.append(')'); |
| } |
| return buffer.toString(); |
| } |
| |
| public static String annotationToString(IBinaryTypeAnnotation typeAnnotation) { |
| StringBuffer buffer = new StringBuffer(); |
| buffer.append(typeAnnotation.getAnnotation()); |
| buffer.append(' '); |
| // Not fully decoding it here, just including all the information in the string |
| buffer.append("target_type=").append(typeAnnotation.getTargetType()); //$NON-NLS-1$ |
| buffer.append(", info=").append(typeAnnotation.getSupertypeIndex()); //$NON-NLS-1$ |
| buffer.append(", info2=").append(typeAnnotation.getBoundIndex()); //$NON-NLS-1$ |
| int[] theTypePath = typeAnnotation.getTypePath(); |
| if (theTypePath != null && theTypePath.length != 0) { |
| buffer.append(", location=["); //$NON-NLS-1$ |
| for (int i = 0, max = theTypePath.length; i < max; i += 2) { |
| if (i > 0) { |
| buffer.append(", "); //$NON-NLS-1$ |
| } |
| switch (theTypePath[i]) { |
| case 0: |
| buffer.append("ARRAY"); //$NON-NLS-1$ |
| break; |
| case 1: |
| buffer.append("INNER_TYPE"); //$NON-NLS-1$ |
| break; |
| case 2: |
| buffer.append("WILDCARD"); //$NON-NLS-1$ |
| break; |
| case 3: |
| buffer.append("TYPE_ARGUMENT(").append(theTypePath[i+1]).append(')'); //$NON-NLS-1$ |
| break; |
| } |
| } |
| buffer.append(']'); |
| } |
| return buffer.toString(); |
| } |
| |
| public static String methodToString(IBinaryMethod method) { |
| StringBuffer result = new StringBuffer(); |
| methodToStringContent(result, method); |
| return result.toString(); |
| } |
| |
| public static void methodToStringContent(StringBuffer buffer, IBinaryMethod method) { |
| int modifiers = method.getModifiers(); |
| char[] desc = method.getGenericSignature(); |
| if (desc == null) |
| desc = method.getMethodDescriptor(); |
| buffer |
| .append('{') |
| .append( |
| ((modifiers & ClassFileConstants.AccDeprecated) != 0 ? "deprecated " : Util.EMPTY_STRING) //$NON-NLS-1$ |
| + ((modifiers & 0x0001) == 1 ? "public " : Util.EMPTY_STRING) //$NON-NLS-1$ |
| + ((modifiers & 0x0002) == 0x0002 ? "private " : Util.EMPTY_STRING) //$NON-NLS-1$ |
| + ((modifiers & 0x0004) == 0x0004 ? "protected " : Util.EMPTY_STRING) //$NON-NLS-1$ |
| + ((modifiers & 0x0008) == 0x000008 ? "static " : Util.EMPTY_STRING) //$NON-NLS-1$ |
| + ((modifiers & 0x0010) == 0x0010 ? "final " : Util.EMPTY_STRING) //$NON-NLS-1$ |
| + ((modifiers & 0x0040) == 0x0040 ? "bridge " : Util.EMPTY_STRING) //$NON-NLS-1$ |
| + ((modifiers & 0x0080) == 0x0080 ? "varargs " : Util.EMPTY_STRING)) //$NON-NLS-1$ |
| .append(method.getSelector()) |
| .append(desc) |
| .append('}'); |
| |
| Object defaultValue = method.getDefaultValue(); |
| if (defaultValue != null) { |
| buffer.append(" default "); //$NON-NLS-1$ |
| if (defaultValue instanceof Object[]) { |
| buffer.append('{'); |
| Object[] elements = (Object[]) defaultValue; |
| for (int i = 0, len = elements.length; i < len; i++) { |
| if (i > 0) |
| buffer.append(", "); //$NON-NLS-1$ |
| buffer.append(elements[i]); |
| } |
| buffer.append('}'); |
| } else { |
| buffer.append(defaultValue); |
| } |
| buffer.append('\n'); |
| } |
| |
| IBinaryAnnotation[] annotations = method.getAnnotations(); |
| for (int i = 0, l = annotations == null ? 0 : annotations.length; i < l; i++) { |
| buffer.append(annotations[i]); |
| buffer.append('\n'); |
| } |
| |
| int annotatedParameterCount = method.getAnnotatedParametersCount(); |
| for (int i = 0; i < annotatedParameterCount; i++) { |
| buffer.append("param" + (i - 1)); //$NON-NLS-1$ |
| buffer.append('\n'); |
| IBinaryAnnotation[] infos = method.getParameterAnnotations(i, new char[0]); |
| for (int j = 0, k = infos == null ? 0 : infos.length; j < k; j++) { |
| buffer.append(infos[j]); |
| buffer.append('\n'); |
| } |
| } |
| } |
| |
| } |