Turn off incorrect switch-optimization for when by enums

#KT-24708 Fixed
This commit is contained in:
Denis Zharkov
2018-08-09 16:34:32 +07:00
parent fc3c4ad883
commit c1cc722ac4
13 changed files with 181 additions and 11 deletions
@@ -959,11 +959,18 @@ class CodegenAnnotatingVisitor extends KtVisitorVoid {
}
private boolean isWhenWithEnums(@NotNull KtWhenExpression expression) {
return WhenChecker.isWhenByEnum(expression, bindingContext) &&
switchCodegenProvider.checkAllItemsAreConstantsSatisfying(
expression,
constant -> constant instanceof EnumValue || constant instanceof NullValue
);
ClassId enumClassId = WhenChecker.getClassIdForEnumSubject(expression, bindingContext);
if (enumClassId == null) return false;
return switchCodegenProvider.checkAllItemsAreConstantsSatisfying(
expression,
constant -> isEnumEntryOrNull(enumClassId, constant)
);
}
private static boolean isEnumEntryOrNull(ClassId enumClassId, ConstantValue<?> constant) {
return (constant instanceof EnumValue && ((EnumValue) constant).getEnumClassId().equals(enumClassId)) ||
constant instanceof NullValue;
}
@NotNull