From 17686e5f69d25e0f7154baed15ac836d02166b69 Mon Sep 17 00:00:00 2001 From: Sergey Evdokimov Date: Fri, 11 Mar 2011 19:37:07 +0300 Subject: [PATCH] Fix: IDEA-66498 ('Go to type declaration' on an injected service/bean name should go to its class) --- plugins/groovy/src/META-INF/plugin.xml | 2 + .../impl/GroovyTypeDeclarationProvider.java | 45 ++++++++++++ .../GroovyGoToTypeDeclarationTest.groovy | 70 +++++++++++++++++++ 3 files changed, 117 insertions(+) create mode 100644 plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/GroovyTypeDeclarationProvider.java create mode 100644 plugins/groovy/test/org/jetbrains/plugins/groovy/GroovyGoToTypeDeclarationTest.groovy diff --git a/plugins/groovy/src/META-INF/plugin.xml b/plugins/groovy/src/META-INF/plugin.xml index d90bdad173ef..0f193d548b92 100644 --- a/plugins/groovy/src/META-INF/plugin.xml +++ b/plugins/groovy/src/META-INF/plugin.xml @@ -231,6 +231,8 @@ + + diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/GroovyTypeDeclarationProvider.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/GroovyTypeDeclarationProvider.java new file mode 100644 index 000000000000..52bb0311475b --- /dev/null +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/GroovyTypeDeclarationProvider.java @@ -0,0 +1,45 @@ +/* + * Copyright 2000-2011 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.plugins.groovy.lang.psi.impl; + +import com.intellij.codeInsight.navigation.actions.TypeDeclarationProvider; +import com.intellij.psi.*; +import com.intellij.psi.util.PsiUtil; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrVariable; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrMethod; + +/** + * @author Sergey Evdokimov + */ +public class GroovyTypeDeclarationProvider implements TypeDeclarationProvider { + @Nullable + public PsiElement[] getSymbolTypeDeclarations(final PsiElement targetElement) { + PsiType type; + if (targetElement instanceof GrVariable){ + type = ((GrVariable)targetElement).getTypeGroovy(); + } + else if (targetElement instanceof GrMethod){ + type = ((GrMethod)targetElement).getInferredReturnType(); + } + else { + return null; + } + if (type == null) return null; + PsiClass psiClass = PsiUtil.resolveClassInType(type); + return psiClass == null ? null : new PsiElement[] {psiClass}; + } +} diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/GroovyGoToTypeDeclarationTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/GroovyGoToTypeDeclarationTest.groovy new file mode 100644 index 000000000000..bf346fb8c1ee --- /dev/null +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/GroovyGoToTypeDeclarationTest.groovy @@ -0,0 +1,70 @@ +/* + * Copyright 2000-2011 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.plugins.groovy + +import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase +import com.intellij.codeInsight.navigation.actions.GotoTypeDeclarationAction +import com.intellij.psi.PsiClass + +/** + * @author Sergey Evdokimov + */ +class GroovyGoToTypeDeclarationTest extends LightCodeInsightFixtureTestCase { + + public void testGoToTypeDeclarationMethod() { + myFixture.configureByText("g.groovy", """ +class A { + + public def method() { + return new B(); + } + + { + method() + } +} + +class B { + +} +""") + + def res = GotoTypeDeclarationAction.findSymbolType(myFixture.editor, myFixture.caretOffset) + assertInstanceOf(res, PsiClass.class) + assertEquals("B", ((PsiClass)res).getName()) + } + + public void testGoToTypeDeclarationVariable() { + myFixture.configureByText("g.groovy", """ +class A { + + { + def a = new B() + println(a) + } +} + +class B { + +} +""") + + def res = GotoTypeDeclarationAction.findSymbolType(myFixture.editor, myFixture.caretOffset) + assertInstanceOf(res, PsiClass.class) + assertEquals("B", ((PsiClass)res).getName()) + } + +}