From 8012725d382e963e74c77bd0b3a26fa81ea14251 Mon Sep 17 00:00:00 2001 From: Alex Tkachman Date: Wed, 11 Jul 2012 13:10:54 +0300 Subject: [PATCH] KT-2060 fix --- .../org/jetbrains/jet/codegen/ExpressionCodegen.java | 10 ++++++---- compiler/testData/codegen/regressions/kt2060.kt | 11 +++++++++++ compiler/testData/codegen/regressions/kt2060_1.kt | 12 ++++++++++++ .../org/jetbrains/jet/codegen/ClassGenTest.java | 5 +++++ 4 files changed, 34 insertions(+), 4 deletions(-) create mode 100644 compiler/testData/codegen/regressions/kt2060.kt create mode 100644 compiler/testData/codegen/regressions/kt2060_1.kt diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index d263d6de8eb..b170238a693 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -1229,10 +1229,12 @@ public class ExpressionCodegen extends JetVisitor { boolean isStatic = containingDeclaration instanceof NamespaceDescriptor; boolean overridesTrait = isOverrideForTrait(propertyDescriptor); - propertyDescriptor = propertyDescriptor.getOriginal(); - boolean isInsideClass = ((containingDeclaration == context.getThisDescriptor()) || + boolean isFakeOverride = propertyDescriptor.getKind() == CallableMemberDescriptor.Kind.FAKE_OVERRIDE; + PropertyDescriptor initialDescriptor = propertyDescriptor; + propertyDescriptor = initialDescriptor.getOriginal(); + boolean isInsideClass = !isFakeOverride && (((containingDeclaration == context.getThisDescriptor()) || (context.getParentContext() instanceof CodegenContexts.NamespaceContext) && context.getParentContext().getContextDescriptor() == containingDeclaration) - && contextKind() != OwnerKind.TRAIT_IMPL; + && contextKind() != OwnerKind.TRAIT_IMPL); Method getter; Method setter; if (forceField) { @@ -1305,7 +1307,7 @@ public class ExpressionCodegen extends JetVisitor { // TODO ugly CallableMethod callableMethod = typeMapper.mapToCallableMethod(propertyDescriptor.getGetter(), isSuper, contextKind()); invokeOpcode = callableMethod.getInvokeOpcode(); - owner = callableMethod.getOwner(); + owner = isFakeOverride && !overridesTrait && !CodegenUtil.isInterface(initialDescriptor.getContainingDeclaration()) ? JvmClassName.byType(typeMapper.mapType(((ClassDescriptor)initialDescriptor.getContainingDeclaration()).getDefaultType(), MapTypeMode.IMPL)): callableMethod.getOwner(); ownerParam = callableMethod.getDefaultImplParam(); } diff --git a/compiler/testData/codegen/regressions/kt2060.kt b/compiler/testData/codegen/regressions/kt2060.kt new file mode 100644 index 00000000000..666cea73389 --- /dev/null +++ b/compiler/testData/codegen/regressions/kt2060.kt @@ -0,0 +1,11 @@ +package testing; // There is no error if both files are in default package + +public abstract class ClassWithInternals { + protected var some: Int = 0; + protected var someGetter: Int = 0 + get() = 5 + + protected fun foo() : Int = 0 + + public abstract fun start() : Unit; +} diff --git a/compiler/testData/codegen/regressions/kt2060_1.kt b/compiler/testData/codegen/regressions/kt2060_1.kt new file mode 100644 index 00000000000..1fb28efa593 --- /dev/null +++ b/compiler/testData/codegen/regressions/kt2060_1.kt @@ -0,0 +1,12 @@ +import testing.ClassWithInternals + +public class HelloServer() : ClassWithInternals() { + public override fun start() { + val test = foo() + someGetter //+ some + } +} + +fun box() : String { + HelloServer().start() + return "OK" +} \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/jet/codegen/ClassGenTest.java b/compiler/tests/org/jetbrains/jet/codegen/ClassGenTest.java index e09c7580502..8a5afb6b9a1 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/ClassGenTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/ClassGenTest.java @@ -466,4 +466,9 @@ public class ClassGenTest extends CodegenTestCase { createEnvironmentWithMockJdkAndIdeaAnnotations(ConfigurationKind.JDK_ONLY); blackBoxFile("regressions/kt2391.kt"); } + + public void testKt2060() { + createEnvironmentWithMockJdkAndIdeaAnnotations(ConfigurationKind.JDK_ONLY); + blackBoxMultiFile("regressions/kt2060_1.kt", "regressions/kt2060.kt"); + } }