diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingUtils.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingUtils.java index 17f2a902052..5a577c497ca 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingUtils.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingUtils.java @@ -18,6 +18,7 @@ package org.jetbrains.jet.lang.types.expressions; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Pair; +import com.intellij.psi.PsiElement; import com.intellij.psi.tree.IElementType; import com.intellij.psi.tree.TokenSet; import org.jetbrains.annotations.NotNull; @@ -25,6 +26,7 @@ import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.JetNodeTypes; import org.jetbrains.jet.lang.ModuleConfiguration; import org.jetbrains.jet.lang.descriptors.*; +import org.jetbrains.jet.lang.diagnostics.Errors; import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.resolve.*; import org.jetbrains.jet.lang.resolve.calls.CallMaker; @@ -341,10 +343,22 @@ public class ExpressionTypingUtils { VariableDescriptor variableDescriptor = context.expressionTypingServices.getDescriptorResolver(). resolveLocalVariableDescriptorWithType(writableScope.getContainingDeclaration(), entry, componentType, context.trace); + VariableDescriptor olderVariable = writableScope.getLocalVariable(variableDescriptor.getName()); + checkVariableShadowing(context, variableDescriptor, olderVariable); + writableScope.addVariableDescriptor(variableDescriptor); } } + public static void checkVariableShadowing(@NotNull ExpressionTypingContext context, @NotNull VariableDescriptor variableDescriptor, VariableDescriptor oldDescriptor) { + if (oldDescriptor != null && DescriptorUtils.isLocal(variableDescriptor.getContainingDeclaration(), oldDescriptor)) { + PsiElement declaration = BindingContextUtils.descriptorToDeclaration(context.trace.getBindingContext(), variableDescriptor); + if (declaration != null) { + context.trace.report(Errors.NAME_SHADOWING.on(declaration, variableDescriptor.getName().getName())); + } + } + } + @NotNull private static JetType getExpectedTypeForComponent(ExpressionTypingContext context, JetMultiDeclarationEntry entry) { JetTypeReference entryTypeRef = entry.getTypeRef(); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingVisitorForStatements.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingVisitorForStatements.java index 83bf6de71cf..b2e2952d0cb 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingVisitorForStatements.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingVisitorForStatements.java @@ -117,10 +117,7 @@ public class ExpressionTypingVisitorForStatements extends ExpressionTypingVisito { VariableDescriptor olderVariable = scope.getLocalVariable(propertyDescriptor.getName()); - if (olderVariable != null && DescriptorUtils.isLocal(propertyDescriptor.getContainingDeclaration(), olderVariable)) { - PsiElement declaration = BindingContextUtils.descriptorToDeclaration(context.trace.getBindingContext(), propertyDescriptor); - context.trace.report(Errors.NAME_SHADOWING.on(declaration, propertyDescriptor.getName().getName())); - } + ExpressionTypingUtils.checkVariableShadowing(context, propertyDescriptor, olderVariable); } scope.addVariableDescriptor(propertyDescriptor); diff --git a/compiler/testData/diagnostics/tests/declarationChecks/RedeclarationsInMultiDecl.kt b/compiler/testData/diagnostics/tests/declarationChecks/RedeclarationsInMultiDecl.kt index bb8c2edb00a..ca3d104f4e3 100644 --- a/compiler/testData/diagnostics/tests/declarationChecks/RedeclarationsInMultiDecl.kt +++ b/compiler/testData/diagnostics/tests/declarationChecks/RedeclarationsInMultiDecl.kt @@ -4,11 +4,11 @@ class A { } fun a() { - val (a, a) = A() + val (a, a) = A() val (x, y) = A(); val b = 1 use(b) - val (b, y) = A(); + val (b, y) = A(); } diff --git a/compiler/testData/diagnostics/tests/declarationChecks/multiDeclarations/RedeclarationInForLoop.kt b/compiler/testData/diagnostics/tests/declarationChecks/multiDeclarations/RedeclarationInForLoop.kt index 489a1eafee1..0af1ac3c81e 100644 --- a/compiler/testData/diagnostics/tests/declarationChecks/multiDeclarations/RedeclarationInForLoop.kt +++ b/compiler/testData/diagnostics/tests/declarationChecks/multiDeclarations/RedeclarationInForLoop.kt @@ -8,7 +8,7 @@ class C { } fun test() { - for ((x, x) in C()) { + for ((x, x) in C()) { } } \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/shadowing/ShadowMultiDeclarationWithFunParameter.kt b/compiler/testData/diagnostics/tests/shadowing/ShadowMultiDeclarationWithFunParameter.kt new file mode 100644 index 00000000000..af52d6bfa25 --- /dev/null +++ b/compiler/testData/diagnostics/tests/shadowing/ShadowMultiDeclarationWithFunParameter.kt @@ -0,0 +1,14 @@ +class A { + fun component1() = 42 + fun component2() = 42 +} + +fun foo(a: A, c: Int) { + val (a, b) = a + val arr = Array(2) { A() } + for ((c, d) in arr) { + + } + + val e = a.toString() + b + c +} \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java index d96072e490b..ea3fb623914 100644 --- a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java @@ -3386,6 +3386,11 @@ public class JetDiagnosticsTestGenerated extends AbstractDiagnosticsTestWithEage JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.checkers.AbstractDiagnosticsTestWithEagerResolve", new File("compiler/testData/diagnostics/tests/shadowing"), "kt", true); } + @TestMetadata("ShadowMultiDeclarationWithFunParameter.kt") + public void testShadowMultiDeclarationWithFunParameter() throws Exception { + doTest("compiler/testData/diagnostics/tests/shadowing/ShadowMultiDeclarationWithFunParameter.kt"); + } + @TestMetadata("ShadowParameterInFunctionBody.kt") public void testShadowParameterInFunctionBody() throws Exception { doTest("compiler/testData/diagnostics/tests/shadowing/ShadowParameterInFunctionBody.kt");