diff options
Diffstat (limited to 'src/proguard/classfile/util/ClassUtil.java')
-rw-r--r-- | src/proguard/classfile/util/ClassUtil.java | 496 |
1 files changed, 290 insertions, 206 deletions
diff --git a/src/proguard/classfile/util/ClassUtil.java b/src/proguard/classfile/util/ClassUtil.java index fb38616..037d31a 100644 --- a/src/proguard/classfile/util/ClassUtil.java +++ b/src/proguard/classfile/util/ClassUtil.java @@ -2,7 +2,7 @@ * ProGuard -- shrinking, optimization, obfuscation, and preverification * of Java bytecode. * - * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu) + * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu) * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free @@ -20,7 +20,7 @@ */ package proguard.classfile.util; -import proguard.classfile.ClassConstants; +import proguard.classfile.*; import java.util.List; @@ -91,18 +91,20 @@ public class ClassUtil public static int internalClassVersion(String classVersion) { return - classVersion.equals(ClassConstants.EXTERNAL_CLASS_VERSION_1_0) || - classVersion.equals(ClassConstants.EXTERNAL_CLASS_VERSION_1_1) ? ClassConstants.INTERNAL_CLASS_VERSION_1_0 : - classVersion.equals(ClassConstants.EXTERNAL_CLASS_VERSION_1_2) ? ClassConstants.INTERNAL_CLASS_VERSION_1_2 : - classVersion.equals(ClassConstants.EXTERNAL_CLASS_VERSION_1_3) ? ClassConstants.INTERNAL_CLASS_VERSION_1_3 : - classVersion.equals(ClassConstants.EXTERNAL_CLASS_VERSION_1_4) ? ClassConstants.INTERNAL_CLASS_VERSION_1_4 : - classVersion.equals(ClassConstants.EXTERNAL_CLASS_VERSION_1_5_ALIAS) || - classVersion.equals(ClassConstants.EXTERNAL_CLASS_VERSION_1_5) ? ClassConstants.INTERNAL_CLASS_VERSION_1_5 : - classVersion.equals(ClassConstants.EXTERNAL_CLASS_VERSION_1_6_ALIAS) || - classVersion.equals(ClassConstants.EXTERNAL_CLASS_VERSION_1_6) ? ClassConstants.INTERNAL_CLASS_VERSION_1_6 : - classVersion.equals(ClassConstants.EXTERNAL_CLASS_VERSION_1_7_ALIAS) || - classVersion.equals(ClassConstants.EXTERNAL_CLASS_VERSION_1_7) ? ClassConstants.INTERNAL_CLASS_VERSION_1_7 : - 0; + classVersion.equals(JavaConstants.CLASS_VERSION_1_0) || + classVersion.equals(JavaConstants.CLASS_VERSION_1_1) ? ClassConstants.CLASS_VERSION_1_0 : + classVersion.equals(JavaConstants.CLASS_VERSION_1_2) ? ClassConstants.CLASS_VERSION_1_2 : + classVersion.equals(JavaConstants.CLASS_VERSION_1_3) ? ClassConstants.CLASS_VERSION_1_3 : + classVersion.equals(JavaConstants.CLASS_VERSION_1_4) ? ClassConstants.CLASS_VERSION_1_4 : + classVersion.equals(JavaConstants.CLASS_VERSION_1_5_ALIAS) || + classVersion.equals(JavaConstants.CLASS_VERSION_1_5) ? ClassConstants.CLASS_VERSION_1_5 : + classVersion.equals(JavaConstants.CLASS_VERSION_1_6_ALIAS) || + classVersion.equals(JavaConstants.CLASS_VERSION_1_6) ? ClassConstants.CLASS_VERSION_1_6 : + classVersion.equals(JavaConstants.CLASS_VERSION_1_7_ALIAS) || + classVersion.equals(JavaConstants.CLASS_VERSION_1_7) ? ClassConstants.CLASS_VERSION_1_7 : + classVersion.equals(JavaConstants.CLASS_VERSION_1_8_ALIAS) || + classVersion.equals(JavaConstants.CLASS_VERSION_1_8) ? ClassConstants.CLASS_VERSION_1_8 : + 0; } @@ -115,14 +117,15 @@ public class ClassUtil { switch (classVersion) { - case ClassConstants.INTERNAL_CLASS_VERSION_1_0: return ClassConstants.EXTERNAL_CLASS_VERSION_1_0; - case ClassConstants.INTERNAL_CLASS_VERSION_1_2: return ClassConstants.EXTERNAL_CLASS_VERSION_1_2; - case ClassConstants.INTERNAL_CLASS_VERSION_1_3: return ClassConstants.EXTERNAL_CLASS_VERSION_1_3; - case ClassConstants.INTERNAL_CLASS_VERSION_1_4: return ClassConstants.EXTERNAL_CLASS_VERSION_1_4; - case ClassConstants.INTERNAL_CLASS_VERSION_1_5: return ClassConstants.EXTERNAL_CLASS_VERSION_1_5; - case ClassConstants.INTERNAL_CLASS_VERSION_1_6: return ClassConstants.EXTERNAL_CLASS_VERSION_1_6; - case ClassConstants.INTERNAL_CLASS_VERSION_1_7: return ClassConstants.EXTERNAL_CLASS_VERSION_1_7; - default: return null; + case ClassConstants.CLASS_VERSION_1_0: return JavaConstants.CLASS_VERSION_1_0; + case ClassConstants.CLASS_VERSION_1_2: return JavaConstants.CLASS_VERSION_1_2; + case ClassConstants.CLASS_VERSION_1_3: return JavaConstants.CLASS_VERSION_1_3; + case ClassConstants.CLASS_VERSION_1_4: return JavaConstants.CLASS_VERSION_1_4; + case ClassConstants.CLASS_VERSION_1_5: return JavaConstants.CLASS_VERSION_1_5; + case ClassConstants.CLASS_VERSION_1_6: return JavaConstants.CLASS_VERSION_1_6; + case ClassConstants.CLASS_VERSION_1_7: return JavaConstants.CLASS_VERSION_1_7; + case ClassConstants.CLASS_VERSION_1_8: return JavaConstants.CLASS_VERSION_1_8; + default: return null; } } @@ -134,15 +137,15 @@ public class ClassUtil */ public static void checkVersionNumbers(int classVersion) throws UnsupportedOperationException { - if (classVersion < ClassConstants.INTERNAL_CLASS_VERSION_1_0 || - classVersion > ClassConstants.INTERNAL_CLASS_VERSION_1_7) + if (classVersion < ClassConstants.CLASS_VERSION_1_0 || + classVersion > ClassConstants.CLASS_VERSION_1_8) { throw new UnsupportedOperationException("Unsupported class version number ["+ internalMajorClassVersion(classVersion)+"."+ internalMinorClassVersion(classVersion)+"] (maximum "+ - ClassConstants.INTERNAL_CLASS_VERSION_1_7_MAJOR+"."+ - ClassConstants.INTERNAL_CLASS_VERSION_1_7_MINOR+", Java "+ - ClassConstants.EXTERNAL_CLASS_VERSION_1_7+")"); + ClassConstants.CLASS_VERSION_1_8_MAJOR+"."+ + ClassConstants.CLASS_VERSION_1_8_MINOR+", Java "+ + JavaConstants.CLASS_VERSION_1_8+")"); } } @@ -156,8 +159,8 @@ public class ClassUtil */ public static String internalClassName(String externalClassName) { - return externalClassName.replace(ClassConstants.EXTERNAL_PACKAGE_SEPARATOR, - ClassConstants.INTERNAL_PACKAGE_SEPARATOR); + return externalClassName.replace(JavaConstants.PACKAGE_SEPARATOR, + ClassConstants.PACKAGE_SEPARATOR); } @@ -186,11 +189,11 @@ public class ClassUtil */ public static String externalClassName(String internalClassName) { - return //internalClassName.startsWith(ClassConstants.INTERNAL_PACKAGE_JAVA_LANG) && - //internalClassName.indexOf(ClassConstants.INTERNAL_PACKAGE_SEPARATOR, ClassConstants.INTERNAL_PACKAGE_JAVA_LANG.length() + 1) < 0 ? - //internalClassName.substring(ClassConstants.INTERNAL_PACKAGE_JAVA_LANG.length()) : - internalClassName.replace(ClassConstants.INTERNAL_PACKAGE_SEPARATOR, - ClassConstants.EXTERNAL_PACKAGE_SEPARATOR); + return //internalClassName.startsWith(ClassConstants.PACKAGE_JAVA_LANG) && + //internalClassName.indexOf(ClassConstants.PACKAGE_SEPARATOR, ClassConstants.PACKAGE_JAVA_LANG.length() + 1) < 0 ? + //internalClassName.substring(ClassConstants.PACKAGE_JAVA_LANG.length()) : + internalClassName.replace(ClassConstants.PACKAGE_SEPARATOR, + JavaConstants.PACKAGE_SEPARATOR); } @@ -204,7 +207,7 @@ public class ClassUtil */ public static String externalBaseType(String externalArrayType) { - int index = externalArrayType.indexOf(ClassConstants.EXTERNAL_TYPE_ARRAY); + int index = externalArrayType.indexOf(JavaConstants.TYPE_ARRAY); return index >= 0 ? externalArrayType.substring(0, index) : externalArrayType; @@ -221,7 +224,7 @@ public class ClassUtil */ public static String externalShortClassName(String externalClassName) { - int index = externalClassName.lastIndexOf(ClassConstants.EXTERNAL_PACKAGE_SEPARATOR); + int index = externalClassName.lastIndexOf(JavaConstants.PACKAGE_SEPARATOR); return externalClassName.substring(index+1); } @@ -236,7 +239,7 @@ public class ClassUtil public static boolean isInternalArrayType(String internalType) { return internalType.length() > 1 && - internalType.charAt(0) == ClassConstants.INTERNAL_TYPE_ARRAY; + internalType.charAt(0) == ClassConstants.TYPE_ARRAY; } @@ -249,7 +252,7 @@ public class ClassUtil public static int internalArrayTypeDimensionCount(String internalType) { int dimensions = 0; - while (internalType.charAt(dimensions) == ClassConstants.INTERNAL_TYPE_ARRAY) + while (internalType.charAt(dimensions) == ClassConstants.TYPE_ARRAY) { dimensions++; } @@ -270,9 +273,9 @@ public class ClassUtil */ public static boolean isInternalArrayInterfaceName(String internalClassName) { - return ClassConstants.INTERNAL_NAME_JAVA_LANG_OBJECT.equals(internalClassName) || - ClassConstants.INTERNAL_NAME_JAVA_LANG_CLONEABLE.equals(internalClassName) || - ClassConstants.INTERNAL_NAME_JAVA_IO_SERIALIZABLE.equals(internalClassName); + return ClassConstants.NAME_JAVA_LANG_OBJECT.equals(internalClassName) || + ClassConstants.NAME_JAVA_LANG_CLONEABLE.equals(internalClassName) || + ClassConstants.NAME_JAVA_IO_SERIALIZABLE.equals(internalClassName); } @@ -286,14 +289,14 @@ public class ClassUtil */ public static boolean isInternalPrimitiveType(char internalType) { - return internalType == ClassConstants.INTERNAL_TYPE_BOOLEAN || - internalType == ClassConstants.INTERNAL_TYPE_BYTE || - internalType == ClassConstants.INTERNAL_TYPE_CHAR || - internalType == ClassConstants.INTERNAL_TYPE_SHORT || - internalType == ClassConstants.INTERNAL_TYPE_INT || - internalType == ClassConstants.INTERNAL_TYPE_FLOAT || - internalType == ClassConstants.INTERNAL_TYPE_LONG || - internalType == ClassConstants.INTERNAL_TYPE_DOUBLE; + return internalType == ClassConstants.TYPE_BOOLEAN || + internalType == ClassConstants.TYPE_BYTE || + internalType == ClassConstants.TYPE_CHAR || + internalType == ClassConstants.TYPE_SHORT || + internalType == ClassConstants.TYPE_INT || + internalType == ClassConstants.TYPE_FLOAT || + internalType == ClassConstants.TYPE_LONG || + internalType == ClassConstants.TYPE_DOUBLE; } @@ -307,8 +310,8 @@ public class ClassUtil public static boolean isInternalCategory2Type(String internalType) { return internalType.length() == 1 && - (internalType.charAt(0) == ClassConstants.INTERNAL_TYPE_LONG || - internalType.charAt(0) == ClassConstants.INTERNAL_TYPE_DOUBLE); + (internalType.charAt(0) == ClassConstants.TYPE_LONG || + internalType.charAt(0) == ClassConstants.TYPE_DOUBLE); } @@ -324,8 +327,8 @@ public class ClassUtil { int length = internalType.length(); return length > 1 && -// internalType.charAt(0) == ClassConstants.INTERNAL_TYPE_CLASS_START && - internalType.charAt(length-1) == ClassConstants.INTERNAL_TYPE_CLASS_END; +// internalType.charAt(0) == ClassConstants.TYPE_CLASS_START && + internalType.charAt(length-1) == ClassConstants.TYPE_CLASS_END; } @@ -359,12 +362,12 @@ public class ClassUtil for (int dimension = 0; dimension < dimensionCount; dimension++) { - buffer.append(ClassConstants.INTERNAL_TYPE_ARRAY); + buffer.append(ClassConstants.TYPE_ARRAY); } - return buffer.append(ClassConstants.INTERNAL_TYPE_CLASS_START) + return buffer.append(ClassConstants.TYPE_CLASS_START) .append(internalClassName) - .append(ClassConstants.INTERNAL_TYPE_CLASS_END) + .append(ClassConstants.TYPE_CLASS_END) .toString(); } @@ -380,7 +383,7 @@ public class ClassUtil */ public static String internalTypeFromArrayType(String internalArrayType) { - int index = internalArrayType.lastIndexOf(ClassConstants.INTERNAL_TYPE_ARRAY); + int index = internalArrayType.lastIndexOf(ClassConstants.TYPE_ARRAY); return internalArrayType.substring(index+1); } @@ -399,7 +402,7 @@ public class ClassUtil public static String internalClassNameFromClassType(String internalClassType) { return isInternalClassType(internalClassType) ? - internalClassType.substring(internalClassType.indexOf(ClassConstants.INTERNAL_TYPE_CLASS_START)+1, + internalClassType.substring(internalClassType.indexOf(ClassConstants.TYPE_CLASS_START)+1, internalClassType.length()-1) : internalClassType; } @@ -442,8 +445,8 @@ public class ClassUtil */ public static boolean isInitializer(String internalMethodName) { - return internalMethodName.equals(ClassConstants.INTERNAL_METHOD_NAME_CLINIT) || - internalMethodName.equals(ClassConstants.INTERNAL_METHOD_NAME_INIT); + return internalMethodName.equals(ClassConstants.METHOD_NAME_CLINIT) || + internalMethodName.equals(ClassConstants.METHOD_NAME_INIT); } @@ -456,7 +459,7 @@ public class ClassUtil */ public static String internalMethodReturnType(String internalMethodDescriptor) { - int index = internalMethodDescriptor.indexOf(ClassConstants.INTERNAL_METHOD_ARGUMENTS_CLOSE); + int index = internalMethodDescriptor.indexOf(ClassConstants.METHOD_ARGUMENTS_CLOSE); return internalMethodDescriptor.substring(index + 1); } @@ -470,18 +473,38 @@ public class ClassUtil */ public static int internalMethodParameterCount(String internalMethodDescriptor) { - InternalTypeEnumeration internalTypeEnumeration = - new InternalTypeEnumeration(internalMethodDescriptor); - int counter = 0; - while (internalTypeEnumeration.hasMoreTypes()) - { - internalTypeEnumeration.nextType(); + int index = 1; - counter++; + while (true) + { + char c = internalMethodDescriptor.charAt(index++); + switch (c) + { + case ClassConstants.TYPE_ARRAY: + { + // Just ignore all array characters. + break; + } + case ClassConstants.TYPE_CLASS_START: + { + counter++; + + // Skip the class name. + index = internalMethodDescriptor.indexOf(ClassConstants.TYPE_CLASS_END, index) + 1; + break; + } + default: + { + counter++; + break; + } + case ClassConstants.METHOD_ARGUMENTS_CLOSE: + { + return counter; + } + } } - - return counter; } @@ -516,7 +539,7 @@ public class ClassUtil int accessFlags) { return internalMethodParameterSize(internalMethodDescriptor, - (accessFlags & ClassConstants.INTERNAL_ACC_STATIC) != 0); + (accessFlags & ClassConstants.ACC_STATIC) != 0); } @@ -535,18 +558,53 @@ public class ClassUtil public static int internalMethodParameterSize(String internalMethodDescriptor, boolean isStatic) { - InternalTypeEnumeration internalTypeEnumeration = - new InternalTypeEnumeration(internalMethodDescriptor); + int size = isStatic ? 0 : 1; + int index = 1; - int size = isStatic ? 0 : 1; - while (internalTypeEnumeration.hasMoreTypes()) + while (true) { - String internalType = internalTypeEnumeration.nextType(); - - size += internalTypeSize(internalType); + char c = internalMethodDescriptor.charAt(index++); + switch (c) + { + case ClassConstants.TYPE_LONG: + case ClassConstants.TYPE_DOUBLE: + { + size += 2; + break; + } + case ClassConstants.TYPE_CLASS_START: + { + size++; + + // Skip the class name. + index = internalMethodDescriptor.indexOf(ClassConstants.TYPE_CLASS_END, index) + 1; + break; + } + case ClassConstants.TYPE_ARRAY: + { + size++; + + // Skip all array characters. + while ((c = internalMethodDescriptor.charAt(index++)) == ClassConstants.TYPE_ARRAY) {} + + if (c == ClassConstants.TYPE_CLASS_START) + { + // Skip the class type. + index = internalMethodDescriptor.indexOf(ClassConstants.TYPE_CLASS_END, index) + 1; + } + break; + } + default: + { + size++; + break; + } + case ClassConstants.METHOD_ARGUMENTS_CLOSE: + { + return size; + } + } } - - return size; } @@ -564,12 +622,12 @@ public class ClassUtil if (internalType.length() == 1) { char internalPrimitiveType = internalType.charAt(0); - if (internalPrimitiveType == ClassConstants.INTERNAL_TYPE_LONG || - internalPrimitiveType == ClassConstants.INTERNAL_TYPE_DOUBLE) + if (internalPrimitiveType == ClassConstants.TYPE_LONG || + internalPrimitiveType == ClassConstants.TYPE_DOUBLE) { return 2; } - else if (internalPrimitiveType == ClassConstants.INTERNAL_TYPE_VOID) + else if (internalPrimitiveType == ClassConstants.TYPE_VOID) { return 0; } @@ -594,43 +652,33 @@ public class ClassUtil int dimensionCount = externalArrayTypeDimensionCount(externalType); if (dimensionCount > 0) { - externalType = externalType.substring(0, externalType.length() - dimensionCount * ClassConstants.EXTERNAL_TYPE_ARRAY.length()); + externalType = externalType.substring(0, externalType.length() - dimensionCount * JavaConstants.TYPE_ARRAY.length()); } // Analyze the actual type part. char internalTypeChar = - externalType.equals(ClassConstants.EXTERNAL_TYPE_VOID ) ? - ClassConstants.INTERNAL_TYPE_VOID : - externalType.equals(ClassConstants.EXTERNAL_TYPE_BOOLEAN) ? - ClassConstants.INTERNAL_TYPE_BOOLEAN : - externalType.equals(ClassConstants.EXTERNAL_TYPE_BYTE ) ? - ClassConstants.INTERNAL_TYPE_BYTE : - externalType.equals(ClassConstants.EXTERNAL_TYPE_CHAR ) ? - ClassConstants.INTERNAL_TYPE_CHAR : - externalType.equals(ClassConstants.EXTERNAL_TYPE_SHORT ) ? - ClassConstants.INTERNAL_TYPE_SHORT : - externalType.equals(ClassConstants.EXTERNAL_TYPE_INT ) ? - ClassConstants.INTERNAL_TYPE_INT : - externalType.equals(ClassConstants.EXTERNAL_TYPE_FLOAT ) ? - ClassConstants.INTERNAL_TYPE_FLOAT : - externalType.equals(ClassConstants.EXTERNAL_TYPE_LONG ) ? - ClassConstants.INTERNAL_TYPE_LONG : - externalType.equals(ClassConstants.EXTERNAL_TYPE_DOUBLE ) ? - ClassConstants.INTERNAL_TYPE_DOUBLE : - externalType.equals("%" ) ? - '%' : - (char)0; + externalType.equals(JavaConstants.TYPE_VOID ) ? ClassConstants.TYPE_VOID : + externalType.equals(JavaConstants.TYPE_BOOLEAN) ? ClassConstants.TYPE_BOOLEAN : + externalType.equals(JavaConstants.TYPE_BYTE ) ? ClassConstants.TYPE_BYTE : + externalType.equals(JavaConstants.TYPE_CHAR ) ? ClassConstants.TYPE_CHAR : + externalType.equals(JavaConstants.TYPE_SHORT ) ? ClassConstants.TYPE_SHORT : + externalType.equals(JavaConstants.TYPE_INT ) ? ClassConstants.TYPE_INT : + externalType.equals(JavaConstants.TYPE_FLOAT ) ? ClassConstants.TYPE_FLOAT : + externalType.equals(JavaConstants.TYPE_LONG ) ? ClassConstants.TYPE_LONG : + externalType.equals(JavaConstants.TYPE_DOUBLE ) ? ClassConstants.TYPE_DOUBLE : + externalType.equals("%" ) ? '%' : + (char)0; String internalType = internalTypeChar != 0 ? String.valueOf(internalTypeChar) : - ClassConstants.INTERNAL_TYPE_CLASS_START + + ClassConstants.TYPE_CLASS_START + internalClassName(externalType) + - ClassConstants.INTERNAL_TYPE_CLASS_END; + ClassConstants.TYPE_CLASS_END; // Prepend the array part, if any. for (int count = 0; count < dimensionCount; count++) { - internalType = ClassConstants.INTERNAL_TYPE_ARRAY + internalType; + internalType = ClassConstants.TYPE_ARRAY + internalType; } return internalType; @@ -646,10 +694,10 @@ public class ClassUtil public static int externalArrayTypeDimensionCount(String externalType) { int dimensions = 0; - int length = ClassConstants.EXTERNAL_TYPE_ARRAY.length(); + int length = JavaConstants.TYPE_ARRAY.length(); int offset = externalType.length() - length; while (externalType.regionMatches(offset, - ClassConstants.EXTERNAL_TYPE_ARRAY, + JavaConstants.TYPE_ARRAY, 0, length)) { @@ -683,29 +731,18 @@ public class ClassUtil char internalTypeChar = internalType.charAt(0); String externalType = - internalTypeChar == ClassConstants.INTERNAL_TYPE_VOID ? - ClassConstants.EXTERNAL_TYPE_VOID : - internalTypeChar == ClassConstants.INTERNAL_TYPE_BOOLEAN ? - ClassConstants.EXTERNAL_TYPE_BOOLEAN : - internalTypeChar == ClassConstants.INTERNAL_TYPE_BYTE ? - ClassConstants.EXTERNAL_TYPE_BYTE : - internalTypeChar == ClassConstants.INTERNAL_TYPE_CHAR ? - ClassConstants.EXTERNAL_TYPE_CHAR : - internalTypeChar == ClassConstants.INTERNAL_TYPE_SHORT ? - ClassConstants.EXTERNAL_TYPE_SHORT : - internalTypeChar == ClassConstants.INTERNAL_TYPE_INT ? - ClassConstants.EXTERNAL_TYPE_INT : - internalTypeChar == ClassConstants.INTERNAL_TYPE_FLOAT ? - ClassConstants.EXTERNAL_TYPE_FLOAT : - internalTypeChar == ClassConstants.INTERNAL_TYPE_LONG ? - ClassConstants.EXTERNAL_TYPE_LONG : - internalTypeChar == ClassConstants.INTERNAL_TYPE_DOUBLE ? - ClassConstants.EXTERNAL_TYPE_DOUBLE : - internalTypeChar == '%' ? - "%" : - internalTypeChar == ClassConstants.INTERNAL_TYPE_CLASS_START ? - externalClassName(internalType.substring(1, internalType.indexOf(ClassConstants.INTERNAL_TYPE_CLASS_END))) : - null; + internalTypeChar == ClassConstants.TYPE_VOID ? JavaConstants.TYPE_VOID : + internalTypeChar == ClassConstants.TYPE_BOOLEAN ? JavaConstants.TYPE_BOOLEAN : + internalTypeChar == ClassConstants.TYPE_BYTE ? JavaConstants.TYPE_BYTE : + internalTypeChar == ClassConstants.TYPE_CHAR ? JavaConstants.TYPE_CHAR : + internalTypeChar == ClassConstants.TYPE_SHORT ? JavaConstants.TYPE_SHORT : + internalTypeChar == ClassConstants.TYPE_INT ? JavaConstants.TYPE_INT : + internalTypeChar == ClassConstants.TYPE_FLOAT ? JavaConstants.TYPE_FLOAT : + internalTypeChar == ClassConstants.TYPE_LONG ? JavaConstants.TYPE_LONG : + internalTypeChar == ClassConstants.TYPE_DOUBLE ? JavaConstants.TYPE_DOUBLE : + internalTypeChar == '%' ? "%" : + internalTypeChar == ClassConstants.TYPE_CLASS_START ? externalClassName(internalType.substring(1, internalType.indexOf(ClassConstants.TYPE_CLASS_END))) : + null; if (externalType == null) { @@ -715,7 +752,7 @@ public class ClassUtil // Append the array part, if any. for (int count = 0; count < dimensionCount; count++) { - externalType += ClassConstants.EXTERNAL_TYPE_ARRAY; + externalType += JavaConstants.TYPE_ARRAY; } return externalType; @@ -732,7 +769,7 @@ public class ClassUtil */ public static boolean isInternalMethodDescriptor(String internalDescriptor) { - return internalDescriptor.charAt(0) == ClassConstants.INTERNAL_METHOD_ARGUMENTS_OPEN; + return internalDescriptor.charAt(0) == ClassConstants.METHOD_ARGUMENTS_OPEN; } @@ -747,7 +784,7 @@ public class ClassUtil */ public static boolean isExternalMethodNameAndArguments(String externalMemberNameAndArguments) { - return externalMemberNameAndArguments.indexOf(ClassConstants.EXTERNAL_METHOD_ARGUMENTS_OPEN) > 0; + return externalMemberNameAndArguments.indexOf(JavaConstants.METHOD_ARGUMENTS_OPEN) > 0; } @@ -780,7 +817,7 @@ public class ClassUtil String externalMethodNameAndArguments) { StringBuffer internalMethodDescriptor = new StringBuffer(); - internalMethodDescriptor.append(ClassConstants.INTERNAL_METHOD_ARGUMENTS_OPEN); + internalMethodDescriptor.append(ClassConstants.METHOD_ARGUMENTS_OPEN); ExternalTypeEnumeration externalTypeEnumeration = new ExternalTypeEnumeration(externalMethodNameAndArguments); @@ -790,7 +827,7 @@ public class ClassUtil internalMethodDescriptor.append(internalType(externalTypeEnumeration.nextType())); } - internalMethodDescriptor.append(ClassConstants.INTERNAL_METHOD_ARGUMENTS_CLOSE); + internalMethodDescriptor.append(ClassConstants.METHOD_ARGUMENTS_CLOSE); internalMethodDescriptor.append(internalType(externalReturnType)); return internalMethodDescriptor.toString(); @@ -811,14 +848,14 @@ public class ClassUtil List externalArguments) { StringBuffer internalMethodDescriptor = new StringBuffer(); - internalMethodDescriptor.append(ClassConstants.INTERNAL_METHOD_ARGUMENTS_OPEN); + internalMethodDescriptor.append(ClassConstants.METHOD_ARGUMENTS_OPEN); for (int index = 0; index < externalArguments.size(); index++) { internalMethodDescriptor.append(internalType((String)externalArguments.get(index))); } - internalMethodDescriptor.append(ClassConstants.INTERNAL_METHOD_ARGUMENTS_CLOSE); + internalMethodDescriptor.append(ClassConstants.METHOD_ARGUMENTS_CLOSE); internalMethodDescriptor.append(internalType(externalReturnType)); return internalMethodDescriptor.toString(); @@ -869,9 +906,9 @@ public class ClassUtil externalMethodReturnTypeAndName(internalClassName, internalMethodName, internalMethodDescriptor) + - ClassConstants.EXTERNAL_METHOD_ARGUMENTS_OPEN + + JavaConstants.METHOD_ARGUMENTS_OPEN + externalMethodArguments(internalMethodDescriptor) + - ClassConstants.EXTERNAL_METHOD_ARGUMENTS_CLOSE; + JavaConstants.METHOD_ARGUMENTS_CLOSE; } @@ -903,48 +940,48 @@ public class ClassUtil StringBuffer string = new StringBuffer(50); - if ((accessFlags & ClassConstants.INTERNAL_ACC_PUBLIC) != 0) + if ((accessFlags & ClassConstants.ACC_PUBLIC) != 0) { - string.append(prefix).append(ClassConstants.EXTERNAL_ACC_PUBLIC).append(' '); + string.append(prefix).append(JavaConstants.ACC_PUBLIC).append(' '); } - if ((accessFlags & ClassConstants.INTERNAL_ACC_PRIVATE) != 0) + if ((accessFlags & ClassConstants.ACC_PRIVATE) != 0) { // Only in InnerClasses attributes. - string.append(prefix).append(ClassConstants.EXTERNAL_ACC_PRIVATE).append(' '); + string.append(prefix).append(JavaConstants.ACC_PRIVATE).append(' '); } - if ((accessFlags & ClassConstants.INTERNAL_ACC_PROTECTED) != 0) + if ((accessFlags & ClassConstants.ACC_PROTECTED) != 0) { // Only in InnerClasses attributes. - string.append(prefix).append(ClassConstants.EXTERNAL_ACC_PROTECTED).append(' '); + string.append(prefix).append(JavaConstants.ACC_PROTECTED).append(' '); } - if ((accessFlags & ClassConstants.INTERNAL_ACC_STATIC) != 0) + if ((accessFlags & ClassConstants.ACC_STATIC) != 0) { // Only in InnerClasses attributes. - string.append(prefix).append(ClassConstants.EXTERNAL_ACC_STATIC).append(' '); + string.append(prefix).append(JavaConstants.ACC_STATIC).append(' '); } - if ((accessFlags & ClassConstants.INTERNAL_ACC_FINAL) != 0) + if ((accessFlags & ClassConstants.ACC_FINAL) != 0) { - string.append(prefix).append(ClassConstants.EXTERNAL_ACC_FINAL).append(' '); + string.append(prefix).append(JavaConstants.ACC_FINAL).append(' '); } - if ((accessFlags & ClassConstants.INTERNAL_ACC_ANNOTATTION) != 0) + if ((accessFlags & ClassConstants.ACC_ANNOTATTION) != 0) { - string.append(prefix).append(ClassConstants.EXTERNAL_ACC_ANNOTATION); + string.append(prefix).append(JavaConstants.ACC_ANNOTATION); } - if ((accessFlags & ClassConstants.INTERNAL_ACC_INTERFACE) != 0) + if ((accessFlags & ClassConstants.ACC_INTERFACE) != 0) { - string.append(prefix).append(ClassConstants.EXTERNAL_ACC_INTERFACE).append(' '); + string.append(prefix).append(JavaConstants.ACC_INTERFACE).append(' '); } - else if ((accessFlags & ClassConstants.INTERNAL_ACC_ENUM) != 0) + else if ((accessFlags & ClassConstants.ACC_ENUM) != 0) { - string.append(prefix).append(ClassConstants.EXTERNAL_ACC_ENUM).append(' '); + string.append(prefix).append(JavaConstants.ACC_ENUM).append(' '); } - else if ((accessFlags & ClassConstants.INTERNAL_ACC_ABSTRACT) != 0) + else if ((accessFlags & ClassConstants.ACC_ABSTRACT) != 0) { - string.append(prefix).append(ClassConstants.EXTERNAL_ACC_ABSTRACT).append(' '); + string.append(prefix).append(JavaConstants.ACC_ABSTRACT).append(' '); } - else if ((accessFlags & ClassConstants.INTERNAL_ACC_SYNTHETIC) != 0) + else if ((accessFlags & ClassConstants.ACC_SYNTHETIC) != 0) { - string.append(prefix).append(ClassConstants.EXTERNAL_ACC_SYNTHETIC).append(' '); + string.append(prefix).append(JavaConstants.ACC_SYNTHETIC).append(' '); } return string.toString(); @@ -979,37 +1016,37 @@ public class ClassUtil StringBuffer string = new StringBuffer(50); - if ((accessFlags & ClassConstants.INTERNAL_ACC_PUBLIC) != 0) + if ((accessFlags & ClassConstants.ACC_PUBLIC) != 0) { - string.append(prefix).append(ClassConstants.EXTERNAL_ACC_PUBLIC).append(' '); + string.append(prefix).append(JavaConstants.ACC_PUBLIC).append(' '); } - if ((accessFlags & ClassConstants.INTERNAL_ACC_PRIVATE) != 0) + if ((accessFlags & ClassConstants.ACC_PRIVATE) != 0) { - string.append(prefix).append(ClassConstants.EXTERNAL_ACC_PRIVATE).append(' '); + string.append(prefix).append(JavaConstants.ACC_PRIVATE).append(' '); } - if ((accessFlags & ClassConstants.INTERNAL_ACC_PROTECTED) != 0) + if ((accessFlags & ClassConstants.ACC_PROTECTED) != 0) { - string.append(prefix).append(ClassConstants.EXTERNAL_ACC_PROTECTED).append(' '); + string.append(prefix).append(JavaConstants.ACC_PROTECTED).append(' '); } - if ((accessFlags & ClassConstants.INTERNAL_ACC_STATIC) != 0) + if ((accessFlags & ClassConstants.ACC_STATIC) != 0) { - string.append(prefix).append(ClassConstants.EXTERNAL_ACC_STATIC).append(' '); + string.append(prefix).append(JavaConstants.ACC_STATIC).append(' '); } - if ((accessFlags & ClassConstants.INTERNAL_ACC_FINAL) != 0) + if ((accessFlags & ClassConstants.ACC_FINAL) != 0) { - string.append(prefix).append(ClassConstants.EXTERNAL_ACC_FINAL).append(' '); + string.append(prefix).append(JavaConstants.ACC_FINAL).append(' '); } - if ((accessFlags & ClassConstants.INTERNAL_ACC_VOLATILE) != 0) + if ((accessFlags & ClassConstants.ACC_VOLATILE) != 0) { - string.append(prefix).append(ClassConstants.EXTERNAL_ACC_VOLATILE).append(' '); + string.append(prefix).append(JavaConstants.ACC_VOLATILE).append(' '); } - if ((accessFlags & ClassConstants.INTERNAL_ACC_TRANSIENT) != 0) + if ((accessFlags & ClassConstants.ACC_TRANSIENT) != 0) { - string.append(prefix).append(ClassConstants.EXTERNAL_ACC_TRANSIENT).append(' '); + string.append(prefix).append(JavaConstants.ACC_TRANSIENT).append(' '); } - if ((accessFlags & ClassConstants.INTERNAL_ACC_SYNTHETIC) != 0) + if ((accessFlags & ClassConstants.ACC_SYNTHETIC) != 0) { - string.append(prefix).append(ClassConstants.EXTERNAL_ACC_SYNTHETIC).append(' '); + string.append(prefix).append(JavaConstants.ACC_SYNTHETIC).append(' '); } return string.toString(); @@ -1044,53 +1081,100 @@ public class ClassUtil StringBuffer string = new StringBuffer(50); - if ((accessFlags & ClassConstants.INTERNAL_ACC_PUBLIC) != 0) + if ((accessFlags & ClassConstants.ACC_PUBLIC) != 0) + { + string.append(prefix).append(JavaConstants.ACC_PUBLIC).append(' '); + } + if ((accessFlags & ClassConstants.ACC_PRIVATE) != 0) + { + string.append(prefix).append(JavaConstants.ACC_PRIVATE).append(' '); + } + if ((accessFlags & ClassConstants.ACC_PROTECTED) != 0) + { + string.append(prefix).append(JavaConstants.ACC_PROTECTED).append(' '); + } + if ((accessFlags & ClassConstants.ACC_STATIC) != 0) + { + string.append(prefix).append(JavaConstants.ACC_STATIC).append(' '); + } + if ((accessFlags & ClassConstants.ACC_FINAL) != 0) { - string.append(prefix).append(ClassConstants.EXTERNAL_ACC_PUBLIC).append(' '); + string.append(prefix).append(JavaConstants.ACC_FINAL).append(' '); } - if ((accessFlags & ClassConstants.INTERNAL_ACC_PRIVATE) != 0) + if ((accessFlags & ClassConstants.ACC_SYNCHRONIZED) != 0) { - string.append(prefix).append(ClassConstants.EXTERNAL_ACC_PRIVATE).append(' '); + string.append(prefix).append(JavaConstants.ACC_SYNCHRONIZED).append(' '); } - if ((accessFlags & ClassConstants.INTERNAL_ACC_PROTECTED) != 0) + if ((accessFlags & ClassConstants.ACC_BRIDGE) != 0) { - string.append(prefix).append(ClassConstants.EXTERNAL_ACC_PROTECTED).append(' '); + string.append(prefix).append(JavaConstants.ACC_BRIDGE).append(' '); } - if ((accessFlags & ClassConstants.INTERNAL_ACC_STATIC) != 0) + if ((accessFlags & ClassConstants.ACC_VARARGS) != 0) { - string.append(prefix).append(ClassConstants.EXTERNAL_ACC_STATIC).append(' '); + string.append(prefix).append(JavaConstants.ACC_VARARGS).append(' '); } - if ((accessFlags & ClassConstants.INTERNAL_ACC_FINAL) != 0) + if ((accessFlags & ClassConstants.ACC_NATIVE) != 0) { - string.append(prefix).append(ClassConstants.EXTERNAL_ACC_FINAL).append(' '); + string.append(prefix).append(JavaConstants.ACC_NATIVE).append(' '); } - if ((accessFlags & ClassConstants.INTERNAL_ACC_SYNCHRONIZED) != 0) + if ((accessFlags & ClassConstants.ACC_ABSTRACT) != 0) { - string.append(prefix).append(ClassConstants.EXTERNAL_ACC_SYNCHRONIZED).append(' '); + string.append(prefix).append(JavaConstants.ACC_ABSTRACT).append(' '); } - if ((accessFlags & ClassConstants.INTERNAL_ACC_BRIDGE) != 0) + if ((accessFlags & ClassConstants.ACC_STRICT) != 0) { - string.append(prefix).append(ClassConstants.EXTERNAL_ACC_BRIDGE).append(' '); + string.append(prefix).append(JavaConstants.ACC_STRICT).append(' '); } - if ((accessFlags & ClassConstants.INTERNAL_ACC_VARARGS) != 0) + if ((accessFlags & ClassConstants.ACC_SYNTHETIC) != 0) { - string.append(prefix).append(ClassConstants.EXTERNAL_ACC_VARARGS).append(' '); + string.append(prefix).append(JavaConstants.ACC_SYNTHETIC).append(' '); } - if ((accessFlags & ClassConstants.INTERNAL_ACC_NATIVE) != 0) + + return string.toString(); + } + + + /** + * Converts internal method parameter access flags into an external access + * description. + * @param accessFlags the method parameter access flags. + * @return the external method parameter access description, + * e.g. "<code>final mandated </code>". + */ + public static String externalParameterAccessFlags(int accessFlags) + { + return externalParameterAccessFlags(accessFlags, ""); + } + + + /** + * Converts internal method parameter access flags into an external access + * description. + * @param accessFlags the method parameter access flags. + * @param prefix a prefix that is added to each access modifier. + * @return the external method parameter access description, + * e.g. "final mandated ". + */ + public static String externalParameterAccessFlags(int accessFlags, String prefix) + { + if (accessFlags == 0) { - string.append(prefix).append(ClassConstants.EXTERNAL_ACC_NATIVE).append(' '); + return EMPTY_STRING; } - if ((accessFlags & ClassConstants.INTERNAL_ACC_ABSTRACT) != 0) + + StringBuffer string = new StringBuffer(50); + + if ((accessFlags & ClassConstants.ACC_FINAL) != 0) { - string.append(prefix).append(ClassConstants.EXTERNAL_ACC_ABSTRACT).append(' '); + string.append(prefix).append(JavaConstants.ACC_FINAL).append(' '); } - if ((accessFlags & ClassConstants.INTERNAL_ACC_STRICT) != 0) + if ((accessFlags & ClassConstants.ACC_SYNTHETIC) != 0) { - string.append(prefix).append(ClassConstants.EXTERNAL_ACC_STRICT).append(' '); + string.append(prefix).append(JavaConstants.ACC_SYNTHETIC).append(' '); } - if ((accessFlags & ClassConstants.INTERNAL_ACC_SYNTHETIC) != 0) + if ((accessFlags & ClassConstants.ACC_MANDATED) != 0) { - string.append(prefix).append(ClassConstants.EXTERNAL_ACC_SYNTHETIC).append(' '); + string.append(prefix).append(JavaConstants.ACC_MANDATED).append(' '); } return string.toString(); @@ -1128,7 +1212,7 @@ public class ClassUtil String internalMethodName, String internalMethodDescriptor) { - return internalMethodName.equals(ClassConstants.INTERNAL_METHOD_NAME_INIT) ? + return internalMethodName.equals(ClassConstants.METHOD_NAME_INIT) ? externalShortClassName(externalClassName(internalClassName)) : (externalMethodReturnType(internalMethodDescriptor) + ' ' + @@ -1156,7 +1240,7 @@ public class ClassUtil externalMethodNameAndArguments.append(externalType(internalTypeEnumeration.nextType())); if (internalTypeEnumeration.hasMoreTypes()) { - externalMethodNameAndArguments.append(ClassConstants.EXTERNAL_METHOD_ARGUMENTS_SEPARATOR); + externalMethodNameAndArguments.append(JavaConstants.METHOD_ARGUMENTS_SEPARATOR); } } @@ -1190,7 +1274,7 @@ public class ClassUtil */ public static String internalPackagePrefix(String internalClassName) { - return internalClassName.substring(0, internalClassName.lastIndexOf(ClassConstants.INTERNAL_PACKAGE_SEPARATOR, + return internalClassName.substring(0, internalClassName.lastIndexOf(ClassConstants.PACKAGE_SEPARATOR, internalClassName.length() - 2) + 1); } @@ -1221,7 +1305,7 @@ public class ClassUtil */ public static String externalPackagePrefix(String externalClassName) { - return externalClassName.substring(0, externalClassName.lastIndexOf(ClassConstants.EXTERNAL_PACKAGE_SEPARATOR, + return externalClassName.substring(0, externalClassName.lastIndexOf(JavaConstants.PACKAGE_SEPARATOR, externalClassName.length() - 2) + 1); } } |