Fix local variables table for inline classes

This commit is contained in:
Mikhail Zarechenskiy
2018-01-31 22:07:33 +03:00
parent 35c454f53f
commit b08a32af2f
2 changed files with 16 additions and 3 deletions
@@ -529,16 +529,18 @@ public class FunctionCodegen {
@NotNull KotlinTypeMapper typeMapper
) {
ReceiverParameterDescriptor dispatchReceiver = functionDescriptor.getDispatchReceiverParameter();
// all functions inside erased version of inline class are static, so they don't have `this` as is,
// but functions inside wrapper class should use type of wrapper class, not the underlying type
if (functionDescriptor instanceof ConstructorDescriptor) {
return typeMapper.mapType(functionDescriptor);
return typeMapper.mapTypeAsDeclaration(functionDescriptor);
}
else if (dispatchReceiver != null) {
return typeMapper.mapType(dispatchReceiver.getType());
return typeMapper.mapTypeAsDeclaration(dispatchReceiver.getType());
}
else if (isFunctionLiteral(functionDescriptor) ||
isLocalFunction(functionDescriptor) ||
isFunctionExpression(functionDescriptor)) {
return typeMapper.mapType(context.getThisDescriptor());
return typeMapper.mapClass(context.getThisDescriptor());
}
else {
return null;
@@ -396,12 +396,23 @@ public class KotlinTypeMapper {
return mapType(jetType, null, TypeMappingMode.DEFAULT);
}
@NotNull
public Type mapTypeAsDeclaration(@NotNull KotlinType kotlinType) {
return mapType(kotlinType, null, TypeMappingMode.CLASS_DECLARATION);
}
@NotNull
public Type mapType(@NotNull CallableDescriptor descriptor) {
//noinspection ConstantConditions
return mapType(descriptor.getReturnType());
}
@NotNull
public Type mapTypeAsDeclaration(@NotNull CallableDescriptor descriptor) {
//noinspection ConstantConditions
return mapTypeAsDeclaration(descriptor.getReturnType());
}
public Type mapErasedInlineClass(@NotNull ClassDescriptor descriptor) {
return Type.getObjectType(mapClass(descriptor).getInternalName() + JvmAbi.ERASED_INLINE_CLASS_SUFFIX);
}