diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/psiUtil/jetPsiUtil.kt b/compiler/frontend/src/org/jetbrains/jet/lang/psi/psiUtil/jetPsiUtil.kt index ee49c5e0244..60fe8c11e64 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/psiUtil/jetPsiUtil.kt +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/psiUtil/jetPsiUtil.kt @@ -23,6 +23,7 @@ import org.jetbrains.jet.lang.psi.JetDeclaration import org.jetbrains.jet.lang.psi.JetClass import java.util.ArrayList import org.jetbrains.jet.lang.psi.JetClassOrObject +import org.jetbrains.jet.lexer.JetTokens fun PsiElement.getParentByTypeAndPredicate( parentClass : Class, strict : Boolean = false, predicate: (T) -> Boolean @@ -66,4 +67,6 @@ fun JetClassOrObject.effectiveDeclarations(): List = getDeclarations() + getPrimaryConstructorParameters().filter { p -> p.getValOrVarNode() != null } else -> getDeclarations() - } \ No newline at end of file + } + +fun JetClass.isAbstract() = isTrait() || hasModifier(JetTokens.ABSTRACT_KEYWORD) diff --git a/idea/src/META-INF/plugin.xml b/idea/src/META-INF/plugin.xml index 9f8cc45d62a..aa8f8020d0e 100644 --- a/idea/src/META-INF/plugin.xml +++ b/idea/src/META-INF/plugin.xml @@ -350,6 +350,10 @@ + + org.jetbrains.jet.plugin.intentions.SpecifyTypeExplicitlyAction Kotlin diff --git a/idea/src/org/jetbrains/jet/plugin/search/JetTargetElementEvaluator.kt b/idea/src/org/jetbrains/jet/plugin/search/JetTargetElementEvaluator.kt new file mode 100644 index 00000000000..314de339b29 --- /dev/null +++ b/idea/src/org/jetbrains/jet/plugin/search/JetTargetElementEvaluator.kt @@ -0,0 +1,30 @@ +/* + * Copyright 2010-2013 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.search + +import com.intellij.codeInsight.TargetElementEvaluator +import com.intellij.psi.PsiElement +import org.jetbrains.jet.lang.psi.psiUtil.isAbstract +import com.intellij.psi.PsiReference +import org.jetbrains.jet.lang.psi.JetClass + +public class JetTargetElementEvaluator : TargetElementEvaluator { + override fun includeSelfInGotoImplementation(element: PsiElement): Boolean = + !(element is JetClass && element.isAbstract()) + + override fun getElementByReference(ref: PsiReference?, flags: Int): PsiElement? = null +} diff --git a/idea/testData/navigation/implementations/AbstractClassImplementorsWithDeclaration.kt b/idea/testData/navigation/implementations/AbstractClassImplementorsWithDeclaration.kt new file mode 100644 index 00000000000..3837db09f53 --- /dev/null +++ b/idea/testData/navigation/implementations/AbstractClassImplementorsWithDeclaration.kt @@ -0,0 +1,10 @@ +package testing + +abstract class Test + +open class TestOther : Test() + +class TestOtherMore : TestOther() + +// REF: (testing).TestOther +// REF: (testing).TestOtherMore diff --git a/idea/testData/navigation/implementations/ClassImplementatorsWithDeclaration.kt b/idea/testData/navigation/implementations/ClassImplementorsWithDeclaration.kt similarity index 100% rename from idea/testData/navigation/implementations/ClassImplementatorsWithDeclaration.kt rename to idea/testData/navigation/implementations/ClassImplementorsWithDeclaration.kt diff --git a/idea/testData/navigation/implementations/TraitImplementorsWithDeclaration.kt b/idea/testData/navigation/implementations/TraitImplementorsWithDeclaration.kt new file mode 100644 index 00000000000..cad7672e41a --- /dev/null +++ b/idea/testData/navigation/implementations/TraitImplementorsWithDeclaration.kt @@ -0,0 +1,16 @@ +package testing + +trait Test + +trait TestMore: Test + +open class TestClass1: Test + +class TestClass2: TestClass1() + +class TestClass3: TestMore + +// REF: (testing).TestMore +// REF: (testing).TestClass1 +// REF: (testing).TestClass2 +// REF: (testing).TestClass3 diff --git a/idea/testData/navigation/implementations/multifile/ImplementJavaAbstractClassInKotlin/ImplementJavaAbstractClassInKotlin.java b/idea/testData/navigation/implementations/multifile/ImplementJavaAbstractClassInKotlin/ImplementJavaAbstractClassInKotlin.java new file mode 100644 index 00000000000..15ffe5e6ab0 --- /dev/null +++ b/idea/testData/navigation/implementations/multifile/ImplementJavaAbstractClassInKotlin/ImplementJavaAbstractClassInKotlin.java @@ -0,0 +1,2 @@ +public abstract class JavaBase { +} \ No newline at end of file diff --git a/idea/testData/navigation/implementations/multifile/ImplementJavaAbstractClassInKotlin/ImplementJavaAbstractClassInKotlin.kt b/idea/testData/navigation/implementations/multifile/ImplementJavaAbstractClassInKotlin/ImplementJavaAbstractClassInKotlin.kt new file mode 100644 index 00000000000..21d907963bd --- /dev/null +++ b/idea/testData/navigation/implementations/multifile/ImplementJavaAbstractClassInKotlin/ImplementJavaAbstractClassInKotlin.kt @@ -0,0 +1,5 @@ +package testing.kt + +class KotlinImpl : JavaBase() + +// REF: (testing.kt).KotlinImpl \ No newline at end of file diff --git a/idea/testData/navigation/implementations/multifile/ImplementJavaInterfaceInKotlin/ImplementJavaInterfaceInKotlin.java b/idea/testData/navigation/implementations/multifile/ImplementJavaInterfaceInKotlin/ImplementJavaInterfaceInKotlin.java new file mode 100644 index 00000000000..8b1aa948138 --- /dev/null +++ b/idea/testData/navigation/implementations/multifile/ImplementJavaInterfaceInKotlin/ImplementJavaInterfaceInKotlin.java @@ -0,0 +1,2 @@ +public interface JavaBase { +} \ No newline at end of file diff --git a/idea/testData/navigation/implementations/multifile/ImplementJavaInterfaceInKotlin/ImplementJavaInterfaceInKotlin.kt b/idea/testData/navigation/implementations/multifile/ImplementJavaInterfaceInKotlin/ImplementJavaInterfaceInKotlin.kt new file mode 100644 index 00000000000..23ba8de3799 --- /dev/null +++ b/idea/testData/navigation/implementations/multifile/ImplementJavaInterfaceInKotlin/ImplementJavaInterfaceInKotlin.kt @@ -0,0 +1,8 @@ +package testing.kt + +trait KotlinTrait: JavaBase + +class KotlinClass : JavaBase + +// REF: (testing.kt).KotlinClass +// REF: (testing.kt).KotlinTrait \ No newline at end of file diff --git a/idea/testData/navigation/implementations/multifile/ImplementKotlinAbstractClassInJava/ImplementKotlinAbstractClassInJava.java b/idea/testData/navigation/implementations/multifile/ImplementKotlinAbstractClassInJava/ImplementKotlinAbstractClassInJava.java new file mode 100644 index 00000000000..71b33f39812 --- /dev/null +++ b/idea/testData/navigation/implementations/multifile/ImplementKotlinAbstractClassInJava/ImplementKotlinAbstractClassInJava.java @@ -0,0 +1,4 @@ +package testing.jj; + +class JavaImplementation extends testing.kt.Base { +} \ No newline at end of file diff --git a/idea/testData/navigation/implementations/multifile/ImplementKotlinAbstractClassInJava/ImplementKotlinAbstractClassInJava.kt b/idea/testData/navigation/implementations/multifile/ImplementKotlinAbstractClassInJava/ImplementKotlinAbstractClassInJava.kt new file mode 100644 index 00000000000..b5ce4dd5a02 --- /dev/null +++ b/idea/testData/navigation/implementations/multifile/ImplementKotlinAbstractClassInJava/ImplementKotlinAbstractClassInJava.kt @@ -0,0 +1,5 @@ +package testing.kt + +abstract class Base + +// REF: (testing.jj).JavaImplementation \ No newline at end of file diff --git a/idea/testData/navigation/implementations/multifile/ImplementKotlinTraitInJava/ImplementKotlinTraitInJava.java b/idea/testData/navigation/implementations/multifile/ImplementKotlinTraitInJava/ImplementKotlinTraitInJava.java new file mode 100644 index 00000000000..68955f10db9 --- /dev/null +++ b/idea/testData/navigation/implementations/multifile/ImplementKotlinTraitInJava/ImplementKotlinTraitInJava.java @@ -0,0 +1,7 @@ +package testing.jj; + +class JavaClass implements testing.kt.Base { +} + +interface JavaInterface extends testing.kt.Base { +} \ No newline at end of file diff --git a/idea/testData/navigation/implementations/multifile/ImplementKotlinTraitInJava/ImplementKotlinTraitInJava.kt b/idea/testData/navigation/implementations/multifile/ImplementKotlinTraitInJava/ImplementKotlinTraitInJava.kt new file mode 100644 index 00000000000..9bc94742d5e --- /dev/null +++ b/idea/testData/navigation/implementations/multifile/ImplementKotlinTraitInJava/ImplementKotlinTraitInJava.kt @@ -0,0 +1,9 @@ +package testing.kt + +trait Base + +trait Derived: Base + +// REF: (testing.jj).JavaClass +// REF: (testing.jj).JavaInterface +// REF: (testing.kt).Derived \ No newline at end of file diff --git a/idea/tests/org/jetbrains/jet/plugin/navigation/JetGotoImplementationMultifileTest.java b/idea/tests/org/jetbrains/jet/plugin/navigation/JetGotoImplementationMultifileTest.java index 22fc50b54cf..8c7a958b943 100644 --- a/idea/tests/org/jetbrains/jet/plugin/navigation/JetGotoImplementationMultifileTest.java +++ b/idea/tests/org/jetbrains/jet/plugin/navigation/JetGotoImplementationMultifileTest.java @@ -31,10 +31,26 @@ public class JetGotoImplementationMultifileTest extends CodeInsightTestCase { doKotlinJavaTest(); } + public void testImplementKotlinAbstractClassInJava() throws Exception { + doKotlinJavaTest(); + } + + public void testImplementKotlinTraitInJava() throws Exception { + doKotlinJavaTest(); + } + public void testImplementJavaClassInKotlin() throws Exception { doKotlinJavaTest(); } + public void testImplementJavaAbstractClassInKotlin() throws Exception { + doKotlinJavaTest(); + } + + public void testImplementJavaInterfaceInKotlin() throws Exception { + doKotlinJavaTest(); + } + public void testImplementMethodInKotlin() throws Exception { doKotlinJavaTest(); } diff --git a/idea/tests/org/jetbrains/jet/plugin/navigation/JetGotoImplementationTest.java b/idea/tests/org/jetbrains/jet/plugin/navigation/JetGotoImplementationTest.java index dd81a32003a..6d3090d2faa 100644 --- a/idea/tests/org/jetbrains/jet/plugin/navigation/JetGotoImplementationTest.java +++ b/idea/tests/org/jetbrains/jet/plugin/navigation/JetGotoImplementationTest.java @@ -29,7 +29,15 @@ public class JetGotoImplementationTest extends LightCodeInsightTestCase { doTest(); } - public void testClassImplementatorsWithDeclaration() { + public void testClassImplementorsWithDeclaration() { + doTest(); + } + + public void testAbstractClassImplementorsWithDeclaration() { + doTest(); + } + + public void testTraitImplementorsWithDeclaration() { doTest(); }