diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetDeclarationStub.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetDeclarationStub.java index 65be1f9ea6e..298357fee3e 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetDeclarationStub.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetDeclarationStub.java @@ -17,6 +17,7 @@ package org.jetbrains.jet.lang.psi; import com.intellij.lang.ASTNode; +import com.intellij.openapi.components.ServiceManager; import com.intellij.psi.PsiElement; import com.intellij.psi.stubs.IStubElementType; import com.intellij.psi.stubs.StubElement; @@ -50,4 +51,17 @@ abstract class JetDeclarationStub extends JetModifierList } return super.getParent(); } + + @NotNull + @Override + public PsiElement getNavigationElement() { + KotlinDeclarationNavigationPolicy navigationPolicy = ServiceManager.getService(KotlinDeclarationNavigationPolicy.class); + if (navigationPolicy != null) { + JetElement navigationElement = navigationPolicy.getNavigationElement(this); + if (navigationElement != null) { + return navigationElement; + } + } + return this; + } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/KotlinDeclarationNavigationPolicy.kt b/compiler/frontend/src/org/jetbrains/jet/lang/psi/KotlinDeclarationNavigationPolicy.kt new file mode 100644 index 00000000000..fc8e0809138 --- /dev/null +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/KotlinDeclarationNavigationPolicy.kt @@ -0,0 +1,21 @@ +/* + * 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.lang.psi + +public trait KotlinDeclarationNavigationPolicy { + public fun getNavigationElement(declaration: JetDeclaration): JetElement? +} \ No newline at end of file diff --git a/idea/idea-analysis/src/org/jetbrains/jet/plugin/codeInsight/DescriptorToDeclarationUtil.kt b/idea/idea-analysis/src/org/jetbrains/jet/plugin/codeInsight/DescriptorToDeclarationUtil.kt index 5460cb6bc61..593c45295bb 100644 --- a/idea/idea-analysis/src/org/jetbrains/jet/plugin/codeInsight/DescriptorToDeclarationUtil.kt +++ b/idea/idea-analysis/src/org/jetbrains/jet/plugin/codeInsight/DescriptorToDeclarationUtil.kt @@ -67,7 +67,7 @@ public object DescriptorToDeclarationUtil { return elements } - val decompiledDeclaration = DecompiledNavigationUtils.findDeclarationForReference(project, descriptor) + val decompiledDeclaration = DecompiledNavigationUtils.getDeclarationFromDecompiledClassFile(project, descriptor) if (decompiledDeclaration != null) { return setOf(decompiledDeclaration) } diff --git a/idea/idea-analysis/src/org/jetbrains/jet/plugin/decompiler/navigation/DecompiledNavigationUtils.java b/idea/idea-analysis/src/org/jetbrains/jet/plugin/decompiler/navigation/DecompiledNavigationUtils.java index 405951a201c..4a8d908c76d 100644 --- a/idea/idea-analysis/src/org/jetbrains/jet/plugin/decompiler/navigation/DecompiledNavigationUtils.java +++ b/idea/idea-analysis/src/org/jetbrains/jet/plugin/decompiler/navigation/DecompiledNavigationUtils.java @@ -16,7 +16,6 @@ package org.jetbrains.jet.plugin.decompiler.navigation; -import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiFile; @@ -38,22 +37,8 @@ import static org.jetbrains.jet.lang.resolve.DescriptorUtils.getFqName; public final class DecompiledNavigationUtils { - private static final Logger LOG = Logger.getInstance(DecompiledNavigationUtils.class); - @Nullable - public static JetDeclaration findDeclarationForReference( - @NotNull Project project, - @NotNull DeclarationDescriptor referencedDescriptor - ) { - JetDeclaration declarationFromDecompiledClassFile = getDeclarationFromDecompiledClassFile(project, referencedDescriptor); - if (declarationFromDecompiledClassFile == null) { - return null; - } - return JetSourceNavigationHelper.replaceBySourceDeclarationIfPresent(declarationFromDecompiledClassFile); - } - - @Nullable - private static JetDeclaration getDeclarationFromDecompiledClassFile( + public static JetDeclaration getDeclarationFromDecompiledClassFile( @NotNull Project project, @NotNull DeclarationDescriptor referencedDescriptor ) { diff --git a/idea/idea-analysis/src/org/jetbrains/jet/plugin/decompiler/navigation/JetSourceNavigationHelper.java b/idea/idea-analysis/src/org/jetbrains/jet/plugin/decompiler/navigation/JetSourceNavigationHelper.java index bb10c301ba5..c62dd8b6a2f 100644 --- a/idea/idea-analysis/src/org/jetbrains/jet/plugin/decompiler/navigation/JetSourceNavigationHelper.java +++ b/idea/idea-analysis/src/org/jetbrains/jet/plugin/decompiler/navigation/JetSourceNavigationHelper.java @@ -204,6 +204,10 @@ public class JetSourceNavigationHelper { + decompiledContainer.getClass().getSimpleName()); } + if (candidates.isEmpty()) { + return null; + } + if (!forceResolve) { candidates = filterByReceiverPresenceAndParametersCount(decompiledDeclaration, candidates); diff --git a/idea/idea-analysis/src/org/jetbrains/jet/plugin/decompiler/navigation/KotlinDeclarationNavigationPolicyImpl.kt b/idea/idea-analysis/src/org/jetbrains/jet/plugin/decompiler/navigation/KotlinDeclarationNavigationPolicyImpl.kt new file mode 100644 index 00000000000..198ed6da579 --- /dev/null +++ b/idea/idea-analysis/src/org/jetbrains/jet/plugin/decompiler/navigation/KotlinDeclarationNavigationPolicyImpl.kt @@ -0,0 +1,34 @@ +/* + * 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.decompiler.navigation + +import org.jetbrains.jet.lang.psi.KotlinDeclarationNavigationPolicy +import org.jetbrains.jet.lang.psi.JetElement +import org.jetbrains.jet.lang.psi.JetDeclaration +import com.intellij.openapi.project.DumbService + +public class KotlinDeclarationNavigationPolicyImpl : KotlinDeclarationNavigationPolicy { + override fun getNavigationElement(declaration: JetDeclaration): JetElement? { + if (DumbService.isDumb(declaration.getProject())) { + return null + } + if (declaration.getContainingJetFile().isCompiled()) { + return JetSourceNavigationHelper.replaceBySourceDeclarationIfPresent(declaration) + } + return null + } +} \ No newline at end of file diff --git a/idea/src/META-INF/plugin.xml b/idea/src/META-INF/plugin.xml index a444dc035f9..91c8ed2a1e9 100644 --- a/idea/src/META-INF/plugin.xml +++ b/idea/src/META-INF/plugin.xml @@ -147,9 +147,13 @@ + + + diff --git a/idea/src/org/jetbrains/jet/plugin/caches/JetGotoClassContributor.java b/idea/src/org/jetbrains/jet/plugin/caches/JetGotoClassContributor.java index 4b17330d754..dd48d409b76 100644 --- a/idea/src/org/jetbrains/jet/plugin/caches/JetGotoClassContributor.java +++ b/idea/src/org/jetbrains/jet/plugin/caches/JetGotoClassContributor.java @@ -27,6 +27,7 @@ import org.jetbrains.jet.lang.psi.JetEnumEntry; import org.jetbrains.jet.lang.psi.JetNamedDeclaration; import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.plugin.stubindex.JetClassShortNameIndex; +import org.jetbrains.jet.plugin.stubindex.JetSourceFilterScope; import java.util.ArrayList; import java.util.Collection; @@ -61,7 +62,8 @@ public class JetGotoClassContributor implements GotoClassContributor { @Override public NavigationItem[] getItemsByName(String name, String pattern, Project project, boolean includeNonProjectItems) { GlobalSearchScope scope = includeNonProjectItems ? GlobalSearchScope.allScope(project) : GlobalSearchScope.projectScope(project); - Collection classesOrObjects = JetClassShortNameIndex.getInstance().get(name, project, scope); + Collection classesOrObjects = + JetClassShortNameIndex.getInstance().get(name, project, JetSourceFilterScope.kotlinSourceAndClassFiles(scope, project)); if (classesOrObjects.isEmpty()) { return NavigationItem.EMPTY_NAVIGATION_ITEM_ARRAY; diff --git a/idea/src/org/jetbrains/jet/plugin/caches/JetGotoSymbolContributor.java b/idea/src/org/jetbrains/jet/plugin/caches/JetGotoSymbolContributor.java index 46a267d7bbf..0b1cdf1542d 100644 --- a/idea/src/org/jetbrains/jet/plugin/caches/JetGotoSymbolContributor.java +++ b/idea/src/org/jetbrains/jet/plugin/caches/JetGotoSymbolContributor.java @@ -27,6 +27,7 @@ import com.intellij.util.ArrayUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.plugin.stubindex.JetFunctionShortNameIndex; import org.jetbrains.jet.plugin.stubindex.JetPropertyShortNameIndex; +import org.jetbrains.jet.plugin.stubindex.JetSourceFilterScope; import java.util.ArrayList; import java.util.Collection; @@ -45,10 +46,11 @@ public class JetGotoSymbolContributor implements ChooseByNameContributor { @NotNull @Override public NavigationItem[] getItemsByName(String name, String pattern, Project project, boolean includeNonProjectItems) { - GlobalSearchScope scope = includeNonProjectItems ? GlobalSearchScope.allScope(project) : GlobalSearchScope.projectScope(project); + GlobalSearchScope baseScope = includeNonProjectItems ? GlobalSearchScope.allScope(project) : GlobalSearchScope.projectScope(project); + GlobalSearchScope noLibrarySourceScope = JetSourceFilterScope.kotlinSourceAndClassFiles(baseScope, project); - Collection functions = JetFunctionShortNameIndex.getInstance().get(name, project, scope); - Collection properties = JetPropertyShortNameIndex.getInstance().get(name, project, scope); + Collection functions = JetFunctionShortNameIndex.getInstance().get(name, project, noLibrarySourceScope); + Collection properties = JetPropertyShortNameIndex.getInstance().get(name, project, noLibrarySourceScope); List items = new ArrayList(Collections2.filter(functions, Predicates.notNull())); items.addAll(properties); diff --git a/idea/testData/navigation/gotoSymbol/stdLibArrayListOf.kt b/idea/testData/navigation/gotoSymbol/stdLibArrayListOf.kt index f27a67873aa..3a0ed62dbf6 100644 --- a/idea/testData/navigation/gotoSymbol/stdLibArrayListOf.kt +++ b/idea/testData/navigation/gotoSymbol/stdLibArrayListOf.kt @@ -2,4 +2,3 @@ // CHECK_BOX // SEARCH_TEXT: arrayListOf // REF: (in kotlin).arrayListOf(T) -// REF: (in kotlin.KotlinPackage).arrayListOf(T...) diff --git a/idea/testData/navigation/gotoSymbol/stdLibArrayListOfNoSources.kt b/idea/testData/navigation/gotoSymbol/stdLibArrayListOfNoSources.kt index 61e8e56e8bc..e21649c2c01 100644 --- a/idea/testData/navigation/gotoSymbol/stdLibArrayListOfNoSources.kt +++ b/idea/testData/navigation/gotoSymbol/stdLibArrayListOfNoSources.kt @@ -1,4 +1,4 @@ // RUNTIME // CHECK_BOX // SEARCH_TEXT: arrayListOf -// REF: (in kotlin.KotlinPackage).arrayListOf(T...) +// REF: (in kotlin).arrayListOf(T) diff --git a/idea/testData/navigation/gotoSymbol/stdLibJoinToString.kt b/idea/testData/navigation/gotoSymbol/stdLibJoinToString.kt index 478fdcfa3af..45b125aeefb 100644 --- a/idea/testData/navigation/gotoSymbol/stdLibJoinToString.kt +++ b/idea/testData/navigation/gotoSymbol/stdLibJoinToString.kt @@ -11,26 +11,4 @@ // REF: (for Iterable in kotlin).joinToString(String,String,String,Int,String) // REF: (for LongArray in kotlin).joinToString(String,String,String,Int,String) // REF: (for ShortArray in kotlin).joinToString(String,String,String,Int,String) -// REF: (for Stream in kotlin).joinToString(String,String,String,Int,String) -// REF: (in kotlin.KotlinPackage).joinToString$default(Iterable, String, String, String, int, String, int) -// REF: (in kotlin.KotlinPackage).joinToString$default(Object[], String, String, String, int, String, int) -// REF: (in kotlin.KotlinPackage).joinToString$default(Stream, String, String, String, int, String, int) -// REF: (in kotlin.KotlinPackage).joinToString$default(boolean[], String, String, String, int, String, int) -// REF: (in kotlin.KotlinPackage).joinToString$default(byte[], String, String, String, int, String, int) -// REF: (in kotlin.KotlinPackage).joinToString$default(char[], String, String, String, int, String, int) -// REF: (in kotlin.KotlinPackage).joinToString$default(double[], String, String, String, int, String, int) -// REF: (in kotlin.KotlinPackage).joinToString$default(float[], String, String, String, int, String, int) -// REF: (in kotlin.KotlinPackage).joinToString$default(int[], String, String, String, int, String, int) -// REF: (in kotlin.KotlinPackage).joinToString$default(long[], String, String, String, int, String, int) -// REF: (in kotlin.KotlinPackage).joinToString$default(short[], String, String, String, int, String, int) -// REF: (in kotlin.KotlinPackage).joinToString(Iterable, String, String, String, int, String) -// REF: (in kotlin.KotlinPackage).joinToString(Stream, String, String, String, int, String) -// REF: (in kotlin.KotlinPackage).joinToString(T[], String, String, String, int, String) -// REF: (in kotlin.KotlinPackage).joinToString(boolean[], String, String, String, int, String) -// REF: (in kotlin.KotlinPackage).joinToString(byte[], String, String, String, int, String) -// REF: (in kotlin.KotlinPackage).joinToString(char[], String, String, String, int, String) -// REF: (in kotlin.KotlinPackage).joinToString(double[], String, String, String, int, String) -// REF: (in kotlin.KotlinPackage).joinToString(float[], String, String, String, int, String) -// REF: (in kotlin.KotlinPackage).joinToString(int[], String, String, String, int, String) -// REF: (in kotlin.KotlinPackage).joinToString(long[], String, String, String, int, String) -// REF: (in kotlin.KotlinPackage).joinToString(short[], String, String, String, int, String) +// REF: (for Stream in kotlin).joinToString(String,String,String,Int,String) \ No newline at end of file