diff --git a/.idea/modules.xml b/.idea/modules.xml
index a7eb64f9ca7..c9d9f6c088f 100644
--- a/.idea/modules.xml
+++ b/.idea/modules.xml
@@ -6,6 +6,7 @@
+
diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index 071fe3c2f83..7234e15e999 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -7,11 +7,58 @@
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+
+
+
@@ -42,6 +89,60 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -81,96 +182,94 @@
-
+
-
-
+
+
-
+
-
-
+
+
-
+
-
-
+
+
-
+
-
-
+
+
-
+
-
-
+
+
-
+
-
-
+
+
-
+
-
-
+
+
-
+
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
+
+
-
+
+
+
+
+
+
+
+
+
+
@@ -180,101 +279,94 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
-
-
-
+
+
-
+
-
-
+
+
-
+
-
-
+
+
-
+
-
-
+
+
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -300,22 +392,22 @@
@@ -405,20 +497,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -465,7 +543,11 @@
-
+
+
+
+
+
@@ -479,7 +561,139 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -517,7 +731,7 @@
-
+
@@ -527,30 +741,26 @@
-
+
-
+
+
+
+
+
-
+
-
-
-
-
-
-
-
-
-
-
+
+
@@ -562,6 +772,7 @@
+
@@ -573,118 +784,27 @@
-
-
+
+
+
+
+
+
-
-
-
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
@@ -751,6 +871,92 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -809,6 +1015,17 @@
+
+
+
+
+
+
+
+
+
+
+
@@ -835,23 +1052,12 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
localhost
@@ -907,7 +1113,7 @@
-
+
@@ -924,13 +1130,13 @@
-
-
+
+
-
+
@@ -969,7 +1175,7 @@
-
+
@@ -982,7 +1188,6 @@
-
@@ -1007,6 +1212,7 @@
+
@@ -1016,119 +1222,116 @@
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -1150,7 +1353,7 @@
- Android
+ No facets are configured
@@ -1162,7 +1365,7 @@
- guava-10.0.1
+ asm-util-3.3.1
@@ -1174,7 +1377,7 @@
- 1.6
+ IDEA IC-110.408
@@ -1186,7 +1389,7 @@
- js
+ frontend.java
diff --git a/examples/jetTests.iml b/examples/jetTests.iml
new file mode 100644
index 00000000000..be9f52c5cfd
--- /dev/null
+++ b/examples/jetTests.iml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/test/ExampleTestSuite.java b/examples/test/ExampleTestSuite.java
new file mode 100644
index 00000000000..9274155c810
--- /dev/null
+++ b/examples/test/ExampleTestSuite.java
@@ -0,0 +1,34 @@
+import com.intellij.testFramework.UsefulTestCase;
+import junit.framework.Test;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.k2js.test.ExampleTest;
+
+public final class ExampleTestSuite extends UsefulTestCase {
+
+ private String name;
+ private ExampleTest tester = new ExampleTest();
+
+ public ExampleTestSuite(String name) {
+ this.name = name;
+ }
+
+ @Override
+ public String getName() {
+ return name;
+ }
+
+ public void runTest() throws Exception {
+ tester.runBoxTest(getName());
+ }
+
+ public static Test suite() {
+ return JetTestCaseBuilder.suiteForDirectory("translator",
+ "/testFiles/examples/cases/", true, new JetTestCaseBuilder.NamedTestFactory() {
+ @NotNull
+ @Override
+ public Test createTest(@NotNull String dataPath, @NotNull String name) {
+ return (new ExampleTestSuite(name));
+ }
+ });
+ }
+}
diff --git a/examples/test/JetTestCaseBuilder.java b/examples/test/JetTestCaseBuilder.java
new file mode 100644
index 00000000000..eb8b79857af
--- /dev/null
+++ b/examples/test/JetTestCaseBuilder.java
@@ -0,0 +1,86 @@
+import junit.framework.Test;
+import junit.framework.TestSuite;
+import org.jetbrains.annotations.NotNull;
+
+import java.io.File;
+import java.io.FileFilter;
+import java.io.FilenameFilter;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * @author abreslav
+ */
+public abstract class JetTestCaseBuilder {
+ public static FilenameFilter emptyFilter = new FilenameFilter() {
+ @Override
+ public boolean accept(File file, String name) {
+ return true;
+ }
+ };
+
+ public interface NamedTestFactory {
+ @NotNull
+ Test createTest(@NotNull String dataPath, @NotNull String name);
+ }
+
+ @NotNull
+ public static TestSuite suiteForDirectory(String baseDataDir, @NotNull final String dataPath, boolean recursive, @NotNull NamedTestFactory factory) {
+ return suiteForDirectory(baseDataDir, dataPath, recursive, emptyFilter, factory);
+ }
+
+ @NotNull
+ public static TestSuite suiteForDirectory(String baseDataDir, @NotNull final String dataPath, boolean recursive, final FilenameFilter filter, @NotNull NamedTestFactory factory) {
+ TestSuite suite = new TestSuite(dataPath);
+ appendTestsInDirectory(baseDataDir, dataPath, recursive, filter, factory, suite);
+ return suite;
+ }
+
+ public static void appendTestsInDirectory(String baseDataDir, String dataPath, boolean recursive,
+ final FilenameFilter filter, NamedTestFactory factory, TestSuite suite) {
+ final String extensionJet = ".jet";
+ final String extensionKt = ".kt";
+ final FilenameFilter extensionFilter = new FilenameFilter() {
+ @Override
+ public boolean accept(File dir, String name) {
+ return name.endsWith(extensionJet) || name.endsWith(extensionKt);
+ }
+ };
+ FilenameFilter resultFilter;
+ if (filter != emptyFilter) {
+ resultFilter = new FilenameFilter() {
+ @Override
+ public boolean accept(File file, String s) {
+ return extensionFilter.accept(file, s) && filter.accept(file, s);
+ }
+ };
+ } else {
+ resultFilter = extensionFilter;
+ }
+ File dir = new File(baseDataDir + dataPath);
+ FileFilter dirFilter = new FileFilter() {
+ @Override
+ public boolean accept(File pathname) {
+ return pathname.isDirectory();
+ }
+ };
+ if (recursive) {
+ File[] files = dir.listFiles(dirFilter);
+ assert files != null : dir;
+ List subdirs = Arrays.asList(files);
+ Collections.sort(subdirs);
+ for (File subdir : subdirs) {
+ suite.addTest(suiteForDirectory(baseDataDir, dataPath + "/" + subdir.getName(), recursive, filter, factory));
+ }
+ }
+ List files = Arrays.asList(dir.listFiles(resultFilter));
+ Collections.sort(files);
+ for (File file : files) {
+ String fileName = file.getName();
+ assert fileName != null;
+ String extension = fileName.endsWith(extensionJet) ? extensionJet : extensionKt;
+ suite.addTest(factory.createTest(dataPath, fileName));
+ }
+ }
+}
diff --git a/jetTests/test/ExampleTestSuite.java b/jetTests/test/ExampleTestSuite.java
new file mode 100644
index 00000000000..288d42b3743
--- /dev/null
+++ b/jetTests/test/ExampleTestSuite.java
@@ -0,0 +1,33 @@
+import junit.framework.Test;
+import org.jetbrains.annotations.NonNls;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.jet.JetLiteFixture;
+
+
+public final class ExampleTestSuite extends JetLiteFixture {
+ private String name;
+
+ public ExampleTestSuite(@NonNls String dataPath, String name) {
+ this.name = name;
+ }
+
+ public String getName() {
+ return "test" + name;
+ }
+
+ public void runTest() throws Exception {
+
+ }
+
+
+ public static Test suite() {
+ return JetTestCaseBuilder.suiteForDirectory(JetTestCaseBuilder.getTestDataPathBase(),
+ "/checkerWithErrorTypes/quick", true, new JetTestCaseBuilder.NamedTestFactory() {
+ @NotNull
+ @Override
+ public Test createTest(@NotNull String dataPath, @NotNull String name) {
+ return (new ExampleTestSuite(dataPath, name));
+ }
+ });
+ }
+}
diff --git a/translator/lib/asm-util-3.3.1.jar b/translator/lib/asm-util-3.3.1.jar
new file mode 100644
index 00000000000..0230bbcfb71
Binary files /dev/null and b/translator/lib/asm-util-3.3.1.jar differ
diff --git a/translator/src/org/jetbrains/k2js/translate/declaration/PropertyTranslator.java b/translator/src/org/jetbrains/k2js/translate/declaration/PropertyTranslator.java
index fb4f5d50dc5..8abe4a6126d 100644
--- a/translator/src/org/jetbrains/k2js/translate/declaration/PropertyTranslator.java
+++ b/translator/src/org/jetbrains/k2js/translate/declaration/PropertyTranslator.java
@@ -7,7 +7,6 @@ import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.PropertyDescriptor;
import org.jetbrains.jet.lang.descriptors.PropertyGetterDescriptor;
import org.jetbrains.jet.lang.descriptors.PropertySetterDescriptor;
-import org.jetbrains.jet.lang.psi.JetExpression;
import org.jetbrains.jet.lang.psi.JetProperty;
import org.jetbrains.jet.lang.psi.JetPropertyAccessor;
import org.jetbrains.k2js.translate.general.AbstractTranslator;
@@ -139,20 +138,6 @@ public final class PropertyTranslator extends AbstractTranslator {
@NotNull
private JsPropertyInitializer translateCustomAccessor(@NotNull JetPropertyAccessor expression) {
- JsFunction methodBody = translateCustomAccessorBody(expression);
- // we know that custom getters and setters always have their descriptors
- return AstUtil.newNamedMethod(context().getNameForElement(expression), methodBody);
+ return Translation.functionTranslator(expression, context()).translateAsMethod();
}
-
- @NotNull
- private JsFunction translateCustomAccessorBody(@NotNull JetPropertyAccessor expression) {
- JsFunction methodBody = JsFunction.getAnonymousFunctionWithScope(context().getScopeForElement(expression));
- JetExpression bodyExpression = expression.getBodyExpression();
- assert bodyExpression != null : "Custom accessor should have a body.";
- JsBlock methodBodyBlock = AstUtil.convertToBlock(
- Translation.translateExpression(bodyExpression, context().newPropertyAccess(expression)));
- methodBody.setBody(methodBodyBlock);
- return methodBody;
- }
-
}
diff --git a/translator/src/org/jetbrains/k2js/translate/expression/FunctionTranslator.java b/translator/src/org/jetbrains/k2js/translate/expression/FunctionTranslator.java
index 79a17e4bd2c..c83b04f6fd3 100644
--- a/translator/src/org/jetbrains/k2js/translate/expression/FunctionTranslator.java
+++ b/translator/src/org/jetbrains/k2js/translate/expression/FunctionTranslator.java
@@ -17,16 +17,18 @@ import java.util.List;
public final class FunctionTranslator extends AbstractTranslator {
@NotNull
- private final JetFunction functionDeclaration;
+ private final JetDeclarationWithBody functionDeclaration;
@NotNull
private final JsFunction functionObject;
@NotNull
- public static FunctionTranslator newInstance(@NotNull JetFunction function, @NotNull TranslationContext context) {
+ public static FunctionTranslator newInstance(@NotNull JetDeclarationWithBody function,
+ @NotNull TranslationContext context) {
return new FunctionTranslator(function, context);
}
- private FunctionTranslator(@NotNull JetFunction functionDeclaration, @NotNull TranslationContext context) {
+ private FunctionTranslator(@NotNull JetDeclarationWithBody functionDeclaration,
+ @NotNull TranslationContext context) {
super(context);
this.functionDeclaration = functionDeclaration;
this.functionObject = createFunctionObject();
@@ -34,7 +36,8 @@ public final class FunctionTranslator extends AbstractTranslator {
@NotNull
public JsPropertyInitializer translateAsMethod() {
- JsName functionName = context().getNameForElement(functionDeclaration);
+ assert functionDeclaration instanceof JetElement;
+ JsName functionName = context().getNameForElement((JetElement) functionDeclaration);
JsFunction function = generateFunctionObject();
return new JsPropertyInitializer(functionName.makeRef(), function);
}
@@ -53,16 +56,25 @@ public final class FunctionTranslator extends AbstractTranslator {
}
private JsFunction createFunctionObject() {
- if (functionDeclaration instanceof JetNamedFunction) {
+ if (isDeclaration()) {
return JsFunction.getAnonymousFunctionWithScope
- (context().getScopeForElement(functionDeclaration));
+ (context().getScopeForElement((JetDeclaration) functionDeclaration));
}
- if (functionDeclaration instanceof JetFunctionLiteral) {
+ if (isLiteral()) {
return new JsFunction(context().enclosingScope());
}
throw new AssertionError("Unsupported type of functionDeclaration.");
}
+ private boolean isLiteral() {
+ return functionDeclaration instanceof JetFunctionLiteral;
+ }
+
+ private boolean isDeclaration() {
+ return (functionDeclaration instanceof JetNamedFunction) ||
+ (functionDeclaration instanceof JetPropertyAccessor);
+ }
+
@NotNull
private JsBlock translateBody() {
JetExpression jetBodyExpression = functionDeclaration.getBodyExpression();
@@ -101,7 +113,10 @@ public final class FunctionTranslator extends AbstractTranslator {
if (functionDeclaration instanceof JetNamedFunction) {
return context().newFunctionDeclaration((JetNamedFunction) functionDeclaration);
}
- if (functionDeclaration instanceof JetFunctionLiteral) {
+ if (functionDeclaration instanceof JetPropertyAccessor) {
+ return context().newPropertyAccess((JetPropertyAccessor) functionDeclaration);
+ }
+ if (isLiteral()) {
return context().newEnclosingScope(functionObject.getScope());
}
throw new AssertionError("Unsupported type of functionDeclaration.");
diff --git a/translator/src/org/jetbrains/k2js/translate/general/Translation.java b/translator/src/org/jetbrains/k2js/translate/general/Translation.java
index 2b5459b8930..71215e2aec8 100644
--- a/translator/src/org/jetbrains/k2js/translate/general/Translation.java
+++ b/translator/src/org/jetbrains/k2js/translate/general/Translation.java
@@ -26,7 +26,7 @@ import org.jetbrains.k2js.translate.reference.ReferenceTranslator;
public final class Translation {
@NotNull
- static public FunctionTranslator functionTranslator(@NotNull JetFunction function,
+ static public FunctionTranslator functionTranslator(@NotNull JetDeclarationWithBody function,
@NotNull TranslationContext context) {
return FunctionTranslator.newInstance(function, context);
}
diff --git a/translator/test/org/jetbrains/k2js/test/ConditionalTest.java b/translator/test/org/jetbrains/k2js/test/ConditionalTest.java
index a7124ad6923..449d869a16e 100644
--- a/translator/test/org/jetbrains/k2js/test/ConditionalTest.java
+++ b/translator/test/org/jetbrains/k2js/test/ConditionalTest.java
@@ -6,6 +6,7 @@ import org.junit.Test;
* @author Talanov Pavel
*/
public class ConditionalTest extends AbstractExpressionTest {
+
final private static String MAIN = "conditional/";
@Override
diff --git a/translator/test/org/jetbrains/k2js/test/ExampleTest.java b/translator/test/org/jetbrains/k2js/test/ExampleTest.java
new file mode 100644
index 00000000000..fc974b05737
--- /dev/null
+++ b/translator/test/org/jetbrains/k2js/test/ExampleTest.java
@@ -0,0 +1,18 @@
+package org.jetbrains.k2js.test;
+
+/**
+ * @author Talanov Pavel
+ */
+public final class ExampleTest extends TranslationTest {
+
+ final private static String MAIN = "examples/";
+
+ @Override
+ protected String mainDirectory() {
+ return MAIN;
+ }
+
+ public void runBoxTest(String filename) throws Exception {
+ testFunctionOutput(filename, "Anonymous", "box", "OK");
+ }
+}
diff --git a/translator/test/org/jetbrains/k2js/test/KotlinLibTest.java b/translator/test/org/jetbrains/k2js/test/KotlinLibTest.java
index c9805a8358f..f2bfc45db9d 100644
--- a/translator/test/org/jetbrains/k2js/test/KotlinLibTest.java
+++ b/translator/test/org/jetbrains/k2js/test/KotlinLibTest.java
@@ -76,6 +76,8 @@ public class KotlinLibTest extends TranslationTest {
new RhinoPropertyTypesChecker("foo", propertyToType));
}
+ //
+ // TODO:Refactor calls to function result checker with test
@Test
public void namespaceHasDeclaredFunction() throws Exception {
runRhinoTest(Arrays.asList(kotlinLibraryPath(), cases("namespace.js")),
diff --git a/translator/test/org/jetbrains/k2js/test/TranslationTest.java b/translator/test/org/jetbrains/k2js/test/TranslationTest.java
index 7cbad97c0aa..f17ac30dc28 100644
--- a/translator/test/org/jetbrains/k2js/test/TranslationTest.java
+++ b/translator/test/org/jetbrains/k2js/test/TranslationTest.java
@@ -14,7 +14,7 @@ import java.util.List;
*/
public abstract class TranslationTest {
- final protected static String TEST_FILES = "testFiles/";
+ final protected static String TEST_FILES = "translator/testFiles/";
final private static String CASES = "cases/";
final private static String OUT = "out/";
final private static String KOTLIN_JS_LIB = TEST_FILES + "kotlin_lib.js";
diff --git a/translator/testFiles/examples/cases/closureWithParameter.jet b/translator/testFiles/examples/cases/closureWithParameter.jet
new file mode 100644
index 00000000000..0c556d628c1
--- /dev/null
+++ b/translator/testFiles/examples/cases/closureWithParameter.jet
@@ -0,0 +1,7 @@
+fun box() : String {
+ return apply( "OK", {(arg: String) => arg } )
+}
+
+fun apply(arg : String, f : fun (p:String) : String) : String {
+ return f(arg)
+}
diff --git a/translator/testFiles/examples/cases/closureWithParameterAndBoxing.jet b/translator/testFiles/examples/cases/closureWithParameterAndBoxing.jet
new file mode 100644
index 00000000000..6d0a4ffa658
--- /dev/null
+++ b/translator/testFiles/examples/cases/closureWithParameterAndBoxing.jet
@@ -0,0 +1,7 @@
+fun box() : String {
+ return if (apply( 5, {(arg: Int) => arg + 13 } ) == 18) "OK" else "fail"
+}
+
+fun apply(arg : Int, f : fun (p:Int) : Int) : Int {
+ return f(arg)
+}
diff --git a/translator/testFiles/examples/cases/diamondInheritance.jet b/translator/testFiles/examples/cases/diamondInheritance.jet
new file mode 100644
index 00000000000..210aecafedc
--- /dev/null
+++ b/translator/testFiles/examples/cases/diamondInheritance.jet
@@ -0,0 +1,24 @@
+// Changed when traits were introduced. May not make sense any more
+
+open class Base() {
+ public var v : Int = 0
+}
+
+open class Left() : Base() {}
+trait Right : Base {}
+
+class D() : Left(), Right
+
+fun vl(l : Left) : Int = l.v
+fun vr(r : Right) : Int = r.v
+
+fun box() : String {
+ val d = D()
+ d.v = 42
+
+ if (d.v != 42) return "Fail #1"
+ if (vl(d) != 42) return "Fail #2"
+ if (vr(d) != 42) return "Fail #3"
+
+ return "OK"
+}
\ No newline at end of file
diff --git a/translator/testFiles/examples/cases/doubleEnclosedLocalVariable.jet b/translator/testFiles/examples/cases/doubleEnclosedLocalVariable.jet
new file mode 100644
index 00000000000..d8e5ea789f2
--- /dev/null
+++ b/translator/testFiles/examples/cases/doubleEnclosedLocalVariable.jet
@@ -0,0 +1,8 @@
+fun box() : String {
+ val cl = 39
+ return if (sum(200, { val ff = {cl}; ff() }) == 239) "OK" else "FAIL"
+}
+
+fun sum(arg:Int, f : fun () : Int) : Int {
+ return arg + f()
+}
diff --git a/translator/testFiles/examples/cases/enclosingLocalVariable.jet b/translator/testFiles/examples/cases/enclosingLocalVariable.jet
new file mode 100644
index 00000000000..d2dbe243469
--- /dev/null
+++ b/translator/testFiles/examples/cases/enclosingLocalVariable.jet
@@ -0,0 +1,8 @@
+fun box() : String {
+ val cl = 39
+ return if (sum(200, { val m = { val r = { cl }; r() }; m() }) == 239) "OK" else "FAIL"
+}
+
+fun sum(arg:Int, f : fun () : Int) : Int {
+ return arg + f()
+}
diff --git a/translator/testFiles/examples/cases/funDelegation.jet b/translator/testFiles/examples/cases/funDelegation.jet
new file mode 100644
index 00000000000..10a1f408b09
--- /dev/null
+++ b/translator/testFiles/examples/cases/funDelegation.jet
@@ -0,0 +1,17 @@
+open class Base() {
+ fun n(n : Int) : Int = n + 1
+}
+
+trait Abstract {}
+
+class Derived1() : Base(), Abstract {}
+class Derived2() : Abstract, Base() {}
+
+fun test(s : Base) : Boolean = s.n(238) == 239
+
+fun box() : String {
+ if (!test(Base())) return "Fail #1"
+ if (!test(Derived1())) return "Fail #2"
+ if (!test(Derived2())) return "Fail #3"
+ return "OK"
+}
\ No newline at end of file
diff --git a/translator/testFiles/examples/cases/initializerBlock.jet b/translator/testFiles/examples/cases/initializerBlock.jet
new file mode 100644
index 00000000000..c89deeda87d
--- /dev/null
+++ b/translator/testFiles/examples/cases/initializerBlock.jet
@@ -0,0 +1,13 @@
+class C() {
+ public var f: Int
+
+ {
+ $f = 610
+ }
+}
+
+fun box(): String {
+ val c = C()
+ if (c.f != 610) return "fail"
+ return "OK"
+}
diff --git a/translator/testFiles/examples/cases/kt242.jet b/translator/testFiles/examples/cases/kt242.jet
new file mode 100644
index 00000000000..4e2de93cff3
--- /dev/null
+++ b/translator/testFiles/examples/cases/kt242.jet
@@ -0,0 +1,19 @@
+fun box() : String {
+ val i: Int? = 7
+ val j: Int? = null
+ val k = 7
+
+ //verify errors
+ if (i == 7) {}
+ if (7 == i) {}
+
+ if (j == 7) {}
+ if (7 == j) {}
+
+ if (i == k) {}
+ if (k == i) {}
+
+ if (j == k) {}
+ if (k == j) {}
+ return "OK"
+}
\ No newline at end of file
diff --git a/translator/testFiles/examples/cases/newInstanceDefaultConstructor.jet b/translator/testFiles/examples/cases/newInstanceDefaultConstructor.jet
new file mode 100644
index 00000000000..6cd0ebd954b
--- /dev/null
+++ b/translator/testFiles/examples/cases/newInstanceDefaultConstructor.jet
@@ -0,0 +1,11 @@
+class SimpleClass() {
+ fun foo() = 610
+}
+
+fun box() : String {
+ val c = SimpleClass()
+ if (c.foo() == 610) {
+ return "OK"
+ }
+ return "FAIL"
+}
diff --git a/translator/testFiles/examples/cases/propertyDelegation.jet b/translator/testFiles/examples/cases/propertyDelegation.jet
new file mode 100644
index 00000000000..614c624f124
--- /dev/null
+++ b/translator/testFiles/examples/cases/propertyDelegation.jet
@@ -0,0 +1,33 @@
+open class Base() {
+ val plain = 239
+ public val read : Int
+ get() = 239
+
+ public var readwrite : Int = 0
+ get() = $readwrite + 1
+ set(n : Int) {
+ $readwrite = n
+ }
+}
+
+trait Abstract {}
+
+class Derived1() : Base(), Abstract {}
+class Derived2() : Abstract, Base() {}
+
+fun code(s : Base) : Int {
+ if (s.plain != 239) return 1
+ if (s.read != 239) return 2
+ s.readwrite = 238
+ if (s.readwrite != 239) return 3
+ return 0
+}
+
+fun test(s : Base) : Boolean = code(s) == 0
+
+fun box() : String {
+ if (!test(Base())) return "Fail #1"
+ if (!test(Derived1())) return "Fail #2"
+ if (!test(Derived2())) return "Fail #3"
+ return "OK"
+}
\ No newline at end of file
diff --git a/translator/testFiles/examples/cases/rightHandOverride.jet b/translator/testFiles/examples/cases/rightHandOverride.jet
new file mode 100644
index 00000000000..e99e60bd863
--- /dev/null
+++ b/translator/testFiles/examples/cases/rightHandOverride.jet
@@ -0,0 +1,20 @@
+// Changed when traits were introduced. May not make sense any more
+
+trait Left {}
+open class Right() {
+ open fun f() = 42
+}
+
+class D() : Left, Right() {
+ override fun f() = 239
+}
+
+fun box() : String {
+ val r : Right = Right()
+ val d : D = D()
+
+ if (r.f() != 42) return "Fail #1"
+ if (d.f() != 239) return "Fail #2"
+
+ return "OK"
+}
\ No newline at end of file
diff --git a/translator/testFiles/examples/cases/simplestClosure.jet b/translator/testFiles/examples/cases/simplestClosure.jet
new file mode 100644
index 00000000000..c851416e4f1
--- /dev/null
+++ b/translator/testFiles/examples/cases/simplestClosure.jet
@@ -0,0 +1,7 @@
+fun box() : String {
+ return invoker( {"OK"} )
+}
+
+fun invoker(gen : fun () : String) : String {
+ return gen()
+}
diff --git a/translator/testFiles/examples/cases/simplestClosureAndBoxing.jet b/translator/testFiles/examples/cases/simplestClosureAndBoxing.jet
new file mode 100644
index 00000000000..8e3bedb2f37
--- /dev/null
+++ b/translator/testFiles/examples/cases/simplestClosureAndBoxing.jet
@@ -0,0 +1,7 @@
+fun box() : String {
+ return if (int_invoker( { 7 } ) == 7) "OK" else "fail"
+}
+
+fun int_invoker(gen : fun () : Int) : Int {
+ return gen()
+}
diff --git a/translator/testFiles/sortedTests/failed/enclosingThis.jet b/translator/testFiles/sortedTests/failed/enclosingThis.jet
new file mode 100644
index 00000000000..93ae48c580f
--- /dev/null
+++ b/translator/testFiles/sortedTests/failed/enclosingThis.jet
@@ -0,0 +1,12 @@
+class Point(val x:Int, val y:Int) {
+ fun mul() : fun (scalar:Int):Point {
+ return { (scalar:Int):Point => Point(x * scalar, y * scalar) }
+ }
+}
+
+val m = Point(2, 3).mul() : fun (scalar:Int):Point
+
+fun box() : String {
+ val answer = m(5)
+ return if (answer.x == 10 && answer.y == 15) "OK" else "FAIL"
+}
diff --git a/translator/testFiles/sortedTests/failed/simpleBox.jet b/translator/testFiles/sortedTests/failed/simpleBox.jet
new file mode 100644
index 00000000000..be95d012d51
--- /dev/null
+++ b/translator/testFiles/sortedTests/failed/simpleBox.jet
@@ -0,0 +1,8 @@
+class Box(t: T) {
+ var value = t
+}
+
+fun box(): String {
+ val box: Box = Box(1)
+ return if (box.value == 1) "OK" else "fail"
+}
diff --git a/translator/testFiles/sortedTests/obscure/inheritedMethod.jet b/translator/testFiles/sortedTests/obscure/inheritedMethod.jet
new file mode 100644
index 00000000000..597910dc7b4
--- /dev/null
+++ b/translator/testFiles/sortedTests/obscure/inheritedMethod.jet
@@ -0,0 +1,13 @@
+open class Foo {
+ fun xyzzy(): String = "xyzzy"
+}
+
+class Bar(): Foo {
+ fun test(): String = xyzzy()
+}
+
+fun box() : String {
+ val bar = Bar()
+ val f = bar.test()
+ return if (f == "xyzzy") "OK" else "fail"
+}
diff --git a/translator/testFiles/sortedTests/unexpectedError/exceptionConstructor.jet b/translator/testFiles/sortedTests/unexpectedError/exceptionConstructor.jet
new file mode 100644
index 00000000000..ab6117e266e
--- /dev/null
+++ b/translator/testFiles/sortedTests/unexpectedError/exceptionConstructor.jet
@@ -0,0 +1,7 @@
+class GameError(msg: String): Exception(msg) {
+}
+
+fun box(): String {
+ val e = GameError("foo")
+ return if (e.getMessage() == "foo") "OK" else "fail"
+}
diff --git a/translator/testFiles/sortedTests/unsupported/basicproperty.jet b/translator/testFiles/sortedTests/unsupported/basicproperty.jet
new file mode 100644
index 00000000000..196ed3f40b0
--- /dev/null
+++ b/translator/testFiles/sortedTests/unsupported/basicproperty.jet
@@ -0,0 +1,22 @@
+open class M() {
+ open var b: Int = 0
+}
+
+class N() : M() {
+ val a : Int
+ get() {
+ super.b = super.b + 1
+ return super.b + 1
+ }
+ override var b: Int = a + 1
+
+ val superb : Int
+ get() = super.b
+}
+
+fun box(): String {
+ val n = N()
+ System.out?.println("a: " + n.a + " b: " + n.b + " superb: " + n.superb)
+ if (n.b == 3 && n.a == 4 && n.superb == 3) return "OK";
+ return "fail";
+}
\ No newline at end of file
diff --git a/translator/testFiles/sortedTests/unsupported/classObject.jet b/translator/testFiles/sortedTests/unsupported/classObject.jet
new file mode 100644
index 00000000000..76eff77c438
--- /dev/null
+++ b/translator/testFiles/sortedTests/unsupported/classObject.jet
@@ -0,0 +1,11 @@
+class C() {
+ class object {
+ fun create() = C()
+ }
+}
+
+fun box(): String {
+ val c = C.create()
+ return if (c is C) "OK" else "fail"
+}
+
diff --git a/translator/testFiles/sortedTests/unsupported/classObjectInterface.jet b/translator/testFiles/sortedTests/unsupported/classObjectInterface.jet
new file mode 100644
index 00000000000..432bb37bee0
--- /dev/null
+++ b/translator/testFiles/sortedTests/unsupported/classObjectInterface.jet
@@ -0,0 +1,9 @@
+class C() {
+ fun getInstance(): Runnable = C
+
+ class object: Runnable {
+ override fun run(): Unit { }
+ }
+}
+
+fun foo() = C().getInstance()
diff --git a/translator/testFiles/sortedTests/unsupported/classObjectMethod.jet b/translator/testFiles/sortedTests/unsupported/classObjectMethod.jet
new file mode 100644
index 00000000000..d7d70a86d96
--- /dev/null
+++ b/translator/testFiles/sortedTests/unsupported/classObjectMethod.jet
@@ -0,0 +1,13 @@
+abstract open class Default {
+ abstract fun defaultValue(): Int
+}
+
+class MyInt() {
+ class object : Default {
+ override fun defaultValue(): Int = 610
+ }
+}
+
+fun toDefault(t: T) where class object T: Default = T.defaultValue()
+
+fun box(): String = if (toDefault(MyInt()) == 610) "OK" else "fail"
diff --git a/translator/testFiles/sortedTests/unsupported/enclosed.jet b/translator/testFiles/sortedTests/unsupported/enclosed.jet
new file mode 100644
index 00000000000..705e0b602c2
--- /dev/null
+++ b/translator/testFiles/sortedTests/unsupported/enclosed.jet
@@ -0,0 +1,42 @@
+trait BK {
+ fun x() : Int = 50
+}
+
+trait K : BK {
+ override fun x() : Int = super.x() * 2
+}
+
+open class M() {
+ open fun x() : Int = 10
+
+ open var y = 500
+}
+
+open class N() : M(), K {
+
+ override fun x() : Int = 20
+
+ override var y = 200
+
+ open class C() : K {
+ fun test1() = x()
+ fun test2() = super@N.x()
+ fun test3() = super@N.x()
+ fun test4() = super.x()
+ fun test5() = y
+ fun test6() : Int {
+ super@N.y += 200
+ return super@N.y
+ }
+ }
+}
+
+fun box(): String {
+ if (N().C().test1() != 100) return "test1 fail";
+ if (N().C().test2() != 10) return "test2 fail";
+ if (N().C().test3() != 100) return "test3 fail";
+ if (N().C().test4() != 100) return "test4 fail";
+ if (N().C().test5() != 200) return "test5 fail";
+ if (N().C().test6() != 700) return "test6 fail";
+ return "OK";
+}
\ No newline at end of file
diff --git a/translator/testFiles/sortedTests/unsupported/extensionClosure.jet b/translator/testFiles/sortedTests/unsupported/extensionClosure.jet
new file mode 100644
index 00000000000..11fd11b3816
--- /dev/null
+++ b/translator/testFiles/sortedTests/unsupported/extensionClosure.jet
@@ -0,0 +1,13 @@
+class Point(val x : Int, val y : Int)
+
+fun box() : String {
+ val answer = apply(Point(3, 5), { Point.(scalar : Int) : Point =>
+ Point(x * scalar, y * scalar)
+ })
+
+ return if (answer.x == 6 && answer.y == 10) "OK" else "FAIL"
+}
+
+fun apply(arg:Point, f : fun Point.(scalar : Int) : Point) : Point {
+ return arg.f(2)
+}
diff --git a/translator/testFiles/sortedTests/unsupported/inheritance.jet b/translator/testFiles/sortedTests/unsupported/inheritance.jet
new file mode 100644
index 00000000000..0bfdb4e497f
--- /dev/null
+++ b/translator/testFiles/sortedTests/unsupported/inheritance.jet
@@ -0,0 +1,41 @@
+// Changed when traits were introduced. May not make sense any more
+
+open class X(val x : Int) {}
+trait Y {
+ abstract val y : Int
+}
+
+class YImpl(override val y : Int) : Y {}
+
+class Point(x : Int, yy : Int) : X(x) , Y {
+ override val y : Int = yy
+}
+
+trait Abstract {}
+
+class P1(x : Int, yy : Y) : Abstract, X(x), Y by yy {}
+class P2(x : Int, yy : Y) : X(x), Abstract, Y by yy {}
+class P3(x : Int, yy : Y) : X(x), Y by yy, Abstract {}
+class P4(x : Int, yy : Y) : Y by yy, Abstract, X(x) {}
+
+fun box() : String {
+ if (X(239).x != 239) return "FAIL #1"
+ if (YImpl(239).y != 239) return "FAIL #2"
+
+ val p = Point(240, -1)
+ if (p.x + p.y != 239) return "FAIL #3"
+
+ val y = YImpl(-1)
+ val p1 = P1(240, y)
+ if (p1.x + p1.y != 239) return "FAIL #4"
+ val p2 = P2(240, y)
+ if (p2.x + p2.y != 239) return "FAIL #5"
+
+ val p3 = P3(240, y)
+ if (p3.x + p3.y != 239) return "FAIL #6"
+
+ val p4 = P4(240, y)
+ if (p4.x + p4.y != 239) return "FAIL #7"
+
+ return "OK"
+}
\ No newline at end of file
diff --git a/translator/testFiles/sortedTests/unsupported/inheritedInnerClass.jet b/translator/testFiles/sortedTests/unsupported/inheritedInnerClass.jet
new file mode 100644
index 00000000000..4717bea55a8
--- /dev/null
+++ b/translator/testFiles/sortedTests/unsupported/inheritedInnerClass.jet
@@ -0,0 +1,14 @@
+class Outer() {
+ open class InnerBase() {
+ }
+
+ class InnerDerived(): InnerBase() {
+ }
+
+ public val foo: InnerBase? = InnerDerived()
+}
+
+fun box() : String {
+ val o = Outer()
+ return if (o.foo === null) "fail" else "OK"
+}
diff --git a/translator/testFiles/sortedTests/unsupported/propertyInInitializer.jet b/translator/testFiles/sortedTests/unsupported/propertyInInitializer.jet
new file mode 100644
index 00000000000..f6e84b15afd
--- /dev/null
+++ b/translator/testFiles/sortedTests/unsupported/propertyInInitializer.jet
@@ -0,0 +1,16 @@
+class Outer() {
+ val s = "xyzzy"
+
+ open class InnerBase(public val name: String) {
+ }
+
+ class InnerDerived(): InnerBase(s) {
+ }
+
+ val x = InnerDerived()
+}
+
+fun box() : String {
+ val o = Outer()
+ return if (o.x.name != "xyzzy") "fail" else "OK"
+}
diff --git a/translator/testFiles/sortedTests/unsupported/traitproperty.jet b/translator/testFiles/sortedTests/unsupported/traitproperty.jet
new file mode 100644
index 00000000000..962f71c5dc9
--- /dev/null
+++ b/translator/testFiles/sortedTests/unsupported/traitproperty.jet
@@ -0,0 +1,29 @@
+trait M {
+ var backingB : Int
+ var b : Int
+ get() = backingB
+ set(value: Int) {
+ backingB = value
+ }
+}
+
+class N() : M {
+ override var backingB : Int = 0
+
+ val a : Int
+ get() {
+ super.b = super.b + 1
+ return super.b + 1
+ }
+ override var b: Int = a + 1
+
+ val superb : Int
+ get() = super.b
+}
+
+fun box(): String {
+ val n = N()
+ System.out?.println("a: " + n.a + " b: " + n.b + " superb: " + n.superb)
+ if (n.b == 3 && n.a == 4 && n.superb == 3) return "OK";
+ return "fail";
+}
\ No newline at end of file
diff --git a/translator/testFiles/sortedTests/usesJava/basicmethod.jet b/translator/testFiles/sortedTests/usesJava/basicmethod.jet
new file mode 100644
index 00000000000..9920bc3b69d
--- /dev/null
+++ b/translator/testFiles/sortedTests/usesJava/basicmethod.jet
@@ -0,0 +1,21 @@
+import java.util.ArrayList
+
+trait Tr {
+ fun extra() : String = "_"
+}
+
+class N() : ArrayList(), Tr {
+ override fun add(el: Any) : Boolean {
+ super.add(el)
+ return super.add(el.toString() + super.extra() + el + extra())
+ }
+
+ override fun extra() : String = super
.extra() + super
.extra()
+}
+
+fun box(): String {
+ val n = N()
+ n.add("239")
+ if (n.get(0) == "239" && n.get(1) == "239_239__") return "OK";
+ return "fail";
+}
\ No newline at end of file
diff --git a/translator/testFiles/sortedTests/usesJava/inheritingFromArrayList.jet b/translator/testFiles/sortedTests/usesJava/inheritingFromArrayList.jet
new file mode 100644
index 00000000000..d0ee9df62d0
--- /dev/null
+++ b/translator/testFiles/sortedTests/usesJava/inheritingFromArrayList.jet
@@ -0,0 +1 @@
+class Foo() : java.util.ArrayList()
\ No newline at end of file
diff --git a/translator/testFiles/sortedTests/usesJava/initializerBlockDImpl.jet b/translator/testFiles/sortedTests/usesJava/initializerBlockDImpl.jet
new file mode 100644
index 00000000000..aa3d227c80f
--- /dev/null
+++ b/translator/testFiles/sortedTests/usesJava/initializerBlockDImpl.jet
@@ -0,0 +1,20 @@
+import java.util.*
+import java.io.*
+
+class World() {
+ public val items: ArrayList- = ArrayList
-
+
+ class Item() {
+ {
+ items.add(this)
+ }
+ }
+
+ val foo = Item()
+}
+
+fun box() : String {
+ val w = World()
+ if (w.items.size() != 1) return "fail"
+ return "OK"
+}
diff --git a/translator/testFiles/sortedTests/usesJava/innerClass.jet b/translator/testFiles/sortedTests/usesJava/innerClass.jet
new file mode 100644
index 00000000000..df43f61e8bc
--- /dev/null
+++ b/translator/testFiles/sortedTests/usesJava/innerClass.jet
@@ -0,0 +1,19 @@
+class Outer(val foo: StringBuilder) {
+ class Inner() {
+ fun len() : Int {
+ return foo.length()
+ }
+ }
+
+ fun test() : Inner {
+ return Inner()
+ }
+}
+
+fun box() : String {
+ val sb = StringBuilder("xyzzy")
+ val o = Outer(sb)
+ val i = o.test()
+ val l = i.len()
+ return if (l != 5) "fail" else "OK"
+}
diff --git a/translator/testFiles/sortedTests/usesJava/overloadBinaryOperator.jet b/translator/testFiles/sortedTests/usesJava/overloadBinaryOperator.jet
new file mode 100644
index 00000000000..bee66062979
--- /dev/null
+++ b/translator/testFiles/sortedTests/usesJava/overloadBinaryOperator.jet
@@ -0,0 +1,25 @@
+import java.util.*
+
+class ArrayWrapper() {
+ val contents = ArrayList()
+
+ fun add(item: T) {
+ contents.add(item)
+ }
+
+ fun plus(b: ArrayWrapper): ArrayWrapper {
+ val result = ArrayWrapper()
+ result.contents.addAll(contents)
+ result.contents.addAll(b.contents)
+ return result
+ }
+}
+
+fun box(): String {
+ val v1 = ArrayWrapper()
+ val v2 = ArrayWrapper()
+ v1.add("foo")
+ v2.add("bar")
+ val v3 = v1 + v2
+ return if (v3.contents.size() == 2) "OK" else "fail"
+}
diff --git a/translator/testFiles/sortedTests/usesJava/overloadPlusAssign.jet b/translator/testFiles/sortedTests/usesJava/overloadPlusAssign.jet
new file mode 100644
index 00000000000..5247973e8d6
--- /dev/null
+++ b/translator/testFiles/sortedTests/usesJava/overloadPlusAssign.jet
@@ -0,0 +1,26 @@
+import java.util.*
+
+class ArrayWrapper() {
+ val contents = ArrayList()
+
+ fun add(item: T) {
+ contents.add(item)
+ }
+
+ fun plusAssign(rhs: ArrayWrapper) {
+ contents.addAll(rhs.contents)
+ }
+
+ fun get(index: Int): T {
+ return contents.get(index)
+ }
+}
+
+fun box(): String {
+ var v1 = ArrayWrapper()
+ val v2 = ArrayWrapper()
+ v1.add("foo")
+ v2.add("bar")
+ v1 += v2
+ return if (v1.contents.size() == 2) "OK" else "fail"
+}
diff --git a/translator/testFiles/sortedTests/usesJava/overloadPlusAssignReturn.jet b/translator/testFiles/sortedTests/usesJava/overloadPlusAssignReturn.jet
new file mode 100644
index 00000000000..42671b9f138
--- /dev/null
+++ b/translator/testFiles/sortedTests/usesJava/overloadPlusAssignReturn.jet
@@ -0,0 +1,30 @@
+import java.util.*
+
+class ArrayWrapper() {
+ val contents = ArrayList()
+
+ fun add(item: T) {
+ contents.add(item)
+ }
+
+ fun plusAssign(rhs: ArrayWrapper): ArrayWrapper {
+ val result = ArrayWrapper()
+ result.contents.addAll(contents)
+ result.contents.addAll(rhs.contents)
+ return result
+ }
+
+ fun get(index: Int): T {
+ return contents.get(index)
+ }
+}
+
+fun box(): String {
+ var v1 = ArrayWrapper()
+ val v2 = ArrayWrapper()
+ v1.add("foo")
+ val v3 = v1
+ v2.add("bar")
+ v1 += v2
+ return if (v1.contents.size() == 2 && v3.contents.size() == 1) "OK" else "fail"
+}
diff --git a/translator/testFiles/sortedTests/usesJava/overloadPlusToPlusAssign.jet b/translator/testFiles/sortedTests/usesJava/overloadPlusToPlusAssign.jet
new file mode 100644
index 00000000000..c5236b0ace4
--- /dev/null
+++ b/translator/testFiles/sortedTests/usesJava/overloadPlusToPlusAssign.jet
@@ -0,0 +1,30 @@
+import java.util.*
+
+class ArrayWrapper() {
+ val contents = ArrayList()
+
+ fun add(item: T) {
+ contents.add(item)
+ }
+
+ fun plus(rhs: ArrayWrapper): ArrayWrapper {
+ val result = ArrayWrapper()
+ result.contents.addAll(contents)
+ result.contents.addAll(rhs.contents)
+ return result
+ }
+
+ fun get(index: Int): T {
+ return contents.get(index)
+ }
+}
+
+fun box(): String {
+ var v1 = ArrayWrapper()
+ val v2 = ArrayWrapper()
+ v1.add("foo")
+ val v3 = v1
+ v2.add("bar")
+ v1 += v2
+ return if (v1.contents.size() == 2 && v3.contents.size() == 1) "OK" else "fail"
+}
diff --git a/translator/testFiles/sortedTests/usesJava/overloadUnaryOperator.jet b/translator/testFiles/sortedTests/usesJava/overloadUnaryOperator.jet
new file mode 100644
index 00000000000..120f84a2746
--- /dev/null
+++ b/translator/testFiles/sortedTests/usesJava/overloadUnaryOperator.jet
@@ -0,0 +1,28 @@
+import java.util.*
+
+class ArrayWrapper() {
+ val contents = ArrayList()
+
+ fun add(item: T) {
+ contents.add(item)
+ }
+
+ fun minus(): ArrayWrapper {
+ val result = ArrayWrapper()
+ result.contents.addAll(contents)
+ Collections.reverse(result.contents)
+ return result
+ }
+
+ fun get(index: Int): T {
+ return contents.get(index)
+ }
+}
+
+fun box(): String {
+ val v1 = ArrayWrapper()
+ v1.add("foo")
+ v1.add("bar")
+ val v2 = -v1
+ return if (v2[0] == "bar" && v2[1] == "foo") "OK" else "fail"
+}
diff --git a/translator/translator.iml b/translator/translator.iml
index 7d89d03133f..18261b47b3f 100644
--- a/translator/translator.iml
+++ b/translator/translator.iml
@@ -5,6 +5,7 @@
+