From 9f640b00d9e79b3d26277a27f9bf85898d058cef Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Wed, 16 Sep 2015 11:12:33 +0300 Subject: [PATCH] "field": synthetic variable creation in accessors, codegen changed accordingly, a set of tests, relevant code fix (j2k) --- .../kotlin/codegen/ExpressionCodegen.java | 13 +++--- .../impl/SyntheticFieldDescriptor.kt | 41 ++++++++++++++++++ .../kotlin/resolve/BodyResolver.java | 18 ++++++++ .../testData/codegen/box/properties/field.kt | 10 +++++ .../codegen/box/properties/fieldInClass.kt | 6 +++ .../box/properties/fieldInsideField.kt | 13 ++++++ .../box/properties/fieldInsideNested.kt | 12 ++++++ .../codegen/box/properties/fieldSimple.kt | 4 ++ .../tests/backingField/FieldAsProperty.kt | 9 ++++ .../tests/backingField/FieldAsProperty.txt | 11 +++++ .../tests/backingField/FieldDerived.kt | 18 ++++++++ .../tests/backingField/FieldDerived.txt | 33 +++++++++++++++ .../tests/backingField/FieldInInterface.kt | 4 ++ .../tests/backingField/FieldInInterface.txt | 8 ++++ .../tests/backingField/FieldInLocal.kt | 11 +++++ .../tests/backingField/FieldInLocal.txt | 3 ++ .../tests/backingField/FieldOnVal.kt | 2 + .../tests/backingField/FieldOnVal.txt | 3 ++ .../tests/backingField/FieldOnVar.kt | 5 +++ .../tests/backingField/FieldOnVar.txt | 3 ++ .../tests/backingField/FieldShadow.kt | 8 ++++ .../tests/backingField/FieldShadow.txt | 9 ++++ .../checkers/JetDiagnosticsTestGenerated.java | 42 +++++++++++++++++++ .../BlackBoxCodegenTestGenerated.java | 30 +++++++++++++ .../codeInsight/ReferenceVariantsHelper.kt | 5 ++- .../FieldToPropertyProcessing.kt | 2 +- 26 files changed, 315 insertions(+), 8 deletions(-) create mode 100644 compiler/frontend/src/org/jetbrains/kotlin/descriptors/impl/SyntheticFieldDescriptor.kt create mode 100644 compiler/testData/codegen/box/properties/field.kt create mode 100644 compiler/testData/codegen/box/properties/fieldInClass.kt create mode 100644 compiler/testData/codegen/box/properties/fieldInsideField.kt create mode 100644 compiler/testData/codegen/box/properties/fieldInsideNested.kt create mode 100644 compiler/testData/codegen/box/properties/fieldSimple.kt create mode 100644 compiler/testData/diagnostics/tests/backingField/FieldAsProperty.kt create mode 100644 compiler/testData/diagnostics/tests/backingField/FieldAsProperty.txt create mode 100644 compiler/testData/diagnostics/tests/backingField/FieldDerived.kt create mode 100644 compiler/testData/diagnostics/tests/backingField/FieldDerived.txt create mode 100644 compiler/testData/diagnostics/tests/backingField/FieldInInterface.kt create mode 100644 compiler/testData/diagnostics/tests/backingField/FieldInInterface.txt create mode 100644 compiler/testData/diagnostics/tests/backingField/FieldInLocal.kt create mode 100644 compiler/testData/diagnostics/tests/backingField/FieldInLocal.txt create mode 100644 compiler/testData/diagnostics/tests/backingField/FieldOnVal.kt create mode 100644 compiler/testData/diagnostics/tests/backingField/FieldOnVal.txt create mode 100644 compiler/testData/diagnostics/tests/backingField/FieldOnVar.kt create mode 100644 compiler/testData/diagnostics/tests/backingField/FieldOnVar.txt create mode 100644 compiler/testData/diagnostics/tests/backingField/FieldShadow.kt create mode 100644 compiler/testData/diagnostics/tests/backingField/FieldShadow.txt diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java index 896f430d590..6adc551bc30 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java @@ -47,6 +47,7 @@ import org.jetbrains.kotlin.codegen.when.SwitchCodegen; import org.jetbrains.kotlin.codegen.when.SwitchCodegenUtil; import org.jetbrains.kotlin.descriptors.*; import org.jetbrains.kotlin.descriptors.impl.ScriptCodeDescriptor; +import org.jetbrains.kotlin.descriptors.impl.SyntheticFieldDescriptor; import org.jetbrains.kotlin.diagnostics.DiagnosticUtils; import org.jetbrains.kotlin.diagnostics.Errors; import org.jetbrains.kotlin.incremental.components.NoLookupLocation; @@ -58,10 +59,7 @@ import org.jetbrains.kotlin.load.java.descriptors.SamConstructorDescriptor; import org.jetbrains.kotlin.name.Name; import org.jetbrains.kotlin.psi.*; import org.jetbrains.kotlin.renderer.DescriptorRenderer; -import org.jetbrains.kotlin.resolve.BindingContext; -import org.jetbrains.kotlin.resolve.BindingContextUtils; -import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils; -import org.jetbrains.kotlin.resolve.DescriptorUtils; +import org.jetbrains.kotlin.resolve.*; import org.jetbrains.kotlin.resolve.annotations.AnnotationsPackage; import org.jetbrains.kotlin.resolve.calls.callResolverUtil.CallResolverUtilPackage; import org.jetbrains.kotlin.resolve.calls.model.*; @@ -1981,6 +1979,10 @@ public class ExpressionCodegen extends JetVisitor implem assert descriptor != null : "Couldn't find descriptor for '" + expression.getText() + "'"; descriptor = descriptor.getOriginal(); + boolean isSyntheticField = descriptor instanceof SyntheticFieldDescriptor; + if (isSyntheticField) { + descriptor = ((SyntheticFieldDescriptor) descriptor).getPropertyDescriptor(); + } if (descriptor instanceof CallableMemberDescriptor) { CallableMemberDescriptor memberDescriptor = DescriptorUtils.unwrapFakeOverride((CallableMemberDescriptor) descriptor); @@ -2009,7 +2011,8 @@ public class ExpressionCodegen extends JetVisitor implem } boolean directToField = - expression.getReferencedNameElementType() == JetTokens.FIELD_IDENTIFIER && contextKind() != OwnerKind.TRAIT_IMPL; + (expression.getReferencedNameElementType() == JetTokens.FIELD_IDENTIFIER || isSyntheticField) + && contextKind() != OwnerKind.TRAIT_IMPL; JetSuperExpression superExpression = resolvedCall == null ? null : CallResolverUtilPackage.getSuperCallExpression(resolvedCall.getCall()); propertyDescriptor = context.accessibleDescriptor(propertyDescriptor, superExpression); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/descriptors/impl/SyntheticFieldDescriptor.kt b/compiler/frontend/src/org/jetbrains/kotlin/descriptors/impl/SyntheticFieldDescriptor.kt new file mode 100644 index 00000000000..3980c004ed9 --- /dev/null +++ b/compiler/frontend/src/org/jetbrains/kotlin/descriptors/impl/SyntheticFieldDescriptor.kt @@ -0,0 +1,41 @@ +/* + * Copyright 2010-2015 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.kotlin.descriptors.impl + +import org.jetbrains.kotlin.descriptors.PropertyAccessorDescriptor +import org.jetbrains.kotlin.descriptors.PropertyDescriptor +import org.jetbrains.kotlin.descriptors.annotations.Annotations +import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.psi.JetProperty +import org.jetbrains.kotlin.resolve.source.toSourceElement + +class SyntheticFieldDescriptor private constructor( + val propertyDescriptor: PropertyDescriptor, + accessorDescriptor: PropertyAccessorDescriptor, + property: JetProperty +): LocalVariableDescriptor(accessorDescriptor, Annotations.EMPTY, SyntheticFieldDescriptor.NAME, + propertyDescriptor.type, propertyDescriptor.isVar, property.toSourceElement()) { + + constructor(accessorDescriptor: PropertyAccessorDescriptor, + property: JetProperty): this(accessorDescriptor.correspondingProperty, accessorDescriptor, property) + + override fun getDispatchReceiverParameter() = propertyDescriptor.dispatchReceiverParameter + + companion object { + val NAME = Name.identifier("field") + } +} \ No newline at end of file diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/BodyResolver.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/BodyResolver.java index b1e1e252a08..d45ade2f5ea 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/BodyResolver.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/BodyResolver.java @@ -25,7 +25,11 @@ import kotlin.jvm.functions.Function1; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.descriptors.*; +import org.jetbrains.kotlin.descriptors.annotations.Annotations; +import org.jetbrains.kotlin.descriptors.impl.LocalVariableDescriptor; +import org.jetbrains.kotlin.descriptors.impl.SyntheticFieldDescriptor; import org.jetbrains.kotlin.lexer.JetTokens; +import org.jetbrains.kotlin.name.Name; import org.jetbrains.kotlin.psi.*; import org.jetbrains.kotlin.psi.psiUtil.PsiUtilPackage; import org.jetbrains.kotlin.resolve.calls.CallResolver; @@ -37,6 +41,7 @@ import org.jetbrains.kotlin.resolve.calls.util.CallMaker; import org.jetbrains.kotlin.resolve.lazy.ForceResolveUtil; import org.jetbrains.kotlin.resolve.scopes.*; import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue; +import org.jetbrains.kotlin.resolve.source.KotlinSourceElementKt; import org.jetbrains.kotlin.types.*; import org.jetbrains.kotlin.types.expressions.ExpressionTypingContext; import org.jetbrains.kotlin.types.expressions.ExpressionTypingServices; @@ -649,6 +654,9 @@ public class BodyResolver { trace.record(BindingContext.BACKING_FIELD_REQUIRED, propertyDescriptor); // TODO: this trace? } } + if (descriptor instanceof SyntheticFieldDescriptor) { + trace.record(BindingContext.BACKING_FIELD_REQUIRED, propertyDescriptor); + } } } }); @@ -766,6 +774,16 @@ public class BodyResolver { trace, innerScope, outerDataFlowInfo, NO_EXPECTED_TYPE, callChecker) ); + // Synthetic "field" creation + if (functionDescriptor instanceof PropertyAccessorDescriptor) { + assert innerScope instanceof WritableScopeStorage : "Expected innerScope as WritableScopeStorage but got " + innerScope; + PropertyAccessorDescriptor accessorDescriptor = (PropertyAccessorDescriptor) functionDescriptor; + JetProperty property = (JetProperty) function.getParent(); + SyntheticFieldDescriptor fieldDescriptor = new SyntheticFieldDescriptor(accessorDescriptor, property); + WritableScopeStorage innerScopeStorage = (WritableScopeStorage) innerScope; + innerScopeStorage.addVariableOrClassDescriptor(fieldDescriptor); + } + DataFlowInfo dataFlowInfo = null; if (beforeBlockBody != null) { diff --git a/compiler/testData/codegen/box/properties/field.kt b/compiler/testData/codegen/box/properties/field.kt new file mode 100644 index 00000000000..c03066671ad --- /dev/null +++ b/compiler/testData/codegen/box/properties/field.kt @@ -0,0 +1,10 @@ +var my: String = "" + get() = field + "K" + set(arg) { + field = arg + } + +fun box(): String { + my = "O" + return my +} diff --git a/compiler/testData/codegen/box/properties/fieldInClass.kt b/compiler/testData/codegen/box/properties/fieldInClass.kt new file mode 100644 index 00000000000..37ef0a06a9a --- /dev/null +++ b/compiler/testData/codegen/box/properties/fieldInClass.kt @@ -0,0 +1,6 @@ +class My { + val my: String = "O" + get() = field + "K" +} + +fun box() = My().my diff --git a/compiler/testData/codegen/box/properties/fieldInsideField.kt b/compiler/testData/codegen/box/properties/fieldInsideField.kt new file mode 100644 index 00000000000..e86fe70da9e --- /dev/null +++ b/compiler/testData/codegen/box/properties/fieldInsideField.kt @@ -0,0 +1,13 @@ +abstract class Your { + abstract val your: String + + fun foo() = your +} + +val my: String = "O" + get() = field + object: Your() { + override val your = "K" + get() = field + }.foo() + +fun box() = my \ No newline at end of file diff --git a/compiler/testData/codegen/box/properties/fieldInsideNested.kt b/compiler/testData/codegen/box/properties/fieldInsideNested.kt new file mode 100644 index 00000000000..cb49c6b46c7 --- /dev/null +++ b/compiler/testData/codegen/box/properties/fieldInsideNested.kt @@ -0,0 +1,12 @@ +abstract class Your { + abstract val your: String + + fun foo() = your +} + +val my: String = "O" + get() = object: Your() { + override val your = field + }.foo() + "K" + +fun box() = my \ No newline at end of file diff --git a/compiler/testData/codegen/box/properties/fieldSimple.kt b/compiler/testData/codegen/box/properties/fieldSimple.kt new file mode 100644 index 00000000000..be19a1f8d45 --- /dev/null +++ b/compiler/testData/codegen/box/properties/fieldSimple.kt @@ -0,0 +1,4 @@ +val x: String = "OK" + get() = field + +fun box() = x \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/backingField/FieldAsProperty.kt b/compiler/testData/diagnostics/tests/backingField/FieldAsProperty.kt new file mode 100644 index 00000000000..a0990d567d3 --- /dev/null +++ b/compiler/testData/diagnostics/tests/backingField/FieldAsProperty.kt @@ -0,0 +1,9 @@ +class My(val field: Int) { + // Backing field, initializer + val second: Int = 0 + get() = field + + // No backing field, no initializer + val third: Int + get() = this.field +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/backingField/FieldAsProperty.txt b/compiler/testData/diagnostics/tests/backingField/FieldAsProperty.txt new file mode 100644 index 00000000000..1a1cc016ca1 --- /dev/null +++ b/compiler/testData/diagnostics/tests/backingField/FieldAsProperty.txt @@ -0,0 +1,11 @@ +package + +public final class My { + public constructor My(/*0*/ field: kotlin.Int) + public final val field: kotlin.Int + public final val second: kotlin.Int = 0 + public final val third: kotlin.Int + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/testData/diagnostics/tests/backingField/FieldDerived.kt b/compiler/testData/diagnostics/tests/backingField/FieldDerived.kt new file mode 100644 index 00000000000..02c7621e8ff --- /dev/null +++ b/compiler/testData/diagnostics/tests/backingField/FieldDerived.kt @@ -0,0 +1,18 @@ +open class Base { + open val x: Int = 1 + get() = field - 1 +} + +class Other: Base() { + override val x = 2 +} + +class Another: Base() { + override val x = 3 + get() = field + 1 +} + +class NoBackingField: Base() { + override val x: Int + get() = 5 +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/backingField/FieldDerived.txt b/compiler/testData/diagnostics/tests/backingField/FieldDerived.txt new file mode 100644 index 00000000000..96496d691ac --- /dev/null +++ b/compiler/testData/diagnostics/tests/backingField/FieldDerived.txt @@ -0,0 +1,33 @@ +package + +public final class Another : Base { + public constructor Another() + public open override /*1*/ val x: kotlin.Int = 3 + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public open class Base { + public constructor Base() + public open val x: kotlin.Int = 1 + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public final class NoBackingField : Base { + public constructor NoBackingField() + public open override /*1*/ val x: kotlin.Int + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public final class Other : Base { + public constructor Other() + public open override /*1*/ val x: kotlin.Int = 2 + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/testData/diagnostics/tests/backingField/FieldInInterface.kt b/compiler/testData/diagnostics/tests/backingField/FieldInInterface.kt new file mode 100644 index 00000000000..febcda8b7cb --- /dev/null +++ b/compiler/testData/diagnostics/tests/backingField/FieldInInterface.kt @@ -0,0 +1,4 @@ +interface My { + val x: Int = 0 + get() = field +} diff --git a/compiler/testData/diagnostics/tests/backingField/FieldInInterface.txt b/compiler/testData/diagnostics/tests/backingField/FieldInInterface.txt new file mode 100644 index 00000000000..9d2163a0b66 --- /dev/null +++ b/compiler/testData/diagnostics/tests/backingField/FieldInInterface.txt @@ -0,0 +1,8 @@ +package + +public interface My { + public open val x: kotlin.Int = 0 + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/testData/diagnostics/tests/backingField/FieldInLocal.kt b/compiler/testData/diagnostics/tests/backingField/FieldInLocal.kt new file mode 100644 index 00000000000..cc14a9b10cd --- /dev/null +++ b/compiler/testData/diagnostics/tests/backingField/FieldInLocal.kt @@ -0,0 +1,11 @@ +// !DIAGNOSTICS: -UNUSED_VARIABLE +fun foo() { + open class Local { + val my: Int = 2 + get() = field + } + val your = object: Local() { + val your: Int = 3 + get() = field + } +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/backingField/FieldInLocal.txt b/compiler/testData/diagnostics/tests/backingField/FieldInLocal.txt new file mode 100644 index 00000000000..65a6ac47e1f --- /dev/null +++ b/compiler/testData/diagnostics/tests/backingField/FieldInLocal.txt @@ -0,0 +1,3 @@ +package + +public fun foo(): kotlin.Unit diff --git a/compiler/testData/diagnostics/tests/backingField/FieldOnVal.kt b/compiler/testData/diagnostics/tests/backingField/FieldOnVal.kt new file mode 100644 index 00000000000..02554ee0a3b --- /dev/null +++ b/compiler/testData/diagnostics/tests/backingField/FieldOnVal.kt @@ -0,0 +1,2 @@ +val my: Int = 21 + get() = field * 2 \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/backingField/FieldOnVal.txt b/compiler/testData/diagnostics/tests/backingField/FieldOnVal.txt new file mode 100644 index 00000000000..03e03666ec2 --- /dev/null +++ b/compiler/testData/diagnostics/tests/backingField/FieldOnVal.txt @@ -0,0 +1,3 @@ +package + +public val my: kotlin.Int = 21 diff --git a/compiler/testData/diagnostics/tests/backingField/FieldOnVar.kt b/compiler/testData/diagnostics/tests/backingField/FieldOnVar.kt new file mode 100644 index 00000000000..882c035d8e2 --- /dev/null +++ b/compiler/testData/diagnostics/tests/backingField/FieldOnVar.kt @@ -0,0 +1,5 @@ +var my: Int = 0 + get() = -field + set(arg) { + field = arg + } diff --git a/compiler/testData/diagnostics/tests/backingField/FieldOnVar.txt b/compiler/testData/diagnostics/tests/backingField/FieldOnVar.txt new file mode 100644 index 00000000000..679a34fc36d --- /dev/null +++ b/compiler/testData/diagnostics/tests/backingField/FieldOnVar.txt @@ -0,0 +1,3 @@ +package + +public var my: kotlin.Int diff --git a/compiler/testData/diagnostics/tests/backingField/FieldShadow.kt b/compiler/testData/diagnostics/tests/backingField/FieldShadow.kt new file mode 100644 index 00000000000..91cf9bb31c7 --- /dev/null +++ b/compiler/testData/diagnostics/tests/backingField/FieldShadow.kt @@ -0,0 +1,8 @@ +class My { + // No initialization needed because no backing field + val two: Int + get() { + val field = 2 + return field + } +} diff --git a/compiler/testData/diagnostics/tests/backingField/FieldShadow.txt b/compiler/testData/diagnostics/tests/backingField/FieldShadow.txt new file mode 100644 index 00000000000..7d3db6a518b --- /dev/null +++ b/compiler/testData/diagnostics/tests/backingField/FieldShadow.txt @@ -0,0 +1,9 @@ +package + +public final class My { + public constructor My() + public final val two: kotlin.Int + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java index 96c0be38e59..21c27cef42c 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java @@ -1326,6 +1326,48 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest { doTest(fileName); } + @TestMetadata("FieldAsProperty.kt") + public void testFieldAsProperty() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/backingField/FieldAsProperty.kt"); + doTest(fileName); + } + + @TestMetadata("FieldDerived.kt") + public void testFieldDerived() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/backingField/FieldDerived.kt"); + doTest(fileName); + } + + @TestMetadata("FieldInInterface.kt") + public void testFieldInInterface() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/backingField/FieldInInterface.kt"); + doTest(fileName); + } + + @TestMetadata("FieldInLocal.kt") + public void testFieldInLocal() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/backingField/FieldInLocal.kt"); + doTest(fileName); + } + + @TestMetadata("FieldOnVal.kt") + public void testFieldOnVal() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/backingField/FieldOnVal.kt"); + doTest(fileName); + } + + @TestMetadata("FieldOnVar.kt") + public void testFieldOnVar() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/backingField/FieldOnVar.kt"); + doTest(fileName); + } + + @TestMetadata("FieldShadow.kt") + public void testFieldShadow() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/backingField/FieldShadow.kt"); + doTest(fileName); + } + @TestMetadata("kt462BackingFieldsResolve.kt") public void testKt462BackingFieldsResolve() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/backingField/kt462BackingFieldsResolve.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxCodegenTestGenerated.java index 82dd588851d..93b32c493ae 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxCodegenTestGenerated.java @@ -6337,6 +6337,36 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { doTest(fileName); } + @TestMetadata("field.kt") + public void testField() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/box/properties/field.kt"); + doTest(fileName); + } + + @TestMetadata("fieldInClass.kt") + public void testFieldInClass() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/box/properties/fieldInClass.kt"); + doTest(fileName); + } + + @TestMetadata("fieldInsideField.kt") + public void testFieldInsideField() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/box/properties/fieldInsideField.kt"); + doTest(fileName); + } + + @TestMetadata("fieldInsideNested.kt") + public void testFieldInsideNested() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/box/properties/fieldInsideNested.kt"); + doTest(fileName); + } + + @TestMetadata("fieldSimple.kt") + public void testFieldSimple() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/box/properties/fieldSimple.kt"); + doTest(fileName); + } + @TestMetadata("generalAccess.kt") public void testGeneralAccess() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/box/properties/generalAccess.kt"); diff --git a/idea/ide-common/src/org/jetbrains/kotlin/idea/codeInsight/ReferenceVariantsHelper.kt b/idea/ide-common/src/org/jetbrains/kotlin/idea/codeInsight/ReferenceVariantsHelper.kt index fe306ab818a..213e6e5852a 100644 --- a/idea/ide-common/src/org/jetbrains/kotlin/idea/codeInsight/ReferenceVariantsHelper.kt +++ b/idea/ide-common/src/org/jetbrains/kotlin/idea/codeInsight/ReferenceVariantsHelper.kt @@ -21,6 +21,7 @@ import org.jetbrains.kotlin.descriptors.CallableDescriptor import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.descriptors.FunctionDescriptor +import org.jetbrains.kotlin.descriptors.impl.SyntheticFieldDescriptor import org.jetbrains.kotlin.idea.resolve.ResolutionFacade import org.jetbrains.kotlin.idea.resolve.frontendService import org.jetbrains.kotlin.idea.util.CallType @@ -156,7 +157,7 @@ public class ReferenceVariantsHelper( // process non-instance members for (descriptor in resolutionScope.getDescriptorsFiltered(kindFilter, nameFilter)) { if (descriptor is CallableDescriptor) { - assert(descriptor.dispatchReceiverParameter == null) { + assert(descriptor is SyntheticFieldDescriptor || descriptor.dispatchReceiverParameter == null) { "Resolution scope with member descriptor: $descriptor. Scope structure: ${JetScopeUtils.printStructure(resolutionScope)}" } } @@ -270,7 +271,7 @@ public class ReferenceVariantsHelper( } for (descriptor in resolutionScope.getDescriptors(kindFilter exclude DescriptorKindExclude.NonExtensions, nameFilter)) { - assert(descriptor !is CallableDescriptor || descriptor.dispatchReceiverParameter == null) { + assert(descriptor !is CallableDescriptor || descriptor is SyntheticFieldDescriptor || descriptor.dispatchReceiverParameter == null) { "Resolution scope with member descriptor: $descriptor. Scope structure: ${JetScopeUtils.printStructure(resolutionScope)}" } if (descriptor.isExtension) { diff --git a/j2k/src/org/jetbrains/kotlin/j2k/usageProcessing/FieldToPropertyProcessing.kt b/j2k/src/org/jetbrains/kotlin/j2k/usageProcessing/FieldToPropertyProcessing.kt index d9c55bca34f..c2f7f413993 100644 --- a/j2k/src/org/jetbrains/kotlin/j2k/usageProcessing/FieldToPropertyProcessing.kt +++ b/j2k/src/org/jetbrains/kotlin/j2k/usageProcessing/FieldToPropertyProcessing.kt @@ -25,7 +25,7 @@ import org.jetbrains.kotlin.psi.JetPsiFactory import org.jetbrains.kotlin.psi.JetSimpleNameExpression class FieldToPropertyProcessing(val field: PsiField, val propertyName: String, val isNullable: Boolean) : UsageProcessing { - override val targetElement: PsiElement get() = field + override val targetElement: PsiElement get() = this.field override val convertedCodeProcessor = if (field.getName() != propertyName) MyConvertedCodeProcessor() else null