JS backend: convert NumberConversionFIF to Kotlin
This commit is contained in:
+1
-1
@@ -45,7 +45,7 @@ public final class FunctionIntrinsics {
|
|||||||
register(StringOperationFIF.INSTANCE);
|
register(StringOperationFIF.INSTANCE);
|
||||||
register(ArrayFIF.INSTANCE);
|
register(ArrayFIF.INSTANCE);
|
||||||
register(TopLevelFIF.INSTANCE);
|
register(TopLevelFIF.INSTANCE);
|
||||||
register(NumberConversionFIF.INSTANCE);
|
register(NumberConversionFIF.INSTANCE$);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void register(@NotNull FunctionIntrinsicFactory instance) {
|
private void register(@NotNull FunctionIntrinsicFactory instance) {
|
||||||
|
|||||||
-117
@@ -1,117 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2010-2013 JetBrains s.r.o.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.jetbrains.k2js.translate.intrinsic.functions.factories;
|
|
||||||
|
|
||||||
import com.google.common.base.Predicate;
|
|
||||||
import com.google.common.base.Predicates;
|
|
||||||
import com.google.dart.compiler.backend.js.ast.JsExpression;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
|
||||||
import org.jetbrains.annotations.Nullable;
|
|
||||||
import org.jetbrains.jet.lang.descriptors.FunctionDescriptor;
|
|
||||||
import org.jetbrains.k2js.translate.context.TranslationContext;
|
|
||||||
import org.jetbrains.k2js.translate.intrinsic.functions.basic.FunctionIntrinsic;
|
|
||||||
import org.jetbrains.k2js.translate.utils.JsAstUtils;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import static org.jetbrains.k2js.translate.intrinsic.functions.patterns.PatternBuilder.pattern;
|
|
||||||
|
|
||||||
//TODO: support longs and chars
|
|
||||||
public final class NumberConversionFIF extends CompositeFIF {
|
|
||||||
|
|
||||||
@NotNull
|
|
||||||
private static final FunctionIntrinsic RETURN_RECEIVER = new FunctionIntrinsic() {
|
|
||||||
@NotNull
|
|
||||||
@Override
|
|
||||||
public JsExpression apply(
|
|
||||||
@Nullable JsExpression receiver,
|
|
||||||
@NotNull List<JsExpression> arguments,
|
|
||||||
@NotNull TranslationContext context
|
|
||||||
) {
|
|
||||||
assert receiver != null;
|
|
||||||
assert arguments.isEmpty();
|
|
||||||
return receiver;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
@NotNull
|
|
||||||
public static final String INTEGER_NUMBER_TYPES = "Int|Byte|Short";
|
|
||||||
|
|
||||||
@NotNull
|
|
||||||
private static final FunctionIntrinsic TO_INT32 = new FunctionIntrinsic() {
|
|
||||||
@NotNull
|
|
||||||
@Override
|
|
||||||
public JsExpression apply(
|
|
||||||
@Nullable JsExpression receiver,
|
|
||||||
@NotNull List<JsExpression> arguments,
|
|
||||||
@NotNull TranslationContext context
|
|
||||||
) {
|
|
||||||
assert receiver != null;
|
|
||||||
assert arguments.isEmpty();
|
|
||||||
return JsAstUtils.toInt32(receiver, context);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
@NotNull
|
|
||||||
private static final FunctionIntrinsic TO_SHORT = new FunctionIntrinsic() {
|
|
||||||
@NotNull
|
|
||||||
@Override
|
|
||||||
public JsExpression apply(
|
|
||||||
@Nullable JsExpression receiver,
|
|
||||||
@NotNull List<JsExpression> arguments,
|
|
||||||
@NotNull TranslationContext context
|
|
||||||
) {
|
|
||||||
assert receiver != null;
|
|
||||||
assert arguments.isEmpty();
|
|
||||||
return JsAstUtils.toShort(receiver);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
@NotNull
|
|
||||||
private static final FunctionIntrinsic TO_BYTE = new FunctionIntrinsic() {
|
|
||||||
@NotNull
|
|
||||||
@Override
|
|
||||||
public JsExpression apply(
|
|
||||||
@Nullable JsExpression receiver,
|
|
||||||
@NotNull List<JsExpression> arguments,
|
|
||||||
@NotNull TranslationContext context
|
|
||||||
) {
|
|
||||||
assert receiver != null;
|
|
||||||
assert arguments.isEmpty();
|
|
||||||
return JsAstUtils.toByte(receiver);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
@NotNull
|
|
||||||
private static final Predicate<FunctionDescriptor> returnReceiverPredicate = Predicates.or(
|
|
||||||
pattern("Int.toInt|toFloat|toDouble"),
|
|
||||||
pattern("Short.toShort|toInt|toFloat|toDouble"),
|
|
||||||
pattern("Byte.toByte|toShort|toInt|toFloat|toDouble"),
|
|
||||||
pattern("Float|Double|Number.toFloat|toDouble")
|
|
||||||
);
|
|
||||||
|
|
||||||
@NotNull
|
|
||||||
public static final FunctionIntrinsicFactory INSTANCE = new NumberConversionFIF();
|
|
||||||
|
|
||||||
//NOTE: treat Number as if it is floating point type
|
|
||||||
private NumberConversionFIF() {
|
|
||||||
add(returnReceiverPredicate, RETURN_RECEIVER);
|
|
||||||
add(pattern("Float|Double|Number.toInt"), TO_INT32);
|
|
||||||
add(pattern("Int|Float|Double|Number.toShort"), TO_SHORT);
|
|
||||||
add(pattern("Short|Int|Float|Double|Number.toByte"), TO_BYTE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
+56
@@ -0,0 +1,56 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2014 JetBrains s.r.o.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.k2js.translate.intrinsic.functions.factories
|
||||||
|
|
||||||
|
import com.google.dart.compiler.backend.js.ast.JsExpression
|
||||||
|
import org.jetbrains.k2js.translate.context.TranslationContext
|
||||||
|
import org.jetbrains.k2js.translate.intrinsic.functions.basic.FunctionIntrinsic
|
||||||
|
import org.jetbrains.k2js.translate.utils.JsAstUtils
|
||||||
|
|
||||||
|
import org.jetbrains.k2js.translate.intrinsic.functions.patterns.PatternBuilder.pattern
|
||||||
|
|
||||||
|
//TODO: support longs and chars
|
||||||
|
public object NumberConversionFIF : CompositeFIF() {
|
||||||
|
|
||||||
|
//NOTE: treat Number as if it is floating point type
|
||||||
|
private val convertOperations: Map<String, (receiver: JsExpression, context: TranslationContext) ->JsExpression> =
|
||||||
|
mapOf(
|
||||||
|
"Int.toInt|toFloat|toDouble" to { (receiver, context) -> receiver },
|
||||||
|
"Short.toShort|toInt|toFloat|toDouble" to { (receiver, context) -> receiver },
|
||||||
|
"Byte.toByte|toShort|toInt|toFloat|toDouble" to { (receiver, context) -> receiver },
|
||||||
|
"Float|Double|Number.toFloat|toDouble" to { (receiver, context) -> receiver },
|
||||||
|
|
||||||
|
"Float|Double|Number.toInt" to { (receiver, context) -> JsAstUtils.toInt32(receiver, context) },
|
||||||
|
"Int|Float|Double|Number.toShort" to { (receiver, context) -> JsAstUtils.toShort(receiver) },
|
||||||
|
"Short|Int|Float|Double|Number.toByte" to { (receiver, context) -> JsAstUtils.toByte(receiver) }
|
||||||
|
)
|
||||||
|
|
||||||
|
fun newUnaryIntrinsic(applyFun: (receiver: JsExpression, context: TranslationContext) -> JsExpression): FunctionIntrinsic =
|
||||||
|
object : FunctionIntrinsic() {
|
||||||
|
override fun apply(receiver: JsExpression?, arguments: List<JsExpression>, context: TranslationContext): JsExpression {
|
||||||
|
assert(receiver != null)
|
||||||
|
assert(arguments.size() == 0)
|
||||||
|
return applyFun(receiver!!, context)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
for((stringPattern, applyFun) in convertOperations) {
|
||||||
|
add(pattern(stringPattern), newUnaryIntrinsic(applyFun))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+1
-2
@@ -37,7 +37,6 @@ import org.jetbrains.k2js.translate.utils.JsAstUtils;
|
|||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import static org.jetbrains.k2js.translate.intrinsic.functions.factories.NumberConversionFIF.INTEGER_NUMBER_TYPES;
|
|
||||||
import static org.jetbrains.k2js.translate.intrinsic.functions.patterns.PatternBuilder.pattern;
|
import static org.jetbrains.k2js.translate.intrinsic.functions.patterns.PatternBuilder.pattern;
|
||||||
import static org.jetbrains.k2js.translate.utils.JsAstUtils.*;
|
import static org.jetbrains.k2js.translate.utils.JsAstUtils.*;
|
||||||
|
|
||||||
@@ -124,7 +123,7 @@ public enum PrimitiveBinaryOperationFIF implements FunctionIntrinsicFactory {
|
|||||||
return NUMBER_COMPARE_TO_INTRINSIC;
|
return NUMBER_COMPARE_TO_INTRINSIC;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pattern(INTEGER_NUMBER_TYPES + ".div").apply(descriptor)) {
|
if (pattern("Int|Short|Byte.div").apply(descriptor)) {
|
||||||
JetType resultType = descriptor.getReturnType();
|
JetType resultType = descriptor.getReturnType();
|
||||||
if (!KotlinBuiltIns.getInstance().getFloatType().equals(resultType) &&
|
if (!KotlinBuiltIns.getInstance().getFloatType().equals(resultType) &&
|
||||||
!KotlinBuiltIns.getInstance().getDoubleType().equals(resultType))
|
!KotlinBuiltIns.getInstance().getDoubleType().equals(resultType))
|
||||||
|
|||||||
Reference in New Issue
Block a user