Correct scope for property accessors in lazy resolve

This commit is contained in:
Andrey Breslav
2014-03-19 18:53:55 +04:00
parent 4dfb6763b2
commit 34c6eaec56
9 changed files with 62 additions and 10 deletions
@@ -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; if (declaration == null) return;
c.registerDeclaringScope( c.registerDeclaringScope(
declaration, declaration,
resolveSession.getScopeProvider().getResolutionScopeForDeclaration(anchorForScope) resolveSession.getScopeProvider().getResolutionScopeForDeclaration(declaration)
); );
} }
@@ -261,7 +261,7 @@ public class TopDownAnalyzer {
@Override @Override
public void visitAnonymousInitializer(@NotNull JetClassInitializer initializer) { public void visitAnonymousInitializer(@NotNull JetClassInitializer initializer) {
registerScope(initializer, initializer); registerScope(initializer);
} }
@Override @Override
@@ -272,7 +272,7 @@ public class TopDownAnalyzer {
(SimpleFunctionDescriptor) resolveSession.resolveToDescriptor(function) (SimpleFunctionDescriptor) resolveSession.resolveToDescriptor(function)
) )
); );
registerScope(function, function); registerScope(function);
} }
@Override @Override
@@ -284,9 +284,9 @@ public class TopDownAnalyzer {
c.getProperties().put(property, descriptor); c.getProperties().put(property, descriptor);
registerTopLevelFqName(property, descriptor); registerTopLevelFqName(property, descriptor);
registerScope(property, property); registerScope(property);
registerScope(property.getGetter(), property); registerScope(property.getGetter());
registerScope(property.getSetter(), property); registerScope(property.getSetter());
} }
} }
); );
@@ -126,6 +126,11 @@ public class ScopeProvider {
"For JetDeclaration element getParentOfType() should return itself."; "For JetDeclaration element getParentOfType() should return itself.";
JetDeclaration parentDeclaration = PsiTreeUtil.getParentOfType(jetDeclaration, JetDeclaration.class); JetDeclaration parentDeclaration = PsiTreeUtil.getParentOfType(jetDeclaration, JetDeclaration.class);
if (jetDeclaration instanceof JetPropertyAccessor) {
parentDeclaration = PsiTreeUtil.getParentOfType(parentDeclaration, JetDeclaration.class);
}
if (parentDeclaration == null) { if (parentDeclaration == null) {
return getFileScope((JetFile) elementOfDeclaration.getContainingFile()); return getFileScope((JetFile) elementOfDeclaration.getContainingFile());
} }
@@ -0,0 +1,9 @@
class Foo(val a: Int, b: Int) {
val c = a + b
val d: Int
get() = a
val e: Int
get() = <!UNRESOLVED_REFERENCE!>b<!>
}
@@ -364,6 +364,11 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest {
doTest("compiler/testData/diagnostics/tests/Properties.kt"); 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") @TestMetadata("QualifiedExpressions.kt")
public void testQualifiedExpressions() throws Exception { public void testQualifiedExpressions() throws Exception {
doTest("compiler/testData/diagnostics/tests/QualifiedExpressions.kt"); doTest("compiler/testData/diagnostics/tests/QualifiedExpressions.kt");
@@ -241,8 +241,8 @@ public class ResolveElementCache {
descriptor.getScopeForMemberDeclarationResolution()); descriptor.getScopeForMemberDeclarationResolution());
} }
private static void propertyAdditionalResolve(ResolveSession resolveSession, final JetProperty jetProperty, BindingTrace trace, JetFile file) { private static void propertyAdditionalResolve(final ResolveSession resolveSession, final JetProperty jetProperty, BindingTrace trace, JetFile file) {
final JetScope propertyResolutionScope = resolveSession.getScopeProvider().getResolutionScopeForDeclaration(jetProperty); JetScope propertyResolutionScope = resolveSession.getScopeProvider().getResolutionScopeForDeclaration(jetProperty);
BodyResolveContextForLazy bodyResolveContext = new BodyResolveContextForLazy( BodyResolveContextForLazy bodyResolveContext = new BodyResolveContextForLazy(
createParameters(resolveSession), createParameters(resolveSession),
@@ -251,7 +251,7 @@ public class ResolveElementCache {
public JetScope apply(JetDeclaration declaration) { public JetScope apply(JetDeclaration declaration) {
assert declaration.getParent() == jetProperty : "Must be called only for property accessors, but called for " + assert declaration.getParent() == jetProperty : "Must be called only for property accessors, but called for " +
declaration; declaration;
return propertyResolutionScope; return resolveSession.getScopeProvider().getResolutionScopeForDeclaration(declaration);
} }
}); });
BodyResolver bodyResolver = createBodyResolver(resolveSession, trace, file); BodyResolver bodyResolver = createBodyResolver(resolveSession, trace, file);
@@ -0,0 +1,7 @@
class Foo(val a: Int, b: Int) {
val e: Int
get() = <caret>
}
// EXIST: a
// ABSENT: b
@@ -0,0 +1,6 @@
class Foo(val a: Int, b: Int) {
val e: Int = <caret>
}
// EXIST: a
// EXIST: b
@@ -294,6 +294,16 @@ public class JSBasicCompletionTestGenerated extends AbstractJSBasicCompletionTes
doTest("idea/testData/completion/basic/common/InParametersTypesForce.kt"); 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") @TestMetadata("InTypeAnnotation.kt")
public void testInTypeAnnotation() throws Exception { public void testInTypeAnnotation() throws Exception {
doTest("idea/testData/completion/basic/common/InTypeAnnotation.kt"); doTest("idea/testData/completion/basic/common/InTypeAnnotation.kt");
@@ -294,6 +294,16 @@ public class JvmBasicCompletionTestGenerated extends AbstractJvmBasicCompletionT
doTest("idea/testData/completion/basic/common/InParametersTypesForce.kt"); 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") @TestMetadata("InTypeAnnotation.kt")
public void testInTypeAnnotation() throws Exception { public void testInTypeAnnotation() throws Exception {
doTest("idea/testData/completion/basic/common/InTypeAnnotation.kt"); doTest("idea/testData/completion/basic/common/InTypeAnnotation.kt");