Lines 10-16
Link Here
|
10 |
*******************************************************************************/ |
10 |
*******************************************************************************/ |
11 |
package org.eclipse.jdt.internal.compiler.lookup; |
11 |
package org.eclipse.jdt.internal.compiler.lookup; |
12 |
|
12 |
|
|
|
13 |
import java.util.HashSet; |
13 |
import java.util.List; |
14 |
import java.util.List; |
|
|
15 |
import java.util.Set; |
14 |
|
16 |
|
15 |
import org.eclipse.jdt.core.compiler.CharOperation; |
17 |
import org.eclipse.jdt.core.compiler.CharOperation; |
16 |
import org.eclipse.jdt.internal.compiler.ClassFile; |
18 |
import org.eclipse.jdt.internal.compiler.ClassFile; |
Lines 962-968
Link Here
|
962 |
*/ |
964 |
*/ |
963 |
public final char[] signature(ClassFile classFile) { |
965 |
public final char[] signature(ClassFile classFile) { |
964 |
if (this.signature != null) { |
966 |
if (this.signature != null) { |
965 |
if ((this.tagBits & TagBits.ContainsNestedTypesInSignature) != 0) { |
967 |
if ((this.tagBits & TagBits.ContainsNestedTypes) != 0) { |
966 |
// we need to record inner classes references |
968 |
// we need to record inner classes references |
967 |
boolean isConstructor = isConstructor(); |
969 |
boolean isConstructor = isConstructor(); |
968 |
TypeBinding[] targetParameters = this.parameters; |
970 |
TypeBinding[] targetParameters = this.parameters; |
Lines 973-980
Link Here
|
973 |
if (syntheticArgumentTypes != null) { |
975 |
if (syntheticArgumentTypes != null) { |
974 |
for (int i = 0, count = syntheticArgumentTypes.length; i < count; i++) { |
976 |
for (int i = 0, count = syntheticArgumentTypes.length; i < count; i++) { |
975 |
ReferenceBinding syntheticArgumentType = syntheticArgumentTypes[i]; |
977 |
ReferenceBinding syntheticArgumentType = syntheticArgumentTypes[i]; |
976 |
if (syntheticArgumentType.isNestedType()) { |
978 |
if ((syntheticArgumentType.tagBits & TagBits.ContainsNestedTypes) != 0) { |
977 |
classFile.recordInnerClasses(syntheticArgumentType); |
979 |
recordNestedType(classFile, syntheticArgumentType, null); |
978 |
} |
980 |
} |
979 |
} |
981 |
} |
980 |
} |
982 |
} |
Lines 984-994
Link Here
|
984 |
} |
986 |
} |
985 |
|
987 |
|
986 |
if (targetParameters != Binding.NO_PARAMETERS) { |
988 |
if (targetParameters != Binding.NO_PARAMETERS) { |
987 |
for (int i = 0; i < targetParameters.length; i++) { |
989 |
for (int i = 0, max = targetParameters.length; i < max; i++) { |
988 |
TypeBinding targetParameter = targetParameters[i]; |
990 |
TypeBinding targetParameter = targetParameters[i]; |
989 |
TypeBinding leafTargetParameterType = targetParameter.leafComponentType(); |
991 |
TypeBinding leafTargetParameterType = targetParameter.leafComponentType(); |
990 |
if (leafTargetParameterType.isNestedType()) { |
992 |
if ((leafTargetParameterType.tagBits & TagBits.ContainsNestedTypes) != 0) { |
991 |
classFile.recordInnerClasses(leafTargetParameterType); |
993 |
recordNestedType(classFile, leafTargetParameterType, null); |
992 |
} |
994 |
} |
993 |
} |
995 |
} |
994 |
} |
996 |
} |
Lines 997-1011
Link Here
|
997 |
for (int i = targetParameters.length, extraLength = this.parameters.length; i < extraLength; i++) { |
999 |
for (int i = targetParameters.length, extraLength = this.parameters.length; i < extraLength; i++) { |
998 |
TypeBinding parameter = this.parameters[i]; |
1000 |
TypeBinding parameter = this.parameters[i]; |
999 |
TypeBinding leafParameterType = parameter.leafComponentType(); |
1001 |
TypeBinding leafParameterType = parameter.leafComponentType(); |
1000 |
if (leafParameterType.isNestedType()) { |
1002 |
if ((leafParameterType.tagBits & TagBits.ContainsNestedTypes) != 0) { |
1001 |
classFile.recordInnerClasses(leafParameterType); |
1003 |
recordNestedType(classFile, leafParameterType, null); |
1002 |
} |
1004 |
} |
1003 |
} |
1005 |
} |
1004 |
} |
1006 |
} |
1005 |
if (this.returnType != null) { |
1007 |
if (this.returnType != null) { |
1006 |
TypeBinding ret = this.returnType.leafComponentType(); |
1008 |
TypeBinding ret = this.returnType.leafComponentType(); |
1007 |
if (ret.isNestedType()) { |
1009 |
if ((ret.tagBits & TagBits.ContainsNestedTypes) != 0) { |
1008 |
classFile.recordInnerClasses(ret); |
1010 |
recordNestedType(classFile, ret, null); |
1009 |
} |
1011 |
} |
1010 |
} |
1012 |
} |
1011 |
} |
1013 |
} |
Lines 1028-1036
Link Here
|
1028 |
if (syntheticArgumentTypes != null) { |
1030 |
if (syntheticArgumentTypes != null) { |
1029 |
for (int i = 0, count = syntheticArgumentTypes.length; i < count; i++) { |
1031 |
for (int i = 0, count = syntheticArgumentTypes.length; i < count; i++) { |
1030 |
ReferenceBinding syntheticArgumentType = syntheticArgumentTypes[i]; |
1032 |
ReferenceBinding syntheticArgumentType = syntheticArgumentTypes[i]; |
1031 |
if (syntheticArgumentType.isNestedType()) { |
1033 |
if ((syntheticArgumentType.tagBits & TagBits.ContainsNestedTypes) != 0) { |
1032 |
this.tagBits |= TagBits.ContainsNestedTypesInSignature; |
1034 |
recordNestedType(classFile, syntheticArgumentType, null); |
1033 |
classFile.recordInnerClasses(syntheticArgumentType); |
|
|
1034 |
} |
1035 |
} |
1035 |
buffer.append(syntheticArgumentType.signature()); |
1036 |
buffer.append(syntheticArgumentType.signature()); |
1036 |
} |
1037 |
} |
Lines 1042-1053
Link Here
|
1042 |
} |
1043 |
} |
1043 |
|
1044 |
|
1044 |
if (targetParameters != Binding.NO_PARAMETERS) { |
1045 |
if (targetParameters != Binding.NO_PARAMETERS) { |
1045 |
for (int i = 0; i < targetParameters.length; i++) { |
1046 |
for (int i = 0, max = targetParameters.length; i < max; i++) { |
1046 |
TypeBinding targetParameter = targetParameters[i]; |
1047 |
TypeBinding targetParameter = targetParameters[i]; |
1047 |
TypeBinding leafTargetParameterType = targetParameter.leafComponentType(); |
1048 |
TypeBinding leafTargetParameterType = targetParameter.leafComponentType(); |
1048 |
if (leafTargetParameterType.isNestedType()) { |
1049 |
if ((leafTargetParameterType.tagBits & TagBits.ContainsNestedTypes) != 0) { |
1049 |
this.tagBits |= TagBits.ContainsNestedTypesInSignature; |
1050 |
recordNestedType(classFile, leafTargetParameterType, null); |
1050 |
classFile.recordInnerClasses(leafTargetParameterType); |
|
|
1051 |
} |
1051 |
} |
1052 |
buffer.append(targetParameter.signature()); |
1052 |
buffer.append(targetParameter.signature()); |
1053 |
} |
1053 |
} |
Lines 1062-1070
Link Here
|
1062 |
for (int i = targetParameters.length, extraLength = this.parameters.length; i < extraLength; i++) { |
1062 |
for (int i = targetParameters.length, extraLength = this.parameters.length; i < extraLength; i++) { |
1063 |
TypeBinding parameter = this.parameters[i]; |
1063 |
TypeBinding parameter = this.parameters[i]; |
1064 |
TypeBinding leafParameterType = parameter.leafComponentType(); |
1064 |
TypeBinding leafParameterType = parameter.leafComponentType(); |
1065 |
if (leafParameterType.isNestedType()) { |
1065 |
if ((leafParameterType.tagBits & TagBits.ContainsNestedTypes) != 0) { |
1066 |
this.tagBits |= TagBits.ContainsNestedTypesInSignature; |
1066 |
recordNestedType(classFile, leafParameterType, null); |
1067 |
classFile.recordInnerClasses(leafParameterType); |
|
|
1068 |
} |
1067 |
} |
1069 |
buffer.append(parameter.signature()); |
1068 |
buffer.append(parameter.signature()); |
1070 |
} |
1069 |
} |
Lines 1072-1080
Link Here
|
1072 |
buffer.append(')'); |
1071 |
buffer.append(')'); |
1073 |
if (this.returnType != null) { |
1072 |
if (this.returnType != null) { |
1074 |
TypeBinding ret = this.returnType.leafComponentType(); |
1073 |
TypeBinding ret = this.returnType.leafComponentType(); |
1075 |
if (ret.isNestedType()) { |
1074 |
if ((ret.tagBits & TagBits.ContainsNestedTypes) != 0) { |
1076 |
this.tagBits |= TagBits.ContainsNestedTypesInSignature; |
1075 |
recordNestedType(classFile, ret, null); |
1077 |
classFile.recordInnerClasses(ret); |
|
|
1078 |
} |
1076 |
} |
1079 |
buffer.append(this.returnType.signature()); |
1077 |
buffer.append(this.returnType.signature()); |
1080 |
} |
1078 |
} |
Lines 1084-1089
Link Here
|
1084 |
|
1082 |
|
1085 |
return this.signature; |
1083 |
return this.signature; |
1086 |
} |
1084 |
} |
|
|
1085 |
private void recordNestedType(ClassFile classFile, TypeBinding typeBinding, Set visitedTypeVariables) { |
1086 |
if (typeBinding.isParameterizedType() |
1087 |
&& ((typeBinding.tagBits & TagBits.ContainsNestedTypes) != 0)) { |
1088 |
ParameterizedTypeBinding parameterizedTypeBinding = (ParameterizedTypeBinding) typeBinding; |
1089 |
ReferenceBinding genericType = parameterizedTypeBinding.genericType(); |
1090 |
if ((genericType.tagBits & TagBits.ContainsNestedTypes) != 0) { |
1091 |
recordNestedType(classFile, genericType, visitedTypeVariables); |
1092 |
} |
1093 |
TypeBinding[] arguments = parameterizedTypeBinding.arguments; |
1094 |
if (arguments != null) { |
1095 |
for (int j = 0, max2 = arguments.length; j < max2; j++) { |
1096 |
TypeBinding argument = arguments[j]; |
1097 |
if (argument.isWildcard()) { |
1098 |
WildcardBinding wildcardBinding = (WildcardBinding) argument; |
1099 |
TypeBinding bound = wildcardBinding.bound; |
1100 |
if (bound != null |
1101 |
&& ((bound.tagBits & TagBits.ContainsNestedTypes) != 0)) { |
1102 |
recordNestedType(classFile, bound, visitedTypeVariables); |
1103 |
} |
1104 |
ReferenceBinding superclass = wildcardBinding.superclass(); |
1105 |
if (superclass != null |
1106 |
&& ((superclass.tagBits & TagBits.ContainsNestedTypes) != 0)) { |
1107 |
recordNestedType(classFile, superclass, visitedTypeVariables); |
1108 |
} |
1109 |
ReferenceBinding[] superInterfaces = wildcardBinding.superInterfaces(); |
1110 |
if (superInterfaces != null) { |
1111 |
for (int k = 0, max3 = superInterfaces.length; k < max3; k++) { |
1112 |
ReferenceBinding superInterface = superInterfaces[k]; |
1113 |
if ((superInterface.tagBits & TagBits.ContainsNestedTypes) != 0) { |
1114 |
recordNestedType(classFile, superInterface, visitedTypeVariables); |
1115 |
} |
1116 |
} |
1117 |
} |
1118 |
} else if ((argument.tagBits & TagBits.ContainsNestedTypes) != 0) { |
1119 |
recordNestedType(classFile, argument, visitedTypeVariables); |
1120 |
} |
1121 |
} |
1122 |
} |
1123 |
} else if (typeBinding.isTypeVariable() |
1124 |
&& ((typeBinding.tagBits & TagBits.ContainsNestedTypes) != 0)) { |
1125 |
if (visitedTypeVariables == null) { |
1126 |
visitedTypeVariables = new HashSet(3); |
1127 |
} else if (visitedTypeVariables.contains(typeBinding)) { |
1128 |
// type is already visited |
1129 |
return; |
1130 |
} |
1131 |
visitedTypeVariables.add(typeBinding); |
1132 |
TypeVariableBinding typeVariableBinding = (TypeVariableBinding) typeBinding; |
1133 |
TypeBinding upperBound = typeVariableBinding.upperBound(); |
1134 |
if (upperBound != null && ((upperBound.tagBits & TagBits.ContainsNestedTypes) != 0)) { |
1135 |
recordNestedType(classFile, upperBound, visitedTypeVariables); |
1136 |
} |
1137 |
TypeBinding[] upperBounds = typeVariableBinding.otherUpperBounds(); |
1138 |
if (upperBounds != null) { |
1139 |
for (int k = 0, max3 = upperBounds.length; k < max3; k++) { |
1140 |
TypeBinding otherUpperBound = upperBounds[k]; |
1141 |
if ((otherUpperBound.tagBits & TagBits.ContainsNestedTypes) != 0) { |
1142 |
recordNestedType(classFile, otherUpperBound, visitedTypeVariables); |
1143 |
} |
1144 |
} |
1145 |
} |
1146 |
} else if (typeBinding.isNestedType()) { |
1147 |
this.tagBits |= TagBits.ContainsNestedTypes; |
1148 |
classFile.recordInnerClasses(typeBinding); |
1149 |
} |
1150 |
} |
1087 |
public final int sourceEnd() { |
1151 |
public final int sourceEnd() { |
1088 |
AbstractMethodDeclaration method = sourceMethod(); |
1152 |
AbstractMethodDeclaration method = sourceMethod(); |
1089 |
if (method == null) { |
1153 |
if (method == null) { |