diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java index f3bde641fe8..20ac2d46c5d 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java @@ -161,11 +161,11 @@ public class TopDownAnalyzer { } } - private void registerScope(@Nullable JetDeclaration declaration, @NotNull JetDeclaration anchorForScope) { + private void registerScope(@Nullable JetDeclaration declaration) { if (declaration == null) return; c.registerDeclaringScope( declaration, - resolveSession.getScopeProvider().getResolutionScopeForDeclaration(anchorForScope) + resolveSession.getScopeProvider().getResolutionScopeForDeclaration(declaration) ); } @@ -261,7 +261,7 @@ public class TopDownAnalyzer { @Override public void visitAnonymousInitializer(@NotNull JetClassInitializer initializer) { - registerScope(initializer, initializer); + registerScope(initializer); } @Override @@ -272,7 +272,7 @@ public class TopDownAnalyzer { (SimpleFunctionDescriptor) resolveSession.resolveToDescriptor(function) ) ); - registerScope(function, function); + registerScope(function); } @Override @@ -284,9 +284,9 @@ public class TopDownAnalyzer { c.getProperties().put(property, descriptor); registerTopLevelFqName(property, descriptor); - registerScope(property, property); - registerScope(property.getGetter(), property); - registerScope(property.getSetter(), property); + registerScope(property); + registerScope(property.getGetter()); + registerScope(property.getSetter()); } } ); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/ScopeProvider.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/ScopeProvider.java index 83443ca6353..f886855a35c 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/ScopeProvider.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/ScopeProvider.java @@ -126,6 +126,11 @@ public class ScopeProvider { "For JetDeclaration element getParentOfType() should return itself."; JetDeclaration parentDeclaration = PsiTreeUtil.getParentOfType(jetDeclaration, JetDeclaration.class); + + if (jetDeclaration instanceof JetPropertyAccessor) { + parentDeclaration = PsiTreeUtil.getParentOfType(parentDeclaration, JetDeclaration.class); + } + if (parentDeclaration == null) { return getFileScope((JetFile) elementOfDeclaration.getContainingFile()); } diff --git a/compiler/testData/diagnostics/tests/PropertyInitializers.kt b/compiler/testData/diagnostics/tests/PropertyInitializers.kt new file mode 100644 index 00000000000..08153981e4d --- /dev/null +++ b/compiler/testData/diagnostics/tests/PropertyInitializers.kt @@ -0,0 +1,9 @@ +class Foo(val a: Int, b: Int) { + val c = a + b + + val d: Int + get() = a + + val e: Int + get() = b +} \ 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 d93a87a63f2..4a4ff975554 100644 --- a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java @@ -364,6 +364,11 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest { doTest("compiler/testData/diagnostics/tests/Properties.kt"); } + @TestMetadata("PropertyInitializers.kt") + public void testPropertyInitializers() throws Exception { + doTest("compiler/testData/diagnostics/tests/PropertyInitializers.kt"); + } + @TestMetadata("QualifiedExpressions.kt") public void testQualifiedExpressions() throws Exception { doTest("compiler/testData/diagnostics/tests/QualifiedExpressions.kt"); diff --git a/idea/src/org/jetbrains/jet/plugin/project/ResolveElementCache.java b/idea/src/org/jetbrains/jet/plugin/project/ResolveElementCache.java index 8d7e055f0ec..147ef26d0ce 100644 --- a/idea/src/org/jetbrains/jet/plugin/project/ResolveElementCache.java +++ b/idea/src/org/jetbrains/jet/plugin/project/ResolveElementCache.java @@ -241,8 +241,8 @@ public class ResolveElementCache { descriptor.getScopeForMemberDeclarationResolution()); } - private static void propertyAdditionalResolve(ResolveSession resolveSession, final JetProperty jetProperty, BindingTrace trace, JetFile file) { - final JetScope propertyResolutionScope = resolveSession.getScopeProvider().getResolutionScopeForDeclaration(jetProperty); + private static void propertyAdditionalResolve(final ResolveSession resolveSession, final JetProperty jetProperty, BindingTrace trace, JetFile file) { + JetScope propertyResolutionScope = resolveSession.getScopeProvider().getResolutionScopeForDeclaration(jetProperty); BodyResolveContextForLazy bodyResolveContext = new BodyResolveContextForLazy( createParameters(resolveSession), @@ -251,7 +251,7 @@ public class ResolveElementCache { public JetScope apply(JetDeclaration declaration) { assert declaration.getParent() == jetProperty : "Must be called only for property accessors, but called for " + declaration; - return propertyResolutionScope; + return resolveSession.getScopeProvider().getResolutionScopeForDeclaration(declaration); } }); BodyResolver bodyResolver = createBodyResolver(resolveSession, trace, file); diff --git a/idea/testData/completion/basic/common/InPropertyAccessor.kt b/idea/testData/completion/basic/common/InPropertyAccessor.kt new file mode 100644 index 00000000000..3c554532f57 --- /dev/null +++ b/idea/testData/completion/basic/common/InPropertyAccessor.kt @@ -0,0 +1,7 @@ +class Foo(val a: Int, b: Int) { + val e: Int + get() = +} + +// EXIST: a +// ABSENT: b \ No newline at end of file diff --git a/idea/testData/completion/basic/common/InPropertyInitializer.kt b/idea/testData/completion/basic/common/InPropertyInitializer.kt new file mode 100644 index 00000000000..b01378064b1 --- /dev/null +++ b/idea/testData/completion/basic/common/InPropertyInitializer.kt @@ -0,0 +1,6 @@ +class Foo(val a: Int, b: Int) { + val e: Int = +} + +// EXIST: a +// EXIST: b \ No newline at end of file diff --git a/idea/tests/org/jetbrains/jet/completion/JSBasicCompletionTestGenerated.java b/idea/tests/org/jetbrains/jet/completion/JSBasicCompletionTestGenerated.java index f63886b7271..6d0d47a2140 100644 --- a/idea/tests/org/jetbrains/jet/completion/JSBasicCompletionTestGenerated.java +++ b/idea/tests/org/jetbrains/jet/completion/JSBasicCompletionTestGenerated.java @@ -294,6 +294,16 @@ public class JSBasicCompletionTestGenerated extends AbstractJSBasicCompletionTes doTest("idea/testData/completion/basic/common/InParametersTypesForce.kt"); } + @TestMetadata("InPropertyAccessor.kt") + public void testInPropertyAccessor() throws Exception { + doTest("idea/testData/completion/basic/common/InPropertyAccessor.kt"); + } + + @TestMetadata("InPropertyInitializer.kt") + public void testInPropertyInitializer() throws Exception { + doTest("idea/testData/completion/basic/common/InPropertyInitializer.kt"); + } + @TestMetadata("InTypeAnnotation.kt") public void testInTypeAnnotation() throws Exception { doTest("idea/testData/completion/basic/common/InTypeAnnotation.kt"); diff --git a/idea/tests/org/jetbrains/jet/completion/JvmBasicCompletionTestGenerated.java b/idea/tests/org/jetbrains/jet/completion/JvmBasicCompletionTestGenerated.java index 4fd4c36319d..e88eef2b8ee 100644 --- a/idea/tests/org/jetbrains/jet/completion/JvmBasicCompletionTestGenerated.java +++ b/idea/tests/org/jetbrains/jet/completion/JvmBasicCompletionTestGenerated.java @@ -294,6 +294,16 @@ public class JvmBasicCompletionTestGenerated extends AbstractJvmBasicCompletionT doTest("idea/testData/completion/basic/common/InParametersTypesForce.kt"); } + @TestMetadata("InPropertyAccessor.kt") + public void testInPropertyAccessor() throws Exception { + doTest("idea/testData/completion/basic/common/InPropertyAccessor.kt"); + } + + @TestMetadata("InPropertyInitializer.kt") + public void testInPropertyInitializer() throws Exception { + doTest("idea/testData/completion/basic/common/InPropertyInitializer.kt"); + } + @TestMetadata("InTypeAnnotation.kt") public void testInTypeAnnotation() throws Exception { doTest("idea/testData/completion/basic/common/InTypeAnnotation.kt");