implement and test extension properties

This commit is contained in:
Pavel Talanov
2012-01-24 13:13:53 +04:00
parent 969956a20d
commit 3360d3bdb9
10 changed files with 428 additions and 598 deletions
+346 -572
View File
File diff suppressed because it is too large Load Diff
@@ -248,8 +248,9 @@ public final class CallTranslator extends AbstractTranslator {
assert descriptor instanceof FunctionDescriptor;
FunctionIntrinsic functionIntrinsic =
context().intrinsics().getFunctionIntrinsic((FunctionDescriptor) descriptor);
assert receiver != null : "Functions that have functionIntrinsic implementation should have a receiver.";
return functionIntrinsic.apply(receiver, arguments, context());
JsExpression receiverExpression = thisObject();
assert receiverExpression != null : "Intrinsic function should have a receiver.";
return functionIntrinsic.apply(receiverExpression, arguments, context());
}
@NotNull
@@ -102,8 +102,8 @@ public final class BindingUtils {
}
@NotNull
public static JetParameter getParameterForDescriptor(@NotNull BindingContext context,
@NotNull ValueParameterDescriptor descriptor) {
private static JetParameter getParameterForDescriptor(@NotNull BindingContext context,
@NotNull ValueParameterDescriptor descriptor) {
PsiElement result = context.get(BindingContext.DESCRIPTOR_TO_DECLARATION, descriptor);
assert result instanceof JetParameter : "ValueParameterDescriptor should have corresponding JetParameter.";
return (JetParameter) result;
@@ -4,10 +4,7 @@ import com.google.dart.compiler.backend.js.ast.*;
import com.google.dart.compiler.util.AstUtil;
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.FunctionDescriptor;
import org.jetbrains.jet.lang.descriptors.PropertyDescriptor;
import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.k2js.translate.context.NamingScope;
import org.jetbrains.k2js.translate.context.TemporaryVariable;
@@ -120,8 +117,9 @@ public final class TranslationUtils {
thisRef = context.aliaser().getAliasForThis(correspondingDeclaration);
}
}
if (correspondingDeclaration instanceof FunctionDescriptor) {
DeclarationDescriptor receiverDescriptor = getExpectedReceiverDescriptor((FunctionDescriptor) correspondingDeclaration);
if (correspondingDeclaration instanceof CallableDescriptor) {
DeclarationDescriptor receiverDescriptor =
getExpectedReceiverDescriptor((CallableDescriptor) correspondingDeclaration);
assert receiverDescriptor != null;
if (context.aliaser().hasAliasForThis(receiverDescriptor)) {
thisRef = context.aliaser().getAliasForThis(receiverDescriptor);
@@ -0,0 +1,26 @@
package org.jetbrains.k2js.test;
import org.junit.Test;
/**
* @author Pavel Talanov
*/
public final class ExtensionPropertyTest extends TranslationTest {
final private static String MAIN = "extensionProperty/";
@Override
protected String mainDirectory() {
return MAIN;
}
@Test
public void simplePropertyWithGetter() throws Exception {
testFooBoxIsTrue("simplePropertyWithGetter.kt");
}
@Test
public void propertyWithGetterAndSetter() throws Exception {
testFooBoxIsTrue("propertyWithGetterAndSetter.kt");
}
}
@@ -4,6 +4,7 @@ package org.jetbrains.k2js.test;
* @author Pavel Talanov
*/
public abstract class JavaClassesTest extends TranslationTest {
private final String SUITE = "java/";
@Override
@@ -20,15 +20,15 @@ public final class WebDemoExamples2Test extends TranslationTest {
testWithMain("bottles", "");
}
@Test
public void life() throws Exception {
testWithMain("life", "", "2");
}
//TODO: a couple of classes not supported
// @Test
// public void life() throws Exception {
// testWithMain("life", "", "2");
// }
@Test
public void builder() throws Exception {
testWithMain("builder", "");
testWithMain("builder", "1", "over9000" +
"");
testWithMain("builder", "1", "over9000");
}
}
@@ -1,10 +0,0 @@
iimport
fun stdout(): java.io.PrintStream? {
println("stdout")
return System.out
}
fun main(args : Array<String>) {
stdout()?.println("Hello, world!")
}
@@ -0,0 +1,23 @@
package foo
class Test() {
var a = 0
}
var Test.b : Int
get() = a * 3
set(c : Int) {
a = c - 1
}
fun box() : Boolean {
val c = Test()
if (c.a != 0) return false;
if (c.b != 0) return false;
c.a = 3;
if (c.b != 9) return false;
c.b = 10;
if (c.a != 9) return false;
if (c.b != 27) return false;
return true;
}
@@ -0,0 +1,17 @@
package foo
val String.size : Int
get() = length
val Int.quadruple : Int
get() = this * 4
fun box() : Boolean
{
if ("1".size != 1) return false;
if ("11".size != 2) return false;
if (("121" + "123").size != 6) return false;
if (1.quadruple != 4) return false;
if (0.quadruple != 0) return false;
return true;
}