Spring Support: Implement Spring-specific references
This commit is contained in:
@@ -97,6 +97,7 @@ New features:
|
|||||||
- [KT-9752](https://youtrack.jetbrains.com/issue/KT-9752) More usable file chooser for "Move declaration to another file"
|
- [KT-9752](https://youtrack.jetbrains.com/issue/KT-9752) More usable file chooser for "Move declaration to another file"
|
||||||
- [KT-9697](https://youtrack.jetbrains.com/issue/KT-9697) Move method to companion object and back
|
- [KT-9697](https://youtrack.jetbrains.com/issue/KT-9697) Move method to companion object and back
|
||||||
- [KT-11098](https://youtrack.jetbrains.com/issue/KT-11098) Inspection on final classes/functions annotated with Spring @Configuration/@Component/@Bean
|
- [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
|
||||||
|
|
||||||
General issues fixed:
|
General issues fixed:
|
||||||
|
|
||||||
|
|||||||
@@ -366,6 +366,9 @@ fun KtStringTemplateExpression.getContentRange(): TextRange {
|
|||||||
return TextRange(start, if (lastChild.elementType == KtTokens.CLOSING_QUOTE) length - lastChild.textLength else length)
|
return TextRange(start, if (lastChild.elementType == KtTokens.CLOSING_QUOTE) length - lastChild.textLength else length)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val KtStringTemplateExpression.plainContent: String
|
||||||
|
get() = getContentRange().substring(text)
|
||||||
|
|
||||||
fun KtStringTemplateExpression.isSingleQuoted(): Boolean
|
fun KtStringTemplateExpression.isSingleQuoted(): Boolean
|
||||||
= node.firstChildNode.textLength == 1
|
= node.firstChildNode.textLength == 1
|
||||||
|
|
||||||
|
|||||||
@@ -101,6 +101,9 @@ import org.jetbrains.kotlin.idea.refactoring.pushDown.AbstractPushDownTest
|
|||||||
import org.jetbrains.kotlin.idea.refactoring.rename.AbstractRenameTest
|
import org.jetbrains.kotlin.idea.refactoring.rename.AbstractRenameTest
|
||||||
import org.jetbrains.kotlin.idea.refactoring.safeDelete.AbstractSafeDeleteTest
|
import org.jetbrains.kotlin.idea.refactoring.safeDelete.AbstractSafeDeleteTest
|
||||||
import org.jetbrains.kotlin.idea.resolve.*
|
import org.jetbrains.kotlin.idea.resolve.*
|
||||||
|
import org.jetbrains.kotlin.idea.spring.tests.references.AbstractSpringReferenceCompletionHandlerTest
|
||||||
|
import org.jetbrains.kotlin.idea.spring.tests.references.AbstractSpringReferenceCompletionTest
|
||||||
|
import org.jetbrains.kotlin.idea.spring.tests.references.AbstractSpringReferenceNavigationTest
|
||||||
import org.jetbrains.kotlin.idea.structureView.AbstractKotlinFileStructureTest
|
import org.jetbrains.kotlin.idea.structureView.AbstractKotlinFileStructureTest
|
||||||
import org.jetbrains.kotlin.idea.stubs.AbstractMultiFileHighlightingTest
|
import org.jetbrains.kotlin.idea.stubs.AbstractMultiFileHighlightingTest
|
||||||
import org.jetbrains.kotlin.idea.stubs.AbstractResolveByStubTest
|
import org.jetbrains.kotlin.idea.stubs.AbstractResolveByStubTest
|
||||||
@@ -782,6 +785,18 @@ fun main(args: Array<String>) {
|
|||||||
testClass<AbstractQuickFixTest>("UltimateQuickFixTestGenerated") {
|
testClass<AbstractQuickFixTest>("UltimateQuickFixTestGenerated") {
|
||||||
model("ultimateQuickFixes", pattern = "^([\\w\\-_]+)\\.kt$", filenameStartsLowerCase = true)
|
model("ultimateQuickFixes", pattern = "^([\\w\\-_]+)\\.kt$", filenameStartsLowerCase = true)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
testClass<AbstractSpringReferenceCompletionHandlerTest>() {
|
||||||
|
model("spring/core/references/completion/handler")
|
||||||
|
}
|
||||||
|
|
||||||
|
testClass<AbstractSpringReferenceCompletionTest>() {
|
||||||
|
model("spring/core/references/completion/variants")
|
||||||
|
}
|
||||||
|
|
||||||
|
testClass<AbstractSpringReferenceNavigationTest>() {
|
||||||
|
model("spring/core/references/navigation")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
testGroup("idea/tests", "compiler/testData") {
|
testGroup("idea/tests", "compiler/testData") {
|
||||||
|
|||||||
+56
@@ -0,0 +1,56 @@
|
|||||||
|
/*
|
||||||
|
* 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.references
|
||||||
|
|
||||||
|
import com.intellij.patterns.ElementPattern
|
||||||
|
import com.intellij.patterns.PlatformPatterns
|
||||||
|
import com.intellij.psi.*
|
||||||
|
import com.intellij.util.ProcessingContext
|
||||||
|
import org.jetbrains.kotlin.psi.KtElement
|
||||||
|
|
||||||
|
abstract class AbstractKotlinReferenceContributor : PsiReferenceContributor() {
|
||||||
|
protected inline fun <reified E : KtElement> PsiReferenceRegistrar.registerProvider(
|
||||||
|
priority: Double = PsiReferenceRegistrar.DEFAULT_PRIORITY,
|
||||||
|
crossinline factory: (E) -> PsiReference?
|
||||||
|
) {
|
||||||
|
registerMultiProvider<E>(priority) { factory(it)?.let { arrayOf(it) } ?: PsiReference.EMPTY_ARRAY }
|
||||||
|
}
|
||||||
|
|
||||||
|
protected inline fun <reified E : KtElement> PsiReferenceRegistrar.registerMultiProvider(
|
||||||
|
priority: Double = PsiReferenceRegistrar.DEFAULT_PRIORITY,
|
||||||
|
crossinline factory: (E) -> Array<PsiReference>
|
||||||
|
) {
|
||||||
|
registerMultiProvider(PlatformPatterns.psiElement(E::class.java), priority, factory)
|
||||||
|
}
|
||||||
|
|
||||||
|
protected inline fun <E : KtElement> PsiReferenceRegistrar.registerMultiProvider(
|
||||||
|
pattern: ElementPattern<E>,
|
||||||
|
priority: Double = PsiReferenceRegistrar.DEFAULT_PRIORITY,
|
||||||
|
crossinline factory: (E) -> Array<PsiReference>
|
||||||
|
) {
|
||||||
|
registerReferenceProvider(
|
||||||
|
pattern,
|
||||||
|
object : PsiReferenceProvider() {
|
||||||
|
override fun getReferencesByElement(element: PsiElement, context: ProcessingContext): Array<PsiReference> {
|
||||||
|
@Suppress("UNCHECKED_CAST")
|
||||||
|
return factory(element as E)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
priority
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
+12
-26
@@ -16,22 +16,21 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.idea.references
|
package org.jetbrains.kotlin.idea.references
|
||||||
|
|
||||||
import com.intellij.patterns.PlatformPatterns
|
import com.intellij.psi.PsiReference
|
||||||
import com.intellij.psi.*
|
import com.intellij.psi.PsiReferenceRegistrar
|
||||||
import com.intellij.util.ProcessingContext
|
|
||||||
import org.jetbrains.kotlin.idea.kdoc.KDocReference
|
import org.jetbrains.kotlin.idea.kdoc.KDocReference
|
||||||
import org.jetbrains.kotlin.kdoc.psi.impl.KDocName
|
import org.jetbrains.kotlin.kdoc.psi.impl.KDocName
|
||||||
import org.jetbrains.kotlin.lexer.KtTokens
|
import org.jetbrains.kotlin.lexer.KtTokens
|
||||||
import org.jetbrains.kotlin.psi.*
|
import org.jetbrains.kotlin.psi.*
|
||||||
|
|
||||||
class KotlinReferenceContributor() : PsiReferenceContributor() {
|
class KotlinReferenceContributor() : AbstractKotlinReferenceContributor() {
|
||||||
override fun registerReferenceProviders(registrar: PsiReferenceRegistrar) {
|
override fun registerReferenceProviders(registrar: PsiReferenceRegistrar) {
|
||||||
with(registrar) {
|
with(registrar) {
|
||||||
registerProvider(KtSimpleNameExpression::class.java) {
|
registerProvider<KtSimpleNameExpression> {
|
||||||
KtSimpleNameReference(it)
|
KtSimpleNameReference(it)
|
||||||
}
|
}
|
||||||
|
|
||||||
registerMultiProvider(KtNameReferenceExpression::class.java) {
|
registerMultiProvider<KtNameReferenceExpression> {
|
||||||
if (it.getReferencedNameElementType() != KtTokens.IDENTIFIER) return@registerMultiProvider emptyArray()
|
if (it.getReferencedNameElementType() != KtTokens.IDENTIFIER) return@registerMultiProvider emptyArray()
|
||||||
|
|
||||||
when (it.readWriteAccess(useResolveForReadWrite = false)) {
|
when (it.readWriteAccess(useResolveForReadWrite = false)) {
|
||||||
@@ -44,46 +43,33 @@ class KotlinReferenceContributor() : PsiReferenceContributor() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
registerProvider(KtConstructorDelegationReferenceExpression::class.java) {
|
registerProvider<KtConstructorDelegationReferenceExpression> {
|
||||||
KtConstructorDelegationReference(it)
|
KtConstructorDelegationReference(it)
|
||||||
}
|
}
|
||||||
|
|
||||||
registerProvider(KtCallExpression::class.java) {
|
registerProvider<KtCallExpression> {
|
||||||
KtInvokeFunctionReference(it)
|
KtInvokeFunctionReference(it)
|
||||||
}
|
}
|
||||||
|
|
||||||
registerProvider(KtArrayAccessExpression::class.java) {
|
registerProvider<KtArrayAccessExpression> {
|
||||||
KtArrayAccessReference(it)
|
KtArrayAccessReference(it)
|
||||||
}
|
}
|
||||||
|
|
||||||
registerProvider(KtForExpression::class.java) {
|
registerProvider<KtForExpression> {
|
||||||
KtForLoopInReference(it)
|
KtForLoopInReference(it)
|
||||||
}
|
}
|
||||||
|
|
||||||
registerProvider(KtPropertyDelegate::class.java) {
|
registerProvider<KtPropertyDelegate> {
|
||||||
KtPropertyDelegationMethodsReference(it)
|
KtPropertyDelegationMethodsReference(it)
|
||||||
}
|
}
|
||||||
|
|
||||||
registerProvider(KtDestructuringDeclaration::class.java) {
|
registerProvider<KtDestructuringDeclaration> {
|
||||||
KtDestructuringDeclarationReference(it)
|
KtDestructuringDeclarationReference(it)
|
||||||
}
|
}
|
||||||
|
|
||||||
registerProvider(KDocName::class.java) {
|
registerProvider<KDocName> {
|
||||||
KDocReference(it)
|
KDocReference(it)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun <E : KtElement> PsiReferenceRegistrar.registerProvider(elementClass: Class<E>, factory: (E) -> KtReference) {
|
|
||||||
registerMultiProvider(elementClass, { arrayOf(factory(it)) })
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun <E : KtElement> PsiReferenceRegistrar.registerMultiProvider(elementClass: Class<E>, factory: (E) -> Array<PsiReference>) {
|
|
||||||
registerReferenceProvider(PlatformPatterns.psiElement(elementClass), object: PsiReferenceProvider() {
|
|
||||||
override fun getReferencesByElement(element: PsiElement, context: ProcessingContext): Array<PsiReference> {
|
|
||||||
@Suppress("UNCHECKED_CAST")
|
|
||||||
return factory(element as E)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
+14
-5
@@ -36,13 +36,18 @@ abstract class KotlinFixtureCompletionBaseTestCase : KotlinLightCodeInsightFixtu
|
|||||||
open fun doTest(testPath: String) {
|
open fun doTest(testPath: String) {
|
||||||
setUpFixture(testPath)
|
setUpFixture(testPath)
|
||||||
|
|
||||||
val fileText = FileUtil.loadFile(File(testPath), true)
|
try {
|
||||||
|
val fileText = FileUtil.loadFile(File(testPath), true)
|
||||||
|
|
||||||
if (ExpectedCompletionUtils.shouldRunHighlightingBeforeCompletion(fileText)) {
|
if (ExpectedCompletionUtils.shouldRunHighlightingBeforeCompletion(fileText)) {
|
||||||
myFixture.doHighlighting()
|
myFixture.doHighlighting()
|
||||||
|
}
|
||||||
|
|
||||||
|
testCompletion(fileText, getPlatform(), { completionType, count -> complete(completionType, count) }, defaultCompletionType(), defaultInvocationCount())
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
tearDownFixture()
|
||||||
}
|
}
|
||||||
|
|
||||||
testCompletion(fileText, getPlatform(), { completionType, count -> complete(completionType, count) }, defaultCompletionType(), defaultInvocationCount())
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected open fun setUpFixture(testPath: String) {
|
protected open fun setUpFixture(testPath: String) {
|
||||||
@@ -51,4 +56,8 @@ abstract class KotlinFixtureCompletionBaseTestCase : KotlinLightCodeInsightFixtu
|
|||||||
|
|
||||||
myFixture.configureByFile(testPath)
|
myFixture.configureByFile(testPath)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected open fun tearDownFixture() {
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+5
@@ -73,6 +73,7 @@ abstract class AbstractCompletionHandlerTest(private val defaultCompletionType:
|
|||||||
}
|
}
|
||||||
finally {
|
finally {
|
||||||
settingManager.dropTemporarySettings()
|
settingManager.dropTemporarySettings()
|
||||||
|
tearDownFixture()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -80,6 +81,10 @@ abstract class AbstractCompletionHandlerTest(private val defaultCompletionType:
|
|||||||
fixture.configureByFile(testPath)
|
fixture.configureByFile(testPath)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected open fun tearDownFixture() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
override fun getProjectDescriptor() = KotlinWithJdkAndRuntimeLightProjectDescriptor.INSTANCE
|
override fun getProjectDescriptor() = KotlinWithJdkAndRuntimeLightProjectDescriptor.INSTANCE
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
<idea-plugin>
|
<idea-plugin>
|
||||||
<extensions defaultExtensionNs="com.intellij">
|
<extensions defaultExtensionNs="com.intellij">
|
||||||
|
<psi.referenceContributor language="kotlin" implementation="org.jetbrains.kotlin.idea.spring.references.KotlinSpringReferenceContributor"/>
|
||||||
|
|
||||||
<localInspection implementationClass="org.jetbrains.kotlin.idea.spring.inspections.KotlinFinalClassOrFunSpringInspection"
|
<localInspection implementationClass="org.jetbrains.kotlin.idea.spring.inspections.KotlinFinalClassOrFunSpringInspection"
|
||||||
displayName="Final Kotlin class or function with Spring annotation"
|
displayName="Final Kotlin class or function with Spring annotation"
|
||||||
groupBundle="resources.messages.SpringBundle"
|
groupBundle="resources.messages.SpringBundle"
|
||||||
|
|||||||
+129
@@ -0,0 +1,129 @@
|
|||||||
|
/*
|
||||||
|
* 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.references
|
||||||
|
|
||||||
|
import com.intellij.openapi.util.TextRange
|
||||||
|
import com.intellij.psi.PsiReference
|
||||||
|
import com.intellij.psi.PsiReferenceRegistrar
|
||||||
|
import com.intellij.spring.constants.SpringAnnotationsConstants
|
||||||
|
import com.intellij.spring.constants.SpringConstants
|
||||||
|
import com.intellij.spring.model.utils.resources.SpringResourcesBuilder
|
||||||
|
import com.intellij.spring.model.utils.resources.SpringResourcesUtil
|
||||||
|
import com.intellij.spring.references.SpringBeanNamesReferenceProvider
|
||||||
|
import com.intellij.spring.references.SpringBeanReference
|
||||||
|
import org.jetbrains.kotlin.asJava.toLightClass
|
||||||
|
import org.jetbrains.kotlin.descriptors.CallableDescriptor
|
||||||
|
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor
|
||||||
|
import org.jetbrains.kotlin.descriptors.ConstructorDescriptor
|
||||||
|
import org.jetbrains.kotlin.idea.caches.resolve.analyze
|
||||||
|
import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptor
|
||||||
|
import org.jetbrains.kotlin.idea.imports.importableFqName
|
||||||
|
import org.jetbrains.kotlin.idea.references.AbstractKotlinReferenceContributor
|
||||||
|
import org.jetbrains.kotlin.psi.*
|
||||||
|
import org.jetbrains.kotlin.psi.psiUtil.getContentRange
|
||||||
|
import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType
|
||||||
|
import org.jetbrains.kotlin.psi.psiUtil.isPlain
|
||||||
|
import org.jetbrains.kotlin.psi.psiUtil.plainContent
|
||||||
|
import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall
|
||||||
|
import org.jetbrains.kotlin.resolve.descriptorUtil.overriddenTreeAsSequence
|
||||||
|
import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode
|
||||||
|
import org.jetbrains.kotlin.resolve.source.getPsi
|
||||||
|
|
||||||
|
class KotlinSpringReferenceContributor : AbstractKotlinReferenceContributor() {
|
||||||
|
override fun registerReferenceProviders(registrar: PsiReferenceRegistrar) {
|
||||||
|
registrar.registerProvider<KtStringTemplateExpression> {
|
||||||
|
if (!it.isPlain()) return@registerProvider null
|
||||||
|
|
||||||
|
val callExpression = (it.parent as? KtValueArgument)?.getStrictParentOfType<KtCallExpression>() ?: return@registerProvider null
|
||||||
|
val context = callExpression.analyze(BodyResolveMode.PARTIAL)
|
||||||
|
val resolvedCall = callExpression.getResolvedCall(context) ?: return@registerProvider null
|
||||||
|
val callable = resolvedCall.resultingDescriptor as? CallableMemberDescriptor ?: return@registerProvider null
|
||||||
|
if (!callable.overriddenTreeAsSequence(true).any {
|
||||||
|
it.containingDeclaration.importableFqName?.asString() == SpringConstants.BEAN_FACTORY_CLASS
|
||||||
|
}) return@registerProvider null
|
||||||
|
if (callable.name.asString() !in SpringBeanNamesReferenceProvider.METHODS) return@registerProvider null
|
||||||
|
|
||||||
|
SpringBeanReference(it, it.getContentRange())
|
||||||
|
}
|
||||||
|
|
||||||
|
registrar.registerProvider<KtStringTemplateExpression>(PsiReferenceRegistrar.HIGHER_PRIORITY) {
|
||||||
|
if (!it.isPlain()) return@registerProvider null
|
||||||
|
|
||||||
|
val argument = it.parent as? KtValueArgument ?: return@registerProvider null
|
||||||
|
val argumentName = argument.getArgumentName() ?: return@registerProvider null
|
||||||
|
if (argumentName.asName.asString() != "name") return@registerProvider null
|
||||||
|
|
||||||
|
val entry = argument.getStrictParentOfType<KtAnnotationEntry>() ?: return@registerProvider null
|
||||||
|
val context = entry.analyze(BodyResolveMode.PARTIAL)
|
||||||
|
val resolvedCall = entry.getResolvedCall(context) ?: return@registerProvider null
|
||||||
|
val annotation = (resolvedCall.resultingDescriptor as? ConstructorDescriptor)?.containingDeclaration ?: return@registerProvider null
|
||||||
|
if (annotation.importableFqName?.asString() != SpringAnnotationsConstants.JAVAX_RESOURCE) return@registerProvider null
|
||||||
|
|
||||||
|
val contentRange = it.getContentRange()
|
||||||
|
var startOffset = contentRange.startOffset
|
||||||
|
val isFactoryBeanRef: Boolean
|
||||||
|
if (it.plainContent.startsWith("&")) {
|
||||||
|
startOffset++
|
||||||
|
isFactoryBeanRef = true
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
isFactoryBeanRef = false
|
||||||
|
}
|
||||||
|
|
||||||
|
val callable = (it.getStrictParentOfType<KtAnnotationEntry>()?.parent as? KtModifierList)?.parent as? KtCallableDeclaration
|
||||||
|
val callableType = (callable?.resolveToDescriptor() as? CallableDescriptor)?.returnType
|
||||||
|
val requiredSuperClass = callableType?.constructor?.declarationDescriptor?.source?.getPsi() as? KtClass
|
||||||
|
|
||||||
|
SpringBeanReference(it, TextRange(startOffset, contentRange.endOffset), requiredSuperClass?.toLightClass(), isFactoryBeanRef)
|
||||||
|
}
|
||||||
|
|
||||||
|
registrar.registerProvider<KtStringTemplateExpression>(PsiReferenceRegistrar.HIGHER_PRIORITY) {
|
||||||
|
if (!it.isPlain()) return@registerProvider null
|
||||||
|
|
||||||
|
val argument = it.parent as? KtValueArgument ?: return@registerProvider null
|
||||||
|
val argumentName = argument.getArgumentName()
|
||||||
|
if (argumentName != null && argumentName.asName.asString() != "value") return@registerProvider null
|
||||||
|
|
||||||
|
val entry = argument.getStrictParentOfType<KtAnnotationEntry>() ?: return@registerProvider null
|
||||||
|
val context = entry.analyze(BodyResolveMode.PARTIAL)
|
||||||
|
val resolvedCall = entry.getResolvedCall(context) ?: return@registerProvider null
|
||||||
|
val annotation = (resolvedCall.resultingDescriptor as? ConstructorDescriptor)?.containingDeclaration ?: return@registerProvider null
|
||||||
|
if (annotation.importableFqName?.asString() != SpringAnnotationsConstants.SCOPE) return@registerProvider null
|
||||||
|
|
||||||
|
KtSpringBeanScopeReference(it)
|
||||||
|
}
|
||||||
|
|
||||||
|
registrar.registerMultiProvider<KtStringTemplateExpression> {
|
||||||
|
if (!it.isPlain()) return@registerMultiProvider PsiReference.EMPTY_ARRAY
|
||||||
|
|
||||||
|
val callExpression = (it.parent as? KtValueArgument)?.getStrictParentOfType<KtCallExpression>()
|
||||||
|
?: return@registerMultiProvider PsiReference.EMPTY_ARRAY
|
||||||
|
val context = callExpression.analyze(BodyResolveMode.PARTIAL)
|
||||||
|
val resolvedCall = callExpression.getResolvedCall(context) ?: return@registerMultiProvider PsiReference.EMPTY_ARRAY
|
||||||
|
val classDescriptor = (resolvedCall.resultingDescriptor as? ConstructorDescriptor)?.containingDeclaration
|
||||||
|
?: return@registerMultiProvider PsiReference.EMPTY_ARRAY
|
||||||
|
val qName = classDescriptor.importableFqName?.asString()
|
||||||
|
if (qName != SpringConstants.CLASS_PATH_XML_APP_CONTEXT && qName != SpringConstants.CLASS_PATH_RESOURCE) {
|
||||||
|
return@registerMultiProvider PsiReference.EMPTY_ARRAY
|
||||||
|
}
|
||||||
|
|
||||||
|
val content = it.plainContent
|
||||||
|
val resourcesBuilder = SpringResourcesBuilder.create(it, content).fromRoot(content.startsWith("/")).soft(false)
|
||||||
|
SpringResourcesUtil.getInstance().getClassPathReferences(resourcesBuilder)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+44
@@ -0,0 +1,44 @@
|
|||||||
|
/*
|
||||||
|
* 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.references
|
||||||
|
|
||||||
|
import com.intellij.codeInsight.lookup.LookupElementBuilder
|
||||||
|
import com.intellij.ide.TypePresentationService
|
||||||
|
import com.intellij.psi.ElementManipulators
|
||||||
|
import com.intellij.psi.PsiReferenceBase
|
||||||
|
import com.intellij.spring.model.scope.SpringBeanScope
|
||||||
|
import com.intellij.spring.model.scope.SpringBeanScopeManager
|
||||||
|
import org.jetbrains.kotlin.psi.KtStringTemplateExpression
|
||||||
|
import org.jetbrains.kotlin.psi.psiUtil.plainContent
|
||||||
|
|
||||||
|
class KtSpringBeanScopeReference(
|
||||||
|
element: KtStringTemplateExpression
|
||||||
|
) : PsiReferenceBase<KtStringTemplateExpression>(element, ElementManipulators.getManipulator(element).getRangeInElement(element)) {
|
||||||
|
private fun getScopes(): Sequence<SpringBeanScope> {
|
||||||
|
return SpringBeanScope.getDefaultScopes().asSequence() + SpringBeanScopeManager.getInstance().getCustomBeanScopes(element)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getLookupElement(scope: String): LookupElementBuilder {
|
||||||
|
return LookupElementBuilder
|
||||||
|
.create(scope)
|
||||||
|
.withIcon(TypePresentationService.getService().getTypeIcon(SpringBeanScope::class.java))
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun resolve() = if (element.plainContent in getScopes().map { it.value }) element else null
|
||||||
|
|
||||||
|
override fun getVariants() = getScopes().map { getLookupElement(it.value) }.toList().toTypedArray()
|
||||||
|
}
|
||||||
+39
@@ -0,0 +1,39 @@
|
|||||||
|
/*
|
||||||
|
* 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.references
|
||||||
|
|
||||||
|
import com.intellij.util.PathUtil
|
||||||
|
import org.jetbrains.kotlin.idea.completion.test.handlers.AbstractBasicCompletionHandlerTest
|
||||||
|
import org.jetbrains.kotlin.idea.spring.tests.SpringTestFixtureExtension
|
||||||
|
import org.jetbrains.kotlin.idea.test.TestFixtureExtension
|
||||||
|
import java.io.File
|
||||||
|
|
||||||
|
abstract class AbstractSpringReferenceCompletionHandlerTest : AbstractBasicCompletionHandlerTest() {
|
||||||
|
override fun setUpFixture(testPath: String) {
|
||||||
|
super.setUpFixture(testPath)
|
||||||
|
|
||||||
|
TestFixtureExtension
|
||||||
|
.loadFixture<SpringTestFixtureExtension>(myModule)
|
||||||
|
.configureFileSet(myFixture, listOf(PathUtil.toSystemIndependentName(File(testPath).parent + "/spring-config.xml")))
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun tearDownFixture() {
|
||||||
|
TestFixtureExtension.unloadFixture<SpringTestFixtureExtension>()
|
||||||
|
|
||||||
|
super.tearDownFixture()
|
||||||
|
}
|
||||||
|
}
|
||||||
+39
@@ -0,0 +1,39 @@
|
|||||||
|
/*
|
||||||
|
* 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.references
|
||||||
|
|
||||||
|
import com.intellij.util.PathUtil
|
||||||
|
import org.jetbrains.kotlin.idea.completion.test.AbstractJvmBasicCompletionTest
|
||||||
|
import org.jetbrains.kotlin.idea.spring.tests.SpringTestFixtureExtension
|
||||||
|
import org.jetbrains.kotlin.idea.test.TestFixtureExtension
|
||||||
|
import java.io.File
|
||||||
|
|
||||||
|
abstract class AbstractSpringReferenceCompletionTest : AbstractJvmBasicCompletionTest() {
|
||||||
|
override fun setUpFixture(testPath: String) {
|
||||||
|
super.setUpFixture(testPath)
|
||||||
|
|
||||||
|
TestFixtureExtension
|
||||||
|
.loadFixture<SpringTestFixtureExtension>(myModule)!!
|
||||||
|
.configureFileSet(myFixture, listOf(PathUtil.toSystemIndependentName(File(testPath).parent + "/spring-config.xml")))
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun tearDownFixture() {
|
||||||
|
TestFixtureExtension.unloadFixture<SpringTestFixtureExtension>()
|
||||||
|
|
||||||
|
super.tearDownFixture()
|
||||||
|
}
|
||||||
|
}
|
||||||
+61
@@ -0,0 +1,61 @@
|
|||||||
|
/*
|
||||||
|
* 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.references
|
||||||
|
|
||||||
|
import com.intellij.codeInsight.navigation.GotoTargetHandler
|
||||||
|
import com.intellij.openapi.editor.Editor
|
||||||
|
import com.intellij.psi.PsiFile
|
||||||
|
import org.jetbrains.kotlin.idea.KotlinFileType
|
||||||
|
import org.jetbrains.kotlin.idea.actions.AbstractNavigationTest
|
||||||
|
import org.jetbrains.kotlin.idea.spring.tests.SpringTestFixtureExtension
|
||||||
|
import org.jetbrains.kotlin.idea.test.TestFixtureExtension
|
||||||
|
import org.jetbrains.kotlin.psi.KtStringTemplateExpression
|
||||||
|
import org.jetbrains.kotlin.psi.psiUtil.getNonStrictParentOfType
|
||||||
|
import org.jetbrains.kotlin.test.InTextDirectivesUtils
|
||||||
|
|
||||||
|
abstract class AbstractSpringReferenceNavigationTest : AbstractNavigationTest() {
|
||||||
|
override fun getSourceAndTargetElements(editor: Editor, file: PsiFile): GotoTargetHandler.GotoData? {
|
||||||
|
val stringTemplate = file.findElementAt(editor.caretModel.offset)!!.getNonStrictParentOfType<KtStringTemplateExpression>()!!
|
||||||
|
return GotoTargetHandler.GotoData(stringTemplate,
|
||||||
|
stringTemplate.references.mapNotNull { it.resolve() }.toTypedArray(),
|
||||||
|
emptyList())
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun setUp() {
|
||||||
|
super.setUp()
|
||||||
|
TestFixtureExtension.loadFixture<SpringTestFixtureExtension>(myModule)!!
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun configureExtra(mainFileBaseName: String, mainFileText: String) {
|
||||||
|
if (!InTextDirectivesUtils.isDirectiveDefined(mainFileText, "// NO_XML_CONFIG")) {
|
||||||
|
TestFixtureExtension
|
||||||
|
.getFixture<SpringTestFixtureExtension>()!!
|
||||||
|
.configureFileSet(myFixture, listOf("${mainFileBaseName}_config.xml"))
|
||||||
|
}
|
||||||
|
if (InTextDirectivesUtils.isDirectiveDefined(mainFileText, "// JAVAX_ANNOTATION_RESOURCE")) {
|
||||||
|
myFixture.configureByText(
|
||||||
|
KotlinFileType.INSTANCE,
|
||||||
|
"""package javax.annotation; annotation class Resource(val name: String = "")"""
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun tearDown() {
|
||||||
|
TestFixtureExtension.unloadFixture<SpringTestFixtureExtension>()
|
||||||
|
super.tearDown()
|
||||||
|
}
|
||||||
|
}
|
||||||
+55
@@ -0,0 +1,55 @@
|
|||||||
|
/*
|
||||||
|
* 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.references;
|
||||||
|
|
||||||
|
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/references/completion/handler")
|
||||||
|
@TestDataPath("$PROJECT_ROOT")
|
||||||
|
@RunWith(JUnit3RunnerWithInners.class)
|
||||||
|
public class SpringReferenceCompletionHandlerTestGenerated extends AbstractSpringReferenceCompletionHandlerTest {
|
||||||
|
public void testAllFilesPresentInHandler() throws Exception {
|
||||||
|
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/spring/core/references/completion/handler"), Pattern.compile("^(.+)\\.kt$"), true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("scopeReference.kt")
|
||||||
|
public void testScopeReference() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/spring/core/references/completion/handler/scopeReference.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("springBeanReferenceEnter.kt")
|
||||||
|
public void testSpringBeanReferenceEnter() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/spring/core/references/completion/handler/springBeanReferenceEnter.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("springBeanReferenceTab.kt")
|
||||||
|
public void testSpringBeanReferenceTab() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/spring/core/references/completion/handler/springBeanReferenceTab.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
}
|
||||||
+49
@@ -0,0 +1,49 @@
|
|||||||
|
/*
|
||||||
|
* 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.references;
|
||||||
|
|
||||||
|
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/references/completion/variants")
|
||||||
|
@TestDataPath("$PROJECT_ROOT")
|
||||||
|
@RunWith(JUnit3RunnerWithInners.class)
|
||||||
|
public class SpringReferenceCompletionTestGenerated extends AbstractSpringReferenceCompletionTest {
|
||||||
|
public void testAllFilesPresentInVariants() throws Exception {
|
||||||
|
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/spring/core/references/completion/variants"), Pattern.compile("^(.+)\\.kt$"), true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("scopeReference.kt")
|
||||||
|
public void testScopeReference() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/spring/core/references/completion/variants/scopeReference.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("springBeanReference.kt")
|
||||||
|
public void testSpringBeanReference() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/spring/core/references/completion/variants/springBeanReference.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
}
|
||||||
+79
@@ -0,0 +1,79 @@
|
|||||||
|
/*
|
||||||
|
* 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.references;
|
||||||
|
|
||||||
|
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/references/navigation")
|
||||||
|
@TestDataPath("$PROJECT_ROOT")
|
||||||
|
@RunWith(JUnit3RunnerWithInners.class)
|
||||||
|
public class SpringReferenceNavigationTestGenerated extends AbstractSpringReferenceNavigationTest {
|
||||||
|
public void testAllFilesPresentInNavigation() throws Exception {
|
||||||
|
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/spring/core/references/navigation"), Pattern.compile("^(.+)\\.kt$"), true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("fileReferenceInClasspathResource.kt")
|
||||||
|
public void testFileReferenceInClasspathResource() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/spring/core/references/navigation/fileReferenceInClasspathResource.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("fileReferenceInClasspathXmlContext.kt")
|
||||||
|
public void testFileReferenceInClasspathXmlContext() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/spring/core/references/navigation/fileReferenceInClasspathXmlContext.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("scopeReference.kt")
|
||||||
|
public void testScopeReference() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/spring/core/references/navigation/scopeReference.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("springBeanRefInFactoryContainsBean.kt")
|
||||||
|
public void testSpringBeanRefInFactoryContainsBean() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/spring/core/references/navigation/springBeanRefInFactoryContainsBean.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("springBeanRefInFactoryGetBean.kt")
|
||||||
|
public void testSpringBeanRefInFactoryGetBean() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/spring/core/references/navigation/springBeanRefInFactoryGetBean.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("springBeanRefInResource.kt")
|
||||||
|
public void testSpringBeanRefInResource() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/spring/core/references/navigation/springBeanRefInResource.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("springFactoryBeanRefInResource.kt")
|
||||||
|
public void testSpringFactoryBeanRefInResource() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/spring/core/references/navigation/springFactoryBeanRefInResource.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
}
|
||||||
+2
-3
@@ -17,12 +17,11 @@
|
|||||||
package org.jetbrains.kotlin.idea.properties
|
package org.jetbrains.kotlin.idea.properties
|
||||||
|
|
||||||
import com.intellij.patterns.PlatformPatterns
|
import com.intellij.patterns.PlatformPatterns
|
||||||
import com.intellij.psi.PsiReferenceContributor
|
|
||||||
import com.intellij.psi.PsiReferenceRegistrar
|
import com.intellij.psi.PsiReferenceRegistrar
|
||||||
import org.jetbrains.kotlin.psi.KtLiteralStringTemplateEntry
|
import org.jetbrains.kotlin.idea.references.AbstractKotlinReferenceContributor
|
||||||
import org.jetbrains.kotlin.psi.KtStringTemplateExpression
|
import org.jetbrains.kotlin.psi.KtStringTemplateExpression
|
||||||
|
|
||||||
class KotlinPropertiesReferenceContributor : PsiReferenceContributor() {
|
class KotlinPropertiesReferenceContributor : AbstractKotlinReferenceContributor() {
|
||||||
override fun registerReferenceProviders(registrar: PsiReferenceRegistrar) {
|
override fun registerReferenceProviders(registrar: PsiReferenceRegistrar) {
|
||||||
registrar.registerReferenceProvider(
|
registrar.registerReferenceProvider(
|
||||||
PlatformPatterns.psiElement(KtStringTemplateExpression::class.java),
|
PlatformPatterns.psiElement(KtStringTemplateExpression::class.java),
|
||||||
|
|||||||
@@ -0,0 +1,7 @@
|
|||||||
|
// ELEMENT: singleton
|
||||||
|
package test
|
||||||
|
|
||||||
|
import org.springframework.context.annotation.Scope
|
||||||
|
|
||||||
|
@Scope("<caret>")
|
||||||
|
class ScopedBean
|
||||||
+7
@@ -0,0 +1,7 @@
|
|||||||
|
// ELEMENT: singleton
|
||||||
|
package test
|
||||||
|
|
||||||
|
import org.springframework.context.annotation.Scope
|
||||||
|
|
||||||
|
@Scope("singleton")
|
||||||
|
class ScopedBean
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
|
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
|
||||||
|
<beans>
|
||||||
|
<bean id="fooBean" class="java.lang.String"/>
|
||||||
|
<bean id="barBean" class="java.lang.String"/>
|
||||||
|
<bean id="scopedBean" class="test.ScopedBean"/>
|
||||||
|
</beans>
|
||||||
+14
@@ -0,0 +1,14 @@
|
|||||||
|
// ELEMENT: fooBean
|
||||||
|
// CHAR: \n
|
||||||
|
import org.springframework.beans.factory.BeanFactory
|
||||||
|
import org.springframework.beans.factory.xml.XmlBeanFactory
|
||||||
|
import org.springframework.core.io.FileSystemResource
|
||||||
|
import org.springframework.core.io.Resource
|
||||||
|
|
||||||
|
class FooBeanClass {
|
||||||
|
init {
|
||||||
|
val configFile = FileSystemResource("spring-config.xml")
|
||||||
|
val factory = XmlBeanFactory(configFile)
|
||||||
|
factory.getBean("fo<caret>o")
|
||||||
|
}
|
||||||
|
}
|
||||||
+14
@@ -0,0 +1,14 @@
|
|||||||
|
// ELEMENT: fooBean
|
||||||
|
// CHAR: \n
|
||||||
|
import org.springframework.beans.factory.BeanFactory
|
||||||
|
import org.springframework.beans.factory.xml.XmlBeanFactory
|
||||||
|
import org.springframework.core.io.FileSystemResource
|
||||||
|
import org.springframework.core.io.Resource
|
||||||
|
|
||||||
|
class FooBeanClass {
|
||||||
|
init {
|
||||||
|
val configFile = FileSystemResource("spring-config.xml")
|
||||||
|
val factory = XmlBeanFactory(configFile)
|
||||||
|
factory.getBean("fooBeano")
|
||||||
|
}
|
||||||
|
}
|
||||||
+14
@@ -0,0 +1,14 @@
|
|||||||
|
// ELEMENT: fooBean
|
||||||
|
// CHAR: \t
|
||||||
|
import org.springframework.beans.factory.BeanFactory
|
||||||
|
import org.springframework.beans.factory.xml.XmlBeanFactory
|
||||||
|
import org.springframework.core.io.FileSystemResource
|
||||||
|
import org.springframework.core.io.Resource
|
||||||
|
|
||||||
|
class FooBeanClass {
|
||||||
|
init {
|
||||||
|
val configFile = FileSystemResource("spring-config.xml")
|
||||||
|
val factory = XmlBeanFactory(configFile)
|
||||||
|
factory.getBean("fo<caret>o")
|
||||||
|
}
|
||||||
|
}
|
||||||
+14
@@ -0,0 +1,14 @@
|
|||||||
|
// ELEMENT: fooBean
|
||||||
|
// CHAR: \t
|
||||||
|
import org.springframework.beans.factory.BeanFactory
|
||||||
|
import org.springframework.beans.factory.xml.XmlBeanFactory
|
||||||
|
import org.springframework.core.io.FileSystemResource
|
||||||
|
import org.springframework.core.io.Resource
|
||||||
|
|
||||||
|
class FooBeanClass {
|
||||||
|
init {
|
||||||
|
val configFile = FileSystemResource("spring-config.xml")
|
||||||
|
val factory = XmlBeanFactory(configFile)
|
||||||
|
factory.getBean("fooBean")
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
// NUMBER: 2
|
||||||
|
// EXIST: { lookupString:"singleton" }
|
||||||
|
// EXIST: { lookupString:"prototype" }
|
||||||
|
package test
|
||||||
|
|
||||||
|
import org.springframework.context.annotation.Scope
|
||||||
|
|
||||||
|
@Scope("<caret>")
|
||||||
|
class ScopedBean
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
|
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
|
||||||
|
<beans>
|
||||||
|
<bean id="fooBean" class="java.lang.String"/>
|
||||||
|
<bean id="fooBean2" class="java.lang.String"/>
|
||||||
|
<bean id="barBean" class="java.lang.String"/>
|
||||||
|
<bean id="scopedBean" class="test.ScopedBean"/>
|
||||||
|
</beans>
|
||||||
+15
@@ -0,0 +1,15 @@
|
|||||||
|
// NUMBER: 2
|
||||||
|
// EXIST: { lookupString:"fooBean" }
|
||||||
|
// EXIST: { lookupString:"fooBean2" }
|
||||||
|
import org.springframework.beans.factory.BeanFactory
|
||||||
|
import org.springframework.beans.factory.xml.XmlBeanFactory
|
||||||
|
import org.springframework.core.io.FileSystemResource
|
||||||
|
import org.springframework.core.io.Resource
|
||||||
|
|
||||||
|
class FooBeanClass {
|
||||||
|
init {
|
||||||
|
val configFile = FileSystemResource("spring-config.xml")
|
||||||
|
val factory = XmlBeanFactory(configFile)
|
||||||
|
factory.getBean("fo<caret>o")
|
||||||
|
}
|
||||||
|
}
|
||||||
+9
@@ -0,0 +1,9 @@
|
|||||||
|
// NO_XML_CONFIG
|
||||||
|
// REF: /src.fileReferenceInClasspathResource.test.xml
|
||||||
|
import org.springframework.core.io.ClassPathResource
|
||||||
|
|
||||||
|
class Bean {
|
||||||
|
init {
|
||||||
|
ClassPathResource("<caret>fileReferenceInClasspathResource.test.xml")
|
||||||
|
}
|
||||||
|
}
|
||||||
+3
@@ -0,0 +1,3 @@
|
|||||||
|
<test>
|
||||||
|
<foo/>
|
||||||
|
</test>
|
||||||
+9
@@ -0,0 +1,9 @@
|
|||||||
|
// NO_XML_CONFIG
|
||||||
|
// REF: /src.fileReferenceInClasspathXmlContext.test.xml
|
||||||
|
import org.springframework.context.support.ClassPathXmlApplicationContext
|
||||||
|
|
||||||
|
class Bean {
|
||||||
|
init {
|
||||||
|
ClassPathXmlApplicationContext("<caret>fileReferenceInClasspathXmlContext.test.xml")
|
||||||
|
}
|
||||||
|
}
|
||||||
Vendored
+3
@@ -0,0 +1,3 @@
|
|||||||
|
<test>
|
||||||
|
<foo/>
|
||||||
|
</test>
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
// REF: singleton
|
||||||
|
package test
|
||||||
|
|
||||||
|
import org.springframework.context.annotation.Scope
|
||||||
|
|
||||||
|
@Scope("<caret>singleton")
|
||||||
|
class Bean
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
|
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
|
||||||
|
<beans>
|
||||||
|
<bean id="fooBean" class="test.Bean"/>
|
||||||
|
</beans>
|
||||||
+13
@@ -0,0 +1,13 @@
|
|||||||
|
// REF: <bean id="fooBean" class="java.lang.String"/>
|
||||||
|
import org.springframework.beans.factory.BeanFactory
|
||||||
|
import org.springframework.beans.factory.xml.XmlBeanFactory
|
||||||
|
import org.springframework.core.io.FileSystemResource
|
||||||
|
import org.springframework.core.io.Resource
|
||||||
|
|
||||||
|
class FooBeanClass {
|
||||||
|
init {
|
||||||
|
val configFile = FileSystemResource("spring-config.xml")
|
||||||
|
val factory = XmlBeanFactory(configFile)
|
||||||
|
if (factory.containsBean("<caret>fooBean")) println("FooBean")
|
||||||
|
}
|
||||||
|
}
|
||||||
Vendored
+5
@@ -0,0 +1,5 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
|
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
|
||||||
|
<beans>
|
||||||
|
<bean id="fooBean" class="java.lang.String"/>
|
||||||
|
</beans>
|
||||||
+13
@@ -0,0 +1,13 @@
|
|||||||
|
// REF: <bean id="fooBean" class="java.lang.String"/>
|
||||||
|
import org.springframework.beans.factory.BeanFactory
|
||||||
|
import org.springframework.beans.factory.xml.XmlBeanFactory
|
||||||
|
import org.springframework.core.io.FileSystemResource
|
||||||
|
import org.springframework.core.io.Resource
|
||||||
|
|
||||||
|
class FooBeanClass {
|
||||||
|
init {
|
||||||
|
val configFile = FileSystemResource("spring-config.xml")
|
||||||
|
val factory = XmlBeanFactory(configFile)
|
||||||
|
factory.getBean("<caret>fooBean")
|
||||||
|
}
|
||||||
|
}
|
||||||
+5
@@ -0,0 +1,5 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
|
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
|
||||||
|
<beans>
|
||||||
|
<bean id="fooBean" class="java.lang.String"/>
|
||||||
|
</beans>
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
// JAVAX_ANNOTATION_RESOURCE
|
||||||
|
// REF: <bean id="fooBean" class="test.Bean"/>
|
||||||
|
package test
|
||||||
|
|
||||||
|
import javax.annotation.Resource
|
||||||
|
|
||||||
|
class Bean
|
||||||
|
|
||||||
|
class Test {
|
||||||
|
@Resource(name= "<caret>fooBean") lateinit var name: String
|
||||||
|
}
|
||||||
+5
@@ -0,0 +1,5 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
|
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
|
||||||
|
<beans>
|
||||||
|
<bean id="fooBean" class="test.Bean"/>
|
||||||
|
</beans>
|
||||||
+11
@@ -0,0 +1,11 @@
|
|||||||
|
// JAVAX_ANNOTATION_RESOURCE
|
||||||
|
// REF: <bean id="fooBean" class="test.Bean"/>
|
||||||
|
package test
|
||||||
|
|
||||||
|
import javax.annotation.Resource
|
||||||
|
|
||||||
|
class Bean
|
||||||
|
|
||||||
|
class Test {
|
||||||
|
@Resource(name= "<caret>&fooBean") lateinit var name: String
|
||||||
|
}
|
||||||
+5
@@ -0,0 +1,5 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
|
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
|
||||||
|
<beans>
|
||||||
|
<bean id="fooBean" class="test.Bean"/>
|
||||||
|
</beans>
|
||||||
@@ -17,55 +17,13 @@
|
|||||||
package org.jetbrains.kotlin.idea.actions
|
package org.jetbrains.kotlin.idea.actions
|
||||||
|
|
||||||
import com.intellij.openapi.editor.Editor
|
import com.intellij.openapi.editor.Editor
|
||||||
import com.intellij.openapi.util.io.FileUtil
|
|
||||||
import com.intellij.psi.PsiFile
|
import com.intellij.psi.PsiFile
|
||||||
import com.intellij.testFramework.PlatformTestUtil
|
|
||||||
import com.intellij.testIntegration.GotoTestOrCodeHandler
|
import com.intellij.testIntegration.GotoTestOrCodeHandler
|
||||||
import org.jetbrains.kotlin.idea.navigation.NavigationTestUtils
|
|
||||||
import org.jetbrains.kotlin.idea.test.ConfigLibraryUtil
|
|
||||||
import org.jetbrains.kotlin.idea.test.KotlinLightCodeInsightFixtureTestCase
|
|
||||||
import org.jetbrains.kotlin.idea.test.KotlinWithJdkAndRuntimeLightProjectDescriptor
|
|
||||||
import org.jetbrains.kotlin.idea.test.PluginTestCaseBase
|
|
||||||
import org.jetbrains.kotlin.test.InTextDirectivesUtils
|
|
||||||
import org.jetbrains.kotlin.test.KotlinTestUtils
|
|
||||||
import java.io.File
|
|
||||||
|
|
||||||
abstract class AbstractGotoTestOrCodeActionTest : KotlinLightCodeInsightFixtureTestCase() {
|
abstract class AbstractGotoTestOrCodeActionTest : AbstractNavigationTest() {
|
||||||
private object Handler: GotoTestOrCodeHandler() {
|
private object Handler: GotoTestOrCodeHandler() {
|
||||||
public override fun getSourceAndTargetElements(editor: Editor?, file: PsiFile?) = super.getSourceAndTargetElements(editor, file)
|
public override fun getSourceAndTargetElements(editor: Editor?, file: PsiFile?) = super.getSourceAndTargetElements(editor, file)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getProjectDescriptor() = KotlinWithJdkAndRuntimeLightProjectDescriptor.INSTANCE
|
override fun getSourceAndTargetElements(editor: Editor, file: PsiFile) = Handler.getSourceAndTargetElements(editor, file)
|
||||||
|
|
||||||
protected fun doTest(path: String) {
|
|
||||||
val mainFile = File(path)
|
|
||||||
val fileText = FileUtil.loadFile(mainFile, true)
|
|
||||||
val addKotlinRuntime = InTextDirectivesUtils.findStringWithPrefixes(fileText, "// WITH_RUNTIME") != null
|
|
||||||
|
|
||||||
try {
|
|
||||||
if (addKotlinRuntime) {
|
|
||||||
ConfigLibraryUtil.configureKotlinRuntimeAndSdk(myModule, PluginTestCaseBase.mockJdk())
|
|
||||||
}
|
|
||||||
ConfigLibraryUtil.configureLibrariesByDirective(myModule, PlatformTestUtil.getCommunityPath(), fileText)
|
|
||||||
|
|
||||||
myFixture.testDataPath = "${KotlinTestUtils.getHomeDirectory()}/${mainFile.parent}"
|
|
||||||
|
|
||||||
val mainFileName = mainFile.name
|
|
||||||
val mainFileBaseName = mainFileName.substring(0, mainFileName.indexOf('.'))
|
|
||||||
mainFile.parentFile
|
|
||||||
.listFiles { file, name ->
|
|
||||||
name != mainFileName && name.startsWith("$mainFileBaseName.") && (name.endsWith(".kt") || name.endsWith(".java"))
|
|
||||||
}
|
|
||||||
.forEach{ myFixture.configureByFile(it.name) }
|
|
||||||
val file = myFixture.configureByFile(mainFileName)
|
|
||||||
|
|
||||||
NavigationTestUtils.assertGotoDataMatching(editor, Handler.getSourceAndTargetElements(editor, file))
|
|
||||||
}
|
|
||||||
finally {
|
|
||||||
ConfigLibraryUtil.unconfigureLibrariesByDirective(myModule, fileText)
|
|
||||||
if (addKotlinRuntime) {
|
|
||||||
ConfigLibraryUtil.unConfigureKotlinRuntimeAndSdk(myModule, PluginTestCaseBase.mockJdk())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,75 @@
|
|||||||
|
/*
|
||||||
|
* 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.actions
|
||||||
|
|
||||||
|
import com.intellij.codeInsight.navigation.GotoTargetHandler
|
||||||
|
import com.intellij.openapi.editor.Editor
|
||||||
|
import com.intellij.openapi.util.io.FileUtil
|
||||||
|
import com.intellij.psi.PsiFile
|
||||||
|
import com.intellij.testFramework.PlatformTestUtil
|
||||||
|
import org.jetbrains.kotlin.idea.navigation.NavigationTestUtils
|
||||||
|
import org.jetbrains.kotlin.idea.test.ConfigLibraryUtil
|
||||||
|
import org.jetbrains.kotlin.idea.test.KotlinLightCodeInsightFixtureTestCase
|
||||||
|
import org.jetbrains.kotlin.idea.test.KotlinWithJdkAndRuntimeLightProjectDescriptor
|
||||||
|
import org.jetbrains.kotlin.idea.test.PluginTestCaseBase
|
||||||
|
import org.jetbrains.kotlin.test.InTextDirectivesUtils
|
||||||
|
import org.jetbrains.kotlin.test.KotlinTestUtils
|
||||||
|
import java.io.File
|
||||||
|
|
||||||
|
abstract class AbstractNavigationTest : KotlinLightCodeInsightFixtureTestCase() {
|
||||||
|
protected abstract fun getSourceAndTargetElements(editor: Editor, file: PsiFile): GotoTargetHandler.GotoData?
|
||||||
|
|
||||||
|
override fun getProjectDescriptor() = KotlinWithJdkAndRuntimeLightProjectDescriptor.INSTANCE
|
||||||
|
|
||||||
|
protected open fun configureExtra(mainFileBaseName: String, mainFileText: String) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
protected fun doTest(path: String) {
|
||||||
|
val mainFile = File(path)
|
||||||
|
val fileText = FileUtil.loadFile(mainFile, true)
|
||||||
|
val addKotlinRuntime = InTextDirectivesUtils.findStringWithPrefixes(fileText, "// WITH_RUNTIME") != null
|
||||||
|
|
||||||
|
try {
|
||||||
|
if (addKotlinRuntime) {
|
||||||
|
ConfigLibraryUtil.configureKotlinRuntimeAndSdk(myModule, PluginTestCaseBase.mockJdk())
|
||||||
|
}
|
||||||
|
ConfigLibraryUtil.configureLibrariesByDirective(myModule, PlatformTestUtil.getCommunityPath(), fileText)
|
||||||
|
|
||||||
|
myFixture.testDataPath = "${KotlinTestUtils.getHomeDirectory()}/${mainFile.parent}"
|
||||||
|
|
||||||
|
val mainFileName = mainFile.name
|
||||||
|
val mainFileBaseName = mainFileName.substring(0, mainFileName.indexOf('.'))
|
||||||
|
configureExtra(mainFileBaseName, fileText)
|
||||||
|
mainFile.parentFile
|
||||||
|
.listFiles { file, name ->
|
||||||
|
name != mainFileName && name.startsWith("$mainFileBaseName.") && (name.endsWith(".kt") || name.endsWith(".java") || name.endsWith(".xml"))
|
||||||
|
}
|
||||||
|
.forEach{ myFixture.configureByFile(it.name) }
|
||||||
|
val file = myFixture.configureByFile(mainFileName)
|
||||||
|
|
||||||
|
NavigationTestUtils.assertGotoDataMatching(editor, getSourceAndTargetElements(editor, file))
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
ConfigLibraryUtil.unconfigureLibrariesByDirective(myModule, fileText)
|
||||||
|
if (addKotlinRuntime) {
|
||||||
|
ConfigLibraryUtil.unConfigureKotlinRuntimeAndSdk(myModule, PluginTestCaseBase.mockJdk())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -53,7 +53,9 @@ public final class NavigationTestUtils {
|
|||||||
// Get expected references from the tested document
|
// Get expected references from the tested document
|
||||||
List<String> expectedReferences = InTextDirectivesUtils.findListWithPrefixes(editor.getDocument().getText(), "// REF:");
|
List<String> expectedReferences = InTextDirectivesUtils.findListWithPrefixes(editor.getDocument().getText(), "// REF:");
|
||||||
for (int i = 0; i < expectedReferences.size(); i++) {
|
for (int i = 0; i < expectedReferences.size(); i++) {
|
||||||
expectedReferences.set(i, PathUtil.toSystemDependentName(expectedReferences.get(i)).replace("//", "/"));
|
String expectedText = expectedReferences.get(i);
|
||||||
|
if (expectedText.startsWith("<")) continue;
|
||||||
|
expectedReferences.set(i, PathUtil.toSystemDependentName(expectedText).replace("//", "/"));
|
||||||
}
|
}
|
||||||
|
|
||||||
Collections.sort(expectedReferences);
|
Collections.sort(expectedReferences);
|
||||||
|
|||||||
@@ -25,6 +25,8 @@ import com.intellij.psi.util.PsiTreeUtil;
|
|||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.kotlin.psi.KtClass;
|
import org.jetbrains.kotlin.psi.KtClass;
|
||||||
import org.jetbrains.kotlin.psi.KtObjectDeclaration;
|
import org.jetbrains.kotlin.psi.KtObjectDeclaration;
|
||||||
|
import org.jetbrains.kotlin.psi.KtStringTemplateExpression;
|
||||||
|
import org.jetbrains.kotlin.psi.psiUtil.KtPsiUtilKt;
|
||||||
import org.junit.Assert;
|
import org.junit.Assert;
|
||||||
|
|
||||||
public final class ReferenceUtils {
|
public final class ReferenceUtils {
|
||||||
@@ -41,11 +43,16 @@ public final class ReferenceUtils {
|
|||||||
return "companion object of " + renderAsGotoImplementation(containingClass);
|
return "companion object of " + renderAsGotoImplementation(containingClass);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (navigationElement instanceof KtStringTemplateExpression) {
|
||||||
|
return KtPsiUtilKt.getPlainContent((KtStringTemplateExpression) navigationElement);
|
||||||
|
}
|
||||||
|
|
||||||
Assert.assertTrue(navigationElement instanceof NavigationItem);
|
Assert.assertTrue(navigationElement instanceof NavigationItem);
|
||||||
ItemPresentation presentation = ((NavigationItem) navigationElement).getPresentation();
|
ItemPresentation presentation = ((NavigationItem) navigationElement).getPresentation();
|
||||||
|
|
||||||
if (presentation == null) {
|
if (presentation == null) {
|
||||||
return element.getText();
|
String elementText = element.getText();
|
||||||
|
return elementText != null ? elementText : navigationElement.getText();
|
||||||
}
|
}
|
||||||
|
|
||||||
String presentableText = presentation.getPresentableText();
|
String presentableText = presentation.getPresentableText();
|
||||||
|
|||||||
Reference in New Issue
Block a user