JS: refactor FunctionIntrinsic

This commit is contained in:
Alexey Andreev
2016-12-28 18:10:27 +03:00
parent 0a9c536c01
commit c565697e77
16 changed files with 151 additions and 194 deletions
@@ -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<JsExpression> arguments,
@NotNull TranslationContext context
) {
assert receiver != null;
return new JsInvocation(JsAstUtils.pureFqn(functionName, receiver), arguments);
}
}
@@ -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<JsExpression> arguments,
public JsExpression apply(@Nullable JsExpression receiver, @NotNull List<? extends JsExpression> arguments,
@NotNull TranslationContext context) {
assert receiver != null;
assert arguments.isEmpty() : "Properties can't have arguments.";
@@ -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<JsExpression> 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<JsExpression> arguments,
@NotNull TranslationContext context) {
return apply(getThisOrReceiverOrNull(callInfo), arguments, context);
}
@NotNull
public abstract JsExpression apply(@Nullable JsExpression receiver,
@NotNull List<JsExpression> 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<JsExpression> arguments,
@NotNull TranslationContext context
) {
throw new IllegalStateException();
}
}
}
@@ -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<JsExpression>, 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<JsExpression>, context: TranslationContext) =
throw UnsupportedOperationException("FunctionIntrinsic#NO_INTRINSIC_#apply")
}
@JvmStatic
protected fun getThisOrReceiverOrNull(callInfo: CallInfo): JsExpression? =
callInfo.dispatchReceiver ?: callInfo.extensionReceiver
}
}
@@ -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<JsExpression>, context: TranslationContext): JsExpression {
return apply(getThisOrReceiverOrNull(callInfo), arguments, context)
}
abstract fun apply(receiver: JsExpression?, arguments: List<JsExpression>, context: TranslationContext): JsExpression
}
@@ -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<JsExpression>, context: TranslationContext): JsExpression {
override fun apply(receiver: JsExpression?, arguments: List<JsExpression>, context: TranslationContext): JsExpression {
val packageName = (rangeTypeDescriptor.containingDeclaration as PackageFragmentDescriptor).fqName
val packageDescriptor = context.currentModule.getPackage(packageName)
val existingClasses = packageDescriptor.memberScope.getContributedDescriptors(DescriptorKindFilter.CLASSIFIERS) {
@@ -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<JsExpression> arguments,
@NotNull List<? extends JsExpression> 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<JsExpression> arguments,
@NotNull List<? extends JsExpression> 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<JsExpression> arguments,
@NotNull List<? extends JsExpression> arguments,
@NotNull TranslationContext context) {
assert receiver != null;
assert arguments.size() == 2 : "Array set expression must have two arguments.";
@@ -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<Pair<Predicate<FunctionDescriptor>, FunctionIntrinsic>> patternsAndIntrinsics = Lists.newArrayList();
@@ -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<JsExpression> arguments,
@NotNull List<? extends JsExpression> arguments,
@NotNull TranslationContext context
) {
JsExpression function = JsAstUtils.pureFqn(functionName, Namer.kotlinObject());
@@ -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<JsExpression>, context: TranslationContext): JsExpression {
assert(receiver != null)
assert(arguments.size == 1)
@@ -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<JsExpression>, context: TranslationContext): JsExpression {
assert(receiver != null)
assert(arguments.size == 0)
assert(arguments.isEmpty())
return applyFun(receiver!!)
}
}
@@ -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<JsExpression> arguments,
@NotNull List<? extends JsExpression> arguments,
@NotNull TranslationContext context) {
assert receiver != null;
assert arguments.size() == 1;
@@ -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<JsExpression> arguments, @NotNull TranslationContext context
@Nullable JsExpression receiver,
@NotNull List<? extends JsExpression> 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<JsExpression> arguments, @NotNull TranslationContext context
@Nullable JsExpression receiver,
@NotNull List<? extends JsExpression> 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<JsExpression> arguments, @NotNull TranslationContext context
@Nullable JsExpression receiver,
@NotNull List<? extends JsExpression> 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<JsExpression> arguments,
@NotNull List<? extends JsExpression> 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<JsExpression> arguments,
@NotNull List<? extends JsExpression> 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<JsExpression> arguments,
@NotNull List<? extends JsExpression> 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<JsExpression> arguments,
@NotNull List<? extends JsExpression> arguments,
@NotNull TranslationContext context) {
assert receiver != null;
assert arguments.size() == 0 : "Unary operator should not have arguments.";
@@ -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<JsExpression> arguments, @NotNull TranslationContext context
@NotNull CallInfo callInfo,
@NotNull List<? extends JsExpression> 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<JsExpression> arguments,
@NotNull List<? extends JsExpression> 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<? extends CallableDescriptor> resolvedCall = callInfo.getResolvedCall();
@@ -102,26 +103,22 @@ public final class TopLevelFIF extends CompositeFIF {
@NotNull
@Override
public JsExpression apply(
@NotNull CallInfo callInfo, @NotNull List<JsExpression> arguments, @NotNull TranslationContext context
@NotNull CallInfo callInfo,
@NotNull List<? extends JsExpression> arguments,
@NotNull TranslationContext context
) {
return getReferenceToOnlyTypeParameter(callInfo, context);
}
@NotNull
@Override
public JsExpression apply(
@Nullable JsExpression receiver, @NotNull List<JsExpression> 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<JsExpression> arguments, @NotNull TranslationContext context
@NotNull CallInfo callInfo,
@NotNull List<? extends JsExpression> 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<JsExpression> arguments, @NotNull TranslationContext context
@NotNull CallInfo callInfo,
@NotNull List<? extends JsExpression> arguments,
@NotNull TranslationContext context
) {
JsExpression arg = arguments.get(2); // The first two are reified parameters
@@ -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<? extends FunctionDescriptor> 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.<JsExpression>emptyList(), context());
CallInfo callInfo = CallInfoKt.getCallInfo(context(), resolvedCall, receiver);
return intrinsic.apply(callInfo, Collections.<JsExpression>emptyList(), context());
}
}
@@ -251,7 +251,10 @@ public final class TranslationUtils {
}
@NotNull
public static List<JsExpression> generateInvocationArguments(@NotNull JsExpression receiver, @NotNull List<JsExpression> arguments) {
public static List<JsExpression> generateInvocationArguments(
@NotNull JsExpression receiver,
@NotNull List<? extends JsExpression> arguments
) {
List<JsExpression> argumentList = new ArrayList<JsExpression>(1 + arguments.size());
argumentList.add(receiver);
argumentList.addAll(arguments);