Make ResolveSessionForBodies.resolveToDescriptor() work for local declarations (EA-56877)

Fix (EA-56877)
This commit is contained in:
Nikolay Krasko
2014-05-22 15:06:23 +04:00
parent 89f80db98f
commit 80d6b0800e
6 changed files with 60 additions and 2 deletions
@@ -1,5 +1,5 @@
/*
* Copyright 2010-2013 JetBrains s.r.o.
* Copyright 2010-2014 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.
@@ -27,6 +27,7 @@ import org.jetbrains.jet.lang.descriptors.ModuleDescriptor;
import org.jetbrains.jet.lang.descriptors.ScriptDescriptor;
import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.resolve.BindingContextUtils;
import org.jetbrains.jet.lang.resolve.lazy.KotlinCodeAnalyzer;
import org.jetbrains.jet.lang.resolve.lazy.ResolveSession;
import org.jetbrains.jet.lang.resolve.lazy.ScopeProvider;
@@ -78,7 +79,14 @@ public class ResolveSessionForBodies implements KotlinCodeAnalyzer, Modification
@NotNull
@Override
public DeclarationDescriptor resolveToDescriptor(JetDeclaration declaration) {
return resolveSession.resolveToDescriptor(declaration);
if (!JetPsiUtil.isLocal(declaration)) {
return resolveSession.resolveToDescriptor(declaration);
}
BindingContext context = resolveElementCache.resolveToElement(declaration);
return BindingContextUtils.getNotNull(context, BindingContext.DECLARATION_TO_DESCRIPTOR, declaration,
"Descriptor wasn't found for declaration " + declaration.toString() + "\n" +
JetPsiUtil.getElementTextWithContext(declaration));
}
@Override
@@ -0,0 +1,10 @@
// "Make A.foo open" "true"
open class A {
open fun foo() {}
}
fun test() {
val some = object : A() {
<caret>override fun foo() {}
}
}
@@ -0,0 +1,10 @@
// "Make A.foo open" "true"
open class A {
fun foo() {}
}
fun test() {
val some = object : A() {
<caret>override fun foo() {}
}
}
@@ -0,0 +1,11 @@
// "Add 'open fun f()' to 'A'" "true"
open class A {
open fun f() {
}
}
fun test() {
val some = object : A() {
<caret>override fun f() {}
}
}
@@ -0,0 +1,9 @@
// "Add 'open fun f()' to 'A'" "true"
open class A {
}
fun test() {
val some = object : A() {
<caret>override fun f() {}
}
}
@@ -1092,6 +1092,11 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest {
doTest("idea/testData/quickfix/override/beforeOverridingFinalMethod.kt");
}
@TestMetadata("beforeOverridingFinalMethodInLocal.kt")
public void testOverridingFinalMethodInLocal() throws Exception {
doTest("idea/testData/quickfix/override/beforeOverridingFinalMethodInLocal.kt");
}
@TestMetadata("beforeOverridingFinalProperty.kt")
public void testOverridingFinalProperty() throws Exception {
doTest("idea/testData/quickfix/override/beforeOverridingFinalProperty.kt");
@@ -1134,6 +1139,11 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest {
doTest("idea/testData/quickfix/override/nothingToOverride/beforeAddFunctionAbstractClass.kt");
}
@TestMetadata("beforeAddFunctionInLocalDeclaration.kt")
public void testAddFunctionInLocalDeclaration() throws Exception {
doTest("idea/testData/quickfix/override/nothingToOverride/beforeAddFunctionInLocalDeclaration.kt");
}
@TestMetadata("beforeAddFunctionNoBody.kt")
public void testAddFunctionNoBody() throws Exception {
doTest("idea/testData/quickfix/override/nothingToOverride/beforeAddFunctionNoBody.kt");