KT-1052: Add support for function calls (and, or, xor, not) on Boolean

This commit is contained in:
unknown
2012-03-09 13:25:42 +04:00
parent 9a92bee187
commit 253b92a44d
4 changed files with 80 additions and 1 deletions
@@ -56,4 +56,8 @@ public final class MiscTest extends AbstractExpressionTest {
}
}
public void testKt1052() throws Exception {
checkFooBoxIsTrue("KT1052.kt");
}
}
@@ -17,15 +17,17 @@
package org.jetbrains.k2js.translate.intrinsic;
import com.google.common.collect.Lists;
import com.google.dart.compiler.backend.js.ast.JsBinaryOperator;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
import org.jetbrains.jet.lang.types.JetType;
import org.jetbrains.jet.lang.types.lang.JetStandardClasses;
import org.jetbrains.jet.lang.types.lang.JetStandardLibrary;
import org.jetbrains.jet.lang.types.JetType;
import org.jetbrains.jet.lang.types.lang.PrimitiveType;
import org.jetbrains.jet.lexer.JetToken;
import org.jetbrains.jet.lexer.JetTokens;
import org.jetbrains.k2js.translate.intrinsic.array.ArrayGetIntrinsic;
import org.jetbrains.k2js.translate.intrinsic.array.ArraySetIntrinsic;
import org.jetbrains.k2js.translate.intrinsic.primitive.*;
@@ -79,12 +81,27 @@ public final class Intrinsics {
declareStringIntrinsics();
declareTuplesIntrinsics();
declareArrayIntrinsics();
declareBooleanIntrinsics();
FunctionDescriptor intToDouble = getFunctionByName(library.getInt().getDefaultType().getMemberScope(), "toDouble");
functionIntrinsics.put(intToDouble, ReturnReceiverIntrinsic.INSTANCE);
FunctionDescriptor toStringFunction = getFunctionByName(library.getLibraryScope(), "toString");
functionIntrinsics.put(toStringFunction, new BuiltInFunctionIntrinsic("toString"));
}
private void declareBooleanIntrinsics() {
FunctionDescriptor andFunction = getFunctionByName(library.getBoolean().getDefaultType().getMemberScope(), "and");
functionIntrinsics.put(andFunction, PrimitiveBinaryOperationIntrinsic.newInstance(JetTokens.ANDAND));
FunctionDescriptor orFunction = getFunctionByName(library.getBoolean().getDefaultType().getMemberScope(), "or");
functionIntrinsics.put(orFunction, PrimitiveBinaryOperationIntrinsic.newInstance(JetTokens.OROR));
FunctionDescriptor notFunction = getFunctionByName(library.getBoolean().getDefaultType().getMemberScope(), "not");
functionIntrinsics.put(notFunction, PrimitiveUnaryOperationIntrinsic.newInstance(JetTokens.EXCL));
FunctionDescriptor xorFunction = getFunctionByName(library.getBoolean().getDefaultType().getMemberScope(), "xor");
functionIntrinsics.put(xorFunction, PrimitiveBinaryOperationIntrinsic.newInstance(JsBinaryOperator.BIT_XOR));
}
@NotNull
public Intrinsic getLengthPropertyIntrinsic() {
return lengthPropertyIntrinsic;
@@ -39,6 +39,12 @@ public final class PrimitiveBinaryOperationIntrinsic implements Intrinsic {
return new PrimitiveBinaryOperationIntrinsic(operator);
}
@NotNull
public static PrimitiveBinaryOperationIntrinsic newInstance(@NotNull JsBinaryOperator operator) {
return new PrimitiveBinaryOperationIntrinsic(operator);
}
@NotNull
private final JsBinaryOperator operator;
@@ -0,0 +1,52 @@
package foo
fun box() : Boolean {
if (!true.and(true)) {
return false;
}
if (false.and(true)) {
return false;
}
if (!true.or(false)) {
return false;
}
if (false.or(false)) {
return false;
}
if (!true.or(true)) {
return false;
}
if (false.and(false)) {
return false;
}
if (false.xor(false)) {
return false;
}
if (!true.xor(false)) {
return false;
}
if (true.xor(true)) {
return false;
}
if (true.not()) {
return false;
}
if (!false.not()) {
return false;
}
return true;
}