JS: refactor FunctionIntrinsic
This commit is contained in:
-47
@@ -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);
|
||||
}
|
||||
}
|
||||
+2
-2
@@ -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.";
|
||||
|
||||
-84
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
+45
@@ -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
|
||||
}
|
||||
}
|
||||
+29
@@ -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
|
||||
}
|
||||
+2
-2
@@ -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) {
|
||||
|
||||
+7
-6
@@ -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.";
|
||||
|
||||
+1
-2
@@ -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();
|
||||
|
||||
+3
-3
@@ -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());
|
||||
|
||||
+3
-1
@@ -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)
|
||||
|
||||
+3
-3
@@ -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!!)
|
||||
}
|
||||
}
|
||||
|
||||
+3
-2
@@ -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;
|
||||
|
||||
+27
-20
@@ -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.";
|
||||
|
||||
+17
-18
@@ -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
|
||||
|
||||
|
||||
+5
-3
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user