refactoring intrinsics
This commit is contained in:
@@ -23,7 +23,6 @@ public final class StringTemplateTranslator extends AbstractTranslator {
|
|||||||
return (new StringTemplateTranslator(expression, context).translate());
|
return (new StringTemplateTranslator(expression, context).translate());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
private final JetStringTemplateExpression expression;
|
private final JetStringTemplateExpression expression;
|
||||||
|
|
||||||
|
|||||||
-39
@@ -1,39 +0,0 @@
|
|||||||
package org.jetbrains.k2js.translate.intrinsic;
|
|
||||||
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
|
||||||
import org.jetbrains.annotations.Nullable;
|
|
||||||
import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
|
|
||||||
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
|
|
||||||
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptorVisitor;
|
|
||||||
import org.jetbrains.jet.lang.descriptors.FunctionDescriptor;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Talanov Pavel
|
|
||||||
*/
|
|
||||||
public final class IntrinsicDeclarationVisitor extends DeclarationDescriptorVisitor<Void, Void> {
|
|
||||||
|
|
||||||
@NotNull
|
|
||||||
private final Intrinsics intrinsics;
|
|
||||||
|
|
||||||
/*package*/ IntrinsicDeclarationVisitor(@NotNull Intrinsics intrinsics) {
|
|
||||||
this.intrinsics = intrinsics;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Void visitClassDescriptor(@NotNull ClassDescriptor descriptor, @Nullable Void nothing) {
|
|
||||||
for (DeclarationDescriptor memberDescriptor :
|
|
||||||
descriptor.getDefaultType().getMemberScope().getAllDescriptors()) {
|
|
||||||
//noinspection NullableProblems
|
|
||||||
memberDescriptor.accept(this, null);
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Void visitFunctionDescriptor(@NotNull FunctionDescriptor descriptor, @Nullable Void nothing) {
|
|
||||||
if (!intrinsics.isIntrinsic(descriptor)) {
|
|
||||||
intrinsics.declareOperatorIntrinsic(descriptor);
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,7 +1,10 @@
|
|||||||
package org.jetbrains.k2js.translate.intrinsic;
|
package org.jetbrains.k2js.translate.intrinsic;
|
||||||
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
|
||||||
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
|
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
|
||||||
|
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptorVisitor;
|
||||||
import org.jetbrains.jet.lang.descriptors.FunctionDescriptor;
|
import org.jetbrains.jet.lang.descriptors.FunctionDescriptor;
|
||||||
import org.jetbrains.jet.lang.types.JetStandardLibrary;
|
import org.jetbrains.jet.lang.types.JetStandardLibrary;
|
||||||
import org.jetbrains.jet.lexer.JetToken;
|
import org.jetbrains.jet.lexer.JetToken;
|
||||||
@@ -50,7 +53,7 @@ public final class Intrinsics {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void declareOperatorIntrinsics() {
|
private void declareOperatorIntrinsics() {
|
||||||
IntrinsicDeclarationVisitor visitor = new IntrinsicDeclarationVisitor(this);
|
IntrinsicDeclarationVisitor visitor = new IntrinsicDeclarationVisitor();
|
||||||
for (DeclarationDescriptor descriptor : library.getLibraryScope().getAllDescriptors()) {
|
for (DeclarationDescriptor descriptor : library.getLibraryScope().getAllDescriptors()) {
|
||||||
//noinspection NullableProblems
|
//noinspection NullableProblems
|
||||||
descriptor.accept(visitor, null);
|
descriptor.accept(visitor, null);
|
||||||
@@ -69,56 +72,6 @@ public final class Intrinsics {
|
|||||||
functionIntrinsics.put(setFunction, ArraySetIntrinsic.INSTANCE);
|
functionIntrinsics.put(setFunction, ArraySetIntrinsic.INSTANCE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*package*/ void declareOperatorIntrinsic(@NotNull FunctionDescriptor descriptor) {
|
|
||||||
addCompareToIntrinsics(descriptor);
|
|
||||||
addEqualsIntrinsics(descriptor);
|
|
||||||
addUnaryIntrinsics(descriptor);
|
|
||||||
addBinaryIntrinsics(descriptor);
|
|
||||||
addRangeToIntrinsics(descriptor);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void addRangeToIntrinsics(@NotNull FunctionDescriptor descriptor) {
|
|
||||||
String functionName = descriptor.getName();
|
|
||||||
if (functionName.equals("rangeTo")) {
|
|
||||||
functionIntrinsics.put(descriptor, PrimitiveRangeToIntrinsic.newInstance());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void addCompareToIntrinsics(@NotNull FunctionDescriptor descriptor) {
|
|
||||||
String functionName = descriptor.getName();
|
|
||||||
if (functionName.equals(COMPARE_TO)) {
|
|
||||||
compareToIntrinsics.put(descriptor, PrimitiveCompareToIntrinsic.newInstance());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void addEqualsIntrinsics(@NotNull FunctionDescriptor descriptor) {
|
|
||||||
String functionName = descriptor.getName();
|
|
||||||
if (functionName.equals(EQUALS)) {
|
|
||||||
equalsIntrinsics.put(descriptor, PrimitiveEqualsIntrinsic.newInstance());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void addUnaryIntrinsics(@NotNull FunctionDescriptor descriptor) {
|
|
||||||
String functionName = descriptor.getName();
|
|
||||||
JetToken token = UNARY_OPERATION_NAMES.inverse().get(functionName);
|
|
||||||
if (token == null) return;
|
|
||||||
boolean isUnary = !DescriptorUtils.hasParameters(descriptor);
|
|
||||||
if (!isUnary) return;
|
|
||||||
functionIntrinsics.put(descriptor, PrimitiveUnaryOperationIntrinsic.newInstance(token));
|
|
||||||
}
|
|
||||||
|
|
||||||
//TODO: refactor
|
|
||||||
private void addBinaryIntrinsics(@NotNull FunctionDescriptor descriptor) {
|
|
||||||
String functionName = descriptor.getName();
|
|
||||||
boolean isUnary = !DescriptorUtils.hasParameters(descriptor);
|
|
||||||
if (isUnary) return;
|
|
||||||
JetToken token = BINARY_OPERATION_NAMES.inverse().get(functionName);
|
|
||||||
if (token == null) return;
|
|
||||||
//TODO: implement contains intrinsic
|
|
||||||
if (!OperatorTable.hasCorrespondingBinaryOperator(token)) return;
|
|
||||||
functionIntrinsics.put(descriptor, PrimitiveBinaryOperationIntrinsic.newInstance(token));
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isIntrinsic(@NotNull DeclarationDescriptor descriptor) {
|
public boolean isIntrinsic(@NotNull DeclarationDescriptor descriptor) {
|
||||||
//NOTE: that if we want to add other intrinsics we have to modify this method
|
//NOTE: that if we want to add other intrinsics we have to modify this method
|
||||||
if (descriptor instanceof FunctionDescriptor) {
|
if (descriptor instanceof FunctionDescriptor) {
|
||||||
@@ -144,4 +97,72 @@ public final class Intrinsics {
|
|||||||
public EqualsIntrinsic getEqualsIntrinsic(@NotNull FunctionDescriptor descriptor) {
|
public EqualsIntrinsic getEqualsIntrinsic(@NotNull FunctionDescriptor descriptor) {
|
||||||
return equalsIntrinsics.get(descriptor.getOriginal());
|
return equalsIntrinsics.get(descriptor.getOriginal());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private final class IntrinsicDeclarationVisitor extends DeclarationDescriptorVisitor<Void, Void> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Void visitClassDescriptor(@NotNull ClassDescriptor descriptor, @Nullable Void nothing) {
|
||||||
|
for (DeclarationDescriptor memberDescriptor :
|
||||||
|
descriptor.getDefaultType().getMemberScope().getAllDescriptors()) {
|
||||||
|
//noinspection NullableProblems
|
||||||
|
memberDescriptor.accept(this, null);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Void visitFunctionDescriptor(@NotNull FunctionDescriptor descriptor, @Nullable Void nothing) {
|
||||||
|
if (!isIntrinsic(descriptor)) {
|
||||||
|
declareOperatorIntrinsic(descriptor);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*package*/ void declareOperatorIntrinsic(@NotNull FunctionDescriptor descriptor) {
|
||||||
|
tryResolveAsEqualsCompareToOrRangeToIntrinsic(descriptor);
|
||||||
|
tryResolveAsUnaryIntrinsics(descriptor);
|
||||||
|
tryResolveAsBinaryIntrinsics(descriptor);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void tryResolveAsEqualsCompareToOrRangeToIntrinsic(@NotNull FunctionDescriptor descriptor) {
|
||||||
|
String functionName = descriptor.getName();
|
||||||
|
if (functionName.equals(COMPARE_TO)) {
|
||||||
|
compareToIntrinsics.put(descriptor, PrimitiveCompareToIntrinsic.newInstance());
|
||||||
|
}
|
||||||
|
if (functionName.equals(EQUALS)) {
|
||||||
|
equalsIntrinsics.put(descriptor, PrimitiveEqualsIntrinsic.newInstance());
|
||||||
|
}
|
||||||
|
if (functionName.equals("rangeTo")) {
|
||||||
|
functionIntrinsics.put(descriptor, PrimitiveRangeToIntrinsic.newInstance());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void tryResolveAsUnaryIntrinsics(@NotNull FunctionDescriptor descriptor) {
|
||||||
|
String functionName = descriptor.getName();
|
||||||
|
JetToken token = UNARY_OPERATION_NAMES.inverse().get(functionName);
|
||||||
|
|
||||||
|
if (token == null) return;
|
||||||
|
if (!isUnaryOperation(descriptor)) return;
|
||||||
|
|
||||||
|
functionIntrinsics.put(descriptor, PrimitiveUnaryOperationIntrinsic.newInstance(token));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void tryResolveAsBinaryIntrinsics(@NotNull FunctionDescriptor descriptor) {
|
||||||
|
String functionName = descriptor.getName();
|
||||||
|
|
||||||
|
if (isUnaryOperation(descriptor)) return;
|
||||||
|
|
||||||
|
JetToken token = BINARY_OPERATION_NAMES.inverse().get(functionName);
|
||||||
|
if (token == null) return;
|
||||||
|
|
||||||
|
if (!OperatorTable.hasCorrespondingBinaryOperator(token)) return;
|
||||||
|
functionIntrinsics.put(descriptor, PrimitiveBinaryOperationIntrinsic.newInstance(token));
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isUnaryOperation(@NotNull FunctionDescriptor descriptor) {
|
||||||
|
return !DescriptorUtils.hasParameters(descriptor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
+6
-6
@@ -37,6 +37,12 @@ public final class BinaryOperationTranslator extends AbstractTranslator {
|
|||||||
return (new BinaryOperationTranslator(expression, context).translate());
|
return (new BinaryOperationTranslator(expression, context).translate());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
private final JetBinaryExpression expression;
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
private final FunctionDescriptor operationDescriptor;
|
||||||
|
|
||||||
private BinaryOperationTranslator(@NotNull JetBinaryExpression expression,
|
private BinaryOperationTranslator(@NotNull JetBinaryExpression expression,
|
||||||
@NotNull TranslationContext context) {
|
@NotNull TranslationContext context) {
|
||||||
super(context);
|
super(context);
|
||||||
@@ -45,12 +51,6 @@ public final class BinaryOperationTranslator extends AbstractTranslator {
|
|||||||
getFunctionDescriptorForOperationExpression(context().bindingContext(), expression);
|
getFunctionDescriptorForOperationExpression(context().bindingContext(), expression);
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
|
||||||
private final JetBinaryExpression expression;
|
|
||||||
|
|
||||||
@Nullable
|
|
||||||
private final FunctionDescriptor operationDescriptor;
|
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
private JsExpression translate() {
|
private JsExpression translate() {
|
||||||
if (isAssignmentOperator(expression)) {
|
if (isAssignmentOperator(expression)) {
|
||||||
|
|||||||
@@ -45,9 +45,6 @@ public final class CompareToTranslator extends AbstractTranslator {
|
|||||||
@NotNull
|
@NotNull
|
||||||
private final JetBinaryExpression expression;
|
private final JetBinaryExpression expression;
|
||||||
|
|
||||||
@NotNull
|
|
||||||
private final JetToken operationToken;
|
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
private final FunctionDescriptor descriptor;
|
private final FunctionDescriptor descriptor;
|
||||||
|
|
||||||
@@ -59,8 +56,7 @@ public final class CompareToTranslator extends AbstractTranslator {
|
|||||||
getFunctionDescriptorForOperationExpression(context.bindingContext(), expression);
|
getFunctionDescriptorForOperationExpression(context.bindingContext(), expression);
|
||||||
assert functionDescriptor != null : "CompareTo should always have a descriptor";
|
assert functionDescriptor != null : "CompareTo should always have a descriptor";
|
||||||
this.descriptor = functionDescriptor;
|
this.descriptor = functionDescriptor;
|
||||||
this.operationToken = getOperationToken(expression);
|
assert (OperatorConventions.COMPARISON_OPERATIONS.contains(getOperationToken(expression)));
|
||||||
assert (OperatorConventions.COMPARISON_OPERATIONS.contains(operationToken));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
@@ -73,7 +69,7 @@ public final class CompareToTranslator extends AbstractTranslator {
|
|||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
private JsExpression overloadedCompareTo() {
|
private JsExpression overloadedCompareTo() {
|
||||||
JsBinaryOperator correspondingOperator = OperatorTable.getBinaryOperator(operationToken);
|
JsBinaryOperator correspondingOperator = OperatorTable.getBinaryOperator(getOperationToken(expression));
|
||||||
JsExpression methodCall = CallTranslator.translate(expression, context());
|
JsExpression methodCall = CallTranslator.translate(expression, context());
|
||||||
return new JsBinaryOperation(correspondingOperator, methodCall, TranslationUtils.zeroLiteral(context()));
|
return new JsBinaryOperation(correspondingOperator, methodCall, TranslationUtils.zeroLiteral(context()));
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user