Fix for KT-14597: "When" over smartcasted enum is broken and breaks all other "when"

#KT-14597 Fixed
This commit is contained in:
Mikhael Bogdanov
2017-01-23 16:04:26 +01:00
parent ee9a174c1f
commit df8394bcd2
22 changed files with 443 additions and 8 deletions
@@ -648,8 +648,10 @@ class CodegenAnnotatingVisitor extends KtVisitorVoid {
int fieldNumber = mappings.size();
assert expression.getSubjectExpression() != null : "subject expression should be not null in a valid when by enums";
KotlinType type = bindingContext.getType(expression.getSubjectExpression());
KotlinType type = WhenChecker.whenSubjectType(expression, bindingContext);
assert type != null : "should not be null in a valid when by enums";
ClassDescriptor classDescriptor = (ClassDescriptor) type.getConstructor().getDeclarationDescriptor();
assert classDescriptor != null : "because it's enum";
@@ -34,7 +34,7 @@ public class EnumSwitchCodegen extends SwitchCodegen {
@NotNull ExpressionCodegen codegen,
@NotNull WhenByEnumsMapping mapping
) {
super(expression, isStatement, isExhaustive, codegen);
super(expression, isStatement, isExhaustive, codegen, codegen.getState().getTypeMapper().mapType(mapping.getEnumClassDescriptor()));
this.mapping = mapping;
}
@@ -29,7 +29,7 @@ public class IntegralConstantsSwitchCodegen extends SwitchCodegen {
boolean isExhaustive,
@NotNull ExpressionCodegen codegen
) {
super(expression, isStatement, isExhaustive, codegen);
super(expression, isStatement, isExhaustive, codegen, null);
}
@Override
@@ -43,7 +43,7 @@ public class StringSwitchCodegen extends SwitchCodegen {
boolean isExhaustive,
@NotNull ExpressionCodegen codegen
) {
super(expression, isStatement, isExhaustive, codegen);
super(expression, isStatement, isExhaustive, codegen, null);
}
@Override
@@ -17,9 +17,9 @@
package org.jetbrains.kotlin.codegen.when;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.kotlin.codegen.ExpressionCodegen;
import org.jetbrains.kotlin.codegen.FrameMap;
import org.jetbrains.kotlin.config.LanguageVersionSettings;
import org.jetbrains.kotlin.psi.KtWhenEntry;
import org.jetbrains.kotlin.psi.KtWhenExpression;
import org.jetbrains.kotlin.resolve.BindingContext;
@@ -51,7 +51,8 @@ abstract public class SwitchCodegen {
public SwitchCodegen(
@NotNull KtWhenExpression expression, boolean isStatement,
boolean isExhaustive, @NotNull ExpressionCodegen codegen
boolean isExhaustive, @NotNull ExpressionCodegen codegen,
@Nullable Type subjectType
) {
this.expression = expression;
this.isStatement = isStatement;
@@ -59,7 +60,7 @@ abstract public class SwitchCodegen {
this.codegen = codegen;
this.bindingContext = codegen.getBindingContext();
subjectType = codegen.expressionType(expression.getSubjectExpression());
this.subjectType = subjectType != null ? subjectType : codegen.expressionType(expression.getSubjectExpression());
resultType = isStatement ? Type.VOID_TYPE : codegen.expressionType(expression);
v = codegen.v;
}