diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/CodegenUtil.java b/compiler/backend/src/org/jetbrains/jet/codegen/CodegenUtil.java index c6a41ce6d3a..f0cfb552f19 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/CodegenUtil.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/CodegenUtil.java @@ -263,10 +263,11 @@ public class CodegenUtil { return false; } - public static boolean couldUseDirectAccessToProperty(PropertyDescriptor propertyDescriptor, boolean forGetter, boolean isInsideClass) { + public static boolean couldUseDirectAccessToProperty(PropertyDescriptor propertyDescriptor, boolean forGetter, boolean isInsideClass, boolean isDelegated) { PropertyAccessorDescriptor accessorDescriptor = forGetter ? propertyDescriptor.getGetter() : propertyDescriptor.getSetter(); boolean isExtensionProperty = propertyDescriptor.getReceiverParameter() != null; return isInsideClass && + !isDelegated && !isExtensionProperty && (accessorDescriptor == null || accessorDescriptor.isDefault() && diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index 5cdd9a1f6ba..69f6042ee9c 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -1660,6 +1660,16 @@ public class ExpressionCodegen extends JetVisitor implem return myFrameMap.getIndex(descriptor); } + @Nullable + private static JetType getPropertyDelegateType(@NotNull PropertyDescriptor descriptor, @NotNull BindingContext bindingContext) { + PropertyGetterDescriptor getter = descriptor.getGetter(); + if (getter != null) { + Call call = bindingContext.get(BindingContext.DELEGATED_PROPERTY_CALL, getter); + return call != null ? call.getExplicitReceiver().getType() : null; + } + return null; + } + @NotNull public StackValue.Property intermediateValueForProperty( PropertyDescriptor propertyDescriptor, @@ -1688,12 +1698,15 @@ public class ExpressionCodegen extends JetVisitor implem boolean isInsideClass = isCallInsideSameClassAsDeclared(propertyDescriptor, context); boolean isInsideModule = isCallInsideSameModuleAsDeclared(propertyDescriptor, context); + JetType delegateType = getPropertyDelegateType(propertyDescriptor, state.getBindingContext()); + boolean isDelegatedProperty = delegateType != null; + CallableMethod callableGetter = null; CallableMethod callableSetter = null; if (!forceField) { //noinspection ConstantConditions - if (couldUseDirectAccessToProperty(propertyDescriptor, true, isInsideClass)) { + if (couldUseDirectAccessToProperty(propertyDescriptor, true, isInsideClass, isDelegatedProperty)) { callableGetter = null; } else { @@ -1715,7 +1728,7 @@ public class ExpressionCodegen extends JetVisitor implem if (propertyDescriptor.isVar()) { if (propertyDescriptor.getSetter() != null) { - if (couldUseDirectAccessToProperty(propertyDescriptor, false, isInsideClass)) { + if (couldUseDirectAccessToProperty(propertyDescriptor, false, isInsideClass, isDelegatedProperty)) { callableSetter = null; } else { @@ -1736,8 +1749,14 @@ public class ExpressionCodegen extends JetVisitor implem owner = callableMethod.getOwner(); } - return StackValue.property(propertyDescriptor, owner, typeMapper.mapType(propertyDescriptor.getOriginal().getType()), - isStatic, callableGetter, callableSetter, state); + if (isDelegatedProperty && forceField) { + return StackValue.property(propertyDescriptor, owner, typeMapper.mapType(delegateType), + isStatic, true, callableGetter, callableSetter, state); + } + else { + return StackValue.property(propertyDescriptor, owner, typeMapper.mapType(propertyDescriptor.getOriginal().getType()), + isStatic, false, callableGetter, callableSetter, state); + } } @Override @@ -1864,7 +1883,7 @@ public class ExpressionCodegen extends JetVisitor implem return (MemberDescriptor) descriptor; } - private StackValue invokeFunction( + public StackValue invokeFunction( Call call, StackValue receiver, ResolvedCall resolvedCall diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java index 94abe4747b4..42594a2f206 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java @@ -1531,10 +1531,10 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { PropertyDescriptor propertyDescriptor = (PropertyDescriptor) bindingContext.get(BindingContext.VARIABLE, property); assert propertyDescriptor != null; - JetExpression initializer = property.getInitializer(); + JetExpression initializer = property.getDelegateExpressionOrInitializer(); assert initializer != null : "shouldInitializeProperty must return false if initializer is null"; - JetType jetType = propertyDescriptor.getType(); + JetType jetType = getPropertyOrDelegateType(bindingContext, property, propertyDescriptor); Type type = codegen.expressionType(initializer); if (jetType.isNullable()) { type = boxType(type); @@ -1542,14 +1542,14 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { codegen.gen(initializer, type); StackValue.Property propValue = codegen.intermediateValueForProperty(propertyDescriptor, true, null); - propValue.store(propValue.type, iv); + propValue.store(type, iv); } public static boolean shouldInitializeProperty( @NotNull JetProperty property, @NotNull JetTypeMapper typeMapper ) { - JetExpression initializer = property.getInitializer(); + JetExpression initializer = property.getDelegateExpressionOrInitializer(); if (initializer == null) return false; CompileTimeConstant compileTimeValue = typeMapper.getBindingContext().get(BindingContext.COMPILE_TIME_VALUE, initializer); @@ -1559,10 +1559,22 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { assert propertyDescriptor != null; Object value = compileTimeValue.getValue(); - Type type = typeMapper.mapType(propertyDescriptor.getType()); + JetType jetType = getPropertyOrDelegateType(typeMapper.getBindingContext(), property, propertyDescriptor); + Type type = typeMapper.mapType(jetType); return !skipDefaultValue(propertyDescriptor, value, type); } + @NotNull + private static JetType getPropertyOrDelegateType(@NotNull BindingContext bindingContext, @NotNull JetProperty property, @NotNull PropertyDescriptor descriptor) { + JetExpression delegateExpression = property.getDelegateExpression(); + if (delegateExpression != null) { + JetType delegateType = bindingContext.get(BindingContext.EXPRESSION_TYPE, delegateExpression); + assert delegateType != null : "Type of delegate expression should be recorded"; + return delegateType; + } + return descriptor.getType(); + } + private static boolean skipDefaultValue(PropertyDescriptor propertyDescriptor, Object value, Type type) { if (isPrimitive(type)) { if (!propertyDescriptor.getType().isNullable() && value instanceof Number) { diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/PropertyCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/PropertyCodegen.java index 4a1ed75e2cc..bdfc892065b 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/PropertyCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/PropertyCodegen.java @@ -34,11 +34,13 @@ import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.DescriptorResolver; +import org.jetbrains.jet.lang.resolve.calls.model.ResolvedCall; import org.jetbrains.jet.lang.resolve.constants.CompileTimeConstant; import org.jetbrains.jet.lang.resolve.java.JvmAbi; import org.jetbrains.jet.lang.resolve.java.JvmStdlibNames; import org.jetbrains.jet.lang.resolve.java.kt.DescriptorKindUtils; import org.jetbrains.jet.lang.resolve.name.Name; +import org.jetbrains.jet.lang.types.JetType; import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns; import static org.jetbrains.asm4.Opcodes.*; @@ -86,38 +88,63 @@ public class PropertyCodegen extends GenerationStateAware { private void generateBackingField(PsiElement p, PropertyDescriptor propertyDescriptor) { //noinspection ConstantConditions - if (bindingContext.get(BindingContext.BACKING_FIELD_REQUIRED, propertyDescriptor)) { + boolean hasBackingField = bindingContext.get(BindingContext.BACKING_FIELD_REQUIRED, propertyDescriptor); + boolean isDelegated = p instanceof JetProperty && ((JetProperty) p).getDelegateExpression() != null; + if (hasBackingField || isDelegated) { DeclarationDescriptor containingDeclaration = propertyDescriptor.getContainingDeclaration(); if (isInterface(containingDeclaration)) { return; } - Object value = null; - JetExpression initializer = p instanceof JetProperty ? ((JetProperty) p).getInitializer() : null; - if (initializer != null) { - if (initializer instanceof JetConstantExpression && !propertyDescriptor.getType().isNullable()) { - CompileTimeConstant compileTimeValue = bindingContext.get(BindingContext.COMPILE_TIME_VALUE, initializer); - value = compileTimeValue != null ? compileTimeValue.getValue() : null; - } - } - int modifiers; - if (kind == OwnerKind.NAMESPACE) { - modifiers = ACC_STATIC; - } - else { - modifiers = ACC_PRIVATE; - } - if (!propertyDescriptor.isVar()) { - modifiers |= ACC_FINAL; - } - modifiers |= getDeprecatedAccessFlag(propertyDescriptor); - if (KotlinBuiltIns.getInstance().isVolatile(propertyDescriptor)) { - modifiers |= ACC_VOLATILE; - } - Type type = typeMapper.mapType(propertyDescriptor); - FieldVisitor fieldVisitor = v.newField(p, modifiers, propertyDescriptor.getName().getName(), type.getDescriptor(), null, value); + FieldVisitor fieldVisitor = hasBackingField + ? generateBackingFieldAccess(p, propertyDescriptor) + : generatePropertyDelegateAccess((JetProperty) p, propertyDescriptor); + AnnotationCodegen.forField(fieldVisitor, typeMapper).genAnnotations(propertyDescriptor); } + + } + + private FieldVisitor generatePropertyDelegateAccess(JetProperty p, PropertyDescriptor propertyDescriptor) { + int modifiers = ACC_PRIVATE | ACC_FINAL | getDeprecatedAccessFlag(propertyDescriptor); + if (kind == OwnerKind.NAMESPACE) { + modifiers |= ACC_STATIC; + } + if (KotlinBuiltIns.getInstance().isVolatile(propertyDescriptor)) { + modifiers |= ACC_VOLATILE; + } + JetType delegateType = bindingContext.get(BindingContext.EXPRESSION_TYPE, p.getDelegateExpression()); + assert delegateType != null : "Type of delegate should be recorded: " + p.getText(); + Type type = typeMapper.mapType(delegateType); + return v.newField(p, modifiers, JvmAbi.getPropertyDelegateName(propertyDescriptor.getName()), type.getDescriptor(), + null, null); + } + + private FieldVisitor generateBackingFieldAccess(PsiElement p, PropertyDescriptor propertyDescriptor) { + Object value = null; + JetExpression initializer = p instanceof JetProperty ? ((JetProperty) p).getInitializer() : null; + if (initializer != null) { + if (initializer instanceof JetConstantExpression && !propertyDescriptor.getType().isNullable()) { + CompileTimeConstant compileTimeValue = bindingContext.get(BindingContext.COMPILE_TIME_VALUE, initializer); + value = compileTimeValue != null ? compileTimeValue.getValue() : null; + } + } + int modifiers; + if (kind == OwnerKind.NAMESPACE) { + modifiers = ACC_STATIC; + } + else { + modifiers = ACC_PRIVATE; + } + if (!propertyDescriptor.isVar()) { + modifiers |= ACC_FINAL; + } + modifiers |= getDeprecatedAccessFlag(propertyDescriptor); + if (KotlinBuiltIns.getInstance().isVolatile(propertyDescriptor)) { + modifiers |= ACC_VOLATILE; + } + Type type = typeMapper.mapType(propertyDescriptor); + return v.newField(p, modifiers, propertyDescriptor.getName().getName(), type.getDescriptor(), null, value); } private void generateGetter(JetNamedDeclaration p, PropertyDescriptor propertyDescriptor, JetPropertyAccessor getter) { @@ -130,10 +157,18 @@ public class PropertyCodegen extends GenerationStateAware { getterDescriptor = getterDescriptor != null ? getterDescriptor : DescriptorResolver.createDefaultGetter(propertyDescriptor); if (kind != OwnerKind.TRAIT_IMPL || !defaultGetter) { - FunctionGenerationStrategy strategy = - defaultGetter - ? new DefaultPropertyAccessorStrategy(getterDescriptor) - : new FunctionGenerationStrategy.FunctionDefault(state, getterDescriptor, getter); + FunctionGenerationStrategy strategy; + if (defaultGetter) { + if (p instanceof JetProperty && ((JetProperty) p).getDelegateExpression() != null) { + strategy = new DefaultPropertyWithDelegateAccessorStrategy(getterDescriptor); + } + else { + strategy = new DefaultPropertyAccessorStrategy(getterDescriptor); + } + } + else { + strategy = new FunctionGenerationStrategy.FunctionDefault(state, getterDescriptor, getter); + } functionCodegen.generateMethod(getter != null ? getter : p, signature, true, @@ -153,10 +188,18 @@ public class PropertyCodegen extends GenerationStateAware { setterDescriptor = setterDescriptor != null ? setterDescriptor : DescriptorResolver.createDefaultSetter(propertyDescriptor); if (kind != OwnerKind.TRAIT_IMPL || !defaultSetter) { - FunctionGenerationStrategy strategy = - defaultSetter - ? new DefaultPropertyAccessorStrategy(setterDescriptor) - : new FunctionGenerationStrategy.FunctionDefault(state, setterDescriptor, setter); + FunctionGenerationStrategy strategy; + if (defaultSetter) { + if (p instanceof JetProperty && ((JetProperty) p).getDelegateExpression() != null) { + strategy = new DefaultPropertyWithDelegateAccessorStrategy(setterDescriptor); + } + else { + strategy = new DefaultPropertyAccessorStrategy(setterDescriptor); + } + } + else { + strategy = new FunctionGenerationStrategy.FunctionDefault(state, setterDescriptor, setter); + } functionCodegen.generateMethod(setter != null ? setter : p, signature, true, @@ -227,6 +270,49 @@ public class PropertyCodegen extends GenerationStateAware { } } + private class DefaultPropertyWithDelegateAccessorStrategy extends FunctionGenerationStrategy { + private final PropertyAccessorDescriptor descriptor; + + public DefaultPropertyWithDelegateAccessorStrategy(@NotNull PropertyAccessorDescriptor descriptor) { + this.descriptor = descriptor; + } + + @Override + public void generateBody( + @NotNull MethodVisitor mv, + @NotNull JvmMethodSignature signature, + @NotNull MethodContext context + ) { + InstructionAdapter iv = new InstructionAdapter(mv); + ExpressionCodegen codegen = new ExpressionCodegen( + mv, getFrameMap(typeMapper, context), signature.getAsmMethod().getReturnType(), context, state); + + ResolvedCall resolvedCall = + bindingContext.get(BindingContext.DELEGATED_PROPERTY_RESOLVED_CALL, descriptor); + + Call call = bindingContext.get(BindingContext.DELEGATED_PROPERTY_CALL, descriptor); + assert call != null : "Call should be recorded for delegate call " + signature.toString(); + + PropertyDescriptor property = descriptor.getCorrespondingProperty(); + Type asmType = typeMapper.mapType(property); + + if (kind != OwnerKind.NAMESPACE) { + iv.load(0, OBJECT_TYPE); + } + + StackValue.Property delegatedProperty = codegen.intermediateValueForProperty(property, true, null); + StackValue lastValue = codegen.invokeFunction(call, delegatedProperty, resolvedCall); + + if (lastValue.type != Type.VOID_TYPE) { + lastValue.put(asmType, iv); + iv.areturn(asmType); + } + else { + iv.areturn(Type.VOID_TYPE); + } + } + } + public static void generateJetPropertyAnnotation( MethodVisitor mv, @NotNull JvmPropertyAccessorSignature propertyAccessorSignature, @NotNull PropertyDescriptor propertyDescriptor, @NotNull Visibility visibility diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/StackValue.java b/compiler/backend/src/org/jetbrains/jet/codegen/StackValue.java index 1c7728aa3dd..3fcaae8c1ff 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/StackValue.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/StackValue.java @@ -30,6 +30,7 @@ import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.psi.JetExpression; import org.jetbrains.jet.lang.resolve.calls.model.ResolvedCall; import org.jetbrains.jet.lang.resolve.java.AsmTypeConstants; +import org.jetbrains.jet.lang.resolve.java.JvmAbi; import org.jetbrains.jet.lang.resolve.java.JvmClassName; import org.jetbrains.jet.lang.resolve.java.JvmPrimitiveType; import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverValue; @@ -139,12 +140,12 @@ public abstract class StackValue { JvmClassName methodOwner, Type type, boolean isStatic, + boolean isDelegated, @Nullable CallableMethod getter, @Nullable CallableMethod setter, GenerationState state ) { - return new Property(descriptor, methodOwner, getter, setter, isStatic, type, - state); + return new Property(descriptor, methodOwner, getter, setter, isStatic, isDelegated, type, state); } public static StackValue expression(Type type, JetExpression expression, ExpressionCodegen generator) { @@ -869,11 +870,12 @@ public abstract class StackValue { private final PropertyDescriptor descriptor; @NotNull private final GenerationState state; + private final boolean isDelegated; public Property( @NotNull PropertyDescriptor descriptor, @NotNull JvmClassName methodOwner, @Nullable CallableMethod getter, @Nullable CallableMethod setter, boolean isStatic, - @NotNull Type type, @NotNull GenerationState state + boolean isDelegated, @NotNull Type type, @NotNull GenerationState state ) { super(type, isStatic); this.methodOwner = methodOwner; @@ -881,12 +883,13 @@ public abstract class StackValue { this.setter = setter; this.descriptor = descriptor; this.state = state; + this.isDelegated = isDelegated; } @Override public void put(Type type, InstructionAdapter v) { if (getter == null) { - v.visitFieldInsn(isStatic ? GETSTATIC : GETFIELD, methodOwner.getInternalName(), descriptor.getName().getName(), + v.visitFieldInsn(isStatic ? GETSTATIC : GETFIELD, methodOwner.getInternalName(), getPropertyName(), this.type.getDescriptor()); genNotNullAssertionForField(v, state, descriptor); } @@ -901,13 +904,17 @@ public abstract class StackValue { public void store(Type topOfStackType, InstructionAdapter v) { coerceFrom(topOfStackType, v); if (setter == null) { - v.visitFieldInsn(isStatic ? PUTSTATIC : PUTFIELD, methodOwner.getInternalName(), descriptor.getName().getName(), + v.visitFieldInsn(isStatic ? PUTSTATIC : PUTFIELD, methodOwner.getInternalName(), getPropertyName(), this.type.getDescriptor()); } else { Method method = setter.getSignature().getAsmMethod(); v.visitMethodInsn(setter.getInvokeOpcode(), setter.getOwner().getInternalName(), method.getName(), method.getDescriptor()); } } + + private String getPropertyName() { + return isDelegated ? JvmAbi.getPropertyDelegateName(descriptor.getName()) : descriptor.getName().getName(); + } } private static class Expression extends StackValue { diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JvmAbi.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JvmAbi.java index e20f5e35bc3..087c8a9b6b4 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JvmAbi.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JvmAbi.java @@ -39,6 +39,8 @@ public class JvmAbi { public static final String CLASS_OBJECT_CLASS_NAME = "object"; public static final String CLASS_OBJECT_SUFFIX = "$" + CLASS_OBJECT_CLASS_NAME; + public static final String DELEGATED_PROPERTY_NAME_POSTFIX = "$delegate"; + public static final String INSTANCE_FIELD = "instance$"; public static final String CLASS_OBJECT_FIELD = "object$"; public static final String RECEIVER_PARAMETER = "$receiver"; @@ -55,6 +57,10 @@ public class JvmAbi { return fqName.lastSegmentIs(Name.identifier(CLASS_OBJECT_CLASS_NAME)); } + public static String getPropertyDelegateName(@NotNull Name name) { + return name.getName() + DELEGATED_PROPERTY_NAME_POSTFIX; + } + private JvmAbi() { } } diff --git a/compiler/testData/codegen/box/delegatedProperty/capturePropertyInClosure.kt b/compiler/testData/codegen/box/delegatedProperty/capturePropertyInClosure.kt new file mode 100644 index 00000000000..d72c0a71362 --- /dev/null +++ b/compiler/testData/codegen/box/delegatedProperty/capturePropertyInClosure.kt @@ -0,0 +1,21 @@ +class Delegate { + var inner = 1 + fun get(t: Any?, p: String): Int = inner + fun set(t: Any?, p: String, i: Int) { inner = i } +} + +class B { + private var value: Int by Delegate() + + public fun test() { + fun foo() { + value = 1 + } + foo() + } +} + +fun box(): String { + B().test() + return "OK" +} \ No newline at end of file diff --git a/compiler/testData/codegen/box/delegatedProperty/castGetReturnType.kt b/compiler/testData/codegen/box/delegatedProperty/castGetReturnType.kt new file mode 100644 index 00000000000..0430109a3fb --- /dev/null +++ b/compiler/testData/codegen/box/delegatedProperty/castGetReturnType.kt @@ -0,0 +1,11 @@ +class Delegate { + fun get(t: Any?, p: String): Int = 1 +} + +class AImpl { + val prop: Number by Delegate() +} + +fun box(): String { + return if(AImpl().prop == 1) "OK" else "fail" +} diff --git a/compiler/testData/codegen/box/delegatedProperty/castSetParameter.kt b/compiler/testData/codegen/box/delegatedProperty/castSetParameter.kt new file mode 100644 index 00000000000..18d4b2b65be --- /dev/null +++ b/compiler/testData/codegen/box/delegatedProperty/castSetParameter.kt @@ -0,0 +1,24 @@ +class Delegate { + var inner = Derived() + fun get(t: Any?, p: String): Derived { + inner = Derived(inner.a + "-get") + return inner + } + fun set(t: Any?, p: String, i: Base) { inner = Derived(inner.a + "-" + i.a + "-set") } +} + +class A { + var prop: Derived by Delegate() +} + +fun box(): String { + val c = A() + if(c.prop.a != "derived-get") return "fail get ${c.prop.a}" + c.prop = Derived() + if (c.prop.a != "derived-get-derived-set-get") return "fail set ${c.prop.a}" + return "OK" +} + +open class Base(open val a: String = "base") + +class Derived(override val a: String = "derived"): Base() diff --git a/compiler/testData/codegen/box/delegatedProperty/defaultArgs.kt b/compiler/testData/codegen/box/delegatedProperty/defaultArgs.kt new file mode 100644 index 00000000000..e9bca328ca1 --- /dev/null +++ b/compiler/testData/codegen/box/delegatedProperty/defaultArgs.kt @@ -0,0 +1,9 @@ +class Delegate { + fun get(t: Any?, p: String, s: String = ""): Int = 1 +} + +val prop: Int by Delegate() + +fun box(): String { + return if(prop == 1) "OK" else "fail" +} diff --git a/compiler/testData/codegen/box/delegatedProperty/delegateAsInnerClass.kt b/compiler/testData/codegen/box/delegatedProperty/delegateAsInnerClass.kt new file mode 100644 index 00000000000..bf2b4d460d9 --- /dev/null +++ b/compiler/testData/codegen/box/delegatedProperty/delegateAsInnerClass.kt @@ -0,0 +1,17 @@ +class A { + var prop: Int by Delegate() + + class Delegate { + var inner = 1 + fun get(t: Any?, p: String): Int = inner + fun set(t: Any?, p: String, i: Int) { inner = i } + } +} + +fun box(): String { + val c = A() + if(c.prop != 1) return "fail get" + c.prop = 2 + if (c.prop != 2) return "fail set" + return "OK" +} diff --git a/compiler/testData/codegen/box/delegatedProperty/delegateByOtherProperty.kt b/compiler/testData/codegen/box/delegatedProperty/delegateByOtherProperty.kt new file mode 100644 index 00000000000..a8fde26abd4 --- /dev/null +++ b/compiler/testData/codegen/box/delegatedProperty/delegateByOtherProperty.kt @@ -0,0 +1,18 @@ +class Delegate { + var inner = 1 + fun get(t: Any?, p: String): Int = inner + fun set(t: Any?, p: String, i: Int) { inner = i } +} + +class A { + val p = Delegate() + var prop: Int by p +} + +fun box(): String { + val c = A() + if(c.prop != 1) return "fail get" + c.prop = 2 + if (c.prop != 2) return "fail set" + return "OK" +} diff --git a/compiler/testData/codegen/box/delegatedProperty/delegateByTopLevelFun.kt b/compiler/testData/codegen/box/delegatedProperty/delegateByTopLevelFun.kt new file mode 100644 index 00000000000..4f833a2599d --- /dev/null +++ b/compiler/testData/codegen/box/delegatedProperty/delegateByTopLevelFun.kt @@ -0,0 +1,19 @@ +class Delegate { + var inner = 1 + fun get(t: Any?, p: String): Int = inner + fun set(t: Any?, p: String, i: Int) { inner = i } +} + +fun foo() = Delegate() + +class A { + var prop: Int by foo() +} + +fun box(): String { + val c = A() + if(c.prop != 1) return "fail get" + c.prop = 2 + if (c.prop != 2) return "fail set" + return "OK" +} diff --git a/compiler/testData/codegen/box/delegatedProperty/delegateByTopLevelProperty.kt b/compiler/testData/codegen/box/delegatedProperty/delegateByTopLevelProperty.kt new file mode 100644 index 00000000000..64a31724924 --- /dev/null +++ b/compiler/testData/codegen/box/delegatedProperty/delegateByTopLevelProperty.kt @@ -0,0 +1,19 @@ +class Delegate { + var inner = 1 + fun get(t: Any?, p: String): Int = inner + fun set(t: Any?, p: String, i: Int) { inner = i } +} + +val p = Delegate() + +class A { + var prop: Int by p +} + +fun box(): String { + val c = A() + if(c.prop != 1) return "fail get" + c.prop = 2 + if (c.prop != 2) return "fail set" + return "OK" +} diff --git a/compiler/testData/codegen/box/delegatedProperty/delegateForExtProperty.kt b/compiler/testData/codegen/box/delegatedProperty/delegateForExtProperty.kt new file mode 100644 index 00000000000..241e2c73701 --- /dev/null +++ b/compiler/testData/codegen/box/delegatedProperty/delegateForExtProperty.kt @@ -0,0 +1,12 @@ +class Delegate { + fun get(t: A, p: String): Int = 1 +} + +val A.prop: Int by Delegate() + +class A { +} + +fun box(): String { + return if(A().prop == 1) "OK" else "fail" +} diff --git a/compiler/testData/codegen/box/delegatedProperty/delegateForExtPropertyInClass.kt b/compiler/testData/codegen/box/delegatedProperty/delegateForExtPropertyInClass.kt new file mode 100644 index 00000000000..8b4d864e750 --- /dev/null +++ b/compiler/testData/codegen/box/delegatedProperty/delegateForExtPropertyInClass.kt @@ -0,0 +1,18 @@ +class Delegate { + fun get(t: F.A, p: String): Int = 1 +} + +class F { + val A.prop: Int by Delegate() + + class A { + } + + fun foo(): Int { + return A().prop + } +} + +fun box(): String { + return if(F().foo() == 1) "OK" else "fail" +} \ No newline at end of file diff --git a/compiler/testData/codegen/box/delegatedProperty/genericDelegate.kt b/compiler/testData/codegen/box/delegatedProperty/genericDelegate.kt new file mode 100644 index 00000000000..df58a8786d9 --- /dev/null +++ b/compiler/testData/codegen/box/delegatedProperty/genericDelegate.kt @@ -0,0 +1,18 @@ +class Delegate(var inner: T) { + fun get(t: Any?, p: String): T = inner + fun set(t: Any?, p: String, i: T) { inner = i } +} + +class A { + inner class B { + var prop: Int by Delegate(1) + } +} + +fun box(): String { + val c = A().B() + if(c.prop != 1) return "fail get" + c.prop = 2 + if (c.prop != 2) return "fail set" + return "OK" +} diff --git a/compiler/testData/codegen/box/delegatedProperty/getAsExtensionFun.kt b/compiler/testData/codegen/box/delegatedProperty/getAsExtensionFun.kt new file mode 100644 index 00000000000..5ba6fc6591f --- /dev/null +++ b/compiler/testData/codegen/box/delegatedProperty/getAsExtensionFun.kt @@ -0,0 +1,12 @@ +class Delegate { +} + +fun Delegate.get(t: Any?, p: String): Int = 1 + +class A { + val prop: Int by Delegate() +} + +fun box(): String { + return if(A().prop == 1) "OK" else "fail" +} diff --git a/compiler/testData/codegen/box/delegatedProperty/getAsExtensionFunInClass.kt b/compiler/testData/codegen/box/delegatedProperty/getAsExtensionFunInClass.kt new file mode 100644 index 00000000000..54cc48c953e --- /dev/null +++ b/compiler/testData/codegen/box/delegatedProperty/getAsExtensionFunInClass.kt @@ -0,0 +1,11 @@ +class Delegate { +} + +class A { + fun Delegate.get(t: Any?, p: String): Int = 1 + val prop: Int by Delegate() +} + +fun box(): String { + return if(A().prop == 1) "OK" else "fail" +} diff --git a/compiler/testData/codegen/box/delegatedProperty/inClassVal.kt b/compiler/testData/codegen/box/delegatedProperty/inClassVal.kt new file mode 100644 index 00000000000..49bfbf61299 --- /dev/null +++ b/compiler/testData/codegen/box/delegatedProperty/inClassVal.kt @@ -0,0 +1,11 @@ +class Delegate { + fun get(t: Any?, p: String): Int = 1 +} + +class A { + val prop: Int by Delegate() +} + +fun box(): String { + return if(A().prop == 1) "OK" else "fail" +} diff --git a/compiler/testData/codegen/box/delegatedProperty/inClassVar.kt b/compiler/testData/codegen/box/delegatedProperty/inClassVar.kt new file mode 100644 index 00000000000..8c5821c93b9 --- /dev/null +++ b/compiler/testData/codegen/box/delegatedProperty/inClassVar.kt @@ -0,0 +1,18 @@ +class Delegate { + var inner = 1 + fun get(t: Any?, p: String): Int = inner + fun set(t: Any?, p: String, i: Int) { inner = i } +} + +class A { + var prop: Int by Delegate() +} + +fun box(): String { + val c = A() + if(c.prop != 1) return "fail get" + c.prop = 2 + if (c.prop != 2) return "fail set" + return "OK" +} + diff --git a/compiler/testData/codegen/box/delegatedProperty/inTrait.kt b/compiler/testData/codegen/box/delegatedProperty/inTrait.kt new file mode 100644 index 00000000000..8e937d7e8ee --- /dev/null +++ b/compiler/testData/codegen/box/delegatedProperty/inTrait.kt @@ -0,0 +1,15 @@ +class Delegate { + fun get(t: Any?, p: String): Int = 1 +} + +trait A { + val prop: Int +} + +class AImpl: A { + override val prop: Int by Delegate() +} + +fun box(): String { + return if(AImpl().prop == 1) "OK" else "fail" +} diff --git a/compiler/testData/codegen/box/delegatedProperty/inferredPropertyType.kt b/compiler/testData/codegen/box/delegatedProperty/inferredPropertyType.kt new file mode 100644 index 00000000000..6c3ceebd1d2 --- /dev/null +++ b/compiler/testData/codegen/box/delegatedProperty/inferredPropertyType.kt @@ -0,0 +1,18 @@ +class Delegate(var inner: T) { + fun get(t: Any?, p: String): T = inner + fun set(t: Any?, p: String, i: T) { inner = i } +} + +class A { + inner class B { + var prop by Delegate(1) + } +} + +fun box(): String { + val c = A().B() + if(c.prop != 1) return "fail get" + c.prop = 2 + if (c.prop != 2) return "fail set" + return "OK" +} diff --git a/compiler/testData/codegen/box/delegatedProperty/privateVar.kt b/compiler/testData/codegen/box/delegatedProperty/privateVar.kt new file mode 100644 index 00000000000..24e8ca00bae --- /dev/null +++ b/compiler/testData/codegen/box/delegatedProperty/privateVar.kt @@ -0,0 +1,20 @@ +class Delegate { + var inner = 1 + fun get(t: Any?, p: String): Int = inner + fun set(t: Any?, p: String, i: Int) { inner = i } +} + +class A { + private var prop: Int by Delegate() + + fun test(): String { + if(prop != 1) return "fail get" + prop = 2 + if (prop != 2) return "fail set" + return "OK" + } +} + +fun box(): String { + return A().test() +} \ No newline at end of file diff --git a/compiler/testData/codegen/box/delegatedProperty/setAsExtensionFun.kt b/compiler/testData/codegen/box/delegatedProperty/setAsExtensionFun.kt new file mode 100644 index 00000000000..ab565dec7b3 --- /dev/null +++ b/compiler/testData/codegen/box/delegatedProperty/setAsExtensionFun.kt @@ -0,0 +1,18 @@ +class Delegate { + var inner = 1 + fun get(t: Any?, p: String): Int = inner +} + +fun Delegate.set(t: Any?, p: String, i: Int) { inner = i } + +class A { + var prop: Int by Delegate() +} + +fun box(): String { + val c = A() + if(c.prop != 1) return "fail get" + c.prop = 2 + if (c.prop != 2) return "fail set" + return "OK" +} diff --git a/compiler/testData/codegen/box/delegatedProperty/setAsExtensionFunInClass.kt b/compiler/testData/codegen/box/delegatedProperty/setAsExtensionFunInClass.kt new file mode 100644 index 00000000000..c0d9ab404df --- /dev/null +++ b/compiler/testData/codegen/box/delegatedProperty/setAsExtensionFunInClass.kt @@ -0,0 +1,18 @@ +class Delegate { + var inner = 1 + fun get(t: Any?, p: String): Int = inner +} + +class A { + fun Delegate.set(t: Any?, p: String, i: Int) { inner = i } + + var prop: Int by Delegate() +} + +fun box(): String { + val c = A() + if(c.prop != 1) return "fail get" + c.prop = 2 + if (c.prop != 2) return "fail set" + return "OK" +} diff --git a/compiler/testData/codegen/box/delegatedProperty/topLevelVal.kt b/compiler/testData/codegen/box/delegatedProperty/topLevelVal.kt new file mode 100644 index 00000000000..88a8977d8d1 --- /dev/null +++ b/compiler/testData/codegen/box/delegatedProperty/topLevelVal.kt @@ -0,0 +1,9 @@ +class Delegate { + fun get(t: Any?, p: String): Int = 1 +} + +val prop: Int by Delegate() + +fun box(): String { + return if(prop == 1) "OK" else "fail" +} diff --git a/compiler/testData/codegen/box/delegatedProperty/topLevelVar.kt b/compiler/testData/codegen/box/delegatedProperty/topLevelVar.kt new file mode 100644 index 00000000000..c8b16f8c8f2 --- /dev/null +++ b/compiler/testData/codegen/box/delegatedProperty/topLevelVar.kt @@ -0,0 +1,14 @@ +class Delegate { + var inner = 1 + fun get(t: Any?, p: String): Int = inner + fun set(t: Any?, p: String, i: Int) { inner = i } +} + +var prop: Int by Delegate() + +fun box(): String { + if(prop != 1) return "fail get" + prop = 2 + if (prop != 2) return "fail set" + return "OK" +} diff --git a/compiler/testData/codegen/box/delegatedProperty/twoPropByOneDelegete.kt b/compiler/testData/codegen/box/delegatedProperty/twoPropByOneDelegete.kt new file mode 100644 index 00000000000..a59c4f03fbe --- /dev/null +++ b/compiler/testData/codegen/box/delegatedProperty/twoPropByOneDelegete.kt @@ -0,0 +1,20 @@ +class Delegate(val f: (T) -> Int) { + fun get(t: T, p: String): Int = f(t) +} + +val p = Delegate { t -> t.foo() } + +class A(val i: Int) { + val prop: Int by p + + fun foo(): Int { + return i + } +} + +fun box(): String { + if(A(1).prop != 1) return "fail get1" + if(A(10).prop != 10) return "fail get2" + + return "OK" +} diff --git a/compiler/testData/codegen/box/delegatedProperty/valInInnerClass.kt b/compiler/testData/codegen/box/delegatedProperty/valInInnerClass.kt new file mode 100644 index 00000000000..f69c505ff95 --- /dev/null +++ b/compiler/testData/codegen/box/delegatedProperty/valInInnerClass.kt @@ -0,0 +1,13 @@ +class Delegate { + fun get(t: Any?, p: String): Int = 1 +} + +class A { + inner class B { + val prop: Int by Delegate() + } +} + +fun box(): String { + return if(A().B().prop == 1) "OK" else "fail" +} diff --git a/compiler/testData/codegen/box/delegatedProperty/varInInnerClass.kt b/compiler/testData/codegen/box/delegatedProperty/varInInnerClass.kt new file mode 100644 index 00000000000..ea06f24afe1 --- /dev/null +++ b/compiler/testData/codegen/box/delegatedProperty/varInInnerClass.kt @@ -0,0 +1,19 @@ +class Delegate { + var inner = 1 + fun get(t: Any?, p: String): Int = inner + fun set(t: Any?, p: String, i: Int) { inner = i } +} + +class A { + inner class B { + var prop: Int by Delegate() + } +} + +fun box(): String { + val c = A().B() + if(c.prop != 1) return "fail get" + c.prop = 2 + if (c.prop != 2) return "fail set" + return "OK" +} diff --git a/compiler/testData/codegen/box/delegatedProperty/vararg.kt b/compiler/testData/codegen/box/delegatedProperty/vararg.kt new file mode 100644 index 00000000000..c2a62d7729a --- /dev/null +++ b/compiler/testData/codegen/box/delegatedProperty/vararg.kt @@ -0,0 +1,9 @@ +class Delegate { + fun get(t: Any?, vararg p: String): Int = 1 +} + +val prop: Int by Delegate() + +fun box(): String { + return if(prop == 1) "OK" else "fail" +} diff --git a/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java index 86b81579648..73ff5d85782 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java @@ -31,7 +31,7 @@ import org.jetbrains.jet.codegen.generated.AbstractBlackBoxCodegenTest; /** This class is generated by {@link org.jetbrains.jet.generators.tests.GenerateTests}. DO NOT MODIFY MANUALLY */ @SuppressWarnings("all") @TestMetadata("compiler/testData/codegen/box") -@InnerTestClasses({BlackBoxCodegenTestGenerated.Arrays.class, BlackBoxCodegenTestGenerated.Bridges.class, BlackBoxCodegenTestGenerated.CallableReference.class, BlackBoxCodegenTestGenerated.Casts.class, BlackBoxCodegenTestGenerated.Classes.class, BlackBoxCodegenTestGenerated.Closures.class, BlackBoxCodegenTestGenerated.ControlStructures.class, BlackBoxCodegenTestGenerated.DefaultArguments.class, BlackBoxCodegenTestGenerated.Elvis.class, BlackBoxCodegenTestGenerated.Enum.class, BlackBoxCodegenTestGenerated.ExclExcl.class, BlackBoxCodegenTestGenerated.ExtensionFunctions.class, BlackBoxCodegenTestGenerated.ExtensionProperties.class, BlackBoxCodegenTestGenerated.Functions.class, BlackBoxCodegenTestGenerated.InnerNested.class, BlackBoxCodegenTestGenerated.Instructions.class, BlackBoxCodegenTestGenerated.Intrinsics.class, BlackBoxCodegenTestGenerated.Labels.class, BlackBoxCodegenTestGenerated.LocalClasses.class, BlackBoxCodegenTestGenerated.MultiDecl.class, BlackBoxCodegenTestGenerated.Namespace.class, BlackBoxCodegenTestGenerated.Objects.class, BlackBoxCodegenTestGenerated.OperatorConventions.class, BlackBoxCodegenTestGenerated.PrimitiveTypes.class, BlackBoxCodegenTestGenerated.Properties.class, BlackBoxCodegenTestGenerated.Reflection.class, BlackBoxCodegenTestGenerated.SafeCall.class, BlackBoxCodegenTestGenerated.Sam.class, BlackBoxCodegenTestGenerated.Strings.class, BlackBoxCodegenTestGenerated.Super.class, BlackBoxCodegenTestGenerated.Traits.class, BlackBoxCodegenTestGenerated.TypeInfo.class, BlackBoxCodegenTestGenerated.Unit.class, BlackBoxCodegenTestGenerated.Vararg.class, BlackBoxCodegenTestGenerated.When.class}) +@InnerTestClasses({BlackBoxCodegenTestGenerated.Arrays.class, BlackBoxCodegenTestGenerated.Bridges.class, BlackBoxCodegenTestGenerated.CallableReference.class, BlackBoxCodegenTestGenerated.Casts.class, BlackBoxCodegenTestGenerated.Classes.class, BlackBoxCodegenTestGenerated.Closures.class, BlackBoxCodegenTestGenerated.ControlStructures.class, BlackBoxCodegenTestGenerated.DefaultArguments.class, BlackBoxCodegenTestGenerated.DelegatedProperty.class, BlackBoxCodegenTestGenerated.Elvis.class, BlackBoxCodegenTestGenerated.Enum.class, BlackBoxCodegenTestGenerated.ExclExcl.class, BlackBoxCodegenTestGenerated.ExtensionFunctions.class, BlackBoxCodegenTestGenerated.ExtensionProperties.class, BlackBoxCodegenTestGenerated.Functions.class, BlackBoxCodegenTestGenerated.InnerNested.class, BlackBoxCodegenTestGenerated.Instructions.class, BlackBoxCodegenTestGenerated.Intrinsics.class, BlackBoxCodegenTestGenerated.Labels.class, BlackBoxCodegenTestGenerated.LocalClasses.class, BlackBoxCodegenTestGenerated.MultiDecl.class, BlackBoxCodegenTestGenerated.Namespace.class, BlackBoxCodegenTestGenerated.Objects.class, BlackBoxCodegenTestGenerated.OperatorConventions.class, BlackBoxCodegenTestGenerated.PrimitiveTypes.class, BlackBoxCodegenTestGenerated.Properties.class, BlackBoxCodegenTestGenerated.Reflection.class, BlackBoxCodegenTestGenerated.SafeCall.class, BlackBoxCodegenTestGenerated.Sam.class, BlackBoxCodegenTestGenerated.Strings.class, BlackBoxCodegenTestGenerated.Super.class, BlackBoxCodegenTestGenerated.Traits.class, BlackBoxCodegenTestGenerated.TypeInfo.class, BlackBoxCodegenTestGenerated.Unit.class, BlackBoxCodegenTestGenerated.Vararg.class, BlackBoxCodegenTestGenerated.When.class}) public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { public void testAllFilesPresentInBox() throws Exception { JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.GenerateTests", new File("compiler/testData/codegen/box"), Pattern.compile("^(.+)\\.kt$"), true); @@ -1620,6 +1620,144 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { } } + @TestMetadata("compiler/testData/codegen/box/delegatedProperty") + public static class DelegatedProperty extends AbstractBlackBoxCodegenTest { + public void testAllFilesPresentInDelegatedProperty() throws Exception { + JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.GenerateTests", new File("compiler/testData/codegen/box/delegatedProperty"), Pattern.compile("^(.+)\\.kt$"), true); + } + + @TestMetadata("capturePropertyInClosure.kt") + public void testCapturePropertyInClosure() throws Exception { + doTest("compiler/testData/codegen/box/delegatedProperty/capturePropertyInClosure.kt"); + } + + @TestMetadata("castGetReturnType.kt") + public void testCastGetReturnType() throws Exception { + doTest("compiler/testData/codegen/box/delegatedProperty/castGetReturnType.kt"); + } + + @TestMetadata("castSetParameter.kt") + public void testCastSetParameter() throws Exception { + doTest("compiler/testData/codegen/box/delegatedProperty/castSetParameter.kt"); + } + + @TestMetadata("defaultArgs.kt") + public void testDefaultArgs() throws Exception { + doTest("compiler/testData/codegen/box/delegatedProperty/defaultArgs.kt"); + } + + @TestMetadata("delegateAsInnerClass.kt") + public void testDelegateAsInnerClass() throws Exception { + doTest("compiler/testData/codegen/box/delegatedProperty/delegateAsInnerClass.kt"); + } + + @TestMetadata("delegateByOtherProperty.kt") + public void testDelegateByOtherProperty() throws Exception { + doTest("compiler/testData/codegen/box/delegatedProperty/delegateByOtherProperty.kt"); + } + + @TestMetadata("delegateByTopLevelFun.kt") + public void testDelegateByTopLevelFun() throws Exception { + doTest("compiler/testData/codegen/box/delegatedProperty/delegateByTopLevelFun.kt"); + } + + @TestMetadata("delegateByTopLevelProperty.kt") + public void testDelegateByTopLevelProperty() throws Exception { + doTest("compiler/testData/codegen/box/delegatedProperty/delegateByTopLevelProperty.kt"); + } + + @TestMetadata("delegateForExtProperty.kt") + public void testDelegateForExtProperty() throws Exception { + doTest("compiler/testData/codegen/box/delegatedProperty/delegateForExtProperty.kt"); + } + + @TestMetadata("delegateForExtPropertyInClass.kt") + public void testDelegateForExtPropertyInClass() throws Exception { + doTest("compiler/testData/codegen/box/delegatedProperty/delegateForExtPropertyInClass.kt"); + } + + @TestMetadata("genericDelegate.kt") + public void testGenericDelegate() throws Exception { + doTest("compiler/testData/codegen/box/delegatedProperty/genericDelegate.kt"); + } + + @TestMetadata("getAsExtensionFun.kt") + public void testGetAsExtensionFun() throws Exception { + doTest("compiler/testData/codegen/box/delegatedProperty/getAsExtensionFun.kt"); + } + + @TestMetadata("getAsExtensionFunInClass.kt") + public void testGetAsExtensionFunInClass() throws Exception { + doTest("compiler/testData/codegen/box/delegatedProperty/getAsExtensionFunInClass.kt"); + } + + @TestMetadata("inClassVal.kt") + public void testInClassVal() throws Exception { + doTest("compiler/testData/codegen/box/delegatedProperty/inClassVal.kt"); + } + + @TestMetadata("inClassVar.kt") + public void testInClassVar() throws Exception { + doTest("compiler/testData/codegen/box/delegatedProperty/inClassVar.kt"); + } + + @TestMetadata("inTrait.kt") + public void testInTrait() throws Exception { + doTest("compiler/testData/codegen/box/delegatedProperty/inTrait.kt"); + } + + @TestMetadata("inferredPropertyType.kt") + public void testInferredPropertyType() throws Exception { + doTest("compiler/testData/codegen/box/delegatedProperty/inferredPropertyType.kt"); + } + + @TestMetadata("privateVar.kt") + public void testPrivateVar() throws Exception { + doTest("compiler/testData/codegen/box/delegatedProperty/privateVar.kt"); + } + + @TestMetadata("setAsExtensionFun.kt") + public void testSetAsExtensionFun() throws Exception { + doTest("compiler/testData/codegen/box/delegatedProperty/setAsExtensionFun.kt"); + } + + @TestMetadata("setAsExtensionFunInClass.kt") + public void testSetAsExtensionFunInClass() throws Exception { + doTest("compiler/testData/codegen/box/delegatedProperty/setAsExtensionFunInClass.kt"); + } + + @TestMetadata("topLevelVal.kt") + public void testTopLevelVal() throws Exception { + doTest("compiler/testData/codegen/box/delegatedProperty/topLevelVal.kt"); + } + + @TestMetadata("topLevelVar.kt") + public void testTopLevelVar() throws Exception { + doTest("compiler/testData/codegen/box/delegatedProperty/topLevelVar.kt"); + } + + @TestMetadata("twoPropByOneDelegete.kt") + public void testTwoPropByOneDelegete() throws Exception { + doTest("compiler/testData/codegen/box/delegatedProperty/twoPropByOneDelegete.kt"); + } + + @TestMetadata("valInInnerClass.kt") + public void testValInInnerClass() throws Exception { + doTest("compiler/testData/codegen/box/delegatedProperty/valInInnerClass.kt"); + } + + @TestMetadata("varInInnerClass.kt") + public void testVarInInnerClass() throws Exception { + doTest("compiler/testData/codegen/box/delegatedProperty/varInInnerClass.kt"); + } + + @TestMetadata("vararg.kt") + public void testVararg() throws Exception { + doTest("compiler/testData/codegen/box/delegatedProperty/vararg.kt"); + } + + } + @TestMetadata("compiler/testData/codegen/box/elvis") public static class Elvis extends AbstractBlackBoxCodegenTest { public void testAllFilesPresentInElvis() throws Exception { @@ -3919,6 +4057,7 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { suite.addTest(Closures.innerSuite()); suite.addTestSuite(ControlStructures.class); suite.addTest(DefaultArguments.innerSuite()); + suite.addTestSuite(DelegatedProperty.class); suite.addTestSuite(Elvis.class); suite.addTestSuite(Enum.class); suite.addTestSuite(ExclExcl.class);