From 3f0118c88c9df28787a1f21c122ed328b0bb9458 Mon Sep 17 00:00:00 2001 From: Yan Zhulanow Date: Fri, 24 Oct 2014 14:58:26 +0400 Subject: [PATCH] KotlinIsReferenceToExtension extracted --- .../KotlinIsReferenceToExtension.kt | 31 +++++++++++++ .../idea/references/JetSimpleNameReference.kt | 44 ++++++++++--------- idea/src/META-INF/extensions/common.xml | 3 ++ 3 files changed, 58 insertions(+), 20 deletions(-) create mode 100644 idea/idea-analysis/src/org/jetbrains/jet/plugin/references/KotlinIsReferenceToExtension.kt diff --git a/idea/idea-analysis/src/org/jetbrains/jet/plugin/references/KotlinIsReferenceToExtension.kt b/idea/idea-analysis/src/org/jetbrains/jet/plugin/references/KotlinIsReferenceToExtension.kt new file mode 100644 index 00000000000..ec2da34fc6b --- /dev/null +++ b/idea/idea-analysis/src/org/jetbrains/jet/plugin/references/KotlinIsReferenceToExtension.kt @@ -0,0 +1,31 @@ +/* + * Copyright 2010-2014 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * 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.jet.plugin.findUsages.handlers + +import com.intellij.openapi.extensions.ExtensionPointName +import com.intellij.psi.PsiElement +import org.jetbrains.jet.plugin.references.JetSimpleNameReference +import org.jetbrains.jet.lang.psi.JetPsiFactory + +public trait KotlinIsReferenceToExtension { + class object { + public val EP_NAME: ExtensionPointName = ExtensionPointName.create("org.jetbrains.kotlin.isReferenceToExtension")!! + } + + fun isReferenceTo(reference: JetSimpleNameReference, element: PsiElement): Boolean? + fun handleElementRename(reference: JetSimpleNameReference, psiFactory: JetPsiFactory, newElementName: String): PsiElement? +} \ No newline at end of file diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/JetSimpleNameReference.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/JetSimpleNameReference.kt index a50124c04ed..61bf3e221ed 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/JetSimpleNameReference.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/JetSimpleNameReference.kt @@ -36,28 +36,27 @@ import org.jetbrains.kotlin.resolve.dataClassUtils.isComponentLike import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.psi.psiUtil.* import com.intellij.psi.impl.light.LightElement +import com.intellij.openapi.extensions.Extensions +import org.jetbrains.jet.plugin.findUsages.handlers.KotlinIsReferenceToExtension public class JetSimpleNameReference( jetSimpleNameExpression: JetSimpleNameExpression ) : JetSimpleReference(jetSimpleNameExpression) { override fun isReferenceTo(element: PsiElement?): Boolean { - val resolvedElement = resolve() - if (resolvedElement == null || element == null) { - return false - } - if (isAndroidSyntheticElement(resolvedElement)) { - if (element is ValueResourceElementWrapper) { - val resource = element.getValue()!! - return (resolvedElement as JetProperty).getName() == resource.substring(resource.indexOf('/')+1) - } + if (element != null) { + val extensions = Extensions.getArea(element.getProject()).getExtensionPoint( + KotlinIsReferenceToExtension.EP_NAME).getExtensions() + for (extension in extensions) { + val value = extension.isReferenceTo(this, element) + if (value != null) { + return value + } + } + } - } - else if (resolvedElement is LightElement && element is JetProperty) { - return resolvedElement.getName() == element.getName() - } - return super.isReferenceTo(element) - } + return super.isReferenceTo(element) + } override fun getRangeInElement(): TextRange = TextRange(0, getElement().getTextLength()) @@ -87,12 +86,17 @@ public class JetSimpleNameReference( JetTokens.FIELD_IDENTIFIER -> psiFactory.createFieldIdentifier(newElementName) JetTokens.LABEL_IDENTIFIER -> psiFactory.createClassLabel(newElementName) else -> { - if (newElementName.startsWith("@+id/")) { - psiFactory.createNameIdentifier(newElementName.substring(newElementName.indexOf('/')+1)) - } - else { - psiFactory.createNameIdentifier(newElementName) + val extensions = Extensions.getArea(expression.getProject()).getExtensionPoint( + KotlinIsReferenceToExtension.EP_NAME).getExtensions() + + var handled: PsiElement? = null + for (extension in extensions) { + handled = extension.handleElementRename(this, psiFactory, newElementName) + if (handled != null) { + break + } } + handled ?: psiFactory.createNameIdentifier(newElementName) } } diff --git a/idea/src/META-INF/extensions/common.xml b/idea/src/META-INF/extensions/common.xml index 1a893f802ce..8d95e053068 100644 --- a/idea/src/META-INF/extensions/common.xml +++ b/idea/src/META-INF/extensions/common.xml @@ -17,5 +17,8 @@ +