From 49c09ef43eb3d85553c03b3c0c47daaa8dcd4bf8 Mon Sep 17 00:00:00 2001 From: Pavel Talanov Date: Tue, 31 Jan 2012 18:48:45 +0400 Subject: [PATCH] added array intrinsic declaration and reannotated intrinsic receiver to be Nullable instead of NotNull --- .idea/workspace.xml | 869 ++++++++++++++---- .../k2js/translate/intrinsic/Intrinsic.java | 3 +- .../k2js/translate/intrinsic/Intrinsics.java | 15 + .../intrinsic/array/ArrayGetIntrinsic.java | 17 +- .../array/ArrayNullConstructorIntrinsic.java | 3 +- .../intrinsic/array/ArraySetIntrinsic.java | 4 +- .../intrinsic/array/IntrinsicArrayUtils.java | 2 + .../PrimitiveBinaryOperationIntrinsic.java | 3 +- .../PrimitiveCompareToIntrinsic.java | 3 +- .../primitive/PrimitiveEqualsIntrinsic.java | 3 +- .../primitive/PrimitiveRangeToIntrinsic.java | 3 +- .../PrimitiveUnaryOperationIntrinsic.java | 4 +- .../intrinsic/string/LengthIntrinsic.java | 4 +- .../intrinsic/tuple/TupleAccessIntrinsic.java | 3 +- .../translate/reference/CallTranslator.java | 1 - 15 files changed, 714 insertions(+), 223 deletions(-) diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 85f139460c7..33ef73ecd68 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -12,30 +12,22 @@ - - - - - - - + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + @@ -79,6 +71,21 @@ + + + + - + @@ -159,16 +166,25 @@ - + - + - + + + + + + + + + + @@ -219,108 +235,95 @@ - - - - - - - - - - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - - - - - - - - - - - - + - - + + - - - - + + - - + + - + + + + + + + + + + @@ -351,22 +354,22 @@ @@ -593,6 +596,228 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - @@ -765,7 +990,37 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -1078,6 +1483,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1451,114 +1912,114 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + diff --git a/translator/src/org/jetbrains/k2js/translate/intrinsic/Intrinsic.java b/translator/src/org/jetbrains/k2js/translate/intrinsic/Intrinsic.java index 806e166ad73..87c65543580 100644 --- a/translator/src/org/jetbrains/k2js/translate/intrinsic/Intrinsic.java +++ b/translator/src/org/jetbrains/k2js/translate/intrinsic/Intrinsic.java @@ -2,6 +2,7 @@ package org.jetbrains.k2js.translate.intrinsic; import com.google.dart.compiler.backend.js.ast.JsExpression; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jetbrains.k2js.translate.context.TranslationContext; import java.util.List; @@ -12,6 +13,6 @@ import java.util.List; public interface Intrinsic { @NotNull - JsExpression apply(@NotNull JsExpression receiver, @NotNull List arguments, + JsExpression apply(@Nullable JsExpression receiver, @NotNull List arguments, @NotNull TranslationContext context); } diff --git a/translator/src/org/jetbrains/k2js/translate/intrinsic/Intrinsics.java b/translator/src/org/jetbrains/k2js/translate/intrinsic/Intrinsics.java index 753d1458c1b..b87d830fbd2 100644 --- a/translator/src/org/jetbrains/k2js/translate/intrinsic/Intrinsics.java +++ b/translator/src/org/jetbrains/k2js/translate/intrinsic/Intrinsics.java @@ -7,6 +7,9 @@ import org.jetbrains.jet.lang.resolve.scopes.JetScope; import org.jetbrains.jet.lang.types.JetStandardClasses; import org.jetbrains.jet.lang.types.JetStandardLibrary; import org.jetbrains.jet.lexer.JetToken; +import org.jetbrains.k2js.translate.intrinsic.array.ArrayGetIntrinsic; +import org.jetbrains.k2js.translate.intrinsic.array.ArrayNullConstructorIntrinsic; +import org.jetbrains.k2js.translate.intrinsic.array.ArraySetIntrinsic; import org.jetbrains.k2js.translate.intrinsic.primitive.*; import org.jetbrains.k2js.translate.intrinsic.string.LengthIntrinsic; import org.jetbrains.k2js.translate.intrinsic.tuple.TupleAccessIntrinsic; @@ -17,6 +20,7 @@ import java.util.HashMap; import java.util.Map; import static org.jetbrains.jet.lang.types.expressions.OperatorConventions.*; +import static org.jetbrains.k2js.translate.utils.DescriptorUtils.getFunctionByName; import static org.jetbrains.k2js.translate.utils.DescriptorUtils.getPropertyByName; /** @@ -48,6 +52,17 @@ public final class Intrinsics { declareOperatorIntrinsics(); declareStringIntrinsics(); declareTuplesIntrinsics(); + declareArrayIntrinsics(); + } + + private void declareArrayIntrinsics() { + JetScope arrayMemberScope = library.getArray().getDefaultType().getMemberScope(); + FunctionDescriptor setFunction = getFunctionByName(arrayMemberScope, "set"); + functionIntrinsics.put(setFunction, ArraySetIntrinsic.INSTANCE); + FunctionDescriptor getFunction = getFunctionByName(arrayMemberScope, "get"); + functionIntrinsics.put(getFunction, ArrayGetIntrinsic.INSTANCE); + FunctionDescriptor nullArrayConstructor = getFunctionByName(library.getLibraryScope(), "Array"); + functionIntrinsics.put(nullArrayConstructor, ArrayNullConstructorIntrinsic.INSTANCE); } private void declareTuplesIntrinsics() { diff --git a/translator/src/org/jetbrains/k2js/translate/intrinsic/array/ArrayGetIntrinsic.java b/translator/src/org/jetbrains/k2js/translate/intrinsic/array/ArrayGetIntrinsic.java index bd126fe6593..4efd7f83fb4 100644 --- a/translator/src/org/jetbrains/k2js/translate/intrinsic/array/ArrayGetIntrinsic.java +++ b/translator/src/org/jetbrains/k2js/translate/intrinsic/array/ArrayGetIntrinsic.java @@ -1,10 +1,9 @@ package org.jetbrains.k2js.translate.intrinsic.array; -import com.google.dart.compiler.backend.js.ast.JsConditional; +import com.google.dart.compiler.backend.js.ast.JsArrayAccess; import com.google.dart.compiler.backend.js.ast.JsExpression; -import com.google.dart.compiler.util.AstUtil; import org.jetbrains.annotations.NotNull; -import org.jetbrains.k2js.translate.context.TemporaryVariable; +import org.jetbrains.annotations.Nullable; import org.jetbrains.k2js.translate.context.TranslationContext; import org.jetbrains.k2js.translate.intrinsic.FunctionIntrinsic; @@ -19,13 +18,15 @@ public enum ArrayGetIntrinsic implements FunctionIntrinsic { @NotNull @Override - public JsExpression apply(@NotNull JsExpression receiver, @NotNull List arguments, + public JsExpression apply(@Nullable JsExpression receiver, @NotNull List arguments, @NotNull TranslationContext context) { + assert receiver != null; assert arguments.size() == 1 : "Array get expression must have one argument."; JsExpression indexExpression = arguments.get(0); - TemporaryVariable arrayExpression = context.declareTemporary(receiver); - JsConditional indexInBoundsCheck = - IntrinsicArrayUtils.indexInBoundsCheck(indexExpression, arrayExpression, context); - return AstUtil.newSequence(arrayExpression.assignmentExpression(), AstUtil.newArrayAccess(receiver, indexExpression)); +// TemporaryVariable arrayExpression = context.declareTemporary(receiver); +// JsConditional indexInBoundsCheck = +// IntrinsicArrayUtils.indexInBoundsCheck(indexExpression, arrayExpression, context); +// return AstUtil.newSequence(arrayExpression.assignmentExpression(), AstUtil.newArrayAccess(receiver, indexExpression)); + return new JsArrayAccess(receiver, indexExpression); } } diff --git a/translator/src/org/jetbrains/k2js/translate/intrinsic/array/ArrayNullConstructorIntrinsic.java b/translator/src/org/jetbrains/k2js/translate/intrinsic/array/ArrayNullConstructorIntrinsic.java index cceb150f38a..227bb15d611 100644 --- a/translator/src/org/jetbrains/k2js/translate/intrinsic/array/ArrayNullConstructorIntrinsic.java +++ b/translator/src/org/jetbrains/k2js/translate/intrinsic/array/ArrayNullConstructorIntrinsic.java @@ -3,6 +3,7 @@ package org.jetbrains.k2js.translate.intrinsic.array; import com.google.dart.compiler.backend.js.ast.JsArrayLiteral; import com.google.dart.compiler.backend.js.ast.JsExpression; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jetbrains.k2js.translate.context.TranslationContext; import org.jetbrains.k2js.translate.intrinsic.FunctionIntrinsic; @@ -18,7 +19,7 @@ public enum ArrayNullConstructorIntrinsic implements FunctionIntrinsic { //TODO: implement function passing to array constructor @NotNull @Override - public JsExpression apply(@NotNull JsExpression receiver, @NotNull List arguments, + public JsExpression apply(@Nullable JsExpression receiver, @NotNull List arguments, @NotNull TranslationContext context) { return new JsArrayLiteral(); } diff --git a/translator/src/org/jetbrains/k2js/translate/intrinsic/array/ArraySetIntrinsic.java b/translator/src/org/jetbrains/k2js/translate/intrinsic/array/ArraySetIntrinsic.java index 053dbfda9ce..5aea42f62ed 100644 --- a/translator/src/org/jetbrains/k2js/translate/intrinsic/array/ArraySetIntrinsic.java +++ b/translator/src/org/jetbrains/k2js/translate/intrinsic/array/ArraySetIntrinsic.java @@ -4,6 +4,7 @@ import com.google.dart.compiler.backend.js.ast.JsArrayAccess; import com.google.dart.compiler.backend.js.ast.JsExpression; import com.google.dart.compiler.util.AstUtil; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jetbrains.k2js.translate.context.TranslationContext; import org.jetbrains.k2js.translate.intrinsic.FunctionIntrinsic; @@ -18,8 +19,9 @@ public enum ArraySetIntrinsic implements FunctionIntrinsic { @NotNull @Override - public JsExpression apply(@NotNull JsExpression receiver, @NotNull List arguments, + public JsExpression apply(@Nullable JsExpression receiver, @NotNull List arguments, @NotNull TranslationContext context) { + assert receiver != null; assert arguments.size() == 2 : "Array set expression must have two arguments."; JsExpression indexExpression = arguments.get(0); JsExpression value = arguments.get(1); diff --git a/translator/src/org/jetbrains/k2js/translate/intrinsic/array/IntrinsicArrayUtils.java b/translator/src/org/jetbrains/k2js/translate/intrinsic/array/IntrinsicArrayUtils.java index dab49e8ef57..fcea8f81319 100644 --- a/translator/src/org/jetbrains/k2js/translate/intrinsic/array/IntrinsicArrayUtils.java +++ b/translator/src/org/jetbrains/k2js/translate/intrinsic/array/IntrinsicArrayUtils.java @@ -8,6 +8,8 @@ import org.jetbrains.k2js.translate.context.TranslationContext; import static org.jetbrains.k2js.translate.utils.TranslationUtils.zeroLiteral; +//TODO: decide if needed + /** * @author Pavel Talanov */ diff --git a/translator/src/org/jetbrains/k2js/translate/intrinsic/primitive/PrimitiveBinaryOperationIntrinsic.java b/translator/src/org/jetbrains/k2js/translate/intrinsic/primitive/PrimitiveBinaryOperationIntrinsic.java index dd69fd1e9b1..8d2921cb6f2 100644 --- a/translator/src/org/jetbrains/k2js/translate/intrinsic/primitive/PrimitiveBinaryOperationIntrinsic.java +++ b/translator/src/org/jetbrains/k2js/translate/intrinsic/primitive/PrimitiveBinaryOperationIntrinsic.java @@ -4,6 +4,7 @@ import com.google.dart.compiler.backend.js.ast.JsBinaryOperation; import com.google.dart.compiler.backend.js.ast.JsBinaryOperator; import com.google.dart.compiler.backend.js.ast.JsExpression; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lexer.JetToken; import org.jetbrains.k2js.translate.context.TranslationContext; import org.jetbrains.k2js.translate.intrinsic.FunctionIntrinsic; @@ -31,7 +32,7 @@ public final class PrimitiveBinaryOperationIntrinsic implements FunctionIntrinsi @NotNull @Override - public JsExpression apply(@NotNull JsExpression receiver, @NotNull List arguments, + public JsExpression apply(@Nullable JsExpression receiver, @NotNull List arguments, @NotNull TranslationContext context) { assert arguments.size() == 1 : "Binary operator should have a receiver and one argument"; return new JsBinaryOperation(operator, receiver, arguments.get(0)); diff --git a/translator/src/org/jetbrains/k2js/translate/intrinsic/primitive/PrimitiveCompareToIntrinsic.java b/translator/src/org/jetbrains/k2js/translate/intrinsic/primitive/PrimitiveCompareToIntrinsic.java index 2628ac1bf32..1abd199c217 100644 --- a/translator/src/org/jetbrains/k2js/translate/intrinsic/primitive/PrimitiveCompareToIntrinsic.java +++ b/translator/src/org/jetbrains/k2js/translate/intrinsic/primitive/PrimitiveCompareToIntrinsic.java @@ -4,6 +4,7 @@ import com.google.dart.compiler.backend.js.ast.JsBinaryOperation; import com.google.dart.compiler.backend.js.ast.JsBinaryOperator; import com.google.dart.compiler.backend.js.ast.JsExpression; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jetbrains.k2js.translate.context.TranslationContext; import org.jetbrains.k2js.translate.intrinsic.CompareToIntrinsic; import org.jetbrains.k2js.translate.operation.OperatorTable; @@ -24,7 +25,7 @@ public final class PrimitiveCompareToIntrinsic extends CompareToIntrinsic { } @NotNull - public JsExpression apply(@NotNull JsExpression receiver, @NotNull List arguments, + public JsExpression apply(@Nullable JsExpression receiver, @NotNull List arguments, @NotNull TranslationContext context) { assert arguments.size() == 1 : "Equals operation should have one argument"; JsBinaryOperator operator = OperatorTable.getBinaryOperator(getComparisonToken()); diff --git a/translator/src/org/jetbrains/k2js/translate/intrinsic/primitive/PrimitiveEqualsIntrinsic.java b/translator/src/org/jetbrains/k2js/translate/intrinsic/primitive/PrimitiveEqualsIntrinsic.java index 1a5fbefcfe4..d5f66844e1d 100644 --- a/translator/src/org/jetbrains/k2js/translate/intrinsic/primitive/PrimitiveEqualsIntrinsic.java +++ b/translator/src/org/jetbrains/k2js/translate/intrinsic/primitive/PrimitiveEqualsIntrinsic.java @@ -3,6 +3,7 @@ package org.jetbrains.k2js.translate.intrinsic.primitive; import com.google.dart.compiler.backend.js.ast.JsExpression; import com.google.dart.compiler.util.AstUtil; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jetbrains.k2js.translate.context.TranslationContext; import org.jetbrains.k2js.translate.intrinsic.EqualsIntrinsic; @@ -22,7 +23,7 @@ public final class PrimitiveEqualsIntrinsic extends EqualsIntrinsic { } @NotNull - public JsExpression apply(@NotNull JsExpression receiver, @NotNull List arguments, + public JsExpression apply(@Nullable JsExpression receiver, @NotNull List arguments, @NotNull TranslationContext context) { assert arguments.size() == 1 : "Equals operation should have one argument"; if (isNegated()) { diff --git a/translator/src/org/jetbrains/k2js/translate/intrinsic/primitive/PrimitiveRangeToIntrinsic.java b/translator/src/org/jetbrains/k2js/translate/intrinsic/primitive/PrimitiveRangeToIntrinsic.java index e8257abc7ed..3d22b008487 100644 --- a/translator/src/org/jetbrains/k2js/translate/intrinsic/primitive/PrimitiveRangeToIntrinsic.java +++ b/translator/src/org/jetbrains/k2js/translate/intrinsic/primitive/PrimitiveRangeToIntrinsic.java @@ -6,6 +6,7 @@ import com.google.dart.compiler.backend.js.ast.JsExpression; import com.google.dart.compiler.backend.js.ast.JsNew; import com.google.dart.compiler.util.AstUtil; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jetbrains.k2js.translate.context.TranslationContext; import org.jetbrains.k2js.translate.intrinsic.FunctionIntrinsic; @@ -27,7 +28,7 @@ public final class PrimitiveRangeToIntrinsic implements FunctionIntrinsic { @NotNull @Override - public JsExpression apply(@NotNull JsExpression rangeStart, @NotNull List arguments, + public JsExpression apply(@Nullable JsExpression rangeStart, @NotNull List arguments, @NotNull TranslationContext context) { assert arguments.size() == 1 : "RangeTo must have one argument."; JsExpression rangeEnd = arguments.get(0); diff --git a/translator/src/org/jetbrains/k2js/translate/intrinsic/primitive/PrimitiveUnaryOperationIntrinsic.java b/translator/src/org/jetbrains/k2js/translate/intrinsic/primitive/PrimitiveUnaryOperationIntrinsic.java index c3b586cad2e..e2bc6a372de 100644 --- a/translator/src/org/jetbrains/k2js/translate/intrinsic/primitive/PrimitiveUnaryOperationIntrinsic.java +++ b/translator/src/org/jetbrains/k2js/translate/intrinsic/primitive/PrimitiveUnaryOperationIntrinsic.java @@ -4,6 +4,7 @@ import com.google.dart.compiler.backend.js.ast.JsExpression; import com.google.dart.compiler.backend.js.ast.JsPrefixOperation; import com.google.dart.compiler.backend.js.ast.JsUnaryOperator; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lexer.JetToken; import org.jetbrains.k2js.translate.context.TranslationContext; import org.jetbrains.k2js.translate.intrinsic.FunctionIntrinsic; @@ -31,8 +32,9 @@ public final class PrimitiveUnaryOperationIntrinsic implements FunctionIntrinsic @NotNull @Override - public JsExpression apply(@NotNull JsExpression receiver, @NotNull List arguments, + public JsExpression apply(@Nullable JsExpression receiver, @NotNull List arguments, @NotNull TranslationContext context) { + assert receiver != null; assert arguments.size() == 0 : "Unary operator should not have arguments."; //NOTE: cannot use this for increment/decrement return new JsPrefixOperation(operator, receiver); diff --git a/translator/src/org/jetbrains/k2js/translate/intrinsic/string/LengthIntrinsic.java b/translator/src/org/jetbrains/k2js/translate/intrinsic/string/LengthIntrinsic.java index 5e731d7d76a..cf7b35dda19 100644 --- a/translator/src/org/jetbrains/k2js/translate/intrinsic/string/LengthIntrinsic.java +++ b/translator/src/org/jetbrains/k2js/translate/intrinsic/string/LengthIntrinsic.java @@ -5,6 +5,7 @@ import com.google.dart.compiler.backend.js.ast.JsExpression; import com.google.dart.compiler.backend.js.ast.JsNameRef; import com.google.dart.compiler.util.AstUtil; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jetbrains.k2js.translate.context.TranslationContext; import org.jetbrains.k2js.translate.intrinsic.FunctionIntrinsic; @@ -19,8 +20,9 @@ public enum LengthIntrinsic implements FunctionIntrinsic { @NotNull @Override - public JsExpression apply(@NotNull JsExpression receiver, @NotNull List arguments, + public JsExpression apply(@Nullable JsExpression receiver, @NotNull List arguments, @NotNull TranslationContext context) { + assert receiver != null; assert arguments.isEmpty() : "Length expression must have zero arguments."; //TODO: provide better way JsNameRef lengthProperty = AstUtil.newQualifiedNameRef("length"); diff --git a/translator/src/org/jetbrains/k2js/translate/intrinsic/tuple/TupleAccessIntrinsic.java b/translator/src/org/jetbrains/k2js/translate/intrinsic/tuple/TupleAccessIntrinsic.java index afb08b5dee3..29c51a818cf 100644 --- a/translator/src/org/jetbrains/k2js/translate/intrinsic/tuple/TupleAccessIntrinsic.java +++ b/translator/src/org/jetbrains/k2js/translate/intrinsic/tuple/TupleAccessIntrinsic.java @@ -3,6 +3,7 @@ package org.jetbrains.k2js.translate.intrinsic.tuple; import com.google.dart.compiler.backend.js.ast.JsExpression; import com.google.dart.compiler.util.AstUtil; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jetbrains.k2js.translate.context.TranslationContext; import org.jetbrains.k2js.translate.intrinsic.FunctionIntrinsic; @@ -21,7 +22,7 @@ public final class TupleAccessIntrinsic implements FunctionIntrinsic { @NotNull @Override - public JsExpression apply(@NotNull JsExpression receiver, @NotNull List arguments, + public JsExpression apply(@Nullable JsExpression receiver, @NotNull List arguments, @NotNull TranslationContext context) { assert arguments.isEmpty() : "Tuple access expression should not have any arguments."; return AstUtil.newArrayAccess(receiver, context.program().getNumberLiteral(elementIndex)); diff --git a/translator/src/org/jetbrains/k2js/translate/reference/CallTranslator.java b/translator/src/org/jetbrains/k2js/translate/reference/CallTranslator.java index 2605dbdd24e..009d92fcb9a 100644 --- a/translator/src/org/jetbrains/k2js/translate/reference/CallTranslator.java +++ b/translator/src/org/jetbrains/k2js/translate/reference/CallTranslator.java @@ -296,7 +296,6 @@ public final class CallTranslator extends AbstractTranslator { FunctionIntrinsic functionIntrinsic = context().intrinsics().getFunctionIntrinsic((FunctionDescriptor) descriptor); JsExpression receiverExpression = thisObject(); - assert receiverExpression != null : "Intrinsic function should have a receiver."; return functionIntrinsic.apply(receiverExpression, arguments, context()); }