KT-12254 Prevent JsEmptyExpression from getting into initializer JS when compiling code like val x = throw Exception()

This commit is contained in:
Alexey Andreev
2016-05-10 19:06:15 +03:00
parent 4387c31939
commit cb36b61f7f
4 changed files with 26 additions and 3 deletions
@@ -34,4 +34,8 @@ public class InitializerTest extends SingleFileTranslationTest {
public void testClassInitializer() throws Exception {
checkFooBoxIsOk();
}
public void testDeclarationInitializedWithThrow() throws Exception {
checkFooBoxIsOk();
}
}
@@ -21,6 +21,7 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.kotlin.js.translate.context.TranslationContext;
import org.jetbrains.kotlin.js.translate.general.Translation;
import org.jetbrains.kotlin.js.translate.general.TranslatorVisitor;
import org.jetbrains.kotlin.js.translate.utils.JsAstUtils;
import org.jetbrains.kotlin.psi.*;
import java.util.List;
@@ -46,8 +47,11 @@ public final class InitializerVisitor extends TranslatorVisitor<Void> {
public final Void visitProperty(@NotNull KtProperty property, @NotNull TranslationContext context) {
KtExpression initializer = property.getInitializer();
if (initializer != null) {
result.add(generateInitializerForProperty(context, getPropertyDescriptor(context.bindingContext(), property),
Translation.translateAsExpression(initializer, context)));
JsStatement statement = generateInitializerForProperty(context, getPropertyDescriptor(context.bindingContext(), property),
Translation.translateAsExpression(initializer, context));
if (!JsAstUtils.isEmptyStatement(statement)) {
result.add(statement);
}
}
JsStatement delegate = generateInitializerForDelegate(context, property);
@@ -175,7 +175,7 @@ public final class TranslationUtils {
@NotNull PropertyDescriptor descriptor,
@NotNull JsExpression assignTo) {
JsNameRef backingFieldReference = backingFieldReference(context, descriptor);
return assignment(backingFieldReference, assignTo);
return !JsAstUtils.isEmptyExpression(assignTo) ? assignment(backingFieldReference, assignTo) : assignTo;
}
@Nullable
@@ -0,0 +1,15 @@
// See KT-12254
package foo
object A {
var x: Int = throw RuntimeException("catch me")
}
fun box(): String {
try {
return "fail: ${A.x.toString()}"
}
catch (e: RuntimeException) {
return if (e.message == "catch me") "OK" else "fail: ${e.message}"
}
}