From c1fc2d264db9eed03663f6cd00585282c1d49262 Mon Sep 17 00:00:00 2001 From: Daniil Ovchinnikov Date: Tue, 28 Nov 2017 20:49:17 +0300 Subject: [PATCH] [groovy] add GrReferenceElement.getQualifiedReferenceName --- .../groovy/lang/psi/GrReferenceElement.java | 19 +++-------- .../lang/psi/impl/GrReferenceElementImpl.java | 32 ++++++++++--------- .../groovy/lang/psi/impl/psiImplUtil.kt | 14 ++++++++ .../GrLightClassReferenceElement.java | 6 ++++ .../types/GrCodeReferenceElementImpl.java | 3 +- .../lang/psi/impl/utils/psiImportUtil.kt | 1 - .../plugins/groovy/lang/resolve/references.kt | 14 -------- .../completion/completeReferenceElement.kt | 1 - 8 files changed, 42 insertions(+), 48 deletions(-) diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/GrReferenceElement.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/GrReferenceElement.java index 28a74e11984c..f8a1a5c51820 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/GrReferenceElement.java +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/GrReferenceElement.java @@ -1,18 +1,4 @@ -/* - * Copyright 2000-2017 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. - */ +// Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package org.jetbrains.plugins.groovy.lang.psi; import com.intellij.psi.PsiElement; @@ -31,6 +17,9 @@ public interface GrReferenceElement extends GroovyPsiEleme @Nullable String getReferenceName(); + @Nullable + String getQualifiedReferenceName(); + @Nullable @Override default PsiElement resolve() { diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/GrReferenceElementImpl.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/GrReferenceElementImpl.java index d2e334de6575..5e8b0b190a23 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/GrReferenceElementImpl.java +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/GrReferenceElementImpl.java @@ -1,18 +1,4 @@ -/* - * Copyright 2000-2015 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ +// Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package org.jetbrains.plugins.groovy.lang.psi.impl; import com.intellij.lang.ASTNode; @@ -32,6 +18,10 @@ import org.jetbrains.plugins.groovy.lang.psi.api.types.GrTypeElement; * @author ven */ public abstract class GrReferenceElementImpl extends GroovyPsiElementImpl implements GrReferenceElement { + + private static final String DUMMY_FQN = "05ab655a-0e15-4f35-909d-9dff5e757f63"; + + private volatile String myQualifiedReferenceName = DUMMY_FQN; private volatile String myCachedQName; private volatile String myCachedTextSkipWhiteSpaceAndComments; @@ -46,6 +36,7 @@ public abstract class GrReferenceElementImpl extends Groov @Override public void subtreeChanged() { + myQualifiedReferenceName = DUMMY_FQN; myCachedQName = null; myCachedTextSkipWhiteSpaceAndComments = null; super.subtreeChanged(); @@ -60,6 +51,17 @@ public abstract class GrReferenceElementImpl extends Groov return null; } + @Nullable + @Override + public String getQualifiedReferenceName() { + String qualifiedReferenceName = myQualifiedReferenceName; + if (qualifiedReferenceName == DUMMY_FQN) { + qualifiedReferenceName = PsiImplUtilKt.getQualifiedReferenceName(this); + myQualifiedReferenceName = qualifiedReferenceName; + } + return qualifiedReferenceName; + } + @Override public PsiElement getElement() { return this; diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/psiImplUtil.kt b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/psiImplUtil.kt index 298ad0a58167..926e1d09f3a2 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/psiImplUtil.kt +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/psiImplUtil.kt @@ -9,6 +9,7 @@ import com.intellij.psi.util.CachedValue import com.intellij.psi.util.CachedValueProvider.Result import com.intellij.psi.util.CachedValuesManager import org.jetbrains.plugins.groovy.lang.parser.GroovyElementTypes +import org.jetbrains.plugins.groovy.lang.psi.GrReferenceElement import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrVariableDeclaration import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.GrTypeDefinition import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrMethod @@ -67,3 +68,16 @@ fun GrCodeReferenceElement.doGetKind(): CodeReferenceKind { else -> CodeReferenceKind.REFERENCE } } + +fun getQualifiedReferenceName(reference: GrReferenceElement<*>): String? { + val parts = mutableListOf() + var current = reference + while (true) { + val name = current.referenceName ?: return null + parts.add(name) + val qualifier = current.qualifier ?: break + qualifier as? GrReferenceElement<*> ?: return null + current = qualifier + } + return parts.reversed().joinToString(separator = ".") +} diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/synthetic/GrLightClassReferenceElement.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/synthetic/GrLightClassReferenceElement.java index cd8257d37423..096c744cd868 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/synthetic/GrLightClassReferenceElement.java +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/synthetic/GrLightClassReferenceElement.java @@ -44,6 +44,12 @@ public class GrLightClassReferenceElement extends LightElement implements GrCode return myClassName; } + @Nullable + @Override + public String getQualifiedReferenceName() { + return myClassName; + } + @NotNull @Override public GroovyResolveResult[] multiResolve(boolean incompleteCode) { diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/types/GrCodeReferenceElementImpl.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/types/GrCodeReferenceElementImpl.java index 241c3216a581..3c7be3e27e5c 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/types/GrCodeReferenceElementImpl.java +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/types/GrCodeReferenceElementImpl.java @@ -25,7 +25,6 @@ import org.jetbrains.plugins.groovy.lang.psi.impl.PsiImplUtil; import org.jetbrains.plugins.groovy.lang.resolve.GrCodeReferencePolyVariantResolver; import static org.jetbrains.plugins.groovy.lang.psi.impl.PsiImplUtilKt.doGetKind; -import static org.jetbrains.plugins.groovy.lang.resolve.ReferencesKt.getQualifiedReferenceName; /** * @author: Dmitry.Krasilschikov @@ -144,7 +143,7 @@ public class GrCodeReferenceElementImpl extends GrReferenceElementImpl.qualifiedReferenceName: String? - get() { - val parts = mutableListOf() - var current = this - while (true) { - val name = current.referenceName ?: return null - parts.add(name) - val qualifier = current.qualifier ?: break - qualifier as? GrReferenceElement<*> ?: return null - current = qualifier - } - return parts.reversed().joinToString(separator = ".") - } - fun GrReferenceElement<*>.resolveClassFqn(): PsiClass? { val fqn = qualifiedReferenceName ?: return null return JavaPsiFacade.getInstance(project).findClass(fqn, resolveScope) diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/completeReferenceElement.kt b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/completeReferenceElement.kt index d2b0050cf4a2..df3660a265b8 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/completeReferenceElement.kt +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/completeReferenceElement.kt @@ -32,7 +32,6 @@ import org.jetbrains.plugins.groovy.lang.resolve.processClasses import org.jetbrains.plugins.groovy.lang.resolve.processors.GrDelegatingScopeProcessorWithHints import org.jetbrains.plugins.groovy.lang.resolve.processors.GroovyResolveKind import org.jetbrains.plugins.groovy.lang.resolve.processors.StaticMembersFilteringProcessor -import org.jetbrains.plugins.groovy.lang.resolve.qualifiedReferenceName import org.jetbrains.plugins.groovy.lang.resolve.resolveClassFqn import org.jetbrains.plugins.groovy.util.consumeAll