Java Resolver: Substitute original element when resolving PsiMethod to FunctionDescriptor
#KT-7353 Fixed
This commit is contained in:
@@ -33,6 +33,7 @@ import org.jetbrains.kotlin.codegen.flags.AbstractWriteFlagsTest
|
|||||||
import org.jetbrains.kotlin.codegen.generated.AbstractBlackBoxCodegenTest
|
import org.jetbrains.kotlin.codegen.generated.AbstractBlackBoxCodegenTest
|
||||||
import org.jetbrains.kotlin.codegen.generated.AbstractBlackBoxInlineCodegenTest
|
import org.jetbrains.kotlin.codegen.generated.AbstractBlackBoxInlineCodegenTest
|
||||||
import org.jetbrains.kotlin.findUsages.AbstractJetFindUsagesTest
|
import org.jetbrains.kotlin.findUsages.AbstractJetFindUsagesTest
|
||||||
|
import org.jetbrains.kotlin.findUsages.AbstractKotlinFindUsagesInLibrarySourceTest
|
||||||
import org.jetbrains.kotlin.formatter.AbstractJetFormatterTest
|
import org.jetbrains.kotlin.formatter.AbstractJetFormatterTest
|
||||||
import org.jetbrains.kotlin.formatter.AbstractJetTypingIndentationTestBase
|
import org.jetbrains.kotlin.formatter.AbstractJetTypingIndentationTestBase
|
||||||
import org.jetbrains.kotlin.generators.tests.generator.*
|
import org.jetbrains.kotlin.generators.tests.generator.*
|
||||||
@@ -497,6 +498,10 @@ fun main(args: Array<String>) {
|
|||||||
model("findUsages/java", pattern = """^(.+)\.0\.java$""")
|
model("findUsages/java", pattern = """^(.+)\.0\.java$""")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
testClass(javaClass<AbstractKotlinFindUsagesInLibrarySourceTest>()) {
|
||||||
|
model("findUsages/librarySources", pattern = """^(.+)\.0\.kt$""")
|
||||||
|
}
|
||||||
|
|
||||||
testClass(javaClass<AbstractJetMoveTest>()) {
|
testClass(javaClass<AbstractJetMoveTest>()) {
|
||||||
model("refactoring/move", extension = "test", singleClass = true)
|
model("refactoring/move", extension = "test", singleClass = true)
|
||||||
}
|
}
|
||||||
|
|||||||
+5
-4
@@ -46,12 +46,13 @@ public object JavaResolveExtension : CacheExtension<(PsiElement) -> Pair<JavaDes
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun PsiMethod.getJavaMethodDescriptor(): FunctionDescriptor {
|
fun PsiMethod.getJavaMethodDescriptor(): FunctionDescriptor {
|
||||||
val resolver = JavaResolveExtension.getResolver(getProject(), this)
|
val method = getOriginalElement() as PsiMethod
|
||||||
|
val resolver = JavaResolveExtension.getResolver(method.getProject(), method)
|
||||||
val methodDescriptor = when {
|
val methodDescriptor = when {
|
||||||
this.isConstructor() -> resolver.resolveConstructor(JavaConstructorImpl(this))
|
method.isConstructor() -> resolver.resolveConstructor(JavaConstructorImpl(method))
|
||||||
else -> resolver.resolveMethod(JavaMethodImpl(this))
|
else -> resolver.resolveMethod(JavaMethodImpl(method))
|
||||||
}
|
}
|
||||||
assert(methodDescriptor != null) { "No descriptor found for " + getText() }
|
assert(methodDescriptor != null) { "No descriptor found for " + method.getText() }
|
||||||
|
|
||||||
return methodDescriptor!!
|
return methodDescriptor!!
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,18 @@
|
|||||||
|
package library;
|
||||||
|
|
||||||
|
public class Foo {
|
||||||
|
public int x;
|
||||||
|
public static int X;
|
||||||
|
|
||||||
|
public Foo(int n) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void bar(int n) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void baz(int n) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
// PSI_ELEMENT: com.intellij.psi.PsiClass
|
||||||
|
// OPTIONS: usages
|
||||||
|
// FIND_BY_REF
|
||||||
|
// FIND_BY_NAVIGATION_ELEMENT
|
||||||
|
package usages
|
||||||
|
|
||||||
|
import library.Foo
|
||||||
|
|
||||||
|
fun test() {
|
||||||
|
val foo: <caret>Foo
|
||||||
|
}
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
Local variable declaration (10: 14) val foo: Foo
|
||||||
|
Usage in import (7: 16) import library.Foo
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
// PSI_ELEMENT: com.intellij.psi.PsiMethod
|
||||||
|
// OPTIONS: usages
|
||||||
|
// FIND_BY_REF
|
||||||
|
// FIND_BY_NAVIGATION_ELEMENT
|
||||||
|
package usages
|
||||||
|
|
||||||
|
import library.Foo
|
||||||
|
|
||||||
|
fun test() {
|
||||||
|
<caret>Foo(1)
|
||||||
|
}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
New instance creation (10: 5) Foo(1)
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
// PSI_ELEMENT: com.intellij.psi.PsiField
|
||||||
|
// OPTIONS: usages
|
||||||
|
// FIND_BY_REF
|
||||||
|
// FIND_BY_NAVIGATION_ELEMENT
|
||||||
|
package usages
|
||||||
|
|
||||||
|
import library.Foo
|
||||||
|
|
||||||
|
fun test() {
|
||||||
|
Foo().<caret>x = 1
|
||||||
|
}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
Value write (10: 11) Foo().x = 1
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
// PSI_ELEMENT: com.intellij.psi.PsiMethod
|
||||||
|
// OPTIONS: usages
|
||||||
|
// FIND_BY_REF
|
||||||
|
// FIND_BY_NAVIGATION_ELEMENT
|
||||||
|
package usages
|
||||||
|
|
||||||
|
import library.Foo
|
||||||
|
|
||||||
|
fun test() {
|
||||||
|
Foo().<caret>bar(1)
|
||||||
|
}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
Function call (10: 11) Foo().bar(1)
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
// PSI_ELEMENT: com.intellij.psi.PsiField
|
||||||
|
// OPTIONS: usages
|
||||||
|
// FIND_BY_REF
|
||||||
|
// FIND_BY_NAVIGATION_ELEMENT
|
||||||
|
package usages
|
||||||
|
|
||||||
|
import library.Foo
|
||||||
|
|
||||||
|
fun test() {
|
||||||
|
Foo.<caret>X = 1
|
||||||
|
}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
Value write (10: 9) Foo.X = 1
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
// PSI_ELEMENT: com.intellij.psi.PsiMethod
|
||||||
|
// OPTIONS: usages
|
||||||
|
// FIND_BY_REF
|
||||||
|
// FIND_BY_NAVIGATION_ELEMENT
|
||||||
|
package usages
|
||||||
|
|
||||||
|
import library.Foo
|
||||||
|
|
||||||
|
fun test() {
|
||||||
|
Foo.<caret>baz(1)
|
||||||
|
}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
Function call (10: 9) Foo.baz(1)
|
||||||
@@ -330,10 +330,22 @@ public abstract class AbstractJetFindUsagesTest extends JetLightCodeInsightFixtu
|
|||||||
? TargetElementUtilBase.findTargetElement(myFixture.getEditor(),
|
? TargetElementUtilBase.findTargetElement(myFixture.getEditor(),
|
||||||
TargetElementUtilBase.REFERENCED_ELEMENT_ACCEPTED | TargetElementUtil.NEW_AS_CONSTRUCTOR)
|
TargetElementUtilBase.REFERENCED_ELEMENT_ACCEPTED | TargetElementUtil.NEW_AS_CONSTRUCTOR)
|
||||||
: myFixture.getElementAtCaret();
|
: myFixture.getElementAtCaret();
|
||||||
if (InTextDirectivesUtils.isDirectiveDefined(mainFileText, "// FIND_BY_MIRROR_ELEMENT")) {
|
boolean findByMirrorElement = InTextDirectivesUtils.isDirectiveDefined(mainFileText, "// FIND_BY_MIRROR_ELEMENT");
|
||||||
|
boolean findByNavigationElement = InTextDirectivesUtils.isDirectiveDefined(mainFileText, "// FIND_BY_NAVIGATION_ELEMENT");
|
||||||
|
if (findByMirrorElement && findByNavigationElement) {
|
||||||
|
fail("Incompatible directives");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (findByMirrorElement) {
|
||||||
assert originalElement instanceof PsiCompiledElement : "PsiCompiledElement is expected: " + originalElement;
|
assert originalElement instanceof PsiCompiledElement : "PsiCompiledElement is expected: " + originalElement;
|
||||||
originalElement = ((PsiCompiledElement)originalElement).getMirror();
|
originalElement = ((PsiCompiledElement)originalElement).getMirror();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (findByNavigationElement) {
|
||||||
|
assert originalElement != null : "Original element is not found";
|
||||||
|
originalElement = originalElement.getNavigationElement();
|
||||||
|
}
|
||||||
|
|
||||||
T caretElement = PsiTreeUtil.getParentOfType(originalElement, caretElementClass, false);
|
T caretElement = PsiTreeUtil.getParentOfType(originalElement, caretElementClass, false);
|
||||||
assertNotNull(String.format("Element with type '%s' wasn't found at caret position", caretElementClass), caretElement);
|
assertNotNull(String.format("Element with type '%s' wasn't found at caret position", caretElementClass), caretElement);
|
||||||
|
|
||||||
|
|||||||
+27
@@ -0,0 +1,27 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2015 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.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.findUsages
|
||||||
|
|
||||||
|
import com.intellij.psi.PsiElement
|
||||||
|
import com.intellij.testFramework.LightProjectDescriptor
|
||||||
|
import org.jetbrains.kotlin.idea.test.JdkAndMockLibraryProjectDescriptor
|
||||||
|
import org.jetbrains.kotlin.idea.test.PluginTestCaseBase
|
||||||
|
|
||||||
|
public abstract class AbstractKotlinFindUsagesInLibrarySourceTest: AbstractJetFindUsagesTest() {
|
||||||
|
override fun getProjectDescriptor() =
|
||||||
|
JdkAndMockLibraryProjectDescriptor(PluginTestCaseBase.getTestDataPathBase() + "/findUsages/_library", true)
|
||||||
|
}
|
||||||
+73
@@ -0,0 +1,73 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2015 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.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.findUsages;
|
||||||
|
|
||||||
|
import com.intellij.testFramework.TestDataPath;
|
||||||
|
import org.jetbrains.kotlin.test.JUnit3RunnerWithInners;
|
||||||
|
import org.jetbrains.kotlin.test.JetTestUtils;
|
||||||
|
import org.jetbrains.kotlin.test.TestMetadata;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
/** This class is generated by {@link org.jetbrains.kotlin.generators.tests.TestsPackage}. DO NOT MODIFY MANUALLY */
|
||||||
|
@SuppressWarnings("all")
|
||||||
|
@TestMetadata("idea/testData/findUsages/librarySources")
|
||||||
|
@TestDataPath("$PROJECT_ROOT")
|
||||||
|
@RunWith(JUnit3RunnerWithInners.class)
|
||||||
|
public class KotlinFindUsagesInLibrarySourceTestGenerated extends AbstractKotlinFindUsagesInLibrarySourceTest {
|
||||||
|
public void testAllFilesPresentInLibrarySources() throws Exception {
|
||||||
|
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/findUsages/librarySources"), Pattern.compile("^(.+)\\.0\\.kt$"), true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("LibraryClassUsages.0.kt")
|
||||||
|
public void testLibraryClassUsages() throws Exception {
|
||||||
|
String fileName = JetTestUtils.navigationMetadata("idea/testData/findUsages/librarySources/LibraryClassUsages.0.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("LibraryConstructorUsages.0.kt")
|
||||||
|
public void testLibraryConstructorUsages() throws Exception {
|
||||||
|
String fileName = JetTestUtils.navigationMetadata("idea/testData/findUsages/librarySources/LibraryConstructorUsages.0.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("LibraryFieldUsages.0.kt")
|
||||||
|
public void testLibraryFieldUsages() throws Exception {
|
||||||
|
String fileName = JetTestUtils.navigationMetadata("idea/testData/findUsages/librarySources/LibraryFieldUsages.0.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("LibraryMethodUsages.0.kt")
|
||||||
|
public void testLibraryMethodUsages() throws Exception {
|
||||||
|
String fileName = JetTestUtils.navigationMetadata("idea/testData/findUsages/librarySources/LibraryMethodUsages.0.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("LibraryStaticFieldUsages.0.kt")
|
||||||
|
public void testLibraryStaticFieldUsages() throws Exception {
|
||||||
|
String fileName = JetTestUtils.navigationMetadata("idea/testData/findUsages/librarySources/LibraryStaticFieldUsages.0.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("LibraryStaticMethodUsages.0.kt")
|
||||||
|
public void testLibraryStaticMethodUsages() throws Exception {
|
||||||
|
String fileName = JetTestUtils.navigationMetadata("idea/testData/findUsages/librarySources/LibraryStaticMethodUsages.0.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user