From c565697e7709a4ed300b7c512c4ad4a3bf9ba621 Mon Sep 17 00:00:00 2001 From: Alexey Andreev Date: Wed, 28 Dec 2016 18:10:27 +0300 Subject: [PATCH] JS: refactor FunctionIntrinsic --- .../basic/BuiltInFunctionIntrinsic.java | 47 ----------- .../basic/BuiltInPropertyIntrinsic.java | 4 +- .../functions/basic/FunctionIntrinsic.java | 84 ------------------- .../functions/basic/FunctionIntrinsic.kt | 45 ++++++++++ .../FunctionIntrinsicWithReceiverComputed.kt | 29 +++++++ .../functions/basic/RangeToIntrinsic.kt | 4 +- .../functions/factories/ArrayFIF.java | 13 +-- .../functions/factories/CompositeFIF.java | 3 +- .../factories/KotlinFunctionIntrinsic.java | 6 +- .../functions/factories/LongOperationFIF.kt | 4 +- .../factories/NumberAndCharConversionFIF.kt | 6 +- .../PrimitiveBinaryOperationFIF.java | 5 +- .../factories/PrimitiveUnaryOperationFIF.java | 47 ++++++----- .../functions/factories/TopLevelFIF.java | 35 ++++---- .../IntrinsicIncrementTranslator.java | 8 +- .../js/translate/utils/TranslationUtils.java | 5 +- 16 files changed, 151 insertions(+), 194 deletions(-) delete mode 100644 js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/functions/basic/BuiltInFunctionIntrinsic.java delete mode 100644 js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/functions/basic/FunctionIntrinsic.java create mode 100644 js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/functions/basic/FunctionIntrinsic.kt create mode 100644 js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/functions/basic/FunctionIntrinsicWithReceiverComputed.kt diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/functions/basic/BuiltInFunctionIntrinsic.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/functions/basic/BuiltInFunctionIntrinsic.java deleted file mode 100644 index 2eb4b24d188..00000000000 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/functions/basic/BuiltInFunctionIntrinsic.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright 2010-2015 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.kotlin.js.translate.intrinsic.functions.basic; - -import org.jetbrains.kotlin.js.backend.ast.JsExpression; -import org.jetbrains.kotlin.js.backend.ast.JsInvocation; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.jetbrains.kotlin.js.translate.context.TranslationContext; -import org.jetbrains.kotlin.js.translate.utils.JsAstUtils; - -import java.util.List; - -public final class BuiltInFunctionIntrinsic extends FunctionIntrinsic { - - @NotNull - private final String functionName; - - public BuiltInFunctionIntrinsic(@NotNull String functionName) { - this.functionName = functionName; - } - - @NotNull - @Override - public JsExpression apply( - @Nullable JsExpression receiver, - @NotNull List arguments, - @NotNull TranslationContext context - ) { - assert receiver != null; - return new JsInvocation(JsAstUtils.pureFqn(functionName, receiver), arguments); - } -} diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/functions/basic/BuiltInPropertyIntrinsic.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/functions/basic/BuiltInPropertyIntrinsic.java index b830997127e..71f3d40e7d2 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/functions/basic/BuiltInPropertyIntrinsic.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/functions/basic/BuiltInPropertyIntrinsic.java @@ -25,7 +25,7 @@ import org.jetbrains.kotlin.js.translate.utils.JsAstUtils; import java.util.List; //TODO: find should be usages -public final class BuiltInPropertyIntrinsic extends FunctionIntrinsic { +public final class BuiltInPropertyIntrinsic extends FunctionIntrinsicWithReceiverComputed { @NotNull private final String propertyName; @@ -36,7 +36,7 @@ public final class BuiltInPropertyIntrinsic extends FunctionIntrinsic { @NotNull @Override - public JsExpression apply(@Nullable JsExpression receiver, @NotNull List arguments, + public JsExpression apply(@Nullable JsExpression receiver, @NotNull List arguments, @NotNull TranslationContext context) { assert receiver != null; assert arguments.isEmpty() : "Properties can't have arguments."; diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/functions/basic/FunctionIntrinsic.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/functions/basic/FunctionIntrinsic.java deleted file mode 100644 index 8fd5f6f20eb..00000000000 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/functions/basic/FunctionIntrinsic.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Copyright 2010-2015 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.kotlin.js.translate.intrinsic.functions.basic; - -import org.jetbrains.kotlin.js.backend.ast.JsExpression; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.jetbrains.kotlin.js.translate.callTranslator.CallInfo; -import org.jetbrains.kotlin.js.translate.context.TranslationContext; - -import java.util.List; - -/** - * Base for intrinsics that substitute standard function calls like Int#plus, Float#minus ... etc - */ -public abstract class FunctionIntrinsic { - - @NotNull - public static final FunctionIntrinsic NO_INTRINSIC = new FunctionIntrinsic() { - @Override - public boolean exists() { - return false; - } - - @NotNull - @Override - public JsExpression apply(@Nullable JsExpression receiver, - @NotNull List arguments, - @NotNull TranslationContext context) { - throw new UnsupportedOperationException("FunctionIntrinsic#NO_INTRINSIC_#apply"); - } - }; - - @Nullable - protected static JsExpression getThisOrReceiverOrNull(@NotNull CallInfo callInfo) { - if (callInfo.getDispatchReceiver() != null) { - return callInfo.getDispatchReceiver(); - } else { - return callInfo.getExtensionReceiver(); - } - } - - @NotNull - public JsExpression apply(@NotNull CallInfo callInfo, - @NotNull List arguments, - @NotNull TranslationContext context) { - return apply(getThisOrReceiverOrNull(callInfo), arguments, context); - } - - @NotNull - public abstract JsExpression apply(@Nullable JsExpression receiver, - @NotNull List arguments, - @NotNull TranslationContext context - ); - - public boolean exists() { - return true; - } - - public abstract static class CallParametersAwareFunctionIntrinsic extends FunctionIntrinsic { - @NotNull - @Override - public JsExpression apply(@Nullable JsExpression receiver, - @NotNull List arguments, - @NotNull TranslationContext context - ) { - throw new IllegalStateException(); - } - } -} diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/functions/basic/FunctionIntrinsic.kt b/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/functions/basic/FunctionIntrinsic.kt new file mode 100644 index 00000000000..b21384c948e --- /dev/null +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/functions/basic/FunctionIntrinsic.kt @@ -0,0 +1,45 @@ +/* + * Copyright 2010-2015 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.kotlin.js.translate.intrinsic.functions.basic + +import org.jetbrains.kotlin.js.backend.ast.JsExpression +import org.jetbrains.kotlin.js.translate.callTranslator.CallInfo +import org.jetbrains.kotlin.js.translate.context.TranslationContext + +/** + * Base for intrinsics that substitute standard function calls like Int#plus, Float#minus ... etc + */ +abstract class FunctionIntrinsic { + abstract fun apply(callInfo: CallInfo, arguments: List, context: TranslationContext): JsExpression + + open fun exists(): Boolean = true + + companion object { + @JvmField + val NO_INTRINSIC: FunctionIntrinsic = object : FunctionIntrinsic() { + override fun exists() = false + + override fun apply(callInfo: CallInfo, arguments: List, context: TranslationContext) = + throw UnsupportedOperationException("FunctionIntrinsic#NO_INTRINSIC_#apply") + + } + + @JvmStatic + protected fun getThisOrReceiverOrNull(callInfo: CallInfo): JsExpression? = + callInfo.dispatchReceiver ?: callInfo.extensionReceiver + } +} diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/functions/basic/FunctionIntrinsicWithReceiverComputed.kt b/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/functions/basic/FunctionIntrinsicWithReceiverComputed.kt new file mode 100644 index 00000000000..32e729f18cf --- /dev/null +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/functions/basic/FunctionIntrinsicWithReceiverComputed.kt @@ -0,0 +1,29 @@ +/* + * Copyright 2010-2016 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.kotlin.js.translate.intrinsic.functions.basic + +import org.jetbrains.kotlin.js.backend.ast.JsExpression +import org.jetbrains.kotlin.js.translate.callTranslator.CallInfo +import org.jetbrains.kotlin.js.translate.context.TranslationContext + +abstract class FunctionIntrinsicWithReceiverComputed : FunctionIntrinsic() { + override fun apply(callInfo: CallInfo, arguments: List, context: TranslationContext): JsExpression { + return apply(getThisOrReceiverOrNull(callInfo), arguments, context) + } + + abstract fun apply(receiver: JsExpression?, arguments: List, context: TranslationContext): JsExpression +} diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/functions/basic/RangeToIntrinsic.kt b/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/functions/basic/RangeToIntrinsic.kt index 00ac2aef161..7d9b65b3e47 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/functions/basic/RangeToIntrinsic.kt +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/functions/basic/RangeToIntrinsic.kt @@ -26,10 +26,10 @@ import org.jetbrains.kotlin.js.translate.reference.ReferenceTranslator import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter import org.jetbrains.kotlin.utils.singletonOrEmptyList -class RangeToIntrinsic(function: FunctionDescriptor) : FunctionIntrinsic() { +class RangeToIntrinsic(function: FunctionDescriptor) : FunctionIntrinsicWithReceiverComputed() { val rangeTypeDescriptor = function.returnType!!.constructor.declarationDescriptor as ClassDescriptor - override fun apply(receiver: JsExpression?, arguments: MutableList, context: TranslationContext): JsExpression { + override fun apply(receiver: JsExpression?, arguments: List, context: TranslationContext): JsExpression { val packageName = (rangeTypeDescriptor.containingDeclaration as PackageFragmentDescriptor).fqName val packageDescriptor = context.currentModule.getPackage(packageName) val existingClasses = packageDescriptor.memberScope.getContributedDescriptors(DescriptorKindFilter.CLASSIFIERS) { diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/functions/factories/ArrayFIF.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/functions/factories/ArrayFIF.java index 40ec93bdfb2..0edd5b79b31 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/functions/factories/ArrayFIF.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/functions/factories/ArrayFIF.java @@ -27,6 +27,7 @@ import org.jetbrains.kotlin.js.patterns.NamePredicate; import org.jetbrains.kotlin.js.translate.context.Namer; import org.jetbrains.kotlin.js.translate.context.TranslationContext; import org.jetbrains.kotlin.js.translate.intrinsic.functions.basic.FunctionIntrinsic; +import org.jetbrains.kotlin.js.translate.intrinsic.functions.basic.FunctionIntrinsicWithReceiverComputed; import org.jetbrains.kotlin.name.Name; import java.util.List; @@ -72,12 +73,12 @@ public final class ArrayFIF extends CompositeFIF { ARRAY_FACTORY_METHODS = pattern(Namer.KOTLIN_LOWER_NAME, new NamePredicate(arrayFactoryMethodNames)); } - private static final FunctionIntrinsic ARRAY_INTRINSIC = new FunctionIntrinsic() { + private static final FunctionIntrinsic ARRAY_INTRINSIC = new FunctionIntrinsicWithReceiverComputed() { @NotNull @Override public JsExpression apply( @Nullable JsExpression receiver, - @NotNull List arguments, + @NotNull List arguments, @NotNull TranslationContext context ) { assert arguments.size() == 1; @@ -86,11 +87,11 @@ public final class ArrayFIF extends CompositeFIF { }; @NotNull - public static final FunctionIntrinsic GET_INTRINSIC = new FunctionIntrinsic() { + public static final FunctionIntrinsic GET_INTRINSIC = new FunctionIntrinsicWithReceiverComputed() { @NotNull @Override public JsExpression apply(@Nullable JsExpression receiver, - @NotNull List arguments, + @NotNull List arguments, @NotNull TranslationContext context) { assert receiver != null; assert arguments.size() == 1 : "Array get expression must have one argument."; @@ -100,11 +101,11 @@ public final class ArrayFIF extends CompositeFIF { }; @NotNull - public static final FunctionIntrinsic SET_INTRINSIC = new FunctionIntrinsic() { + public static final FunctionIntrinsic SET_INTRINSIC = new FunctionIntrinsicWithReceiverComputed() { @NotNull @Override public JsExpression apply(@Nullable JsExpression receiver, - @NotNull List arguments, + @NotNull List arguments, @NotNull TranslationContext context) { assert receiver != null; assert arguments.size() == 2 : "Array set expression must have two arguments."; diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/functions/factories/CompositeFIF.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/functions/factories/CompositeFIF.java index 8e243d133fd..eb5afbdaeae 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/functions/factories/CompositeFIF.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/functions/factories/CompositeFIF.java @@ -29,8 +29,7 @@ import java.util.List; public abstract class CompositeFIF implements FunctionIntrinsicFactory { @NotNull - public static final FunctionIntrinsic LENGTH_PROPERTY_INTRINSIC = new BuiltInPropertyIntrinsic("length"); - public static final FunctionIntrinsic MESSAGE_PROPERTY_INTRINSIC = new BuiltInPropertyIntrinsic("message"); + public static final BuiltInPropertyIntrinsic LENGTH_PROPERTY_INTRINSIC = new BuiltInPropertyIntrinsic("length"); @NotNull private final List, FunctionIntrinsic>> patternsAndIntrinsics = Lists.newArrayList(); diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/functions/factories/KotlinFunctionIntrinsic.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/functions/factories/KotlinFunctionIntrinsic.java index 90420612ced..f242f06233a 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/functions/factories/KotlinFunctionIntrinsic.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/functions/factories/KotlinFunctionIntrinsic.java @@ -22,14 +22,14 @@ import org.jetbrains.kotlin.js.backend.ast.JsExpression; import org.jetbrains.kotlin.js.backend.ast.JsInvocation; import org.jetbrains.kotlin.js.translate.context.Namer; import org.jetbrains.kotlin.js.translate.context.TranslationContext; -import org.jetbrains.kotlin.js.translate.intrinsic.functions.basic.FunctionIntrinsic; +import org.jetbrains.kotlin.js.translate.intrinsic.functions.basic.FunctionIntrinsicWithReceiverComputed; import org.jetbrains.kotlin.js.translate.utils.JsAstUtils; import org.jetbrains.kotlin.js.translate.utils.TranslationUtils; import java.util.ArrayList; import java.util.List; -public class KotlinFunctionIntrinsic extends FunctionIntrinsic { +public class KotlinFunctionIntrinsic extends FunctionIntrinsicWithReceiverComputed { @NotNull private final String functionName; private final JsExpression[] additionalArguments; @@ -43,7 +43,7 @@ public class KotlinFunctionIntrinsic extends FunctionIntrinsic { @Override public JsExpression apply( @Nullable JsExpression receiver, - @NotNull List arguments, + @NotNull List arguments, @NotNull TranslationContext context ) { JsExpression function = JsAstUtils.pureFqn(functionName, Namer.kotlinObject()); diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/functions/factories/LongOperationFIF.kt b/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/functions/factories/LongOperationFIF.kt index f93bc26b27a..b0af8404d25 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/functions/factories/LongOperationFIF.kt +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/functions/factories/LongOperationFIF.kt @@ -22,6 +22,7 @@ import org.jetbrains.kotlin.js.patterns.PatternBuilder.pattern import org.jetbrains.kotlin.js.translate.context.Namer import org.jetbrains.kotlin.js.translate.context.TranslationContext import org.jetbrains.kotlin.js.translate.intrinsic.functions.basic.FunctionIntrinsic +import org.jetbrains.kotlin.js.translate.intrinsic.functions.basic.FunctionIntrinsicWithReceiverComputed import org.jetbrains.kotlin.js.translate.utils.JsAstUtils.* import org.jetbrains.kotlin.utils.identity as ID @@ -67,7 +68,8 @@ object LongOperationFIF : FunctionIntrinsicFactory { "rem" to BaseBinaryIntrinsic(::mod) ) - class BaseBinaryIntrinsic(val applyFun: (left: JsExpression, right: JsExpression) -> JsExpression) : FunctionIntrinsic() { + class BaseBinaryIntrinsic(val applyFun: (left: JsExpression, right: JsExpression) -> JsExpression) : + FunctionIntrinsicWithReceiverComputed() { override fun apply(receiver: JsExpression?, arguments: List, context: TranslationContext): JsExpression { assert(receiver != null) assert(arguments.size == 1) diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/functions/factories/NumberAndCharConversionFIF.kt b/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/functions/factories/NumberAndCharConversionFIF.kt index 79f3636a69b..1eafca09013 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/functions/factories/NumberAndCharConversionFIF.kt +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/functions/factories/NumberAndCharConversionFIF.kt @@ -20,7 +20,7 @@ import com.google.common.base.Predicates import org.jetbrains.kotlin.js.backend.ast.JsExpression import org.jetbrains.kotlin.js.patterns.PatternBuilder.pattern import org.jetbrains.kotlin.js.translate.context.TranslationContext -import org.jetbrains.kotlin.js.translate.intrinsic.functions.basic.FunctionIntrinsic +import org.jetbrains.kotlin.js.translate.intrinsic.functions.basic.FunctionIntrinsicWithReceiverComputed import org.jetbrains.kotlin.js.translate.utils.JsAstUtils.* import org.jetbrains.kotlin.utils.identity @@ -62,10 +62,10 @@ object NumberAndCharConversionFIF : CompositeFIF() { ) - class ConversionUnaryIntrinsic(val applyFun: (receiver: JsExpression) -> JsExpression) : FunctionIntrinsic() { + class ConversionUnaryIntrinsic(val applyFun: (receiver: JsExpression) -> JsExpression) : FunctionIntrinsicWithReceiverComputed() { override fun apply(receiver: JsExpression?, arguments: List, context: TranslationContext): JsExpression { assert(receiver != null) - assert(arguments.size == 0) + assert(arguments.isEmpty()) return applyFun(receiver!!) } } diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/functions/factories/PrimitiveBinaryOperationFIF.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/functions/factories/PrimitiveBinaryOperationFIF.java index 5956d3dff73..3606b782b83 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/functions/factories/PrimitiveBinaryOperationFIF.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/functions/factories/PrimitiveBinaryOperationFIF.java @@ -29,6 +29,7 @@ import org.jetbrains.kotlin.js.patterns.NamePredicate; import org.jetbrains.kotlin.js.translate.context.Namer; import org.jetbrains.kotlin.js.translate.context.TranslationContext; import org.jetbrains.kotlin.js.translate.intrinsic.functions.basic.FunctionIntrinsic; +import org.jetbrains.kotlin.js.translate.intrinsic.functions.basic.FunctionIntrinsicWithReceiverComputed; import org.jetbrains.kotlin.js.translate.intrinsic.functions.basic.RangeToIntrinsic; import org.jetbrains.kotlin.js.translate.operation.OperatorTable; import org.jetbrains.kotlin.js.translate.utils.JsAstUtils; @@ -44,7 +45,7 @@ import static org.jetbrains.kotlin.js.patterns.PatternBuilder.pattern; public enum PrimitiveBinaryOperationFIF implements FunctionIntrinsicFactory { INSTANCE; - private static abstract class BinaryOperationIntrinsicBase extends FunctionIntrinsic { + private static abstract class BinaryOperationIntrinsicBase extends FunctionIntrinsicWithReceiverComputed { @NotNull public abstract JsExpression doApply(@NotNull JsExpression left, @NotNull JsExpression right, @NotNull TranslationContext context); @@ -52,7 +53,7 @@ public enum PrimitiveBinaryOperationFIF implements FunctionIntrinsicFactory { @Override public JsExpression apply( @Nullable JsExpression receiver, - @NotNull List arguments, + @NotNull List arguments, @NotNull TranslationContext context) { assert receiver != null; assert arguments.size() == 1; diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/functions/factories/PrimitiveUnaryOperationFIF.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/functions/factories/PrimitiveUnaryOperationFIF.java index 88723f2d227..b5982d267c6 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/functions/factories/PrimitiveUnaryOperationFIF.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/functions/factories/PrimitiveUnaryOperationFIF.java @@ -26,6 +26,7 @@ import org.jetbrains.kotlin.js.patterns.DescriptorPredicate; import org.jetbrains.kotlin.js.patterns.NamePredicate; import org.jetbrains.kotlin.js.translate.context.TranslationContext; import org.jetbrains.kotlin.js.translate.intrinsic.functions.basic.FunctionIntrinsic; +import org.jetbrains.kotlin.js.translate.intrinsic.functions.basic.FunctionIntrinsicWithReceiverComputed; import org.jetbrains.kotlin.js.translate.operation.OperatorTable; import org.jetbrains.kotlin.js.translate.utils.JsAstUtils; import org.jetbrains.kotlin.js.translate.utils.JsDescriptorUtils; @@ -73,61 +74,67 @@ public enum PrimitiveUnaryOperationFIF implements FunctionIntrinsicFactory { @NotNull private static final DescriptorPredicate DEC_OPERATION_FOR_PRIMITIVE_NUMBER = pattern("Float|Double.dec()"); - private static class IntOverflowIntrinsic extends FunctionIntrinsic { - private final FunctionIntrinsic underlyingIntrinsic; + private static class IntOverflowIntrinsic extends FunctionIntrinsicWithReceiverComputed { + private final FunctionIntrinsicWithReceiverComputed underlyingIntrinsic; - public IntOverflowIntrinsic(FunctionIntrinsic underlyingIntrinsic) { + public IntOverflowIntrinsic(FunctionIntrinsicWithReceiverComputed underlyingIntrinsic) { this.underlyingIntrinsic = underlyingIntrinsic; } @NotNull @Override public JsExpression apply( - @Nullable JsExpression receiver, @NotNull List arguments, @NotNull TranslationContext context + @Nullable JsExpression receiver, + @NotNull List arguments, + @NotNull TranslationContext context ) { return JsAstUtils.toInt32(underlyingIntrinsic.apply(receiver, arguments, context)); } } - private static class ShortOverflowIntrinsic extends FunctionIntrinsic { - private final FunctionIntrinsic underlyingIntrinsic; + private static class ShortOverflowIntrinsic extends FunctionIntrinsicWithReceiverComputed { + private final FunctionIntrinsicWithReceiverComputed underlyingIntrinsic; - public ShortOverflowIntrinsic(FunctionIntrinsic underlyingIntrinsic) { + public ShortOverflowIntrinsic(FunctionIntrinsicWithReceiverComputed underlyingIntrinsic) { this.underlyingIntrinsic = underlyingIntrinsic; } @NotNull @Override public JsExpression apply( - @Nullable JsExpression receiver, @NotNull List arguments, @NotNull TranslationContext context + @Nullable JsExpression receiver, + @NotNull List arguments, + @NotNull TranslationContext context ) { return JsAstUtils.toShort(underlyingIntrinsic.apply(receiver, arguments, context)); } } - private static class ByteOverflowIntrinsic extends FunctionIntrinsic { - private final FunctionIntrinsic underlyingIntrinsic; + private static class ByteOverflowIntrinsic extends FunctionIntrinsicWithReceiverComputed { + private final FunctionIntrinsicWithReceiverComputed underlyingIntrinsic; - public ByteOverflowIntrinsic(FunctionIntrinsic underlyingIntrinsic) { + public ByteOverflowIntrinsic(FunctionIntrinsicWithReceiverComputed underlyingIntrinsic) { this.underlyingIntrinsic = underlyingIntrinsic; } @NotNull @Override public JsExpression apply( - @Nullable JsExpression receiver, @NotNull List arguments, @NotNull TranslationContext context + @Nullable JsExpression receiver, + @NotNull List arguments, + @NotNull TranslationContext context ) { return JsAstUtils.toByte(underlyingIntrinsic.apply(receiver, arguments, context)); } } @NotNull - private static final FunctionIntrinsic NUMBER_INC_INTRINSIC = new FunctionIntrinsic() { + private static final FunctionIntrinsicWithReceiverComputed NUMBER_INC_INTRINSIC = new FunctionIntrinsicWithReceiverComputed() { @NotNull @Override public JsExpression apply( @Nullable JsExpression receiver, - @NotNull List arguments, + @NotNull List arguments, @NotNull TranslationContext context ) { assert receiver != null; @@ -137,12 +144,12 @@ public enum PrimitiveUnaryOperationFIF implements FunctionIntrinsicFactory { }; @NotNull - private static final FunctionIntrinsic NUMBER_DEC_INTRINSIC = new FunctionIntrinsic() { + private static final FunctionIntrinsicWithReceiverComputed NUMBER_DEC_INTRINSIC = new FunctionIntrinsicWithReceiverComputed() { @NotNull @Override public JsExpression apply( @Nullable JsExpression receiver, - @NotNull List arguments, + @NotNull List arguments, @NotNull TranslationContext context ) { assert receiver != null; @@ -151,7 +158,7 @@ public enum PrimitiveUnaryOperationFIF implements FunctionIntrinsicFactory { } }; - private static abstract class UnaryOperationInstrinsicBase extends FunctionIntrinsic { + private static abstract class UnaryOperationInstrinsicBase extends FunctionIntrinsicWithReceiverComputed { @NotNull public abstract JsExpression doApply(@NotNull JsExpression receiver, @NotNull TranslationContext context); @@ -159,7 +166,7 @@ public enum PrimitiveUnaryOperationFIF implements FunctionIntrinsicFactory { @Override public JsExpression apply( @Nullable JsExpression receiver, - @NotNull List arguments, + @NotNull List arguments, @NotNull TranslationContext context ) { assert receiver != null; @@ -277,11 +284,11 @@ public enum PrimitiveUnaryOperationFIF implements FunctionIntrinsicFactory { } final JsUnaryOperator finalJsOperator = jsOperator; - return new FunctionIntrinsic() { + return new FunctionIntrinsicWithReceiverComputed() { @NotNull @Override public JsExpression apply(@Nullable JsExpression receiver, - @NotNull List arguments, + @NotNull List arguments, @NotNull TranslationContext context) { assert receiver != null; assert arguments.size() == 0 : "Unary operator should not have arguments."; diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/functions/factories/TopLevelFIF.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/functions/factories/TopLevelFIF.java index 3ab22459212..45d36c5f4fb 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/functions/factories/TopLevelFIF.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/functions/factories/TopLevelFIF.java @@ -28,6 +28,7 @@ import org.jetbrains.kotlin.js.translate.callTranslator.CallInfo; import org.jetbrains.kotlin.js.translate.callTranslator.CallInfoExtensionsKt; import org.jetbrains.kotlin.js.translate.context.TranslationContext; import org.jetbrains.kotlin.js.translate.intrinsic.functions.basic.FunctionIntrinsic; +import org.jetbrains.kotlin.js.translate.intrinsic.functions.basic.FunctionIntrinsicWithReceiverComputed; import org.jetbrains.kotlin.js.translate.utils.JsAstUtils; import org.jetbrains.kotlin.js.translate.utils.UtilsKt; import org.jetbrains.kotlin.resolve.DescriptorFactory; @@ -39,7 +40,6 @@ import java.util.Map; import static org.jetbrains.kotlin.builtins.KotlinBuiltIns.FQ_NAMES; import static org.jetbrains.kotlin.js.patterns.PatternBuilder.pattern; -import static org.jetbrains.kotlin.js.translate.intrinsic.functions.basic.FunctionIntrinsic.CallParametersAwareFunctionIntrinsic; public final class TopLevelFIF extends CompositeFIF { public static final DescriptorPredicate EQUALS_IN_ANY = pattern("kotlin", "Any", "equals"); @@ -48,7 +48,8 @@ public final class TopLevelFIF extends CompositeFIF { @NotNull @Override public JsExpression apply( - @NotNull CallInfo callInfo, @NotNull List arguments, @NotNull TranslationContext context + @NotNull CallInfo callInfo, + @NotNull List arguments, @NotNull TranslationContext context ) { if (CallInfoExtensionsKt.isSuperInvocation(callInfo)) { JsExpression dispatchReceiver = callInfo.getDispatchReceiver(); @@ -72,12 +73,12 @@ public final class TopLevelFIF extends CompositeFIF { private static final KotlinFunctionIntrinsic KOTLIN_HASH_CODE = new KotlinFunctionIntrinsic("hashCode"); @NotNull - private static final FunctionIntrinsic RETURN_RECEIVER_INTRINSIC = new FunctionIntrinsic() { + private static final FunctionIntrinsic RETURN_RECEIVER_INTRINSIC = new FunctionIntrinsicWithReceiverComputed() { @NotNull @Override public JsExpression apply( @Nullable JsExpression receiver, - @NotNull List arguments, + @NotNull List arguments, @NotNull TranslationContext context ) { assert receiver != null; @@ -86,7 +87,7 @@ public final class TopLevelFIF extends CompositeFIF { }; - private static final JsExpression getReferenceToOnlyTypeParameter( + private static JsExpression getReferenceToOnlyTypeParameter( @NotNull CallInfo callInfo, @NotNull TranslationContext context ) { ResolvedCall resolvedCall = callInfo.getResolvedCall(); @@ -102,26 +103,22 @@ public final class TopLevelFIF extends CompositeFIF { @NotNull @Override public JsExpression apply( - @NotNull CallInfo callInfo, @NotNull List arguments, @NotNull TranslationContext context + @NotNull CallInfo callInfo, + @NotNull List arguments, + @NotNull TranslationContext context ) { return getReferenceToOnlyTypeParameter(callInfo, context); } - - @NotNull - @Override - public JsExpression apply( - @Nullable JsExpression receiver, @NotNull List arguments, @NotNull TranslationContext context - ) { - throw new IllegalStateException(); - } }; - private static final FunctionIntrinsic ENUM_VALUES_INTRINSIC = new CallParametersAwareFunctionIntrinsic() { + private static final FunctionIntrinsic ENUM_VALUES_INTRINSIC = new FunctionIntrinsic() { @NotNull @Override public JsExpression apply( - @NotNull CallInfo callInfo, @NotNull List arguments, @NotNull TranslationContext context + @NotNull CallInfo callInfo, + @NotNull List arguments, + @NotNull TranslationContext context ) { JsExpression enumClassRef = getReferenceToOnlyTypeParameter(callInfo, context); @@ -132,11 +129,13 @@ public final class TopLevelFIF extends CompositeFIF { }; - private static final FunctionIntrinsic ENUM_VALUE_OF_INTRINSIC = new CallParametersAwareFunctionIntrinsic() { + private static final FunctionIntrinsic ENUM_VALUE_OF_INTRINSIC = new FunctionIntrinsic() { @NotNull @Override public JsExpression apply( - @NotNull CallInfo callInfo, @NotNull List arguments, @NotNull TranslationContext context + @NotNull CallInfo callInfo, + @NotNull List arguments, + @NotNull TranslationContext context ) { JsExpression arg = arguments.get(2); // The first two are reified parameters diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/operation/IntrinsicIncrementTranslator.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/operation/IntrinsicIncrementTranslator.java index b06e261f09a..5eb02303b16 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/operation/IntrinsicIncrementTranslator.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/operation/IntrinsicIncrementTranslator.java @@ -19,6 +19,8 @@ package org.jetbrains.kotlin.js.translate.operation; import org.jetbrains.annotations.NotNull; import org.jetbrains.kotlin.descriptors.FunctionDescriptor; import org.jetbrains.kotlin.js.backend.ast.JsExpression; +import org.jetbrains.kotlin.js.translate.callTranslator.CallInfo; +import org.jetbrains.kotlin.js.translate.callTranslator.CallInfoKt; import org.jetbrains.kotlin.js.translate.context.TranslationContext; import org.jetbrains.kotlin.js.translate.intrinsic.functions.basic.FunctionIntrinsic; import org.jetbrains.kotlin.psi.KtUnaryExpression; @@ -32,8 +34,7 @@ public final class IntrinsicIncrementTranslator extends IncrementTranslator { @NotNull private final ResolvedCall resolvedCall; - public IntrinsicIncrementTranslator(@NotNull KtUnaryExpression expression, - @NotNull TranslationContext context) { + public IntrinsicIncrementTranslator(@NotNull KtUnaryExpression expression, @NotNull TranslationContext context) { super(expression, context); this.resolvedCall = CallUtilKt.getFunctionResolvedCallWithAssert(expression, context.bindingContext()); } @@ -42,6 +43,7 @@ public final class IntrinsicIncrementTranslator extends IncrementTranslator { @NotNull protected JsExpression operationExpression(@NotNull JsExpression receiver) { FunctionIntrinsic intrinsic = context().intrinsics().getFunctionIntrinsic(resolvedCall.getResultingDescriptor()); - return intrinsic.apply(receiver, Collections.emptyList(), context()); + CallInfo callInfo = CallInfoKt.getCallInfo(context(), resolvedCall, receiver); + return intrinsic.apply(callInfo, Collections.emptyList(), context()); } } diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/TranslationUtils.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/TranslationUtils.java index 39facf9349c..4fbf490d6d1 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/TranslationUtils.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/TranslationUtils.java @@ -251,7 +251,10 @@ public final class TranslationUtils { } @NotNull - public static List generateInvocationArguments(@NotNull JsExpression receiver, @NotNull List arguments) { + public static List generateInvocationArguments( + @NotNull JsExpression receiver, + @NotNull List arguments + ) { List argumentList = new ArrayList(1 + arguments.size()); argumentList.add(receiver); argumentList.addAll(arguments);