diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java index 0ee4cda1e5b..9fe4707cf39 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java @@ -379,6 +379,7 @@ public interface Errors { // General DiagnosticFactory1 NAME_SHADOWING = DiagnosticFactory1.create(WARNING, PositioningStrategies.FOR_REDECLARATION); + DiagnosticFactory0 ACCESSOR_PARAMETER_NAME_SHADOWING = DiagnosticFactory0.create(WARNING); DiagnosticFactory0 TYPECHECKER_HAS_RUN_INTO_RECURSIVE_PROBLEM = DiagnosticFactory0.create(ERROR); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java index 8fb471170d7..766b8373268 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java @@ -114,6 +114,7 @@ public class DefaultErrorMessages { MAP.put(REDECLARATION, "Redeclaration: {0}", STRING); MAP.put(NAME_SHADOWING, "Name shadowed: {0}", STRING); + MAP.put(ACCESSOR_PARAMETER_NAME_SHADOWING, "Accessor parameter name 'field' is shadowed by backing field variable"); MAP.put(TYPE_MISMATCH, "Type mismatch: inferred type is {1} but {0} was expected", RENDER_TYPE, RENDER_TYPE); MAP.put(INCOMPATIBLE_MODIFIERS, "Modifier ''{0}'' is incompatible with ''{1}''", TO_STRING, TO_STRING); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/BodyResolver.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/BodyResolver.java index 24ae1159e22..6a27ab5b835 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/BodyResolver.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/BodyResolver.java @@ -779,6 +779,11 @@ public class BodyResolver { SyntheticFieldDescriptor fieldDescriptor = new SyntheticFieldDescriptor(accessorDescriptor, property); WritableScopeStorage innerScopeStorage = (WritableScopeStorage) innerScope; innerScopeStorage.addVariableOrClassDescriptor(fieldDescriptor); + for (JetParameter parameter : function.getValueParameters()) { + if (SyntheticFieldDescriptor.NAME.equals(parameter.getNameAsName())) { + trace.report(Errors.ACCESSOR_PARAMETER_NAME_SHADOWING.on(parameter)); + } + } } DataFlowInfo dataFlowInfo = null; diff --git a/compiler/testData/diagnostics/tests/backingField/FieldAsParam.kt b/compiler/testData/diagnostics/tests/backingField/FieldAsParam.kt new file mode 100644 index 00000000000..5eb02ce2f1a --- /dev/null +++ b/compiler/testData/diagnostics/tests/backingField/FieldAsParam.kt @@ -0,0 +1,8 @@ +var y: Int = 1 + +// No backing field! +var x: Int + get() = y + set(field) { + y = field + } \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/backingField/FieldAsParam.txt b/compiler/testData/diagnostics/tests/backingField/FieldAsParam.txt new file mode 100644 index 00000000000..16f4acd4c87 --- /dev/null +++ b/compiler/testData/diagnostics/tests/backingField/FieldAsParam.txt @@ -0,0 +1,4 @@ +package + +public var x: kotlin.Int +public var y: kotlin.Int diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java index cf34c914f3f..096ecfa90f3 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java @@ -1326,6 +1326,12 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest { doTest(fileName); } + @TestMetadata("FieldAsParam.kt") + public void testFieldAsParam() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/backingField/FieldAsParam.kt"); + doTest(fileName); + } + @TestMetadata("FieldAsProperty.kt") public void testFieldAsProperty() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/backingField/FieldAsProperty.kt");