From a89dbfcfd42d54bddf0d883d5098e63dce4625ac Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Tue, 22 Mar 2016 21:26:30 +0300 Subject: [PATCH] [RESTORED] Spring Support: Show Spring line markers for Kotlin classes #KT-3741 Fixed --- ChangeLog.md | 1 + .../kotlin/asJava/KtLightAnnotation.kt | 3 + .../kotlin/asJava/KtLightParameter.java | 12 ++ .../src/META-INF/kotlin-spring.xml | 2 + .../lineMarking/KotlinSpringClassAnnotator.kt | 67 +++++++++ .../tests/SpringTestFixtureExtension.kt | 14 ++ .../AbstractSpringClassAnnotatorTest.kt | 96 +++++++++++++ .../SpringClassAnnotatorTestGenerated.java | 133 ++++++++++++++++++ .../tests/gutter/springGutterTestUtils.kt | 74 ++++++++++ .../KotlinAnnotatedElementsSearcher.kt | 7 +- .../testAnnotationsWithParameters.kt | 3 +- .../gutter/autowiredBeanCandidates/Bean.kt | 17 +++ .../autowiredBeanCandidates.test | 9 ++ .../gutter/autowiredBeanCandidates/config.xml | 11 ++ .../core/gutter/autowiredProperty/Bean.kt | 6 + .../autowiredProperty/autowiredProperty.test | 8 ++ .../core/gutter/autowiredProperty/config.xml | 11 ++ .../core/gutter/autowiredSetter/Bean.kt | 6 + .../autowiredSetter/autowiredSetter.test | 9 ++ .../core/gutter/autowiredSetter/config.xml | 11 ++ .../spring/core/gutter/classGutter/Bean.kt | 7 + .../core/gutter/classGutter/classGutter.test | 8 ++ .../spring/core/gutter/classGutter/config.xml | 6 + .../AbstractBean.kt | 1 + .../AbstractBeanInheritor.kt | 1 + .../AbstractBeanInheritor2.kt | 1 + ...assGutterAbstractShowMappedInheritors.test | 8 ++ .../inheritors.xml | 8 ++ .../spring/core/gutter/componentScan/Bean.kt | 3 + .../gutter/componentScan/ComponentScan.kt | 6 + .../componentScan/beans/MyController.kt | 6 + .../componentScan/beans/ResourceGutter.kt | 18 +++ .../gutter/componentScan/componentScan.test | 8 ++ .../ContextBeanInjectionPoints.kt | 21 +++ .../contextBeanInjectionPoints/FooBar.kt | 5 + .../contextBeanInjectionPoints.test | 8 ++ ...ContextBeanWithQualifierInjectionPoints.kt | 22 +++ .../FooBar.kt | 5 + ...ntextBeanWithQualifierInjectionPoints.test | 9 ++ .../spring/core/gutter/innerBean/InnerBean.kt | 1 + .../core/gutter/innerBean/innerBean.test | 8 ++ .../core/gutter/innerBean/innerBeanGutter.xml | 10 ++ .../methodTypeDefaultInitMethod/Bean.kt | 4 + .../methodTypeDefaultInitMethod/config.xml | 7 + .../methodTypeDefaultInitMethod.test | 8 ++ .../core/gutter/methodTypeFactory/Bean.kt | 6 + .../core/gutter/methodTypeFactory/config.xml | 6 + .../methodTypeFactory/methodTypeFactory.test | 9 ++ .../core/gutter/methodTypeInitMethod/Bean.kt | 4 + .../gutter/methodTypeInitMethod/config.xml | 6 + .../methodTypeInitMethod.test | 8 ++ .../core/gutter/methodTypeMultiple/Bean.kt | 4 + .../core/gutter/methodTypeMultiple/config.xml | 6 + .../methodTypeMultiple.test | 8 ++ .../BeanWithProperties.kt | 3 + .../propertyGutter.xml | 10 ++ .../propertyGutterForProperty.test | 8 ++ .../BeanWithProperties.kt | 3 + .../propertyGutter.xml | 10 ++ .../propertyGutterForSetter.test | 8 ++ .../spring/core/gutter/resourceGutter/Bean.kt | 3 + .../core/gutter/resourceGutter/Resource.kt | 3 + .../resourceGutter/beans/ResourceGutter.kt | 13 ++ .../gutter/resourceGutter/resourceGutter.test | 8 ++ .../gutter/resourceGutter/resourceGutter.xml | 19 +++ .../kotlin/search/AbstractSearcherTest.java | 4 + 66 files changed, 836 insertions(+), 2 deletions(-) create mode 100644 idea/idea-ultimate/src/org/jetbrains/kotlin/idea/spring/lineMarking/KotlinSpringClassAnnotator.kt create mode 100644 idea/idea-ultimate/tests/org/jetbrains/kotlin/idea/spring/tests/gutter/AbstractSpringClassAnnotatorTest.kt create mode 100644 idea/idea-ultimate/tests/org/jetbrains/kotlin/idea/spring/tests/gutter/SpringClassAnnotatorTestGenerated.java create mode 100644 idea/idea-ultimate/tests/org/jetbrains/kotlin/idea/spring/tests/gutter/springGutterTestUtils.kt create mode 100644 idea/testData/spring/core/gutter/autowiredBeanCandidates/Bean.kt create mode 100644 idea/testData/spring/core/gutter/autowiredBeanCandidates/autowiredBeanCandidates.test create mode 100644 idea/testData/spring/core/gutter/autowiredBeanCandidates/config.xml create mode 100644 idea/testData/spring/core/gutter/autowiredProperty/Bean.kt create mode 100644 idea/testData/spring/core/gutter/autowiredProperty/autowiredProperty.test create mode 100644 idea/testData/spring/core/gutter/autowiredProperty/config.xml create mode 100644 idea/testData/spring/core/gutter/autowiredSetter/Bean.kt create mode 100644 idea/testData/spring/core/gutter/autowiredSetter/autowiredSetter.test create mode 100644 idea/testData/spring/core/gutter/autowiredSetter/config.xml create mode 100644 idea/testData/spring/core/gutter/classGutter/Bean.kt create mode 100644 idea/testData/spring/core/gutter/classGutter/classGutter.test create mode 100644 idea/testData/spring/core/gutter/classGutter/config.xml create mode 100644 idea/testData/spring/core/gutter/classGutterAbstractShowMappedInheritors/AbstractBean.kt create mode 100644 idea/testData/spring/core/gutter/classGutterAbstractShowMappedInheritors/AbstractBeanInheritor.kt create mode 100644 idea/testData/spring/core/gutter/classGutterAbstractShowMappedInheritors/AbstractBeanInheritor2.kt create mode 100644 idea/testData/spring/core/gutter/classGutterAbstractShowMappedInheritors/classGutterAbstractShowMappedInheritors.test create mode 100644 idea/testData/spring/core/gutter/classGutterAbstractShowMappedInheritors/inheritors.xml create mode 100644 idea/testData/spring/core/gutter/componentScan/Bean.kt create mode 100644 idea/testData/spring/core/gutter/componentScan/ComponentScan.kt create mode 100644 idea/testData/spring/core/gutter/componentScan/beans/MyController.kt create mode 100644 idea/testData/spring/core/gutter/componentScan/beans/ResourceGutter.kt create mode 100644 idea/testData/spring/core/gutter/componentScan/componentScan.test create mode 100644 idea/testData/spring/core/gutter/contextBeanInjectionPoints/ContextBeanInjectionPoints.kt create mode 100644 idea/testData/spring/core/gutter/contextBeanInjectionPoints/FooBar.kt create mode 100644 idea/testData/spring/core/gutter/contextBeanInjectionPoints/contextBeanInjectionPoints.test create mode 100644 idea/testData/spring/core/gutter/contextBeanWithQualifierInjectionPoints/ContextBeanWithQualifierInjectionPoints.kt create mode 100644 idea/testData/spring/core/gutter/contextBeanWithQualifierInjectionPoints/FooBar.kt create mode 100644 idea/testData/spring/core/gutter/contextBeanWithQualifierInjectionPoints/contextBeanWithQualifierInjectionPoints.test create mode 100644 idea/testData/spring/core/gutter/innerBean/InnerBean.kt create mode 100644 idea/testData/spring/core/gutter/innerBean/innerBean.test create mode 100644 idea/testData/spring/core/gutter/innerBean/innerBeanGutter.xml create mode 100644 idea/testData/spring/core/gutter/methodTypeDefaultInitMethod/Bean.kt create mode 100644 idea/testData/spring/core/gutter/methodTypeDefaultInitMethod/config.xml create mode 100644 idea/testData/spring/core/gutter/methodTypeDefaultInitMethod/methodTypeDefaultInitMethod.test create mode 100644 idea/testData/spring/core/gutter/methodTypeFactory/Bean.kt create mode 100644 idea/testData/spring/core/gutter/methodTypeFactory/config.xml create mode 100644 idea/testData/spring/core/gutter/methodTypeFactory/methodTypeFactory.test create mode 100644 idea/testData/spring/core/gutter/methodTypeInitMethod/Bean.kt create mode 100644 idea/testData/spring/core/gutter/methodTypeInitMethod/config.xml create mode 100644 idea/testData/spring/core/gutter/methodTypeInitMethod/methodTypeInitMethod.test create mode 100644 idea/testData/spring/core/gutter/methodTypeMultiple/Bean.kt create mode 100644 idea/testData/spring/core/gutter/methodTypeMultiple/config.xml create mode 100644 idea/testData/spring/core/gutter/methodTypeMultiple/methodTypeMultiple.test create mode 100644 idea/testData/spring/core/gutter/propertyGutterForProperty/BeanWithProperties.kt create mode 100644 idea/testData/spring/core/gutter/propertyGutterForProperty/propertyGutter.xml create mode 100644 idea/testData/spring/core/gutter/propertyGutterForProperty/propertyGutterForProperty.test create mode 100644 idea/testData/spring/core/gutter/propertyGutterForSetter/BeanWithProperties.kt create mode 100644 idea/testData/spring/core/gutter/propertyGutterForSetter/propertyGutter.xml create mode 100644 idea/testData/spring/core/gutter/propertyGutterForSetter/propertyGutterForSetter.test create mode 100644 idea/testData/spring/core/gutter/resourceGutter/Bean.kt create mode 100644 idea/testData/spring/core/gutter/resourceGutter/Resource.kt create mode 100644 idea/testData/spring/core/gutter/resourceGutter/beans/ResourceGutter.kt create mode 100644 idea/testData/spring/core/gutter/resourceGutter/resourceGutter.test create mode 100644 idea/testData/spring/core/gutter/resourceGutter/resourceGutter.xml diff --git a/ChangeLog.md b/ChangeLog.md index 8a7b2cc1d68..95353c71849 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -126,6 +126,7 @@ New features: - Add `kotlinClassName()` and `kotlinFunctionName()` macros for use in live templates - [KT-11098](https://youtrack.jetbrains.com/issue/KT-11098) Inspection on final classes/functions annotated with Spring @Configuration/@Component/@Bean - [KT-11405](https://youtrack.jetbrains.com/issue/KT-11405) Navigation and Find Usages for Spring beans referenced in annotation arguments and BeanFactory method calls +- [KT-3741](https://youtrack.jetbrains.com/issue/KT-3741) Show Spring-specific line markers on Kotlin classes Issues fixed: diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KtLightAnnotation.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KtLightAnnotation.kt index 58f886912a9..bfa1f06d07c 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KtLightAnnotation.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KtLightAnnotation.kt @@ -18,6 +18,7 @@ package org.jetbrains.kotlin.asJava import com.intellij.openapi.util.TextRange import com.intellij.psi.* +import com.intellij.psi.impl.source.resolve.reference.ReferenceProvidersRegistry import com.intellij.util.IncorrectOperationException import org.jetbrains.kotlin.idea.KotlinLanguage import org.jetbrains.kotlin.psi.KtAnnotationEntry @@ -66,6 +67,8 @@ class KtLightAnnotation( } } + override fun getReference() = references.singleOrNull() + override fun getReferences() = ReferenceProvidersRegistry.getReferencesFromProviders(delegate, PsiReferenceService.Hints.NO_HINTS) override fun getLanguage() = KotlinLanguage.INSTANCE } diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KtLightParameter.java b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KtLightParameter.java index 9f82b1f532d..51727142728 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KtLightParameter.java +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KtLightParameter.java @@ -17,6 +17,7 @@ package org.jetbrains.kotlin.asJava; import com.intellij.lang.Language; +import com.intellij.openapi.util.TextRange; import com.intellij.psi.*; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.search.SearchScope; @@ -151,6 +152,12 @@ public class KtLightParameter extends LightParameter implements KtLightDeclarati return ""; } + @Override + public TextRange getTextRange() { + KtParameter origin = getKotlinOrigin(); + return origin != null ? origin.getTextRange() : TextRange.EMPTY_RANGE; + } + @Override public PsiIdentifier getNameIdentifier() { if (lightIdentifier == null) { @@ -158,4 +165,9 @@ public class KtLightParameter extends LightParameter implements KtLightDeclarati } return lightIdentifier; } + + @Override + public PsiElement getParent() { + return getMethod().getParameterList(); + } } diff --git a/idea/idea-ultimate/src/META-INF/kotlin-spring.xml b/idea/idea-ultimate/src/META-INF/kotlin-spring.xml index a8767bc3bcb..347c6c334ca 100644 --- a/idea/idea-ultimate/src/META-INF/kotlin-spring.xml +++ b/idea/idea-ultimate/src/META-INF/kotlin-spring.xml @@ -2,6 +2,8 @@ + + { nameIdentifier }?.let { return it.toLightClass() } + psiElement.getParentOfTypeAndBranch { nameIdentifier }?.let { function -> + val containingClassOrObject = function.containingClassOrObject + val classForLightMethod = if (containingClassOrObject is KtObjectDeclaration + && containingClassOrObject.isCompanion() + && function.resolveToDescriptor().hasJvmStaticAnnotation()) { + containingClassOrObject.containingClassOrObject + } + else { + containingClassOrObject + } + return classForLightMethod?.toLightClass()?.methods?.firstOrNull { (it as? KtLightMethod)?.kotlinOrigin == function } + } + psiElement.getParentOfTypeAndBranch { nameIdentifier }?.let { return it } + psiElement.getParentOfTypeAndBranch { + (typeReference?.typeElement as? KtUserType)?.referenceExpression?.getReferencedNameElement() + }?.let { return it.toLightAnnotation() } + return null + } + + override fun collectNavigationMarkers(psiElement: PsiElement, result: MutableCollection>?) { + if (psiElement is KtProperty) { + for (it in psiElement.toLightElements()) { + val nameIdentifier = (it as? PsiNameIdentifierOwner)?.nameIdentifier ?: continue + super.collectNavigationMarkers(nameIdentifier, result) + } + return + } + + // Workaround for SpringClassAnnotator + (getElementToProcess(psiElement) as? KtLightAnnotation)?.let { return super.collectNavigationMarkers(it, result) } + + super.collectNavigationMarkers(psiElement, result) + } +} \ No newline at end of file diff --git a/idea/idea-ultimate/tests/org/jetbrains/kotlin/idea/spring/tests/SpringTestFixtureExtension.kt b/idea/idea-ultimate/tests/org/jetbrains/kotlin/idea/spring/tests/SpringTestFixtureExtension.kt index 97aed6f6d15..e210bad5e32 100644 --- a/idea/idea-ultimate/tests/org/jetbrains/kotlin/idea/spring/tests/SpringTestFixtureExtension.kt +++ b/idea/idea-ultimate/tests/org/jetbrains/kotlin/idea/spring/tests/SpringTestFixtureExtension.kt @@ -19,6 +19,8 @@ package org.jetbrains.kotlin.idea.spring.tests import com.intellij.facet.impl.FacetUtil import com.intellij.openapi.module.Module import com.intellij.spring.facet.SpringFacet +import com.intellij.spring.facet.SpringFileSet +import com.intellij.testFramework.fixtures.CodeInsightTestFixture import org.jetbrains.kotlin.idea.test.ConfigLibraryUtil import org.jetbrains.kotlin.idea.test.PluginTestCaseBase import org.jetbrains.kotlin.idea.test.TestFixtureExtension @@ -50,6 +52,18 @@ class SpringTestFixtureExtension() : TestFixtureExtension { FacetUtil.addFacet(module, SpringFacet.getSpringFacetType()) } + fun configureFileSet(fixture: CodeInsightTestFixture, configFiles: Collection): SpringFileSet { + return configureFileSet(fixture, "default", module!!, configFiles) + } + + fun configureFileSet(fixture: CodeInsightTestFixture, id: String, module: Module, configFiles: Collection): SpringFileSet { + return module.getSpringFacetWithAssertion().addFileSet(id, id).apply { + configFiles.forEach { addFile(fixture.copyFileToProject(it)) } + } + } + + fun Module.getSpringFacetWithAssertion() = SpringFacet.getInstance(this) ?: error("No Spring facet in ${this}") + override fun tearDown() { try { // clear existing SpringFacet configuration before running next test diff --git a/idea/idea-ultimate/tests/org/jetbrains/kotlin/idea/spring/tests/gutter/AbstractSpringClassAnnotatorTest.kt b/idea/idea-ultimate/tests/org/jetbrains/kotlin/idea/spring/tests/gutter/AbstractSpringClassAnnotatorTest.kt new file mode 100644 index 00000000000..5968514fc60 --- /dev/null +++ b/idea/idea-ultimate/tests/org/jetbrains/kotlin/idea/spring/tests/gutter/AbstractSpringClassAnnotatorTest.kt @@ -0,0 +1,96 @@ +/* + * Copyright 2010-2016 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.idea.spring.tests.gutter + +import com.google.gson.JsonArray +import com.google.gson.JsonObject +import com.google.gson.JsonParser +import com.intellij.openapi.util.io.FileUtil +import com.intellij.testFramework.LightProjectDescriptor +import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase +import icons.SpringApiIcons +import org.jetbrains.kotlin.idea.jsonUtils.getString +import org.jetbrains.kotlin.idea.spring.tests.SpringTestFixtureExtension +import org.jetbrains.kotlin.idea.test.ConfigLibraryUtil +import org.jetbrains.kotlin.idea.test.KotlinLightCodeInsightFixtureTestCase +import org.jetbrains.kotlin.idea.test.PluginTestCaseBase +import org.jetbrains.kotlin.idea.test.TestFixtureExtension +import org.jetbrains.kotlin.test.KotlinTestUtils +import java.io.File + +abstract class AbstractSpringClassAnnotatorTest : KotlinLightCodeInsightFixtureTestCase() { + override fun getProjectDescriptor() = LightCodeInsightFixtureTestCase.JAVA_LATEST + + override fun setUp() { + super.setUp() + TestFixtureExtension.loadFixture(myModule) + } + + protected fun doTest(path: String) { + val configFilePath = "${KotlinTestUtils.getHomeDirectory()}/$path" + val configFile = File(configFilePath) + val testRoot = configFile.parentFile + + val config = JsonParser().parse(FileUtil.loadFile(configFile, true)) as JsonObject + + val withRuntime = config["withRuntime"]?.asBoolean ?: false + if (withRuntime) { + ConfigLibraryUtil.configureKotlinRuntimeAndSdk(myModule, PluginTestCaseBase.mockJdk()) + } + + try { + val springConfigFiles = (config["springConfig"] as JsonArray).map { it.asString } + + myFixture.testDataPath = testRoot.absolutePath + TestFixtureExtension.getFixture()!!.configureFileSet(myFixture, springConfigFiles) + for (file in testRoot.listFiles()) { + val name = file.name + if (name in springConfigFiles) continue + if (file.isDirectory) myFixture.copyDirectoryToProject(name, name) else myFixture.copyFileToProject(name) + } + + val fileName = config.getString("file") + val gutterMark = myFixture.findGutter(fileName)!! + + val iconName = config.getString("icon") + val icon = SpringApiIcons::class.java.getField(iconName)[null] + assert(gutterMark.icon == icon) + + val tooltip = config.getString("tooltip") + assert(gutterMark.tooltipText == tooltip) + + val naming = config.getString("naming") + val targets = (config["targets"] as JsonArray).map { it.asString } + when (naming) { + "bean" -> checkBeanGutterTargets(gutterMark, targets) + "property" -> checkBeanPropertyTargets(gutterMark, targets) + "generic" -> checkPsiElementGutterTargets(gutterMark, targets) + else -> error("Unexpected naming: $naming") + } + } + finally { + if (withRuntime) { + ConfigLibraryUtil.unConfigureKotlinRuntimeAndSdk(myModule, PluginTestCaseBase.mockJdk()) + } + } + } + + override fun tearDown() { + TestFixtureExtension.unloadFixture() + super.tearDown() + } +} diff --git a/idea/idea-ultimate/tests/org/jetbrains/kotlin/idea/spring/tests/gutter/SpringClassAnnotatorTestGenerated.java b/idea/idea-ultimate/tests/org/jetbrains/kotlin/idea/spring/tests/gutter/SpringClassAnnotatorTestGenerated.java new file mode 100644 index 00000000000..e334465c487 --- /dev/null +++ b/idea/idea-ultimate/tests/org/jetbrains/kotlin/idea/spring/tests/gutter/SpringClassAnnotatorTestGenerated.java @@ -0,0 +1,133 @@ +/* + * Copyright 2010-2016 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.idea.spring.tests.gutter; + +import com.intellij.testFramework.TestDataPath; +import org.jetbrains.kotlin.test.JUnit3RunnerWithInners; +import org.jetbrains.kotlin.test.KotlinTestUtils; +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/spring/core/gutter") +@TestDataPath("$PROJECT_ROOT") +@RunWith(JUnit3RunnerWithInners.class) +public class SpringClassAnnotatorTestGenerated extends AbstractSpringClassAnnotatorTest { + public void testAllFilesPresentInGutter() throws Exception { + KotlinTestUtils.assertAllTestsPresentInSingleGeneratedClass(this.getClass(), new File("idea/testData/spring/core/gutter"), Pattern.compile("^(.+)\\.test$")); + } + + @TestMetadata("autowiredBeanCandidates/autowiredBeanCandidates.test") + public void testAutowiredBeanCandidates_AutowiredBeanCandidates() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/spring/core/gutter/autowiredBeanCandidates/autowiredBeanCandidates.test"); + doTest(fileName); + } + + @TestMetadata("autowiredProperty/autowiredProperty.test") + public void testAutowiredProperty_AutowiredProperty() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/spring/core/gutter/autowiredProperty/autowiredProperty.test"); + doTest(fileName); + } + + @TestMetadata("autowiredSetter/autowiredSetter.test") + public void testAutowiredSetter_AutowiredSetter() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/spring/core/gutter/autowiredSetter/autowiredSetter.test"); + doTest(fileName); + } + + @TestMetadata("classGutter/classGutter.test") + public void testClassGutter_ClassGutter() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/spring/core/gutter/classGutter/classGutter.test"); + doTest(fileName); + } + + @TestMetadata("classGutterAbstractShowMappedInheritors/classGutterAbstractShowMappedInheritors.test") + public void testClassGutterAbstractShowMappedInheritors_ClassGutterAbstractShowMappedInheritors() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/spring/core/gutter/classGutterAbstractShowMappedInheritors/classGutterAbstractShowMappedInheritors.test"); + doTest(fileName); + } + + @TestMetadata("componentScan/componentScan.test") + public void testComponentScan_ComponentScan() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/spring/core/gutter/componentScan/componentScan.test"); + doTest(fileName); + } + + @TestMetadata("contextBeanInjectionPoints/contextBeanInjectionPoints.test") + public void testContextBeanInjectionPoints_ContextBeanInjectionPoints() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/spring/core/gutter/contextBeanInjectionPoints/contextBeanInjectionPoints.test"); + doTest(fileName); + } + + @TestMetadata("contextBeanWithQualifierInjectionPoints/contextBeanWithQualifierInjectionPoints.test") + public void testContextBeanWithQualifierInjectionPoints_ContextBeanWithQualifierInjectionPoints() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/spring/core/gutter/contextBeanWithQualifierInjectionPoints/contextBeanWithQualifierInjectionPoints.test"); + doTest(fileName); + } + + @TestMetadata("innerBean/innerBean.test") + public void testInnerBean_InnerBean() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/spring/core/gutter/innerBean/innerBean.test"); + doTest(fileName); + } + + @TestMetadata("methodTypeDefaultInitMethod/methodTypeDefaultInitMethod.test") + public void testMethodTypeDefaultInitMethod_MethodTypeDefaultInitMethod() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/spring/core/gutter/methodTypeDefaultInitMethod/methodTypeDefaultInitMethod.test"); + doTest(fileName); + } + + @TestMetadata("methodTypeFactory/methodTypeFactory.test") + public void testMethodTypeFactory_MethodTypeFactory() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/spring/core/gutter/methodTypeFactory/methodTypeFactory.test"); + doTest(fileName); + } + + @TestMetadata("methodTypeInitMethod/methodTypeInitMethod.test") + public void testMethodTypeInitMethod_MethodTypeInitMethod() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/spring/core/gutter/methodTypeInitMethod/methodTypeInitMethod.test"); + doTest(fileName); + } + + @TestMetadata("methodTypeMultiple/methodTypeMultiple.test") + public void testMethodTypeMultiple_MethodTypeMultiple() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/spring/core/gutter/methodTypeMultiple/methodTypeMultiple.test"); + doTest(fileName); + } + + @TestMetadata("propertyGutterForProperty/propertyGutterForProperty.test") + public void testPropertyGutterForProperty_PropertyGutterForProperty() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/spring/core/gutter/propertyGutterForProperty/propertyGutterForProperty.test"); + doTest(fileName); + } + + @TestMetadata("propertyGutterForSetter/propertyGutterForSetter.test") + public void testPropertyGutterForSetter_PropertyGutterForSetter() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/spring/core/gutter/propertyGutterForSetter/propertyGutterForSetter.test"); + doTest(fileName); + } + + @TestMetadata("resourceGutter/resourceGutter.test") + public void testResourceGutter_ResourceGutter() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/spring/core/gutter/resourceGutter/resourceGutter.test"); + doTest(fileName); + } +} diff --git a/idea/idea-ultimate/tests/org/jetbrains/kotlin/idea/spring/tests/gutter/springGutterTestUtils.kt b/idea/idea-ultimate/tests/org/jetbrains/kotlin/idea/spring/tests/gutter/springGutterTestUtils.kt new file mode 100644 index 00000000000..49d83e7a121 --- /dev/null +++ b/idea/idea-ultimate/tests/org/jetbrains/kotlin/idea/spring/tests/gutter/springGutterTestUtils.kt @@ -0,0 +1,74 @@ +/* + * Copyright 2010-2016 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.idea.spring.tests.gutter + +import com.intellij.codeInsight.daemon.GutterMark +import com.intellij.codeInsight.daemon.LineMarkerInfo +import com.intellij.codeInsight.navigation.NavigationGutterIconRenderer +import com.intellij.pom.PomTargetPsiElement +import com.intellij.psi.PsiElement +import com.intellij.psi.presentation.java.SymbolPresentationUtil +import com.intellij.psi.xml.XmlTag +import com.intellij.spring.SpringPresentationProvider +import com.intellij.spring.model.pom.SpringBeanPomTargetUtils +import com.intellij.spring.model.xml.DomSpringBean +import com.intellij.spring.model.xml.beans.SpringPropertyDefinition +import com.intellij.testFramework.UsefulTestCase.assertSameElements +import com.intellij.util.containers.ContainerUtil +import com.intellij.util.xml.DomUtil +import org.jetbrains.kotlin.idea.completion.test.assertInstanceOf + +private fun nameBean(element: PsiElement): String { + return when (element) { + is XmlTag -> DomUtil.getDomElement(element).assertInstanceOf().beanName!! + is PomTargetPsiElement -> SpringBeanPomTargetUtils.getSpringBean(element)?.let { SpringPresentationProvider.getSpringBeanName(it) } + ?: namePsi(element) + else -> throw IllegalArgumentException("Cannot convert " + element.javaClass + " (" + element.text + ")") + } +} + +private fun nameProperty(element: PsiElement) = DomUtil.getDomElement(element).assertInstanceOf().propertyName!! + +private fun namePsi(element: PsiElement) = SymbolPresentationUtil.getSymbolPresentableText(element) + +fun checkBeanGutterTargets(gutterMark: GutterMark, expectedBeanNames: Collection) { + checkGutterTargets(gutterMark, expectedBeanNames, ::nameBean) +} + +fun checkBeanPropertyTargets(gutterMark: GutterMark, expectedPropertyNames: Collection) { + checkGutterTargets(gutterMark, expectedPropertyNames, ::nameProperty) +} + +fun checkPsiElementGutterTargets(gutterMark: GutterMark, expectedSymbolNames: Collection) { + checkGutterTargets(gutterMark, expectedSymbolNames, ::namePsi) +} + +fun checkGutterTargets( + gutterMark: GutterMark, + expectedValues: Collection, + targetNamer: (PsiElement) -> String +) { + val targetElements = when (gutterMark) { + is LineMarkerInfo.LineMarkerGutterIconRenderer<*> -> + gutterMark.lineMarkerInfo.navigationHandler.assertInstanceOf().targetElements + is NavigationGutterIconRenderer -> + gutterMark.targetElements + else -> throw IllegalArgumentException("${gutterMark.javaClass.name} not supported") + } + + assertSameElements(ContainerUtil.map(targetElements, targetNamer), expectedValues) +} \ No newline at end of file diff --git a/idea/src/org/jetbrains/kotlin/idea/search/ideaExtensions/KotlinAnnotatedElementsSearcher.kt b/idea/src/org/jetbrains/kotlin/idea/search/ideaExtensions/KotlinAnnotatedElementsSearcher.kt index e60bf2c6439..5c6adda75bf 100644 --- a/idea/src/org/jetbrains/kotlin/idea/search/ideaExtensions/KotlinAnnotatedElementsSearcher.kt +++ b/idea/src/org/jetbrains/kotlin/idea/search/ideaExtensions/KotlinAnnotatedElementsSearcher.kt @@ -49,10 +49,15 @@ class KotlinAnnotatedElementsSearcher : QueryExecutor { + is KtNamedFunction, is KtConstructor<*> -> { val wrappedMethod = LightClassUtil.getLightClassMethod(declaration as KtFunction) consumer.process(wrappedMethod) } + is KtProperty -> { + with (LightClassUtil.getLightClassPropertyMethods(declaration)) { + if (backingField != null) consumer.process(backingField) else all { consumer.process(it) } + } + } else -> true } } diff --git a/idea/testData/search/annotations/testAnnotationsWithParameters.kt b/idea/testData/search/annotations/testAnnotationsWithParameters.kt index cab1c878bb8..3817fab1c4e 100644 --- a/idea/testData/search/annotations/testAnnotationsWithParameters.kt +++ b/idea/testData/search/annotations/testAnnotationsWithParameters.kt @@ -8,4 +8,5 @@ annotation class MyAnnotation(val first: String, val second: String) // ANNOTATION: MyAnnotation // SEARCH: method:test1 -// SEARCH: class:Test1 \ No newline at end of file +// SEARCH: class:Test1 +// SEARCH: field:test3 \ No newline at end of file diff --git a/idea/testData/spring/core/gutter/autowiredBeanCandidates/Bean.kt b/idea/testData/spring/core/gutter/autowiredBeanCandidates/Bean.kt new file mode 100644 index 00000000000..5c592abd2e1 --- /dev/null +++ b/idea/testData/spring/core/gutter/autowiredBeanCandidates/Bean.kt @@ -0,0 +1,17 @@ +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.context.annotation.Bean + +class Bean { + @Autowired + fun setProp1(autowiredProp: String) { + } + + @Autowired + lateinit var prop2: String + + @Bean(name = "myBean") + @Autowired + fun myBean(collab: String): String { + return "aaa" + collab + } +} \ No newline at end of file diff --git a/idea/testData/spring/core/gutter/autowiredBeanCandidates/autowiredBeanCandidates.test b/idea/testData/spring/core/gutter/autowiredBeanCandidates/autowiredBeanCandidates.test new file mode 100644 index 00000000000..9a1bb8d83ff --- /dev/null +++ b/idea/testData/spring/core/gutter/autowiredBeanCandidates/autowiredBeanCandidates.test @@ -0,0 +1,9 @@ +{ + withRuntime: "true", + springConfig: ["config.xml"], + file: "Bean.kt", + icon: "ShowAutowiredDependencies", + tooltip: "Navigate to autowired candidates", + naming: "generic", + targets: ["myBean(String)", "prop2", "setProp1(String)"] +} \ No newline at end of file diff --git a/idea/testData/spring/core/gutter/autowiredBeanCandidates/config.xml b/idea/testData/spring/core/gutter/autowiredBeanCandidates/config.xml new file mode 100644 index 00000000000..6b1adf258e2 --- /dev/null +++ b/idea/testData/spring/core/gutter/autowiredBeanCandidates/config.xml @@ -0,0 +1,11 @@ + + + + + + + + \ No newline at end of file diff --git a/idea/testData/spring/core/gutter/autowiredProperty/Bean.kt b/idea/testData/spring/core/gutter/autowiredProperty/Bean.kt new file mode 100644 index 00000000000..24c26cf48f0 --- /dev/null +++ b/idea/testData/spring/core/gutter/autowiredProperty/Bean.kt @@ -0,0 +1,6 @@ +import org.springframework.beans.factory.annotation.Autowired + +class Bean { + @Autowired + lateinit var prop: String +} \ No newline at end of file diff --git a/idea/testData/spring/core/gutter/autowiredProperty/autowiredProperty.test b/idea/testData/spring/core/gutter/autowiredProperty/autowiredProperty.test new file mode 100644 index 00000000000..2eb4925bc67 --- /dev/null +++ b/idea/testData/spring/core/gutter/autowiredProperty/autowiredProperty.test @@ -0,0 +1,8 @@ +{ + springConfig: ["config.xml"], + file: "Bean.kt", + icon: "ShowAutowiredDependencies", + tooltip: "Navigate to the autowired dependencies", + naming: "bean", + targets: ["stringBean1", "stringBean2"] +} \ No newline at end of file diff --git a/idea/testData/spring/core/gutter/autowiredProperty/config.xml b/idea/testData/spring/core/gutter/autowiredProperty/config.xml new file mode 100644 index 00000000000..6b1adf258e2 --- /dev/null +++ b/idea/testData/spring/core/gutter/autowiredProperty/config.xml @@ -0,0 +1,11 @@ + + + + + + + + \ No newline at end of file diff --git a/idea/testData/spring/core/gutter/autowiredSetter/Bean.kt b/idea/testData/spring/core/gutter/autowiredSetter/Bean.kt new file mode 100644 index 00000000000..91f56438829 --- /dev/null +++ b/idea/testData/spring/core/gutter/autowiredSetter/Bean.kt @@ -0,0 +1,6 @@ +import org.springframework.beans.factory.annotation.Autowired + +class Bean { + @Autowired + fun setProp(autowiredProp: String) { } +} \ No newline at end of file diff --git a/idea/testData/spring/core/gutter/autowiredSetter/autowiredSetter.test b/idea/testData/spring/core/gutter/autowiredSetter/autowiredSetter.test new file mode 100644 index 00000000000..5b238c5a6f5 --- /dev/null +++ b/idea/testData/spring/core/gutter/autowiredSetter/autowiredSetter.test @@ -0,0 +1,9 @@ +{ + withRuntime: "true", + "springConfig": ["config.xml"], + file: "Bean.kt", + icon: "ShowAutowiredDependencies", + tooltip: "Navigate to the autowired dependencies", + naming: "bean", + targets: ["stringBean1", "stringBean2"] +} \ No newline at end of file diff --git a/idea/testData/spring/core/gutter/autowiredSetter/config.xml b/idea/testData/spring/core/gutter/autowiredSetter/config.xml new file mode 100644 index 00000000000..6b1adf258e2 --- /dev/null +++ b/idea/testData/spring/core/gutter/autowiredSetter/config.xml @@ -0,0 +1,11 @@ + + + + + + + + \ No newline at end of file diff --git a/idea/testData/spring/core/gutter/classGutter/Bean.kt b/idea/testData/spring/core/gutter/classGutter/Bean.kt new file mode 100644 index 00000000000..f6742c966ac --- /dev/null +++ b/idea/testData/spring/core/gutter/classGutter/Bean.kt @@ -0,0 +1,7 @@ +class Bean { + var prop1: String + + fun setProp2(value: String) { + + } +} \ No newline at end of file diff --git a/idea/testData/spring/core/gutter/classGutter/classGutter.test b/idea/testData/spring/core/gutter/classGutter/classGutter.test new file mode 100644 index 00000000000..c2dc8796def --- /dev/null +++ b/idea/testData/spring/core/gutter/classGutter/classGutter.test @@ -0,0 +1,8 @@ +{ + springConfig: ["config.xml"], + file: "Bean.kt", + icon: "SpringBean", + tooltip: "Navigate to the spring bean declaration(s)", + naming: "bean", + targets: ["bean"] +} \ No newline at end of file diff --git a/idea/testData/spring/core/gutter/classGutter/config.xml b/idea/testData/spring/core/gutter/classGutter/config.xml new file mode 100644 index 00000000000..1d2f57bb2f7 --- /dev/null +++ b/idea/testData/spring/core/gutter/classGutter/config.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/idea/testData/spring/core/gutter/classGutterAbstractShowMappedInheritors/AbstractBean.kt b/idea/testData/spring/core/gutter/classGutterAbstractShowMappedInheritors/AbstractBean.kt new file mode 100644 index 00000000000..d83435d3da0 --- /dev/null +++ b/idea/testData/spring/core/gutter/classGutterAbstractShowMappedInheritors/AbstractBean.kt @@ -0,0 +1 @@ +abstract class AbstractBean \ No newline at end of file diff --git a/idea/testData/spring/core/gutter/classGutterAbstractShowMappedInheritors/AbstractBeanInheritor.kt b/idea/testData/spring/core/gutter/classGutterAbstractShowMappedInheritors/AbstractBeanInheritor.kt new file mode 100644 index 00000000000..9d548c208cb --- /dev/null +++ b/idea/testData/spring/core/gutter/classGutterAbstractShowMappedInheritors/AbstractBeanInheritor.kt @@ -0,0 +1 @@ +class AbstractBeanInheritor : AbstractBean() \ No newline at end of file diff --git a/idea/testData/spring/core/gutter/classGutterAbstractShowMappedInheritors/AbstractBeanInheritor2.kt b/idea/testData/spring/core/gutter/classGutterAbstractShowMappedInheritors/AbstractBeanInheritor2.kt new file mode 100644 index 00000000000..651d247ebb4 --- /dev/null +++ b/idea/testData/spring/core/gutter/classGutterAbstractShowMappedInheritors/AbstractBeanInheritor2.kt @@ -0,0 +1 @@ +class AbstractBeanInheritor2 : AbstractBean() \ No newline at end of file diff --git a/idea/testData/spring/core/gutter/classGutterAbstractShowMappedInheritors/classGutterAbstractShowMappedInheritors.test b/idea/testData/spring/core/gutter/classGutterAbstractShowMappedInheritors/classGutterAbstractShowMappedInheritors.test new file mode 100644 index 00000000000..cfb23608280 --- /dev/null +++ b/idea/testData/spring/core/gutter/classGutterAbstractShowMappedInheritors/classGutterAbstractShowMappedInheritors.test @@ -0,0 +1,8 @@ +{ + springConfig: ["inheritors.xml"], + file: "AbstractBean.kt", + icon: "SpringBean", + tooltip: "Navigate to the spring bean declaration(s)", + naming: "bean", + targets: ["inheritor", "inheritor2"] +} \ No newline at end of file diff --git a/idea/testData/spring/core/gutter/classGutterAbstractShowMappedInheritors/inheritors.xml b/idea/testData/spring/core/gutter/classGutterAbstractShowMappedInheritors/inheritors.xml new file mode 100644 index 00000000000..5524c5871b2 --- /dev/null +++ b/idea/testData/spring/core/gutter/classGutterAbstractShowMappedInheritors/inheritors.xml @@ -0,0 +1,8 @@ + + + + + + \ No newline at end of file diff --git a/idea/testData/spring/core/gutter/componentScan/Bean.kt b/idea/testData/spring/core/gutter/componentScan/Bean.kt new file mode 100644 index 00000000000..1ea35e9420f --- /dev/null +++ b/idea/testData/spring/core/gutter/componentScan/Bean.kt @@ -0,0 +1,3 @@ +package test + +class Bean(val n: Int) \ No newline at end of file diff --git a/idea/testData/spring/core/gutter/componentScan/ComponentScan.kt b/idea/testData/spring/core/gutter/componentScan/ComponentScan.kt new file mode 100644 index 00000000000..771f40ca1a3 --- /dev/null +++ b/idea/testData/spring/core/gutter/componentScan/ComponentScan.kt @@ -0,0 +1,6 @@ +import org.springframework.context.annotation.ComponentScan +import org.springframework.context.annotation.Configuration + +@ComponentScan("beans") +@Configuration +open class ComponentScan \ No newline at end of file diff --git a/idea/testData/spring/core/gutter/componentScan/beans/MyController.kt b/idea/testData/spring/core/gutter/componentScan/beans/MyController.kt new file mode 100644 index 00000000000..72f3aca40d1 --- /dev/null +++ b/idea/testData/spring/core/gutter/componentScan/beans/MyController.kt @@ -0,0 +1,6 @@ +package beans + +import org.springframework.stereotype.Controller + +@Controller(value = "customControllerName") +class MyController \ No newline at end of file diff --git a/idea/testData/spring/core/gutter/componentScan/beans/ResourceGutter.kt b/idea/testData/spring/core/gutter/componentScan/beans/ResourceGutter.kt new file mode 100644 index 00000000000..41d53870600 --- /dev/null +++ b/idea/testData/spring/core/gutter/componentScan/beans/ResourceGutter.kt @@ -0,0 +1,18 @@ +package beans + +import org.springframework.stereotype.Component +import javax.annotation.Resource +import test.Bean + +@Component +class ResourceGutter { + @Resource(name = "bean1") + fun setResource(bean: Bean) { + + } + + @Resource + fun setUnknown(booo: Boolean) { + + } +} \ No newline at end of file diff --git a/idea/testData/spring/core/gutter/componentScan/componentScan.test b/idea/testData/spring/core/gutter/componentScan/componentScan.test new file mode 100644 index 00000000000..cb075d1e2c3 --- /dev/null +++ b/idea/testData/spring/core/gutter/componentScan/componentScan.test @@ -0,0 +1,8 @@ +{ + springConfig: ["ComponentScan.kt"], + file: "ComponentScan.kt", + icon: "SpringJavaBean", + tooltip: "Navigate to the spring bean declaration(s)", + naming: "bean", + targets: ["resourceGutter", "customControllerName"] +} \ No newline at end of file diff --git a/idea/testData/spring/core/gutter/contextBeanInjectionPoints/ContextBeanInjectionPoints.kt b/idea/testData/spring/core/gutter/contextBeanInjectionPoints/ContextBeanInjectionPoints.kt new file mode 100644 index 00000000000..8c5cd45343a --- /dev/null +++ b/idea/testData/spring/core/gutter/contextBeanInjectionPoints/ContextBeanInjectionPoints.kt @@ -0,0 +1,21 @@ +import pkg.* +import org.springframework.context.annotation.Configuration +import org.springframework.context.annotation.Bean + +@Configuration +class ContextBeanInjectionPoints { + @Bean + fun foo(): Foo { + return Foo() + } + + @Bean + fun foo2(): Foo { + return Foo() + } + + @Bean + fun bar(f: Foo): Bar { + return Bar(f) + } +} \ No newline at end of file diff --git a/idea/testData/spring/core/gutter/contextBeanInjectionPoints/FooBar.kt b/idea/testData/spring/core/gutter/contextBeanInjectionPoints/FooBar.kt new file mode 100644 index 00000000000..ad3efc70282 --- /dev/null +++ b/idea/testData/spring/core/gutter/contextBeanInjectionPoints/FooBar.kt @@ -0,0 +1,5 @@ +package pkg + +class Foo + +class Bar(foo: Foo) \ No newline at end of file diff --git a/idea/testData/spring/core/gutter/contextBeanInjectionPoints/contextBeanInjectionPoints.test b/idea/testData/spring/core/gutter/contextBeanInjectionPoints/contextBeanInjectionPoints.test new file mode 100644 index 00000000000..bfe9b32911e --- /dev/null +++ b/idea/testData/spring/core/gutter/contextBeanInjectionPoints/contextBeanInjectionPoints.test @@ -0,0 +1,8 @@ +{ + springConfig: [], + file: "ContextBeanInjectionPoints.kt", + icon: "ShowAutowiredDependencies", + tooltip: "Navigate to the autowired dependencies", + naming: "generic", + targets: ["foo()", "foo2()"] +} \ No newline at end of file diff --git a/idea/testData/spring/core/gutter/contextBeanWithQualifierInjectionPoints/ContextBeanWithQualifierInjectionPoints.kt b/idea/testData/spring/core/gutter/contextBeanWithQualifierInjectionPoints/ContextBeanWithQualifierInjectionPoints.kt new file mode 100644 index 00000000000..63c8c0accd8 --- /dev/null +++ b/idea/testData/spring/core/gutter/contextBeanWithQualifierInjectionPoints/ContextBeanWithQualifierInjectionPoints.kt @@ -0,0 +1,22 @@ +import pkg.* +import org.springframework.context.annotation.Configuration +import org.springframework.context.annotation.Bean +import org.springframework.beans.factory.annotation.Qualifier + +@Configuration +class ContextBeanWithQualifierInjectionPoints { + @Bean + fun foo(): Foo { + return Foo() + } + + @Bean + fun foo2(): Foo { + return Foo() + } + + @Bean + fun bar(@Qualifier("foo2") f: Foo): Bar { + return Bar(f) + } +} \ No newline at end of file diff --git a/idea/testData/spring/core/gutter/contextBeanWithQualifierInjectionPoints/FooBar.kt b/idea/testData/spring/core/gutter/contextBeanWithQualifierInjectionPoints/FooBar.kt new file mode 100644 index 00000000000..ad3efc70282 --- /dev/null +++ b/idea/testData/spring/core/gutter/contextBeanWithQualifierInjectionPoints/FooBar.kt @@ -0,0 +1,5 @@ +package pkg + +class Foo + +class Bar(foo: Foo) \ No newline at end of file diff --git a/idea/testData/spring/core/gutter/contextBeanWithQualifierInjectionPoints/contextBeanWithQualifierInjectionPoints.test b/idea/testData/spring/core/gutter/contextBeanWithQualifierInjectionPoints/contextBeanWithQualifierInjectionPoints.test new file mode 100644 index 00000000000..e9c1a88b95e --- /dev/null +++ b/idea/testData/spring/core/gutter/contextBeanWithQualifierInjectionPoints/contextBeanWithQualifierInjectionPoints.test @@ -0,0 +1,9 @@ +{ + withRuntime: "true", + springConfig: [], + file: "ContextBeanWithQualifierInjectionPoints.kt", + icon: "ShowAutowiredDependencies", + tooltip: "Navigate to the autowired dependencies", + naming: "generic", + targets: ["foo2()"] +} \ No newline at end of file diff --git a/idea/testData/spring/core/gutter/innerBean/InnerBean.kt b/idea/testData/spring/core/gutter/innerBean/InnerBean.kt new file mode 100644 index 00000000000..bcec3542de6 --- /dev/null +++ b/idea/testData/spring/core/gutter/innerBean/InnerBean.kt @@ -0,0 +1 @@ +class InnerBean \ No newline at end of file diff --git a/idea/testData/spring/core/gutter/innerBean/innerBean.test b/idea/testData/spring/core/gutter/innerBean/innerBean.test new file mode 100644 index 00000000000..c122f30c4e0 --- /dev/null +++ b/idea/testData/spring/core/gutter/innerBean/innerBean.test @@ -0,0 +1,8 @@ +{ + springConfig: ["innerBeanGutter.xml"], + file: "InnerBean.kt", + icon: "SpringBean", + tooltip: "Navigate to the spring bean declaration(s)", + naming: "bean", + targets: ["InnerBean"] +} \ No newline at end of file diff --git a/idea/testData/spring/core/gutter/innerBean/innerBeanGutter.xml b/idea/testData/spring/core/gutter/innerBean/innerBeanGutter.xml new file mode 100644 index 00000000000..bd72ca12a9a --- /dev/null +++ b/idea/testData/spring/core/gutter/innerBean/innerBeanGutter.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/idea/testData/spring/core/gutter/methodTypeDefaultInitMethod/Bean.kt b/idea/testData/spring/core/gutter/methodTypeDefaultInitMethod/Bean.kt new file mode 100644 index 00000000000..a84e58bc83e --- /dev/null +++ b/idea/testData/spring/core/gutter/methodTypeDefaultInitMethod/Bean.kt @@ -0,0 +1,4 @@ +class Bean { + fun myInit() { + } +} \ No newline at end of file diff --git a/idea/testData/spring/core/gutter/methodTypeDefaultInitMethod/config.xml b/idea/testData/spring/core/gutter/methodTypeDefaultInitMethod/config.xml new file mode 100644 index 00000000000..920414fc636 --- /dev/null +++ b/idea/testData/spring/core/gutter/methodTypeDefaultInitMethod/config.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/idea/testData/spring/core/gutter/methodTypeDefaultInitMethod/methodTypeDefaultInitMethod.test b/idea/testData/spring/core/gutter/methodTypeDefaultInitMethod/methodTypeDefaultInitMethod.test new file mode 100644 index 00000000000..beeaa2a869e --- /dev/null +++ b/idea/testData/spring/core/gutter/methodTypeDefaultInitMethod/methodTypeDefaultInitMethod.test @@ -0,0 +1,8 @@ +{ + springConfig: ["config.xml"], + file: "Bean.kt", + icon: "SpringBeanMethod", + tooltip: "Navigate to the spring bean init method declaration", + naming: "generic", + targets: ["default-init-method"] +} \ No newline at end of file diff --git a/idea/testData/spring/core/gutter/methodTypeFactory/Bean.kt b/idea/testData/spring/core/gutter/methodTypeFactory/Bean.kt new file mode 100644 index 00000000000..d09e49801c1 --- /dev/null +++ b/idea/testData/spring/core/gutter/methodTypeFactory/Bean.kt @@ -0,0 +1,6 @@ +class Bean { + companion object { + @JvmStatic + fun myFactory() = "TEST" + } +} \ No newline at end of file diff --git a/idea/testData/spring/core/gutter/methodTypeFactory/config.xml b/idea/testData/spring/core/gutter/methodTypeFactory/config.xml new file mode 100644 index 00000000000..878e876f483 --- /dev/null +++ b/idea/testData/spring/core/gutter/methodTypeFactory/config.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/idea/testData/spring/core/gutter/methodTypeFactory/methodTypeFactory.test b/idea/testData/spring/core/gutter/methodTypeFactory/methodTypeFactory.test new file mode 100644 index 00000000000..9f9a6ec3aef --- /dev/null +++ b/idea/testData/spring/core/gutter/methodTypeFactory/methodTypeFactory.test @@ -0,0 +1,9 @@ +{ + withRuntime: "true", + springConfig: ["config.xml"], + file: "Bean.kt", + icon: "FactoryMethodBean", + tooltip: "Navigate to the spring bean factory method declaration", + naming: "generic", + targets: ["factory-method"] +} \ No newline at end of file diff --git a/idea/testData/spring/core/gutter/methodTypeInitMethod/Bean.kt b/idea/testData/spring/core/gutter/methodTypeInitMethod/Bean.kt new file mode 100644 index 00000000000..a84e58bc83e --- /dev/null +++ b/idea/testData/spring/core/gutter/methodTypeInitMethod/Bean.kt @@ -0,0 +1,4 @@ +class Bean { + fun myInit() { + } +} \ No newline at end of file diff --git a/idea/testData/spring/core/gutter/methodTypeInitMethod/config.xml b/idea/testData/spring/core/gutter/methodTypeInitMethod/config.xml new file mode 100644 index 00000000000..1026aca4992 --- /dev/null +++ b/idea/testData/spring/core/gutter/methodTypeInitMethod/config.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/idea/testData/spring/core/gutter/methodTypeInitMethod/methodTypeInitMethod.test b/idea/testData/spring/core/gutter/methodTypeInitMethod/methodTypeInitMethod.test new file mode 100644 index 00000000000..85648d80949 --- /dev/null +++ b/idea/testData/spring/core/gutter/methodTypeInitMethod/methodTypeInitMethod.test @@ -0,0 +1,8 @@ +{ + springConfig: ["config.xml"], + file: "Bean.kt", + icon: "SpringBeanMethod", + tooltip: "Navigate to the spring bean init method declaration", + naming: "generic", + targets: ["init-method"] +} \ No newline at end of file diff --git a/idea/testData/spring/core/gutter/methodTypeMultiple/Bean.kt b/idea/testData/spring/core/gutter/methodTypeMultiple/Bean.kt new file mode 100644 index 00000000000..5035fc33b01 --- /dev/null +++ b/idea/testData/spring/core/gutter/methodTypeMultiple/Bean.kt @@ -0,0 +1,4 @@ +class Bean { + fun myFun() { + } +} \ No newline at end of file diff --git a/idea/testData/spring/core/gutter/methodTypeMultiple/config.xml b/idea/testData/spring/core/gutter/methodTypeMultiple/config.xml new file mode 100644 index 00000000000..0b5fb6860a9 --- /dev/null +++ b/idea/testData/spring/core/gutter/methodTypeMultiple/config.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/idea/testData/spring/core/gutter/methodTypeMultiple/methodTypeMultiple.test b/idea/testData/spring/core/gutter/methodTypeMultiple/methodTypeMultiple.test new file mode 100644 index 00000000000..0f5d8de9478 --- /dev/null +++ b/idea/testData/spring/core/gutter/methodTypeMultiple/methodTypeMultiple.test @@ -0,0 +1,8 @@ +{ + springConfig: ["config.xml"], + file: "Bean.kt", + icon: "SpringBeanMethod", + tooltip: "Navigate to the spring bean method declarations", + naming: "generic", + targets: ["destroy-method", "init-method"] +} \ No newline at end of file diff --git a/idea/testData/spring/core/gutter/propertyGutterForProperty/BeanWithProperties.kt b/idea/testData/spring/core/gutter/propertyGutterForProperty/BeanWithProperties.kt new file mode 100644 index 00000000000..5c731ed7735 --- /dev/null +++ b/idea/testData/spring/core/gutter/propertyGutterForProperty/BeanWithProperties.kt @@ -0,0 +1,3 @@ +class BeanWithProperties { + lateinit var prop: String +} \ No newline at end of file diff --git a/idea/testData/spring/core/gutter/propertyGutterForProperty/propertyGutter.xml b/idea/testData/spring/core/gutter/propertyGutterForProperty/propertyGutter.xml new file mode 100644 index 00000000000..4e30857e85d --- /dev/null +++ b/idea/testData/spring/core/gutter/propertyGutterForProperty/propertyGutter.xml @@ -0,0 +1,10 @@ + + + + + + + \ No newline at end of file diff --git a/idea/testData/spring/core/gutter/propertyGutterForProperty/propertyGutterForProperty.test b/idea/testData/spring/core/gutter/propertyGutterForProperty/propertyGutterForProperty.test new file mode 100644 index 00000000000..e37e457a80b --- /dev/null +++ b/idea/testData/spring/core/gutter/propertyGutterForProperty/propertyGutterForProperty.test @@ -0,0 +1,8 @@ +{ + springConfig: ["propertyGutter.xml"], + file: "BeanWithProperties.kt", + icon: "SpringProperty", + tooltip: "Navigate to the spring bean property", + naming: "property", + targets: ["prop", "prop"] +} \ No newline at end of file diff --git a/idea/testData/spring/core/gutter/propertyGutterForSetter/BeanWithProperties.kt b/idea/testData/spring/core/gutter/propertyGutterForSetter/BeanWithProperties.kt new file mode 100644 index 00000000000..405344a7410 --- /dev/null +++ b/idea/testData/spring/core/gutter/propertyGutterForSetter/BeanWithProperties.kt @@ -0,0 +1,3 @@ +class BeanWithProperties { + fun setProp(prop: String) { } +} \ No newline at end of file diff --git a/idea/testData/spring/core/gutter/propertyGutterForSetter/propertyGutter.xml b/idea/testData/spring/core/gutter/propertyGutterForSetter/propertyGutter.xml new file mode 100644 index 00000000000..4e30857e85d --- /dev/null +++ b/idea/testData/spring/core/gutter/propertyGutterForSetter/propertyGutter.xml @@ -0,0 +1,10 @@ + + + + + + + \ No newline at end of file diff --git a/idea/testData/spring/core/gutter/propertyGutterForSetter/propertyGutterForSetter.test b/idea/testData/spring/core/gutter/propertyGutterForSetter/propertyGutterForSetter.test new file mode 100644 index 00000000000..e37e457a80b --- /dev/null +++ b/idea/testData/spring/core/gutter/propertyGutterForSetter/propertyGutterForSetter.test @@ -0,0 +1,8 @@ +{ + springConfig: ["propertyGutter.xml"], + file: "BeanWithProperties.kt", + icon: "SpringProperty", + tooltip: "Navigate to the spring bean property", + naming: "property", + targets: ["prop", "prop"] +} \ No newline at end of file diff --git a/idea/testData/spring/core/gutter/resourceGutter/Bean.kt b/idea/testData/spring/core/gutter/resourceGutter/Bean.kt new file mode 100644 index 00000000000..1ea35e9420f --- /dev/null +++ b/idea/testData/spring/core/gutter/resourceGutter/Bean.kt @@ -0,0 +1,3 @@ +package test + +class Bean(val n: Int) \ No newline at end of file diff --git a/idea/testData/spring/core/gutter/resourceGutter/Resource.kt b/idea/testData/spring/core/gutter/resourceGutter/Resource.kt new file mode 100644 index 00000000000..95d9607c807 --- /dev/null +++ b/idea/testData/spring/core/gutter/resourceGutter/Resource.kt @@ -0,0 +1,3 @@ +package javax.annotation + +annotation class Resource(val name: String = "") \ No newline at end of file diff --git a/idea/testData/spring/core/gutter/resourceGutter/beans/ResourceGutter.kt b/idea/testData/spring/core/gutter/resourceGutter/beans/ResourceGutter.kt new file mode 100644 index 00000000000..ca9d4e04e61 --- /dev/null +++ b/idea/testData/spring/core/gutter/resourceGutter/beans/ResourceGutter.kt @@ -0,0 +1,13 @@ +package beans + +import org.springframework.stereotype.Component +import javax.annotation.Resource +import test.Bean + +@Component +class ResourceGutter { + @Resource(name = "bean1") + fun setResource(bean: Bean) { + + } +} \ No newline at end of file diff --git a/idea/testData/spring/core/gutter/resourceGutter/resourceGutter.test b/idea/testData/spring/core/gutter/resourceGutter/resourceGutter.test new file mode 100644 index 00000000000..c08073d1102 --- /dev/null +++ b/idea/testData/spring/core/gutter/resourceGutter/resourceGutter.test @@ -0,0 +1,8 @@ +{ + springConfig: ["resourceGutter.xml"], + file: "beans/ResourceGutter.kt", + icon: "ShowAutowiredDependencies", + tooltip: "Navigate to the autowired dependencies", + naming: "bean", + targets: ["bean1"] +} \ No newline at end of file diff --git a/idea/testData/spring/core/gutter/resourceGutter/resourceGutter.xml b/idea/testData/spring/core/gutter/resourceGutter/resourceGutter.xml new file mode 100644 index 00000000000..097174ed0a3 --- /dev/null +++ b/idea/testData/spring/core/gutter/resourceGutter/resourceGutter.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/search/AbstractSearcherTest.java b/idea/tests/org/jetbrains/kotlin/search/AbstractSearcherTest.java index 0a171353e3b..aa025dacf04 100644 --- a/idea/tests/org/jetbrains/kotlin/search/AbstractSearcherTest.java +++ b/idea/tests/org/jetbrains/kotlin/search/AbstractSearcherTest.java @@ -19,6 +19,7 @@ package org.jetbrains.kotlin.search; import com.intellij.openapi.util.io.FileUtil; import com.intellij.psi.JavaPsiFacade; import com.intellij.psi.PsiClass; +import com.intellij.psi.PsiField; import com.intellij.psi.PsiMethod; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.testFramework.LightProjectDescriptor; @@ -74,6 +75,9 @@ public abstract class AbstractSearcherTest extends LightCodeInsightFixtureTestCa if (member instanceof PsiMethod) { return "method:" + ((PsiMethod) member).getName(); } + if (member instanceof PsiField) { + return "field:" + ((PsiField) member).getName(); + } throw new IllegalStateException("Do not know how to render member of type: " + member.getClass().getName()); }