[REVERTED] 0a71eb7 Alexey Sedunov on 2/25/2016 at 14:02 (committed on 3/24/2016 at 18:42)

Spring Support: Implement Spring-specific references
This commit is contained in:
Alexey Sedunov
2016-03-29 17:17:56 +03:00
parent 95f6acdddf
commit ed9b1ac151
45 changed files with 80 additions and 906 deletions
@@ -1,56 +0,0 @@
/*
* 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
)
}
}
@@ -16,21 +16,22 @@
package org.jetbrains.kotlin.idea.references
import com.intellij.psi.PsiReference
import com.intellij.psi.PsiReferenceRegistrar
import com.intellij.patterns.PlatformPatterns
import com.intellij.psi.*
import com.intellij.util.ProcessingContext
import org.jetbrains.kotlin.idea.kdoc.KDocReference
import org.jetbrains.kotlin.kdoc.psi.impl.KDocName
import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.psi.*
class KotlinReferenceContributor() : AbstractKotlinReferenceContributor() {
class KotlinReferenceContributor() : PsiReferenceContributor() {
override fun registerReferenceProviders(registrar: PsiReferenceRegistrar) {
with(registrar) {
registerProvider<KtSimpleNameExpression> {
registerProvider(KtSimpleNameExpression::class.java) {
KtSimpleNameReference(it)
}
registerMultiProvider<KtNameReferenceExpression> {
registerMultiProvider(KtNameReferenceExpression::class.java) {
if (it.getReferencedNameElementType() != KtTokens.IDENTIFIER) return@registerMultiProvider emptyArray()
when (it.readWriteAccess(useResolveForReadWrite = false)) {
@@ -43,33 +44,46 @@ class KotlinReferenceContributor() : AbstractKotlinReferenceContributor() {
}
}
registerProvider<KtConstructorDelegationReferenceExpression> {
registerProvider(KtConstructorDelegationReferenceExpression::class.java) {
KtConstructorDelegationReference(it)
}
registerProvider<KtCallExpression> {
registerProvider(KtCallExpression::class.java) {
KtInvokeFunctionReference(it)
}
registerProvider<KtArrayAccessExpression> {
registerProvider(KtArrayAccessExpression::class.java) {
KtArrayAccessReference(it)
}
registerProvider<KtForExpression> {
registerProvider(KtForExpression::class.java) {
KtForLoopInReference(it)
}
registerProvider<KtPropertyDelegate> {
registerProvider(KtPropertyDelegate::class.java) {
KtPropertyDelegationMethodsReference(it)
}
registerProvider<KtDestructuringDeclaration> {
registerProvider(KtDestructuringDeclaration::class.java) {
KtDestructuringDeclarationReference(it)
}
registerProvider<KDocName> {
registerProvider(KDocName::class.java) {
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)
}
})
}
}