assorted fixes to handle boxing correctly when calling generic methods/properties; rename getUnsubstitutedValueParameters/ReturnType to getValueParameters/ReturnType

This commit is contained in:
Dmitry Jemerov
2011-06-30 16:48:13 +02:00
parent f7a04097bb
commit 8a1b9933e4
22 changed files with 79 additions and 65 deletions
@@ -38,7 +38,7 @@ public class ClosureCodegen {
public static Method erasedInvokeSignature(FunctionDescriptor fd) { public static Method erasedInvokeSignature(FunctionDescriptor fd) {
boolean isExtensionFunction = fd.getReceiverType() != null; boolean isExtensionFunction = fd.getReceiverType() != null;
int paramCount = fd.getUnsubstitutedValueParameters().size(); int paramCount = fd.getValueParameters().size();
if (isExtensionFunction) { if (isExtensionFunction) {
paramCount++; paramCount++;
} }
@@ -87,14 +87,14 @@ public class ClosureCodegen {
SignatureWriter signatureWriter = new SignatureWriter(); SignatureWriter signatureWriter = new SignatureWriter();
final List<ValueParameterDescriptor> parameters = funDescriptor.getUnsubstitutedValueParameters(); final List<ValueParameterDescriptor> parameters = funDescriptor.getValueParameters();
final String funClass = getInternalClassName(funDescriptor); final String funClass = getInternalClassName(funDescriptor);
signatureWriter.visitClassType(funClass); signatureWriter.visitClassType(funClass);
for (ValueParameterDescriptor parameter : parameters) { for (ValueParameterDescriptor parameter : parameters) {
appendType(signatureWriter, parameter.getOutType(), '='); appendType(signatureWriter, parameter.getOutType(), '=');
} }
appendType(signatureWriter, funDescriptor.getUnsubstitutedReturnType(), '='); appendType(signatureWriter, funDescriptor.getReturnType(), '=');
signatureWriter.visitEnd(); signatureWriter.visitEnd();
cv.visit(Opcodes.V1_6, cv.visit(Opcodes.V1_6,
@@ -123,7 +123,7 @@ public class ClosureCodegen {
private void generateBody(FunctionDescriptor funDescriptor, ClassVisitor cv, List<JetElement> body) { private void generateBody(FunctionDescriptor funDescriptor, ClassVisitor cv, List<JetElement> body) {
FunctionCodegen fc = new FunctionCodegen(null, cv, state); FunctionCodegen fc = new FunctionCodegen(null, cv, state);
fc.generatedMethod(body, OwnerKind.IMPLEMENTATION, invokeSignature(funDescriptor), funDescriptor.getReceiverType(), funDescriptor.getUnsubstitutedValueParameters(), null); fc.generatedMethod(body, OwnerKind.IMPLEMENTATION, invokeSignature(funDescriptor), funDescriptor.getReceiverType(), funDescriptor.getValueParameters(), null);
} }
private void generateBridge(String className, FunctionDescriptor funDescriptor, ClassVisitor cv) { private void generateBridge(String className, FunctionDescriptor funDescriptor, ClassVisitor cv) {
@@ -145,7 +145,7 @@ public class ClosureCodegen {
count++; count++;
} }
final List<ValueParameterDescriptor> params = funDescriptor.getUnsubstitutedValueParameters(); final List<ValueParameterDescriptor> params = funDescriptor.getValueParameters();
for (ValueParameterDescriptor param : params) { for (ValueParameterDescriptor param : params) {
StackValue.local(count, JetTypeMapper.TYPE_OBJECT).put(JetTypeMapper.TYPE_OBJECT, iv); StackValue.local(count, JetTypeMapper.TYPE_OBJECT).put(JetTypeMapper.TYPE_OBJECT, iv);
StackValue.onStack(JetTypeMapper.TYPE_OBJECT).upcast(state.getTypeMapper().mapType(param.getOutType()), iv); StackValue.onStack(JetTypeMapper.TYPE_OBJECT).upcast(state.getTypeMapper().mapType(param.getOutType()), iv);
@@ -191,7 +191,7 @@ public class ClosureCodegen {
} }
public static String getInternalClassName(FunctionDescriptor descriptor) { public static String getInternalClassName(FunctionDescriptor descriptor) {
final int paramCount = descriptor.getUnsubstitutedValueParameters().size(); final int paramCount = descriptor.getValueParameters().size();
if (descriptor.getReceiverType() != null) { if (descriptor.getReceiverType() != null) {
return "jet/ExtensionFunction" + paramCount; return "jet/ExtensionFunction" + paramCount;
} }
@@ -52,7 +52,7 @@ public class ConstructorFrameMap extends FrameMap {
} }
List<ValueParameterDescriptor> paramDescrs = descriptor != null List<ValueParameterDescriptor> paramDescrs = descriptor != null
? descriptor.getUnsubstitutedValueParameters() ? descriptor.getValueParameters()
: Collections.<ValueParameterDescriptor>emptyList(); : Collections.<ValueParameterDescriptor>emptyList();
for (int i = 0; i < paramDescrs.size(); i++) { for (int i = 0; i < paramDescrs.size(); i++) {
ValueParameterDescriptor parameter = paramDescrs.get(i); ValueParameterDescriptor parameter = paramDescrs.get(i);
@@ -608,7 +608,7 @@ public class ExpressionCodegen extends JetVisitor {
if (PsiTreeUtil.getParentOfType(expression, JetDelegationSpecifier.class) != null) { if (PsiTreeUtil.getParentOfType(expression, JetDelegationSpecifier.class) != null) {
JetClass aClass = PsiTreeUtil.getParentOfType(expression, JetClass.class); JetClass aClass = PsiTreeUtil.getParentOfType(expression, JetClass.class);
ConstructorDescriptor constructorDescriptor = bindingContext.getConstructorDescriptor(aClass); ConstructorDescriptor constructorDescriptor = bindingContext.getConstructorDescriptor(aClass);
List<ValueParameterDescriptor> parameters = constructorDescriptor.getUnsubstitutedValueParameters(); List<ValueParameterDescriptor> parameters = constructorDescriptor.getValueParameters();
for (ValueParameterDescriptor parameter : parameters) { for (ValueParameterDescriptor parameter : parameters) {
if (parameter.getName().equals(descriptor.getName())) { if (parameter.getName().equals(descriptor.getName())) {
final JetType outType = ((VariableDescriptor) descriptor).getOutType(); final JetType outType = ((VariableDescriptor) descriptor).getOutType();
@@ -663,6 +663,7 @@ public class ExpressionCodegen extends JetVisitor {
public StackValue intermediateValueForProperty(PropertyDescriptor propertyDescriptor, final boolean forceField, boolean forceInterface) { public StackValue intermediateValueForProperty(PropertyDescriptor propertyDescriptor, final boolean forceField, boolean forceInterface) {
DeclarationDescriptor containingDeclaration = propertyDescriptor.getContainingDeclaration(); DeclarationDescriptor containingDeclaration = propertyDescriptor.getContainingDeclaration();
boolean isStatic = containingDeclaration instanceof NamespaceDescriptorImpl; boolean isStatic = containingDeclaration instanceof NamespaceDescriptorImpl;
propertyDescriptor = propertyDescriptor.getOriginal();
final JetType outType = propertyDescriptor.getOutType(); final JetType outType = propertyDescriptor.getOutType();
boolean isInsideClass = !forceInterface && containingDeclaration == contextType; boolean isInsideClass = !forceInterface && containingDeclaration == contextType;
Method getter; Method getter;
@@ -750,7 +751,7 @@ public class ExpressionCodegen extends JetVisitor {
ProjectScope.getAllScope(project)); ProjectScope.getAllScope(project));
// TODO better overload mapping // TODO better overload mapping
final PsiMethod[] methods = jlString.findMethodsByName(funDescriptor.getName(), false); final PsiMethod[] methods = jlString.findMethodsByName(funDescriptor.getName(), false);
final int arity = fd.getUnsubstitutedValueParameters().size(); final int arity = fd.getValueParameters().size();
for (PsiMethod method : methods) { for (PsiMethod method : methods) {
if (method.getParameterList().getParametersCount() == arity) { if (method.getParameterList().getParametersCount() == arity) {
declarationPsiElement = method; declarationPsiElement = method;
@@ -815,7 +816,7 @@ public class ExpressionCodegen extends JetVisitor {
gen(callee, Type.getObjectType(ClosureCodegen.getInternalClassName(fd))); gen(callee, Type.getObjectType(ClosureCodegen.getInternalClassName(fd)));
boolean isExtensionFunction = fd.getReceiverType() != null; boolean isExtensionFunction = fd.getReceiverType() != null;
int paramCount = fd.getUnsubstitutedValueParameters().size(); int paramCount = fd.getValueParameters().size();
if (isExtensionFunction) { if (isExtensionFunction) {
ensureReceiverOnStack(expression, null); ensureReceiverOnStack(expression, null);
paramCount++; paramCount++;
@@ -827,7 +828,7 @@ public class ExpressionCodegen extends JetVisitor {
} }
if (methodDescriptor.getReturnType() != Type.VOID_TYPE) { if (methodDescriptor.getReturnType() != Type.VOID_TYPE) {
final Type retType = typeMapper.mapType(fd.getUnsubstitutedReturnType()); final Type retType = typeMapper.mapType(fd.getReturnType());
StackValue.onStack(methodDescriptor.getReturnType()).upcast(retType, v); StackValue.onStack(methodDescriptor.getReturnType()).upcast(retType, v);
myStack.push(StackValue.onStack(retType)); myStack.push(StackValue.onStack(retType));
} }
@@ -1206,7 +1207,7 @@ public class ExpressionCodegen extends JetVisitor {
} }
private void generateBinaryOp(JetBinaryExpression expression, FunctionDescriptor op, int opcode) { private void generateBinaryOp(JetBinaryExpression expression, FunctionDescriptor op, int opcode) {
JetType returnType = op.getUnsubstitutedReturnType(); JetType returnType = op.getReturnType();
final Type asmType = typeMapper.mapType(returnType); final Type asmType = typeMapper.mapType(returnType);
if (asmType == Type.INT_TYPE || asmType == Type.LONG_TYPE || if (asmType == Type.INT_TYPE || asmType == Type.LONG_TYPE ||
asmType == Type.FLOAT_TYPE || asmType == Type.DOUBLE_TYPE) { asmType == Type.FLOAT_TYPE || asmType == Type.DOUBLE_TYPE) {
@@ -33,7 +33,7 @@ public class FunctionCodegen {
final JetTypeReference receiverTypeRef = f.getReceiverTypeRef(); final JetTypeReference receiverTypeRef = f.getReceiverTypeRef();
final JetType receiverType = receiverTypeRef == null ? null : state.getBindingContext().resolveTypeReference(receiverTypeRef); final JetType receiverType = receiverTypeRef == null ? null : state.getBindingContext().resolveTypeReference(receiverTypeRef);
Method method = state.getTypeMapper().mapSignature(f); Method method = state.getTypeMapper().mapSignature(f);
List<ValueParameterDescriptor> paramDescrs = state.getBindingContext().getFunctionDescriptor(f).getUnsubstitutedValueParameters(); List<ValueParameterDescriptor> paramDescrs = state.getBindingContext().getFunctionDescriptor(f).getValueParameters();
generateMethod(f, kind, method, receiverType, paramDescrs); generateMethod(f, kind, method, receiverType, paramDescrs);
} }
@@ -99,7 +99,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
Type[] argTypes = method.getArgumentTypes(); Type[] argTypes = method.getArgumentTypes();
List<ValueParameterDescriptor> paramDescrs = constructorDescriptor != null List<ValueParameterDescriptor> paramDescrs = constructorDescriptor != null
? constructorDescriptor.getUnsubstitutedValueParameters() ? constructorDescriptor.getValueParameters()
: Collections.<ValueParameterDescriptor>emptyList(); : Collections.<ValueParameterDescriptor>emptyList();
ConstructorFrameMap frameMap = new ConstructorFrameMap(state.getTypeMapper(), constructorDescriptor, kind); ConstructorFrameMap frameMap = new ConstructorFrameMap(state.getTypeMapper(), constructorDescriptor, kind);
@@ -252,7 +252,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
} }
Method method = state.getTypeMapper().mapConstructorSignature(constructorDescriptor, kind); Method method = state.getTypeMapper().mapConstructorSignature(constructorDescriptor, kind);
List<ValueParameterDescriptor> valueParameters = constructorDescriptor.getUnsubstitutedValueParameters(); List<ValueParameterDescriptor> valueParameters = constructorDescriptor.getValueParameters();
List<JetArgument> args = constructorCall.getValueArguments(); List<JetArgument> args = constructorCall.getValueArguments();
for (int i = 0, argsSize = args.size(); i < argsSize; i++) { for (int i = 0, argsSize = args.size(); i < argsSize; i++) {
JetArgument arg = args.get(i); JetArgument arg = args.get(i);
@@ -286,7 +286,7 @@ public class JetTypeMapper {
Type returnType; Type returnType;
if (returnTypeRef == null) { if (returnTypeRef == null) {
final FunctionDescriptor functionDescriptor = bindingContext.getFunctionDescriptor(f); final FunctionDescriptor functionDescriptor = bindingContext.getFunctionDescriptor(f);
final JetType type = functionDescriptor.getUnsubstitutedReturnType(); final JetType type = functionDescriptor.getReturnType();
returnType = mapType(type); returnType = mapType(type);
} }
else { else {
@@ -297,7 +297,7 @@ public class JetTypeMapper {
public Method mapSignature(String name, FunctionDescriptor f) { public Method mapSignature(String name, FunctionDescriptor f) {
final JetType receiverType = f.getReceiverType(); final JetType receiverType = f.getReceiverType();
final List<ValueParameterDescriptor> parameters = f.getUnsubstitutedValueParameters(); final List<ValueParameterDescriptor> parameters = f.getValueParameters();
List<Type> parameterTypes = new ArrayList<Type>(); List<Type> parameterTypes = new ArrayList<Type>();
if (receiverType != null) { if (receiverType != null) {
parameterTypes.add(mapType(receiverType)); parameterTypes.add(mapType(receiverType));
@@ -305,7 +305,7 @@ public class JetTypeMapper {
for (ValueParameterDescriptor parameter : parameters) { for (ValueParameterDescriptor parameter : parameters) {
parameterTypes.add(mapType(parameter.getOutType())); parameterTypes.add(mapType(parameter.getOutType()));
} }
Type returnType = mapType(f.getUnsubstitutedReturnType()); Type returnType = mapType(f.getReturnType());
return new Method(name, returnType, parameterTypes.toArray(new Type[parameterTypes.size()])); return new Method(name, returnType, parameterTypes.toArray(new Type[parameterTypes.size()]));
} }
@@ -321,12 +321,12 @@ public class JetTypeMapper {
} }
answer.append('('); answer.append('(');
for (ValueParameterDescriptor p : f.getUnsubstitutedValueParameters()) { for (ValueParameterDescriptor p : f.getValueParameters()) {
appendType(answer, p.getOutType()); appendType(answer, p.getOutType());
} }
answer.append(')'); answer.append(')');
appendType(answer, f.getUnsubstitutedReturnType()); appendType(answer, f.getReturnType());
return answer.toString(); return answer.toString();
} }
@@ -355,7 +355,7 @@ public class JetTypeMapper {
public Method mapConstructorSignature(ConstructorDescriptor descriptor, OwnerKind kind) { public Method mapConstructorSignature(ConstructorDescriptor descriptor, OwnerKind kind) {
boolean delegate = kind == OwnerKind.DELEGATING_IMPLEMENTATION; boolean delegate = kind == OwnerKind.DELEGATING_IMPLEMENTATION;
List<ValueParameterDescriptor> parameters = descriptor.getUnsubstitutedValueParameters(); List<ValueParameterDescriptor> parameters = descriptor.getOriginal().getValueParameters();
List<Type> parameterTypes = new ArrayList<Type>(); List<Type> parameterTypes = new ArrayList<Type>();
ClassDescriptor classDescriptor = descriptor.getContainingDeclaration(); ClassDescriptor classDescriptor = descriptor.getContainingDeclaration();
final DeclarationDescriptor outerDescriptor = classDescriptor.getContainingDeclaration(); final DeclarationDescriptor outerDescriptor = classDescriptor.getContainingDeclaration();
@@ -119,7 +119,7 @@ public class PropertyCodegen {
final PropertySetterDescriptor setterDescriptor = propertyDescriptor.getSetter(); final PropertySetterDescriptor setterDescriptor = propertyDescriptor.getSetter();
assert setterDescriptor != null; assert setterDescriptor != null;
functionCodegen.generateMethod(setter, kind, mapper.mapSetterSignature(propertyDescriptor), functionCodegen.generateMethod(setter, kind, mapper.mapSetterSignature(propertyDescriptor),
null, setterDescriptor.getUnsubstitutedValueParameters()); null, setterDescriptor.getValueParameters());
} }
else if (!p.hasModifier(JetTokens.PRIVATE_KEYWORD)) { else if (!p.hasModifier(JetTokens.PRIVATE_KEYWORD)) {
generateDefaultSetter(p, setter, kind); generateDefaultSetter(p, setter, kind);
@@ -440,6 +440,7 @@ public abstract class StackValue {
else { else {
v.visitMethodInsn(isStatic ? Opcodes.INVOKESTATIC : isInterface ? Opcodes.INVOKEINTERFACE : Opcodes.INVOKEVIRTUAL, owner, getter.getName(), getter.getDescriptor()); v.visitMethodInsn(isStatic ? Opcodes.INVOKESTATIC : isInterface ? Opcodes.INVOKEINTERFACE : Opcodes.INVOKEVIRTUAL, owner, getter.getName(), getter.getDescriptor());
} }
coerce(type, v);
} }
@Override @Override
@@ -21,7 +21,7 @@ public interface ConstructorDescriptor extends FunctionDescriptor {
*/ */
@NotNull @NotNull
@Override @Override
JetType getUnsubstitutedReturnType(); JetType getReturnType();
@NotNull @NotNull
@Override @Override
@@ -23,10 +23,10 @@ public interface FunctionDescriptor extends DeclarationDescriptor {
List<TypeParameterDescriptor> getTypeParameters(); List<TypeParameterDescriptor> getTypeParameters();
@NotNull @NotNull
List<ValueParameterDescriptor> getUnsubstitutedValueParameters(); List<ValueParameterDescriptor> getValueParameters();
@NotNull @NotNull
JetType getUnsubstitutedReturnType(); JetType getReturnType();
@NotNull @NotNull
FunctionDescriptor getOriginal(); FunctionDescriptor getOriginal();
@@ -79,13 +79,13 @@ public class FunctionDescriptorImpl extends DeclarationDescriptorImpl implements
@Override @Override
@NotNull @NotNull
public List<ValueParameterDescriptor> getUnsubstitutedValueParameters() { public List<ValueParameterDescriptor> getValueParameters() {
return unsubstitutedValueParameters; return unsubstitutedValueParameters;
} }
@Override @Override
@NotNull @NotNull
public JetType getUnsubstitutedReturnType() { public JetType getReturnType() {
return unsubstitutedReturnType; return unsubstitutedReturnType;
} }
@@ -20,7 +20,7 @@ public class FunctionDescriptorUtil {
/** @return Minimal number of arguments to be passed */ /** @return Minimal number of arguments to be passed */
public static int getMinimumArity(@NotNull FunctionDescriptor functionDescriptor) { public static int getMinimumArity(@NotNull FunctionDescriptor functionDescriptor) {
int result = 0; int result = 0;
for (ValueParameterDescriptor valueParameter : functionDescriptor.getUnsubstitutedValueParameters()) { for (ValueParameterDescriptor valueParameter : functionDescriptor.getValueParameters()) {
if (valueParameter.hasDefaultValue()) { if (valueParameter.hasDefaultValue()) {
break; break;
} }
@@ -33,7 +33,7 @@ public class FunctionDescriptorUtil {
* @return Maximum number of arguments that can be passed. -1 if unbound (vararg) * @return Maximum number of arguments that can be passed. -1 if unbound (vararg)
*/ */
public static int getMaximumArity(@NotNull FunctionDescriptor functionDescriptor) { public static int getMaximumArity(@NotNull FunctionDescriptor functionDescriptor) {
List<ValueParameterDescriptor> unsubstitutedValueParameters = functionDescriptor.getUnsubstitutedValueParameters(); List<ValueParameterDescriptor> unsubstitutedValueParameters = functionDescriptor.getValueParameters();
if (unsubstitutedValueParameters.isEmpty()) { if (unsubstitutedValueParameters.isEmpty()) {
return 0; return 0;
} }
@@ -65,7 +65,7 @@ public class FunctionDescriptorUtil {
@Nullable @Nullable
public static List<ValueParameterDescriptor> getSubstitutedValueParameters(FunctionDescriptor substitutedDescriptor, @NotNull FunctionDescriptor functionDescriptor, TypeSubstitutor substitutor) { public static List<ValueParameterDescriptor> getSubstitutedValueParameters(FunctionDescriptor substitutedDescriptor, @NotNull FunctionDescriptor functionDescriptor, TypeSubstitutor substitutor) {
List<ValueParameterDescriptor> result = new ArrayList<ValueParameterDescriptor>(); List<ValueParameterDescriptor> result = new ArrayList<ValueParameterDescriptor>();
List<ValueParameterDescriptor> unsubstitutedValueParameters = functionDescriptor.getUnsubstitutedValueParameters(); List<ValueParameterDescriptor> unsubstitutedValueParameters = functionDescriptor.getValueParameters();
for (int i = 0, unsubstitutedValueParametersSize = unsubstitutedValueParameters.size(); i < unsubstitutedValueParametersSize; i++) { for (int i = 0, unsubstitutedValueParametersSize = unsubstitutedValueParameters.size(); i < unsubstitutedValueParametersSize; i++) {
ValueParameterDescriptor unsubstitutedValueParameter = unsubstitutedValueParameters.get(i); ValueParameterDescriptor unsubstitutedValueParameter = unsubstitutedValueParameters.get(i);
// TODO : Lazy? // TODO : Lazy?
@@ -87,7 +87,7 @@ public class FunctionDescriptorUtil {
@Nullable @Nullable
public static JetType getSubstitutedReturnType(@NotNull FunctionDescriptor functionDescriptor, TypeSubstitutor substitutor) { public static JetType getSubstitutedReturnType(@NotNull FunctionDescriptor functionDescriptor, TypeSubstitutor substitutor) {
return substitutor.substitute(functionDescriptor.getUnsubstitutedReturnType(), Variance.OUT_VARIANCE); return substitutor.substitute(functionDescriptor.getReturnType(), Variance.OUT_VARIANCE);
} }
@Nullable @Nullable
@@ -106,7 +106,7 @@ public class FunctionDescriptorUtil {
for (TypeParameterDescriptor typeParameter : descriptor.getTypeParameters()) { for (TypeParameterDescriptor typeParameter : descriptor.getTypeParameters()) {
parameterScope.addTypeParameterDescriptor(typeParameter); parameterScope.addTypeParameterDescriptor(typeParameter);
} }
for (ValueParameterDescriptor valueParameterDescriptor : descriptor.getUnsubstitutedValueParameters()) { for (ValueParameterDescriptor valueParameterDescriptor : descriptor.getValueParameters()) {
parameterScope.addVariableDescriptor(valueParameterDescriptor); parameterScope.addVariableDescriptor(valueParameterDescriptor);
} }
parameterScope.addLabeledDeclaration(descriptor); parameterScope.addLabeledDeclaration(descriptor);
@@ -183,7 +183,7 @@ public class FunctionDescriptorUtil {
return OverrideCompatibilityInfo.typeParameterNumberMismatch(); return OverrideCompatibilityInfo.typeParameterNumberMismatch();
} }
if (superFunction.getUnsubstitutedValueParameters().size() != subFunction.getUnsubstitutedValueParameters().size()) { if (superFunction.getValueParameters().size() != subFunction.getValueParameters().size()) {
return OverrideCompatibilityInfo.valueParameterNumberMismatch(); return OverrideCompatibilityInfo.valueParameterNumberMismatch();
} }
@@ -211,8 +211,8 @@ public class FunctionDescriptorUtil {
} }
} }
List<ValueParameterDescriptor> superValueParameters = superFunction.getUnsubstitutedValueParameters(); List<ValueParameterDescriptor> superValueParameters = superFunction.getValueParameters();
List<ValueParameterDescriptor> subValueParameters = subFunction.getUnsubstitutedValueParameters(); List<ValueParameterDescriptor> subValueParameters = subFunction.getValueParameters();
for (int i = 0, unsubstitutedValueParametersSize = superValueParameters.size(); i < unsubstitutedValueParametersSize; i++) { for (int i = 0, unsubstitutedValueParametersSize = superValueParameters.size(); i < unsubstitutedValueParametersSize; i++) {
ValueParameterDescriptor superValueParameter = superValueParameters.get(i); ValueParameterDescriptor superValueParameter = superValueParameters.get(i);
ValueParameterDescriptor subValueParameter = subValueParameters.get(i); ValueParameterDescriptor subValueParameter = subValueParameters.get(i);
@@ -225,10 +225,10 @@ public class FunctionDescriptorUtil {
// TODO : Default values, varargs etc // TODO : Default values, varargs etc
TypeSubstitutor typeSubstitutor = TypeSubstitutor.create(substitutionContext); TypeSubstitutor typeSubstitutor = TypeSubstitutor.create(substitutionContext);
JetType substitutedSuperReturnType = typeSubstitutor.substitute(superFunction.getUnsubstitutedReturnType(), Variance.OUT_VARIANCE); JetType substitutedSuperReturnType = typeSubstitutor.substitute(superFunction.getReturnType(), Variance.OUT_VARIANCE);
assert substitutedSuperReturnType != null; assert substitutedSuperReturnType != null;
if (!typeChecker.isSubtypeOf(subFunction.getUnsubstitutedReturnType(), substitutedSuperReturnType)) { if (!typeChecker.isSubtypeOf(subFunction.getReturnType(), substitutedSuperReturnType)) {
return OverrideCompatibilityInfo.returnTypeMismatch(substitutedSuperReturnType, subFunction.getUnsubstitutedReturnType()); return OverrideCompatibilityInfo.returnTypeMismatch(substitutedSuperReturnType, subFunction.getReturnType());
} }
return OverrideCompatibilityInfo.success(); return OverrideCompatibilityInfo.success();
@@ -38,13 +38,13 @@ public class PropertyGetterDescriptor extends PropertyAccessorDescriptor {
@NotNull @NotNull
@Override @Override
public List<ValueParameterDescriptor> getUnsubstitutedValueParameters() { public List<ValueParameterDescriptor> getValueParameters() {
return Collections.emptyList(); return Collections.emptyList();
} }
@NotNull @NotNull
@Override @Override
public JetType getUnsubstitutedReturnType() { public JetType getReturnType() {
return returnType; return returnType;
} }
@@ -47,13 +47,13 @@ public class PropertySetterDescriptor extends PropertyAccessorDescriptor {
@NotNull @NotNull
@Override @Override
public List<ValueParameterDescriptor> getUnsubstitutedValueParameters() { public List<ValueParameterDescriptor> getValueParameters() {
return Collections.<ValueParameterDescriptor>singletonList(parameter); return Collections.<ValueParameterDescriptor>singletonList(parameter);
} }
@NotNull @NotNull
@Override @Override
public JetType getUnsubstitutedReturnType() { public JetType getReturnType() {
return JetStandardClasses.getUnitType(); return JetStandardClasses.getUnitType();
} }
@@ -126,9 +126,9 @@ public class JetSimpleNameExpression extends JetReferenceExpression {
boolean tailTextGrayed = false; boolean tailTextGrayed = false;
if (descriptor instanceof FunctionDescriptor) { if (descriptor instanceof FunctionDescriptor) {
FunctionDescriptor functionDescriptor = (FunctionDescriptor) descriptor; FunctionDescriptor functionDescriptor = (FunctionDescriptor) descriptor;
JetType returnType = functionDescriptor.getUnsubstitutedReturnType(); JetType returnType = functionDescriptor.getReturnType();
typeText = DescriptorRenderer.TEXT.renderType(returnType); typeText = DescriptorRenderer.TEXT.renderType(returnType);
tailText = "(" + StringUtil.join(functionDescriptor.getUnsubstitutedValueParameters(), new Function<ValueParameterDescriptor, String>() { tailText = "(" + StringUtil.join(functionDescriptor.getValueParameters(), new Function<ValueParameterDescriptor, String>() {
@Override @Override
public String fun(ValueParameterDescriptor valueParameterDescriptor) { public String fun(ValueParameterDescriptor valueParameterDescriptor) {
return valueParameterDescriptor.getName() + ":" + return valueParameterDescriptor.getName() + ":" +
@@ -75,7 +75,7 @@ public class OverloadResolver {
continue; continue;
} }
List<ValueParameterDescriptor> parameters = descriptor.getUnsubstitutedValueParameters(); List<ValueParameterDescriptor> parameters = descriptor.getValueParameters();
if (parameters.size() >= positionedValueArgumentTypes.size()) { if (parameters.size() >= positionedValueArgumentTypes.size()) {
// possibly, some default values // possibly, some default values
// possibly, nothing passed to a vararg // possibly, nothing passed to a vararg
@@ -153,8 +153,8 @@ public class OverloadResolver {
} }
private boolean moreSpecific(FunctionDescriptor f, FunctionDescriptor g) { private boolean moreSpecific(FunctionDescriptor f, FunctionDescriptor g) {
List<ValueParameterDescriptor> fParams = f.getUnsubstitutedValueParameters(); List<ValueParameterDescriptor> fParams = f.getValueParameters();
List<ValueParameterDescriptor> gParams = g.getUnsubstitutedValueParameters(); List<ValueParameterDescriptor> gParams = g.getValueParameters();
int fSize = fParams.size(); int fSize = fParams.size();
if (fSize != gParams.size()) return false; if (fSize != gParams.size()) return false;
@@ -661,7 +661,7 @@ public class TopDownAnalyzer {
resolveSecondaryConstructorBody((JetConstructor) declaration, descriptor, ((MutableClassDescriptor) descriptor.getContainingDeclaration()).getScopeForMemberResolution()); resolveSecondaryConstructorBody((JetConstructor) declaration, descriptor, ((MutableClassDescriptor) descriptor.getContainingDeclaration()).getScopeForMemberResolution());
assert descriptor.getUnsubstitutedReturnType() != null; assert descriptor.getReturnType() != null;
} }
} }
@@ -743,7 +743,7 @@ public class TopDownAnalyzer {
constructorScope.setThisType(descriptor.getContainingDeclaration().getDefaultType()); constructorScope.setThisType(descriptor.getContainingDeclaration().getDefaultType());
for (ValueParameterDescriptor valueParameterDescriptor : descriptor.getUnsubstitutedValueParameters()) { for (ValueParameterDescriptor valueParameterDescriptor : descriptor.getValueParameters()) {
JetParameter parameter = (JetParameter) trace.getBindingContext().getDeclarationPsiElement(valueParameterDescriptor); JetParameter parameter = (JetParameter) trace.getBindingContext().getDeclarationPsiElement(valueParameterDescriptor);
if (parameter.getValOrVarNode() == null || !primary) { if (parameter.getValOrVarNode() == null || !primary) {
constructorScope.addVariableDescriptor(valueParameterDescriptor); constructorScope.addVariableDescriptor(valueParameterDescriptor);
@@ -865,7 +865,7 @@ public class TopDownAnalyzer {
JetType expectedType; JetType expectedType;
PropertySetterDescriptor setter = propertyDescriptor.getSetter(); PropertySetterDescriptor setter = propertyDescriptor.getSetter();
if (setter != null) { if (setter != null) {
expectedType = setter.getUnsubstitutedReturnType(); expectedType = setter.getReturnType();
} }
else { else {
expectedType = propertyDescriptor.getInType(); expectedType = propertyDescriptor.getInType();
@@ -889,7 +889,7 @@ public class TopDownAnalyzer {
resolveFunctionBody(traceForMembers, (JetNamedFunction) declaration, (FunctionDescriptorImpl) descriptor, declaringScope); resolveFunctionBody(traceForMembers, (JetNamedFunction) declaration, (FunctionDescriptorImpl) descriptor, declaringScope);
assert descriptor.getUnsubstitutedReturnType() != null; assert descriptor.getReturnType() != null;
} }
} }
@@ -907,7 +907,7 @@ public class TopDownAnalyzer {
typeInferrer.checkFunctionReturnType(declaringScope, function, functionDescriptor); typeInferrer.checkFunctionReturnType(declaringScope, function, functionDescriptor);
} }
assert functionDescriptor.getUnsubstitutedReturnType() != null; assert functionDescriptor.getReturnType() != null;
} }
@@ -342,7 +342,7 @@ public class JetTypeInferrer {
} }
public void checkFunctionReturnType(@NotNull JetScope outerScope, @NotNull JetDeclarationWithBody function, @NotNull FunctionDescriptor functionDescriptor) { public void checkFunctionReturnType(@NotNull JetScope outerScope, @NotNull JetDeclarationWithBody function, @NotNull FunctionDescriptor functionDescriptor) {
final JetType expectedReturnType = functionDescriptor.getUnsubstitutedReturnType(); final JetType expectedReturnType = functionDescriptor.getReturnType();
JetScope functionInnerScope = FunctionDescriptorUtil.getFunctionInnerScope(outerScope, functionDescriptor, trace); JetScope functionInnerScope = FunctionDescriptorUtil.getFunctionInnerScope(outerScope, functionDescriptor, trace);
checkFunctionReturnType(functionInnerScope, function, functionDescriptor, expectedReturnType); checkFunctionReturnType(functionInnerScope, function, functionDescriptor, expectedReturnType);
// Map<JetElement, JetType> typeMap = collectReturnedExpressionsWithTypes(outerScope, function, functionDescriptor, expectedReturnType); // Map<JetElement, JetType> typeMap = collectReturnedExpressionsWithTypes(outerScope, function, functionDescriptor, expectedReturnType);
@@ -563,7 +563,7 @@ public class JetTypeInferrer {
final FunctionDescriptor functionDescriptor = resolutionResult.getFunctionDescriptor(); final FunctionDescriptor functionDescriptor = resolutionResult.getFunctionDescriptor();
checkGenericBoundsInAFunctionCall(call.getTypeArguments(), typeArguments, functionDescriptor); checkGenericBoundsInAFunctionCall(call.getTypeArguments(), typeArguments, functionDescriptor);
return functionDescriptor.getUnsubstitutedReturnType(); return functionDescriptor.getReturnType();
} }
} }
return null; return null;
@@ -1802,7 +1802,7 @@ public class JetTypeInferrer {
private JetType checkIterableConvention(@NotNull JetType type, @NotNull ASTNode reportErrorsOn) { private JetType checkIterableConvention(@NotNull JetType type, @NotNull ASTNode reportErrorsOn) {
OverloadResolutionResult iteratorResolutionResult = services.resolveNoParametersFunction(type, context.scope, "iterator"); OverloadResolutionResult iteratorResolutionResult = services.resolveNoParametersFunction(type, context.scope, "iterator");
if (iteratorResolutionResult.isSuccess()) { if (iteratorResolutionResult.isSuccess()) {
JetType iteratorType = iteratorResolutionResult.getFunctionDescriptor().getUnsubstitutedReturnType(); JetType iteratorType = iteratorResolutionResult.getFunctionDescriptor().getReturnType();
boolean hasNextFunctionSupported = checkHasNextFunctionSupport(reportErrorsOn, iteratorType); boolean hasNextFunctionSupported = checkHasNextFunctionSupport(reportErrorsOn, iteratorType);
boolean hasNextPropertySupported = checkHasNextPropertySupport(reportErrorsOn, iteratorType); boolean hasNextPropertySupported = checkHasNextPropertySupport(reportErrorsOn, iteratorType);
if (hasNextFunctionSupported && hasNextPropertySupported && !ErrorUtils.isErrorType(iteratorType)) { if (hasNextFunctionSupported && hasNextPropertySupported && !ErrorUtils.isErrorType(iteratorType)) {
@@ -1819,7 +1819,7 @@ public class JetTypeInferrer {
} else if (nextResolutionResult.isNothing()) { } else if (nextResolutionResult.isNothing()) {
context.trace.getErrorHandler().genericError(reportErrorsOn, "Loop range must have an 'iterator().next()' method"); context.trace.getErrorHandler().genericError(reportErrorsOn, "Loop range must have an 'iterator().next()' method");
} else { } else {
return nextResolutionResult.getFunctionDescriptor().getUnsubstitutedReturnType(); return nextResolutionResult.getFunctionDescriptor().getReturnType();
} }
} }
else { else {
@@ -1839,7 +1839,7 @@ public class JetTypeInferrer {
} else if (hasNextResolutionResult.isNothing()) { } else if (hasNextResolutionResult.isNothing()) {
return false; return false;
} else { } else {
JetType hasNextReturnType = hasNextResolutionResult.getFunctionDescriptor().getUnsubstitutedReturnType(); JetType hasNextReturnType = hasNextResolutionResult.getFunctionDescriptor().getReturnType();
if (!isBoolean(hasNextReturnType)) { if (!isBoolean(hasNextReturnType)) {
context.trace.getErrorHandler().genericError(reportErrorsOn, "The 'iterator().hasNext()' method of the loop range must return Boolean, but returns " + hasNextReturnType); context.trace.getErrorHandler().genericError(reportErrorsOn, "The 'iterator().hasNext()' method of the loop range must return Boolean, but returns " + hasNextReturnType);
} }
@@ -2152,7 +2152,7 @@ public class JetTypeInferrer {
if (receiverType != null) { if (receiverType != null) {
FunctionDescriptor functionDescriptor = services.lookupFunction(context.scope, expression.getOperationSign(), name, receiverType, Collections.<JetType>emptyList(), true); FunctionDescriptor functionDescriptor = services.lookupFunction(context.scope, expression.getOperationSign(), name, receiverType, Collections.<JetType>emptyList(), true);
if (functionDescriptor != null) { if (functionDescriptor != null) {
JetType returnType = functionDescriptor.getUnsubstitutedReturnType(); JetType returnType = functionDescriptor.getReturnType();
if (operationType == JetTokens.PLUSPLUS || operationType == JetTokens.MINUSMINUS) { if (operationType == JetTokens.PLUSPLUS || operationType == JetTokens.MINUSMINUS) {
if (semanticServices.getTypeChecker().isSubtypeOf(returnType, JetStandardClasses.getUnitType())) { if (semanticServices.getTypeChecker().isSubtypeOf(returnType, JetStandardClasses.getUnitType())) {
result = JetStandardClasses.getUnitType(); result = JetStandardClasses.getUnitType();
@@ -2219,7 +2219,7 @@ public class JetTypeInferrer {
context.scope, operationSign, "equals", context.scope, operationSign, "equals",
leftType, Collections.singletonList(JetStandardClasses.getNullableAnyType()), false); leftType, Collections.singletonList(JetStandardClasses.getNullableAnyType()), false);
if (equals != null) { if (equals != null) {
if (ensureBooleanResult(operationSign, name, equals.getUnsubstitutedReturnType())) { if (ensureBooleanResult(operationSign, name, equals.getReturnType())) {
ensureNonemptyIntersectionOfOperandTypes(expression); ensureNonemptyIntersectionOfOperandTypes(expression);
} }
} }
@@ -2359,7 +2359,7 @@ public class JetTypeInferrer {
FunctionDescriptor functionDescriptor = services.lookupFunction(context.scope, expression, "get", receiverType, argumentTypes, true); FunctionDescriptor functionDescriptor = services.lookupFunction(context.scope, expression, "get", receiverType, argumentTypes, true);
if (functionDescriptor != null) { if (functionDescriptor != null) {
// checkNullSafety(receiverType, expression.getIndexExpressions().get(0).getNode(), functionDescriptor); // checkNullSafety(receiverType, expression.getIndexExpressions().get(0).getNode(), functionDescriptor);
result = functionDescriptor.getUnsubstitutedReturnType(); result = functionDescriptor.getReturnType();
} }
} }
} }
@@ -2403,7 +2403,7 @@ public class JetTypeInferrer {
" Use '?.'-qualified call instead"); " Use '?.'-qualified call instead");
} }
return functionDescriptor.getUnsubstitutedReturnType(); return functionDescriptor.getReturnType();
} }
return null; return null;
} }
@@ -2587,7 +2587,7 @@ public class JetTypeInferrer {
services.lookupFunction(scope, arrayAccessExpression, "set", receiverType, argumentTypes, true); services.lookupFunction(scope, arrayAccessExpression, "set", receiverType, argumentTypes, true);
FunctionDescriptor functionDescriptor = services.lookupFunction(scope, operationSign, "set", receiverType, argumentTypes, true); FunctionDescriptor functionDescriptor = services.lookupFunction(scope, operationSign, "set", receiverType, argumentTypes, true);
if (functionDescriptor != null) { if (functionDescriptor != null) {
result = functionDescriptor.getUnsubstitutedReturnType(); result = functionDescriptor.getReturnType();
} }
} }
@@ -202,14 +202,14 @@ public class DescriptorRenderer {
renderName(descriptor, builder); renderName(descriptor, builder);
builder.append("("); builder.append("(");
for (Iterator<ValueParameterDescriptor> iterator = descriptor.getUnsubstitutedValueParameters().iterator(); iterator.hasNext(); ) { for (Iterator<ValueParameterDescriptor> iterator = descriptor.getValueParameters().iterator(); iterator.hasNext(); ) {
ValueParameterDescriptor parameterDescriptor = iterator.next(); ValueParameterDescriptor parameterDescriptor = iterator.next();
parameterDescriptor.accept(subVisitor, builder); parameterDescriptor.accept(subVisitor, builder);
if (iterator.hasNext()) { if (iterator.hasNext()) {
builder.append(", "); builder.append(", ");
} }
} }
builder.append(") : ").append(escape(renderType(descriptor.getUnsubstitutedReturnType()))); builder.append(") : ").append(escape(renderType(descriptor.getReturnType())));
return super.visitFunctionDescriptor(descriptor, builder); return super.visitFunctionDescriptor(descriptor, builder);
} }
@@ -0,0 +1,8 @@
class Box<T>(t: T) {
var value = t
}
fun box(): String {
val box: Box<Int> = Box<Int>(1)
return if (box.value == 1) "OK" else "fail"
}
@@ -103,4 +103,8 @@ public class ClassGenTest extends CodegenTestCase {
public void testExceptionConstructor() throws Exception { public void testExceptionConstructor() throws Exception {
blackBoxFile("classes/exceptionConstructor.jet"); blackBoxFile("classes/exceptionConstructor.jet");
} }
public void testSimpleBox() throws Exception {
blackBoxFile("classes/simpleBox.jet");
}
} }
@@ -104,7 +104,7 @@ public class JetResolveTest extends ExtensibleResolveTestCase {
List<JetType> parameterTypeList = Arrays.asList(parameterType); List<JetType> parameterTypeList = Arrays.asList(parameterType);
OverloadResolutionResult functions = functionGroup.getPossiblyApplicableFunctions(Collections.<JetType>emptyList(), parameterTypeList); OverloadResolutionResult functions = functionGroup.getPossiblyApplicableFunctions(Collections.<JetType>emptyList(), parameterTypeList);
for (FunctionDescriptor function : functions.getFunctionDescriptors()) { for (FunctionDescriptor function : functions.getFunctionDescriptors()) {
List<ValueParameterDescriptor> unsubstitutedValueParameters = function.getUnsubstitutedValueParameters(); List<ValueParameterDescriptor> unsubstitutedValueParameters = function.getValueParameters();
for (int i = 0, unsubstitutedValueParametersSize = unsubstitutedValueParameters.size(); i < unsubstitutedValueParametersSize; i++) { for (int i = 0, unsubstitutedValueParametersSize = unsubstitutedValueParameters.size(); i < unsubstitutedValueParametersSize; i++) {
ValueParameterDescriptor unsubstitutedValueParameter = unsubstitutedValueParameters.get(i); ValueParameterDescriptor unsubstitutedValueParameter = unsubstitutedValueParameters.get(i);
if (unsubstitutedValueParameter.getOutType().equals(parameterType[i])) { if (unsubstitutedValueParameter.getOutType().equals(parameterType[i])) {