From 52ffd52a4efd5d5e17c408f7624f1eed9a126be3 Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Wed, 6 Nov 2013 17:19:59 +0400 Subject: [PATCH] Implement "Find Usages" for value/type parameters --- .../KotlinFindUsagesHandlerFactory.kt | 25 ++++-- .../KotlinFindPropertyUsagesDialog.java | 11 ++- .../KotlinTypeParameterFindUsagesDialog.java | 44 ++++++++++ .../jet/plugin/findUsages/dialogs/Utils.java | 10 +++ ...ava => KotlinFindMemberUsagesHandler.java} | 45 +++++------ .../handlers/KotlinFindUsagesHandler.java | 6 -- .../KotlinTypeParameterFindUsagesHandler.java | 79 ++++++++++++++++++ .../refactoring/JetRefactoringUtil.java | 24 +++--- .../jet/plugin/search/usagesSearch/utils.kt | 46 +++++++---- .../kotlinConstructorParameterUsages.0.kt | 9 +++ ...tlinConstructorParameterUsages.results.txt | 2 + .../kotlinFunctionParameterUsages.0.kt | 6 ++ .../kotlinFunctionParameterUsages.results.txt | 2 + .../javaAndKotlinOverrides2.0.kt | 26 ++++++ .../javaAndKotlinOverrides2.1.java | 15 ++++ .../javaAndKotlinOverrides2.results.txt | 8 ++ .../javaPropertyReadUsages2.0.kt | 16 ++++ .../javaPropertyReadUsages2.1.java | 15 ++++ .../javaPropertyReadUsages2.results.txt | 2 + .../javaPropertyUsages2.0.kt | 16 ++++ .../javaPropertyUsages2.1.java | 15 ++++ .../javaPropertyUsages2.results.txt | 4 + .../javaPropertyWriteUsages2.0.kt | 16 ++++ .../javaPropertyWriteUsages2.1.java | 15 ++++ .../javaPropertyWriteUsages2.results.txt | 2 + .../kotlinPrivatePropertyUsages2.0.kt | 12 +++ .../kotlinPrivatePropertyUsages2.1.kt | 8 ++ .../kotlinPrivatePropertyUsages2.results.txt | 3 + .../kotlinPropertyReadUsages2.0.kt | 17 ++++ .../kotlinPropertyReadUsages2.1.kt | 13 +++ .../kotlinPropertyReadUsages2.results.txt | 3 + .../kotlinPropertyUsages2.0.kt | 17 ++++ .../kotlinPropertyUsages2.1.kt | 13 +++ .../kotlinPropertyUsages2.results.txt | 6 ++ .../kotlinPropertyWriteUsages2.0.kt | 17 ++++ .../kotlinPropertyWriteUsages2.1.kt | 13 +++ .../kotlinPropertyWriteUsages2.results.txt | 3 + .../kotlinClassTypeParameterUsages.0.kt | 12 +++ ...kotlinClassTypeParameterUsages.results.txt | 6 ++ .../kotlinFunctionTypeParameterUsages.0.kt | 5 ++ ...linFunctionTypeParameterUsages.results.txt | 4 + .../findUsages/AbstractJetFindUsagesTest.java | 16 +++- .../JetFindUsagesTestGenerated.java | 80 ++++++++++++++++++- 43 files changed, 638 insertions(+), 69 deletions(-) create mode 100644 idea/src/org/jetbrains/jet/plugin/findUsages/dialogs/KotlinTypeParameterFindUsagesDialog.java rename idea/src/org/jetbrains/jet/plugin/findUsages/handlers/{KotlinFindCallableUsagesHandler.java => KotlinFindMemberUsagesHandler.java} (81%) create mode 100644 idea/src/org/jetbrains/jet/plugin/findUsages/handlers/KotlinTypeParameterFindUsagesHandler.java create mode 100644 idea/testData/findUsages/kotlin/findParameterUsages/kotlinConstructorParameterUsages.0.kt create mode 100644 idea/testData/findUsages/kotlin/findParameterUsages/kotlinConstructorParameterUsages.results.txt create mode 100644 idea/testData/findUsages/kotlin/findParameterUsages/kotlinFunctionParameterUsages.0.kt create mode 100644 idea/testData/findUsages/kotlin/findParameterUsages/kotlinFunctionParameterUsages.results.txt create mode 100644 idea/testData/findUsages/kotlin/findPropertyUsages/javaAndKotlinOverrides2.0.kt create mode 100644 idea/testData/findUsages/kotlin/findPropertyUsages/javaAndKotlinOverrides2.1.java create mode 100644 idea/testData/findUsages/kotlin/findPropertyUsages/javaAndKotlinOverrides2.results.txt create mode 100644 idea/testData/findUsages/kotlin/findPropertyUsages/javaPropertyReadUsages2.0.kt create mode 100644 idea/testData/findUsages/kotlin/findPropertyUsages/javaPropertyReadUsages2.1.java create mode 100644 idea/testData/findUsages/kotlin/findPropertyUsages/javaPropertyReadUsages2.results.txt create mode 100644 idea/testData/findUsages/kotlin/findPropertyUsages/javaPropertyUsages2.0.kt create mode 100644 idea/testData/findUsages/kotlin/findPropertyUsages/javaPropertyUsages2.1.java create mode 100644 idea/testData/findUsages/kotlin/findPropertyUsages/javaPropertyUsages2.results.txt create mode 100644 idea/testData/findUsages/kotlin/findPropertyUsages/javaPropertyWriteUsages2.0.kt create mode 100644 idea/testData/findUsages/kotlin/findPropertyUsages/javaPropertyWriteUsages2.1.java create mode 100644 idea/testData/findUsages/kotlin/findPropertyUsages/javaPropertyWriteUsages2.results.txt create mode 100644 idea/testData/findUsages/kotlin/findPropertyUsages/kotlinPrivatePropertyUsages2.0.kt create mode 100644 idea/testData/findUsages/kotlin/findPropertyUsages/kotlinPrivatePropertyUsages2.1.kt create mode 100644 idea/testData/findUsages/kotlin/findPropertyUsages/kotlinPrivatePropertyUsages2.results.txt create mode 100644 idea/testData/findUsages/kotlin/findPropertyUsages/kotlinPropertyReadUsages2.0.kt create mode 100644 idea/testData/findUsages/kotlin/findPropertyUsages/kotlinPropertyReadUsages2.1.kt create mode 100644 idea/testData/findUsages/kotlin/findPropertyUsages/kotlinPropertyReadUsages2.results.txt create mode 100644 idea/testData/findUsages/kotlin/findPropertyUsages/kotlinPropertyUsages2.0.kt create mode 100644 idea/testData/findUsages/kotlin/findPropertyUsages/kotlinPropertyUsages2.1.kt create mode 100644 idea/testData/findUsages/kotlin/findPropertyUsages/kotlinPropertyUsages2.results.txt create mode 100644 idea/testData/findUsages/kotlin/findPropertyUsages/kotlinPropertyWriteUsages2.0.kt create mode 100644 idea/testData/findUsages/kotlin/findPropertyUsages/kotlinPropertyWriteUsages2.1.kt create mode 100644 idea/testData/findUsages/kotlin/findPropertyUsages/kotlinPropertyWriteUsages2.results.txt create mode 100644 idea/testData/findUsages/kotlin/findTypeParameterUsages/kotlinClassTypeParameterUsages.0.kt create mode 100644 idea/testData/findUsages/kotlin/findTypeParameterUsages/kotlinClassTypeParameterUsages.results.txt create mode 100644 idea/testData/findUsages/kotlin/findTypeParameterUsages/kotlinFunctionTypeParameterUsages.0.kt create mode 100644 idea/testData/findUsages/kotlin/findTypeParameterUsages/kotlinFunctionTypeParameterUsages.results.txt diff --git a/idea/src/org/jetbrains/jet/plugin/findUsages/KotlinFindUsagesHandlerFactory.kt b/idea/src/org/jetbrains/jet/plugin/findUsages/KotlinFindUsagesHandlerFactory.kt index bad9c283ce7..1e01668a495 100644 --- a/idea/src/org/jetbrains/jet/plugin/findUsages/KotlinFindUsagesHandlerFactory.kt +++ b/idea/src/org/jetbrains/jet/plugin/findUsages/KotlinFindUsagesHandlerFactory.kt @@ -24,39 +24,48 @@ import org.jetbrains.jet.lang.psi.JetClass import org.jetbrains.jet.lang.psi.JetDeclaration import org.jetbrains.jet.lang.psi.JetNamedFunction import org.jetbrains.jet.plugin.findUsages.handlers.KotlinFindClassUsagesHandler -import org.jetbrains.jet.plugin.findUsages.handlers.KotlinFindCallableUsagesHandler +import org.jetbrains.jet.plugin.findUsages.handlers.KotlinFindMemberUsagesHandler import org.jetbrains.jet.plugin.refactoring.JetRefactoringUtil import org.jetbrains.jet.lang.psi.JetProperty -import org.jetbrains.jet.lang.psi.JetCallableDeclaration +import org.jetbrains.jet.lang.psi.JetNamedDeclaration +import com.intellij.find.findUsages.FindUsagesOptions +import org.jetbrains.jet.lang.psi.JetTypeParameter +import org.jetbrains.jet.plugin.findUsages.handlers.KotlinTypeParameterFindUsagesHandler +import org.jetbrains.jet.lang.psi.JetParameter +import org.jetbrains.jet.lang.psi.JetNamedDeclaration public class KotlinFindUsagesHandlerFactory(project: Project) : FindUsagesHandlerFactory() { val findFunctionOptions = KotlinFunctionFindUsagesOptions(project) val findPropertyOptions = KotlinPropertyFindUsagesOptions(project) val findClassOptions = KotlinClassFindUsagesOptions(project) + val defaultOptions = FindUsagesOptions(project) public override fun canFindUsages(element: PsiElement): Boolean = - element is JetClass || element is JetNamedFunction || element is JetProperty + element is JetClass || element is JetNamedFunction || element is JetProperty || element is JetParameter || element is JetTypeParameter public override fun createFindUsagesHandler(element: PsiElement, forHighlightUsages: Boolean): FindUsagesHandler { when(element) { is JetClass -> return KotlinFindClassUsagesHandler(element, this) - is JetNamedFunction, is JetProperty -> { - val declaration = element as JetCallableDeclaration + is JetNamedFunction, is JetProperty, is JetParameter -> { + val declaration = element as JetNamedDeclaration - return if (forHighlightUsages) KotlinFindCallableUsagesHandler.getInstance(declaration, this) + return if (forHighlightUsages) KotlinFindMemberUsagesHandler.getInstance(declaration, this) else JetRefactoringUtil.checkSuperMethods(declaration, null, "super.methods.action.key.find.usages")?.let { callables -> when (callables.size()) { 0 -> null 1 -> - KotlinFindCallableUsagesHandler.getInstance(callables.get(0) as JetCallableDeclaration, this) + KotlinFindMemberUsagesHandler.getInstance(callables.get(0) as JetNamedDeclaration, this) else -> - KotlinFindCallableUsagesHandler.getInstance(declaration, callables, this) + KotlinFindMemberUsagesHandler.getInstance(declaration, callables, this) } } ?: FindUsagesHandler.NULL_HANDLER } + is JetTypeParameter -> + return KotlinTypeParameterFindUsagesHandler(element, this) + else -> throw IllegalArgumentException("unexpected element type: " + element) } diff --git a/idea/src/org/jetbrains/jet/plugin/findUsages/dialogs/KotlinFindPropertyUsagesDialog.java b/idea/src/org/jetbrains/jet/plugin/findUsages/dialogs/KotlinFindPropertyUsagesDialog.java index e20a51df872..fea25a6f20c 100644 --- a/idea/src/org/jetbrains/jet/plugin/findUsages/dialogs/KotlinFindPropertyUsagesDialog.java +++ b/idea/src/org/jetbrains/jet/plugin/findUsages/dialogs/KotlinFindPropertyUsagesDialog.java @@ -23,8 +23,10 @@ import com.intellij.find.findUsages.JavaFindUsagesDialog; import com.intellij.openapi.project.Project; import com.intellij.psi.PsiElement; import com.intellij.ui.IdeBorderFactory; +import com.intellij.ui.SimpleColoredComponent; import com.intellij.ui.StateRestoringCheckBox; -import org.jetbrains.jet.lang.psi.JetProperty; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.lang.psi.JetNamedDeclaration; import org.jetbrains.jet.lexer.JetTokens; import org.jetbrains.jet.plugin.JetBundle; import org.jetbrains.jet.plugin.findUsages.KotlinPropertyFindUsagesOptions; @@ -91,11 +93,16 @@ public class KotlinFindPropertyUsagesDialog extends JavaFindUsagesDialog extends CommonFindUsagesDialog { + public KotlinTypeParameterFindUsagesDialog( + T element, + Project project, + FindUsagesOptions findUsagesOptions, + boolean toShowInNewTab, + boolean mustOpenInNewTab, + boolean isSingleFile, + FindUsagesHandler handler + ) { + super(element, project, findUsagesOptions, toShowInNewTab, mustOpenInNewTab, isSingleFile, handler); + } + + @Override + public void configureLabelComponent(@NotNull SimpleColoredComponent coloredComponent) { + Utils.configureLabelComponent(coloredComponent, (JetNamedDeclaration) myPsiElement); + } +} diff --git a/idea/src/org/jetbrains/jet/plugin/findUsages/dialogs/Utils.java b/idea/src/org/jetbrains/jet/plugin/findUsages/dialogs/Utils.java index b7f4bc988a9..1a6dc957df8 100644 --- a/idea/src/org/jetbrains/jet/plugin/findUsages/dialogs/Utils.java +++ b/idea/src/org/jetbrains/jet/plugin/findUsages/dialogs/Utils.java @@ -1,6 +1,10 @@ package org.jetbrains.jet.plugin.findUsages.dialogs; +import com.intellij.ui.SimpleColoredComponent; import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.lang.psi.JetNamedDeclaration; +import org.jetbrains.jet.plugin.search.usagesSearch.UsagesSearchPackage; +import org.jetbrains.jet.renderer.DescriptorRenderer; import javax.swing.*; import java.awt.*; @@ -9,6 +13,12 @@ class Utils { private Utils() { } + public static void configureLabelComponent( + @NotNull SimpleColoredComponent coloredComponent, + @NotNull JetNamedDeclaration declaration) { + coloredComponent.append(DescriptorRenderer.COMPACT.render(UsagesSearchPackage.getDescriptor(declaration))); + } + static boolean renameCheckbox(@NotNull JPanel panel, @NotNull String srcText, @NotNull String destText) { for (Component component : panel.getComponents()) { if (component instanceof JCheckBox) { diff --git a/idea/src/org/jetbrains/jet/plugin/findUsages/handlers/KotlinFindCallableUsagesHandler.java b/idea/src/org/jetbrains/jet/plugin/findUsages/handlers/KotlinFindMemberUsagesHandler.java similarity index 81% rename from idea/src/org/jetbrains/jet/plugin/findUsages/handlers/KotlinFindCallableUsagesHandler.java rename to idea/src/org/jetbrains/jet/plugin/findUsages/handlers/KotlinFindMemberUsagesHandler.java index d67ad42e358..38583ba80f7 100644 --- a/idea/src/org/jetbrains/jet/plugin/findUsages/handlers/KotlinFindCallableUsagesHandler.java +++ b/idea/src/org/jetbrains/jet/plugin/findUsages/handlers/KotlinFindMemberUsagesHandler.java @@ -32,8 +32,9 @@ import com.intellij.util.Processor; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.asJava.LightClassUtil; -import org.jetbrains.jet.lang.psi.JetCallableDeclaration; +import org.jetbrains.jet.lang.psi.JetNamedDeclaration; import org.jetbrains.jet.lang.psi.JetNamedFunction; +import org.jetbrains.jet.lang.psi.JetParameter; import org.jetbrains.jet.lang.psi.JetProperty; import org.jetbrains.jet.plugin.findUsages.*; import org.jetbrains.jet.plugin.findUsages.dialogs.KotlinFindFunctionUsagesDialog; @@ -46,8 +47,8 @@ import java.util.Collection; import java.util.Collections; import java.util.Iterator; -public abstract class KotlinFindCallableUsagesHandler extends KotlinFindUsagesHandler { - private static class Function extends KotlinFindCallableUsagesHandler { +public abstract class KotlinFindMemberUsagesHandler extends KotlinFindUsagesHandler { + private static class Function extends KotlinFindMemberUsagesHandler { public Function( @NotNull JetNamedFunction declaration, @NotNull Collection elementsToSearch, @@ -82,9 +83,9 @@ public abstract class KotlinFindCallableUsagesHandler { + private static class Property extends KotlinFindMemberUsagesHandler { public Property( - @NotNull JetProperty declaration, + @NotNull JetNamedDeclaration declaration, @NotNull Collection elementsToSearch, @NotNull KotlinFindUsagesHandlerFactory factory ) { @@ -92,7 +93,7 @@ public abstract class KotlinFindCallableUsagesHandler getSearchHelper(KotlinCallableFindUsagesOptions options) { + protected UsagesSearchHelper getSearchHelper(KotlinCallableFindUsagesOptions options) { return FindUsagesPackage.toHelper((KotlinPropertyFindUsagesOptions) options); } @@ -105,19 +106,13 @@ public abstract class KotlinFindCallableUsagesHandler lightMethods = getLightMethods(getElement()).iterator(); - if (lightMethods.hasNext()) { - return new KotlinFindPropertyUsagesDialog( - getElement(), getProject(), options, toShowInNewTab, mustOpenInNewTab, isSingleFile, this - ); - } - - return super.getFindUsagesDialog(isSingleFile, toShowInNewTab, mustOpenInNewTab); + return new KotlinFindPropertyUsagesDialog( + getElement(), getProject(), getFactory().getFindPropertyOptions(), toShowInNewTab, mustOpenInNewTab, isSingleFile, this + ); } } - protected KotlinFindCallableUsagesHandler( + protected KotlinFindMemberUsagesHandler( @NotNull T declaration, @NotNull Collection elementsToSearch, @NotNull KotlinFindUsagesHandlerFactory factory @@ -127,7 +122,7 @@ public abstract class KotlinFindCallableUsagesHandler getSearchHelper(KotlinCallableFindUsagesOptions options); - private static Iterable getLightMethods(JetCallableDeclaration element) { + private static Iterable getLightMethods(JetNamedDeclaration element) { if (element instanceof JetNamedFunction) { PsiMethod method = LightClassUtil.getLightClassMethod((JetNamedFunction) element); return method != null ? Collections.singletonList(method) : Collections.emptyList(); @@ -137,6 +132,10 @@ public abstract class KotlinFindCallableUsagesHandler lightMethods = ApplicationManager.getApplication().runReadAction(new Computable>() { @Override public Iterator compute() { - return getLightMethods((JetCallableDeclaration) element).iterator(); + return getLightMethods((JetNamedDeclaration) element).iterator(); } }); @@ -185,18 +184,18 @@ public abstract class KotlinFindCallableUsagesHandler getInstance( - @NotNull JetCallableDeclaration declaration, + public static KotlinFindMemberUsagesHandler getInstance( + @NotNull JetNamedDeclaration declaration, @NotNull Collection elementsToSearch, @NotNull KotlinFindUsagesHandlerFactory factory) { return declaration instanceof JetNamedFunction ? new Function((JetNamedFunction) declaration, elementsToSearch, factory) - : new Property((JetProperty) declaration, elementsToSearch, factory); + : new Property(declaration, elementsToSearch, factory); } @NotNull - public static KotlinFindCallableUsagesHandler getInstance( - @NotNull JetCallableDeclaration declaration, + public static KotlinFindMemberUsagesHandler getInstance( + @NotNull JetNamedDeclaration declaration, @NotNull KotlinFindUsagesHandlerFactory factory) { return getInstance(declaration, Collections.emptyList(), factory); } diff --git a/idea/src/org/jetbrains/jet/plugin/findUsages/handlers/KotlinFindUsagesHandler.java b/idea/src/org/jetbrains/jet/plugin/findUsages/handlers/KotlinFindUsagesHandler.java index 700d10617f1..5d8b17738d2 100644 --- a/idea/src/org/jetbrains/jet/plugin/findUsages/handlers/KotlinFindUsagesHandler.java +++ b/idea/src/org/jetbrains/jet/plugin/findUsages/handlers/KotlinFindUsagesHandler.java @@ -18,21 +18,15 @@ package org.jetbrains.jet.plugin.findUsages.handlers; import com.intellij.find.findUsages.FindUsagesHandler; import com.intellij.find.findUsages.FindUsagesOptions; -import com.intellij.find.findUsages.JavaFindUsagesOptions; import com.intellij.openapi.util.TextRange; import com.intellij.psi.PsiElement; -import com.intellij.psi.PsiNamedElement; import com.intellij.psi.PsiReference; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.search.SearchScope; import com.intellij.usageView.UsageInfo; import com.intellij.util.Processor; import org.jetbrains.annotations.NotNull; -import org.jetbrains.jet.plugin.findUsages.FindUsagesPackage; import org.jetbrains.jet.plugin.findUsages.KotlinFindUsagesHandlerFactory; -import org.jetbrains.jet.plugin.search.usagesSearch.DeclarationUsagesSearchHelper; -import org.jetbrains.jet.plugin.search.usagesSearch.UsagesSearch; -import org.jetbrains.jet.plugin.search.usagesSearch.UsagesSearchTarget; import java.util.Collection; import java.util.Collections; diff --git a/idea/src/org/jetbrains/jet/plugin/findUsages/handlers/KotlinTypeParameterFindUsagesHandler.java b/idea/src/org/jetbrains/jet/plugin/findUsages/handlers/KotlinTypeParameterFindUsagesHandler.java new file mode 100644 index 00000000000..cdb950525b3 --- /dev/null +++ b/idea/src/org/jetbrains/jet/plugin/findUsages/handlers/KotlinTypeParameterFindUsagesHandler.java @@ -0,0 +1,79 @@ +/* + * 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.findUsages.handlers; + +import com.intellij.find.findUsages.AbstractFindUsagesDialog; +import com.intellij.find.findUsages.FindUsagesOptions; +import com.intellij.openapi.actionSystem.DataContext; +import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.util.Computable; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiReference; +import com.intellij.usageView.UsageInfo; +import com.intellij.util.Processor; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.jet.lang.psi.JetNamedDeclaration; +import org.jetbrains.jet.plugin.findUsages.FindUsagesPackage; +import org.jetbrains.jet.plugin.findUsages.KotlinFindUsagesHandlerFactory; +import org.jetbrains.jet.plugin.findUsages.dialogs.KotlinTypeParameterFindUsagesDialog; +import org.jetbrains.jet.plugin.search.usagesSearch.DefaultSearchHelper; +import org.jetbrains.jet.plugin.search.usagesSearch.UsagesSearch; +import org.jetbrains.jet.plugin.search.usagesSearch.UsagesSearchRequest; +import org.jetbrains.jet.plugin.search.usagesSearch.UsagesSearchTarget; + +public class KotlinTypeParameterFindUsagesHandler extends KotlinFindUsagesHandler { + public KotlinTypeParameterFindUsagesHandler(@NotNull JetNamedDeclaration element, @NotNull KotlinFindUsagesHandlerFactory factory) { + super(element, factory); + } + + @NotNull + @Override + public AbstractFindUsagesDialog getFindUsagesDialog(boolean isSingleFile, boolean toShowInNewTab, boolean mustOpenInNewTab) { + return new KotlinTypeParameterFindUsagesDialog( + getElement(), getProject(), getFindUsagesOptions(), toShowInNewTab, mustOpenInNewTab, isSingleFile, this + ); + } + + @Override + protected boolean searchReferences( + @NotNull final PsiElement element, @NotNull final Processor processor, @NotNull final FindUsagesOptions options + ) { + return ApplicationManager.getApplication().runReadAction( + new Computable() { + @Override + public Boolean compute() { + UsagesSearchTarget target = + FindUsagesPackage.toSearchTarget(options, (JetNamedDeclaration) element, true); + UsagesSearchRequest request = new DefaultSearchHelper().newRequest(target); + + for (PsiReference ref : UsagesSearch.instance$.search(request)) { + if (!processUsage(processor, ref)) return false; + } + + return true; + } + } + ); + } + + @NotNull + @Override + public FindUsagesOptions getFindUsagesOptions(@Nullable DataContext dataContext) { + return getFactory().getFindClassOptions(); + } +} \ No newline at end of file diff --git a/idea/src/org/jetbrains/jet/plugin/refactoring/JetRefactoringUtil.java b/idea/src/org/jetbrains/jet/plugin/refactoring/JetRefactoringUtil.java index 15846262feb..9b5d993dfa1 100644 --- a/idea/src/org/jetbrains/jet/plugin/refactoring/JetRefactoringUtil.java +++ b/idea/src/org/jetbrains/jet/plugin/refactoring/JetRefactoringUtil.java @@ -136,8 +136,15 @@ public class JetRefactoringUtil { } @NotNull - private static List getPropertySuperDeclarations(@NotNull JetProperty property) { - LightClassUtil.PropertyAccessorsPsiMethods lightMethods = LightClassUtil.getLightClassPropertyMethods(property); + private static List getPropertySuperDeclarations(@NotNull JetDeclaration declaration) { + LightClassUtil.PropertyAccessorsPsiMethods lightMethods; + if (declaration instanceof JetProperty) { + lightMethods = LightClassUtil.getLightClassPropertyMethods((JetProperty) declaration); + } + else if (declaration instanceof JetParameter) { + lightMethods = LightClassUtil.getLightClassPropertyMethods((JetParameter) declaration); + } + else return Collections.emptyList(); Collection foundMethods = new HashSet(); if (lightMethods.getGetter() != null) { @@ -158,7 +165,7 @@ public class JetRefactoringUtil { @NotNull private static List getSuperDeclarations(@NotNull JetDeclaration declaration) { if (declaration instanceof JetNamedFunction) return getFunctionSuperDeclarations((JetNamedFunction) declaration); - if (declaration instanceof JetProperty) return getPropertySuperDeclarations((JetProperty) declaration); + if (declaration instanceof JetProperty || declaration instanceof JetParameter) return getPropertySuperDeclarations(declaration); return Collections.emptyList(); } @@ -174,9 +181,6 @@ public class JetRefactoringUtil { if (declarationDescriptor instanceof LocalVariableDescriptor) { return Collections.singletonList(declaration); } - if (!(declarationDescriptor instanceof CallableMemberDescriptor)) return null; - - CallableMemberDescriptor callableDescriptor = (CallableMemberDescriptor) declarationDescriptor; List superDeclarations = getSuperDeclarations(declaration); if (ignore != null) { @@ -186,13 +190,13 @@ public class JetRefactoringUtil { if (superDeclarations.isEmpty()) return Collections.singletonList(declaration); java.util.List superClasses = getClassDescriptions(bindingContext, superDeclarations); - return askUserForMethodsToSearch(declaration, callableDescriptor, superDeclarations, superClasses, actionStringKey); + return askUserForMethodsToSearch(declaration, declarationDescriptor, superDeclarations, superClasses, actionStringKey); } @NotNull private static List askUserForMethodsToSearch( @NotNull JetDeclaration declaration, - @NotNull CallableMemberDescriptor callableDescriptor, + @NotNull DeclarationDescriptor declarationDescriptor, @NotNull List superMethods, @NotNull List superClasses, @NotNull String actionStringKey @@ -200,8 +204,8 @@ public class JetRefactoringUtil { String superClassesStr = "\n" + StringUtil.join(superClasses, ""); String message = JetBundle.message( "x.overrides.y.in.class.list", - DescriptorRenderer.COMPACT.render(callableDescriptor), - DescriptorRenderer.SOURCE_CODE_SHORT_NAMES_IN_TYPES.render(callableDescriptor.getContainingDeclaration()), + DescriptorRenderer.COMPACT.render(declarationDescriptor), + DescriptorRenderer.SOURCE_CODE_SHORT_NAMES_IN_TYPES.render(declarationDescriptor.getContainingDeclaration()), superClassesStr, JetBundle.message(actionStringKey) ); diff --git a/idea/src/org/jetbrains/jet/plugin/search/usagesSearch/utils.kt b/idea/src/org/jetbrains/jet/plugin/search/usagesSearch/utils.kt index a4c1d446397..6fcaf31ab6a 100644 --- a/idea/src/org/jetbrains/jet/plugin/search/usagesSearch/utils.kt +++ b/idea/src/org/jetbrains/jet/plugin/search/usagesSearch/utils.kt @@ -42,6 +42,7 @@ import com.intellij.usages.impl.rules.UsageType import org.jetbrains.jet.asJava.LightClassUtil import org.jetbrains.jet.lang.resolve.java.JvmAbi import org.jetbrains.jet.codegen.PropertyCodegen +import org.jetbrains.jet.lang.descriptors.PropertyDescriptor // Navigation element of the resolved reference // For property accessor return enclosing property @@ -54,18 +55,23 @@ val PsiReference.navigationTarget: PsiElement? val JetDeclaration.descriptor: DeclarationDescriptor? get() = AnalyzerFacadeWithCache.getContextForElement(this).get(BindingContext.DECLARATION_TO_DESCRIPTOR, this) +val JetParameter.propertyDescriptor: PropertyDescriptor? + get() = AnalyzerFacadeWithCache.getContextForElement(this).get(BindingContext.PRIMARY_CONSTRUCTOR_PARAMETER, this) + fun PsiReference.isTargetUsage(target: PsiElement): Boolean { return target.getNavigationElement() == navigationTarget } fun PsiReference.checkUsageVsOriginalDescriptor( - target: JetDeclaration, checker: (usageDescriptor: DeclarationDescriptor, targetDescriptor: DeclarationDescriptor) -> Boolean + target: JetDeclaration, + declarationToDescriptor: (JetDeclaration) -> DeclarationDescriptor? = {it.descriptor}, + checker: (usageDescriptor: DeclarationDescriptor, targetDescriptor: DeclarationDescriptor) -> Boolean ): Boolean { val refTarget = navigationTarget if (refTarget !is JetDeclaration) return false - val usageDescriptor = refTarget.descriptor - val targetDescriptor = target.descriptor + val usageDescriptor = declarationToDescriptor(refTarget) + val targetDescriptor = declarationToDescriptor(target) return usageDescriptor != null && targetDescriptor != null && checker(usageDescriptor, targetDescriptor) } @@ -137,22 +143,32 @@ fun PsiReference.isUsageInContainingDeclaration(declaration: JetNamedDeclaration && usageDescriptor.getContainingDeclaration() == targetDescriptor.getContainingDeclaration() } -fun PsiReference.isCallableOverrideUsage(declaration: JetCallableDeclaration): Boolean = - checkUsageVsOriginalDescriptor(declaration) { (usageDescriptor, targetDescriptor) -> - usageDescriptor is CallableDescriptor && targetDescriptor is CallableDescriptor - && OverridingUtil.overrides(usageDescriptor, targetDescriptor) - } - -fun PsiReference.isPropertyReadOnlyUsage(): Boolean { - if (this is JetPsiReference) { - return JetUsageTypeProvider.getUsageType(getElement()) != UsageType.WRITE +fun PsiReference.isCallableOverrideUsage(declaration: JetNamedDeclaration): Boolean { + val decl2Desc = {(declaration: JetDeclaration) -> + if (declaration is JetParameter && declaration.getValOrVarNode() != null) declaration.propertyDescriptor else declaration.descriptor } - val refTarget = resolve() + return checkUsageVsOriginalDescriptor(declaration, decl2Desc) { (usageDescriptor, targetDescriptor) -> + usageDescriptor is CallableDescriptor && targetDescriptor is CallableDescriptor + && OverridingUtil.overrides(usageDescriptor, targetDescriptor) + } +} + +// Check if reference resolves to property getter +// Works for JetProperty and JetParameter +fun PsiReference.isPropertyReadOnlyUsage(): Boolean { + if (JetUsageTypeProvider.getUsageType(getElement()) == UsageType.READ) return true + + val refTarget = resolve() if (refTarget is JetClsMethod) { - val property = refTarget.getOrigin()?.getParentByType(javaClass()) - return property != null && refTarget.getName() == PropertyCodegen.getterName(property.getNameAsName()) + val origin = refTarget.getOrigin() + val declaration: JetNamedDeclaration? = when (origin) { + is JetPropertyAccessor -> origin.getParentByType(javaClass()) + is JetProperty, is JetParameter -> origin as JetNamedDeclaration + else -> null + } + return declaration != null && refTarget.getName() == PropertyCodegen.getterName(declaration.getNameAsName()) } return false diff --git a/idea/testData/findUsages/kotlin/findParameterUsages/kotlinConstructorParameterUsages.0.kt b/idea/testData/findUsages/kotlin/findParameterUsages/kotlinConstructorParameterUsages.0.kt new file mode 100644 index 00000000000..4510a89825b --- /dev/null +++ b/idea/testData/findUsages/kotlin/findParameterUsages/kotlinConstructorParameterUsages.0.kt @@ -0,0 +1,9 @@ +// PSI_ELEMENT: org.jetbrains.jet.lang.psi.JetParameter +// OPTIONS: usages +open class A(foo: T) { + { + println(foo) + } + + val t: T = foo +} \ No newline at end of file diff --git a/idea/testData/findUsages/kotlin/findParameterUsages/kotlinConstructorParameterUsages.results.txt b/idea/testData/findUsages/kotlin/findParameterUsages/kotlinConstructorParameterUsages.results.txt new file mode 100644 index 00000000000..70b5e9f71d9 --- /dev/null +++ b/idea/testData/findUsages/kotlin/findParameterUsages/kotlinConstructorParameterUsages.results.txt @@ -0,0 +1,2 @@ +Value read (5: 17) println(foo) +Value read (8: 16) val t: T = foo diff --git a/idea/testData/findUsages/kotlin/findParameterUsages/kotlinFunctionParameterUsages.0.kt b/idea/testData/findUsages/kotlin/findParameterUsages/kotlinFunctionParameterUsages.0.kt new file mode 100644 index 00000000000..7f51d6dacca --- /dev/null +++ b/idea/testData/findUsages/kotlin/findParameterUsages/kotlinFunctionParameterUsages.0.kt @@ -0,0 +1,6 @@ +// PSI_ELEMENT: org.jetbrains.jet.lang.psi.JetParameter +// OPTIONS: usages +fun foo(t: T): T { + println(t) + return t +} \ No newline at end of file diff --git a/idea/testData/findUsages/kotlin/findParameterUsages/kotlinFunctionParameterUsages.results.txt b/idea/testData/findUsages/kotlin/findParameterUsages/kotlinFunctionParameterUsages.results.txt new file mode 100644 index 00000000000..2865abdc165 --- /dev/null +++ b/idea/testData/findUsages/kotlin/findParameterUsages/kotlinFunctionParameterUsages.results.txt @@ -0,0 +1,2 @@ +Value read (4: 13) println(t) +Value read (5: 12) return t \ No newline at end of file diff --git a/idea/testData/findUsages/kotlin/findPropertyUsages/javaAndKotlinOverrides2.0.kt b/idea/testData/findUsages/kotlin/findPropertyUsages/javaAndKotlinOverrides2.0.kt new file mode 100644 index 00000000000..eba4fbc5bdf --- /dev/null +++ b/idea/testData/findUsages/kotlin/findPropertyUsages/javaAndKotlinOverrides2.0.kt @@ -0,0 +1,26 @@ +// PSI_ELEMENT: org.jetbrains.jet.lang.psi.JetParameter +// OPTIONS: overrides +open class A(open var foo: T) + +open class B: A("") { + override var foo: String + get() { + println("get") + return super.foo + } + set(value: String) { + println("set:" + value) + super.foo = value + } + + fun baz(a: A) { + a.foo = "" + println(a.foo) + } +} + +open class D: A("") { + override var foo: String = "" +} + +open class E(override var foo: T): A(foo) \ No newline at end of file diff --git a/idea/testData/findUsages/kotlin/findPropertyUsages/javaAndKotlinOverrides2.1.java b/idea/testData/findUsages/kotlin/findPropertyUsages/javaAndKotlinOverrides2.1.java new file mode 100644 index 00000000000..fbd28a35093 --- /dev/null +++ b/idea/testData/findUsages/kotlin/findPropertyUsages/javaAndKotlinOverrides2.1.java @@ -0,0 +1,15 @@ +class C extends A { + C(String s) { + super(s); + } + + @Override + public String getFoo() { + return super.getFoo(); + } + + @Override + public void setFoo(String s) { + super.setFoo(s); + } +} diff --git a/idea/testData/findUsages/kotlin/findPropertyUsages/javaAndKotlinOverrides2.results.txt b/idea/testData/findUsages/kotlin/findPropertyUsages/javaAndKotlinOverrides2.results.txt new file mode 100644 index 00000000000..f4b45fe2af8 --- /dev/null +++ b/idea/testData/findUsages/kotlin/findPropertyUsages/javaAndKotlinOverrides2.results.txt @@ -0,0 +1,8 @@ +Unclassified usage (11: 9) set(value: String) { +Unclassified usage (12: 17) public void setFoo(String s) { +Unclassified usage (23: 18) override var foo: String = "" +Unclassified usage (23: 18) override var foo: String = "" +Unclassified usage (26: 30) open class E(override var foo: T): A(foo) +Unclassified usage (26: 30) open class E(override var foo: T): A(foo) +Unclassified usage (7: 19) public String getFoo() { +Unclassified usage (7: 9) get() { diff --git a/idea/testData/findUsages/kotlin/findPropertyUsages/javaPropertyReadUsages2.0.kt b/idea/testData/findUsages/kotlin/findPropertyUsages/javaPropertyReadUsages2.0.kt new file mode 100644 index 00000000000..3ba5410f4e7 --- /dev/null +++ b/idea/testData/findUsages/kotlin/findPropertyUsages/javaPropertyReadUsages2.0.kt @@ -0,0 +1,16 @@ +// PSI_ELEMENT: org.jetbrains.jet.lang.psi.JetParameter +// OPTIONS: usages, skipWrite +package server; + +open class A(open var foo: T) + +open class B: A("") { + override var foo: String + get() { + println("get") + return "" + } + set(value: String) { + println("set:" + value) + } +} \ No newline at end of file diff --git a/idea/testData/findUsages/kotlin/findPropertyUsages/javaPropertyReadUsages2.1.java b/idea/testData/findUsages/kotlin/findPropertyUsages/javaPropertyReadUsages2.1.java new file mode 100644 index 00000000000..3e2271c51d3 --- /dev/null +++ b/idea/testData/findUsages/kotlin/findPropertyUsages/javaPropertyReadUsages2.1.java @@ -0,0 +1,15 @@ +package client; + +import server.* + +class Client { + fun fooBar() { + A a = new A(""); + a.setFoo("a"); + println("a.foo = " + a.getFoo()); + + B b = new B(); + b.setFoo("b"); + println("b.foo = " + b.getFoo()); + } +} \ No newline at end of file diff --git a/idea/testData/findUsages/kotlin/findPropertyUsages/javaPropertyReadUsages2.results.txt b/idea/testData/findUsages/kotlin/findPropertyUsages/javaPropertyReadUsages2.results.txt new file mode 100644 index 00000000000..ac83caeaa58 --- /dev/null +++ b/idea/testData/findUsages/kotlin/findPropertyUsages/javaPropertyReadUsages2.results.txt @@ -0,0 +1,2 @@ +Unclassified usage (13: 32) println("b.foo = " + b.getFoo()); +Unclassified usage (9: 32) println("a.foo = " + a.getFoo()); diff --git a/idea/testData/findUsages/kotlin/findPropertyUsages/javaPropertyUsages2.0.kt b/idea/testData/findUsages/kotlin/findPropertyUsages/javaPropertyUsages2.0.kt new file mode 100644 index 00000000000..ddb3ca8e1cc --- /dev/null +++ b/idea/testData/findUsages/kotlin/findPropertyUsages/javaPropertyUsages2.0.kt @@ -0,0 +1,16 @@ +// PSI_ELEMENT: org.jetbrains.jet.lang.psi.JetParameter +// OPTIONS: usages +package server; + +open class A(open var foo: T) + +open class B: A("") { + override var foo: String + get() { + println("get") + return "" + } + set(value: String) { + println("set:" + value) + } +} \ No newline at end of file diff --git a/idea/testData/findUsages/kotlin/findPropertyUsages/javaPropertyUsages2.1.java b/idea/testData/findUsages/kotlin/findPropertyUsages/javaPropertyUsages2.1.java new file mode 100644 index 00000000000..3e2271c51d3 --- /dev/null +++ b/idea/testData/findUsages/kotlin/findPropertyUsages/javaPropertyUsages2.1.java @@ -0,0 +1,15 @@ +package client; + +import server.* + +class Client { + fun fooBar() { + A a = new A(""); + a.setFoo("a"); + println("a.foo = " + a.getFoo()); + + B b = new B(); + b.setFoo("b"); + println("b.foo = " + b.getFoo()); + } +} \ No newline at end of file diff --git a/idea/testData/findUsages/kotlin/findPropertyUsages/javaPropertyUsages2.results.txt b/idea/testData/findUsages/kotlin/findPropertyUsages/javaPropertyUsages2.results.txt new file mode 100644 index 00000000000..1defce528bb --- /dev/null +++ b/idea/testData/findUsages/kotlin/findPropertyUsages/javaPropertyUsages2.results.txt @@ -0,0 +1,4 @@ +Unclassified usage (12: 11) b.setFoo("b"); +Unclassified usage (13: 32) println("b.foo = " + b.getFoo()); +Unclassified usage (8: 11) a.setFoo("a"); +Unclassified usage (9: 32) println("a.foo = " + a.getFoo()); diff --git a/idea/testData/findUsages/kotlin/findPropertyUsages/javaPropertyWriteUsages2.0.kt b/idea/testData/findUsages/kotlin/findPropertyUsages/javaPropertyWriteUsages2.0.kt new file mode 100644 index 00000000000..7e949dcb193 --- /dev/null +++ b/idea/testData/findUsages/kotlin/findPropertyUsages/javaPropertyWriteUsages2.0.kt @@ -0,0 +1,16 @@ +// PSI_ELEMENT: org.jetbrains.jet.lang.psi.JetParameter +// OPTIONS: usages, skipRead +package server; + +open class A(open var foo: T) + +open class B: A("") { + override var foo: String + get() { + println("get") + return "" + } + set(value: String) { + println("set:" + value) + } +} \ No newline at end of file diff --git a/idea/testData/findUsages/kotlin/findPropertyUsages/javaPropertyWriteUsages2.1.java b/idea/testData/findUsages/kotlin/findPropertyUsages/javaPropertyWriteUsages2.1.java new file mode 100644 index 00000000000..3e2271c51d3 --- /dev/null +++ b/idea/testData/findUsages/kotlin/findPropertyUsages/javaPropertyWriteUsages2.1.java @@ -0,0 +1,15 @@ +package client; + +import server.* + +class Client { + fun fooBar() { + A a = new A(""); + a.setFoo("a"); + println("a.foo = " + a.getFoo()); + + B b = new B(); + b.setFoo("b"); + println("b.foo = " + b.getFoo()); + } +} \ No newline at end of file diff --git a/idea/testData/findUsages/kotlin/findPropertyUsages/javaPropertyWriteUsages2.results.txt b/idea/testData/findUsages/kotlin/findPropertyUsages/javaPropertyWriteUsages2.results.txt new file mode 100644 index 00000000000..98bd4c92281 --- /dev/null +++ b/idea/testData/findUsages/kotlin/findPropertyUsages/javaPropertyWriteUsages2.results.txt @@ -0,0 +1,2 @@ +Unclassified usage (12: 11) b.setFoo("b"); +Unclassified usage (8: 11) a.setFoo("a"); diff --git a/idea/testData/findUsages/kotlin/findPropertyUsages/kotlinPrivatePropertyUsages2.0.kt b/idea/testData/findUsages/kotlin/findPropertyUsages/kotlinPrivatePropertyUsages2.0.kt new file mode 100644 index 00000000000..4775089504a --- /dev/null +++ b/idea/testData/findUsages/kotlin/findPropertyUsages/kotlinPrivatePropertyUsages2.0.kt @@ -0,0 +1,12 @@ +// PSI_ELEMENT: org.jetbrains.jet.lang.psi.JetParameter +// OPTIONS: usages +package server; + +public open class Server(private val foo: String = "foo") { + open fun processRequest() = foo +} + +public class ServerEx(): Server() { + override fun processRequest() = "foo" + foo +} + diff --git a/idea/testData/findUsages/kotlin/findPropertyUsages/kotlinPrivatePropertyUsages2.1.kt b/idea/testData/findUsages/kotlin/findPropertyUsages/kotlinPrivatePropertyUsages2.1.kt new file mode 100644 index 00000000000..fc85e72876a --- /dev/null +++ b/idea/testData/findUsages/kotlin/findPropertyUsages/kotlinPrivatePropertyUsages2.1.kt @@ -0,0 +1,8 @@ +import server.*; + +class Client { + public fun foo() { + println(Server().foo) + ServerEx().processRequest() + } +} diff --git a/idea/testData/findUsages/kotlin/findPropertyUsages/kotlinPrivatePropertyUsages2.results.txt b/idea/testData/findUsages/kotlin/findPropertyUsages/kotlinPrivatePropertyUsages2.results.txt new file mode 100644 index 00000000000..7a57efd526b --- /dev/null +++ b/idea/testData/findUsages/kotlin/findPropertyUsages/kotlinPrivatePropertyUsages2.results.txt @@ -0,0 +1,3 @@ +Value read (10: 45) override fun processRequest() = "foo" + foo +Value read (5: 26) println(Server().foo) +Value read (6: 33) open fun processRequest() = foo diff --git a/idea/testData/findUsages/kotlin/findPropertyUsages/kotlinPropertyReadUsages2.0.kt b/idea/testData/findUsages/kotlin/findPropertyUsages/kotlinPropertyReadUsages2.0.kt new file mode 100644 index 00000000000..2ee5a06aad1 --- /dev/null +++ b/idea/testData/findUsages/kotlin/findPropertyUsages/kotlinPropertyReadUsages2.0.kt @@ -0,0 +1,17 @@ +// PSI_ELEMENT: org.jetbrains.jet.lang.psi.JetParameter +// OPTIONS: usages, skipWrite +package server; + +open class A(open var foo: T) + +open class B: A() { + open var foo: String + get() { + println("get") + return super.foo + } + set(value: String) { + println("set:" + value) + super.foo = value + } +} diff --git a/idea/testData/findUsages/kotlin/findPropertyUsages/kotlinPropertyReadUsages2.1.kt b/idea/testData/findUsages/kotlin/findPropertyUsages/kotlinPropertyReadUsages2.1.kt new file mode 100644 index 00000000000..64abfcf634c --- /dev/null +++ b/idea/testData/findUsages/kotlin/findPropertyUsages/kotlinPropertyReadUsages2.1.kt @@ -0,0 +1,13 @@ +import server.*; + +class Client { + public fun foo() { + val a = A("") + a.foo = "a" + println("a.foo = ${a.foo}") + + val b = B() + b.foo = "b" + println("b.foo = ${b.foo}") + } +} diff --git a/idea/testData/findUsages/kotlin/findPropertyUsages/kotlinPropertyReadUsages2.results.txt b/idea/testData/findUsages/kotlin/findPropertyUsages/kotlinPropertyReadUsages2.results.txt new file mode 100644 index 00000000000..bf08a875580 --- /dev/null +++ b/idea/testData/findUsages/kotlin/findPropertyUsages/kotlinPropertyReadUsages2.results.txt @@ -0,0 +1,3 @@ +Value read (11: 29) return super.foo +Value read (11: 30) println("b.foo = ${b.foo}") +Value read (7: 30) println("a.foo = ${a.foo}") \ No newline at end of file diff --git a/idea/testData/findUsages/kotlin/findPropertyUsages/kotlinPropertyUsages2.0.kt b/idea/testData/findUsages/kotlin/findPropertyUsages/kotlinPropertyUsages2.0.kt new file mode 100644 index 00000000000..9b77f8d75ee --- /dev/null +++ b/idea/testData/findUsages/kotlin/findPropertyUsages/kotlinPropertyUsages2.0.kt @@ -0,0 +1,17 @@ +// PSI_ELEMENT: org.jetbrains.jet.lang.psi.JetParameter +// OPTIONS: usages +package server; + +open class A(open var foo: T) + +open class B: A() { + open var foo: String + get() { + println("get") + return super.foo + } + set(value: String) { + println("set:" + value) + super.foo = value + } +} diff --git a/idea/testData/findUsages/kotlin/findPropertyUsages/kotlinPropertyUsages2.1.kt b/idea/testData/findUsages/kotlin/findPropertyUsages/kotlinPropertyUsages2.1.kt new file mode 100644 index 00000000000..64abfcf634c --- /dev/null +++ b/idea/testData/findUsages/kotlin/findPropertyUsages/kotlinPropertyUsages2.1.kt @@ -0,0 +1,13 @@ +import server.*; + +class Client { + public fun foo() { + val a = A("") + a.foo = "a" + println("a.foo = ${a.foo}") + + val b = B() + b.foo = "b" + println("b.foo = ${b.foo}") + } +} diff --git a/idea/testData/findUsages/kotlin/findPropertyUsages/kotlinPropertyUsages2.results.txt b/idea/testData/findUsages/kotlin/findPropertyUsages/kotlinPropertyUsages2.results.txt new file mode 100644 index 00000000000..88da8b909f0 --- /dev/null +++ b/idea/testData/findUsages/kotlin/findPropertyUsages/kotlinPropertyUsages2.results.txt @@ -0,0 +1,6 @@ +Value read (11: 29) return super.foo +Value read (11: 30) println("b.foo = ${b.foo}") +Value read (7: 30) println("a.foo = ${a.foo}") +Value write (10: 11) b.foo = "b" +Value write (15: 22) super.foo = value +Value write (6: 11) a.foo = "a" diff --git a/idea/testData/findUsages/kotlin/findPropertyUsages/kotlinPropertyWriteUsages2.0.kt b/idea/testData/findUsages/kotlin/findPropertyUsages/kotlinPropertyWriteUsages2.0.kt new file mode 100644 index 00000000000..5ab9b9e4c6e --- /dev/null +++ b/idea/testData/findUsages/kotlin/findPropertyUsages/kotlinPropertyWriteUsages2.0.kt @@ -0,0 +1,17 @@ +// PSI_ELEMENT: org.jetbrains.jet.lang.psi.JetParameter +// OPTIONS: usages, skipRead +package server; + +open class A(open var foo: T) + +open class B: A() { + open var foo: String + get() { + println("get") + return super.foo + } + set(value: String) { + println("set:" + value) + super.foo = value + } +} diff --git a/idea/testData/findUsages/kotlin/findPropertyUsages/kotlinPropertyWriteUsages2.1.kt b/idea/testData/findUsages/kotlin/findPropertyUsages/kotlinPropertyWriteUsages2.1.kt new file mode 100644 index 00000000000..64abfcf634c --- /dev/null +++ b/idea/testData/findUsages/kotlin/findPropertyUsages/kotlinPropertyWriteUsages2.1.kt @@ -0,0 +1,13 @@ +import server.*; + +class Client { + public fun foo() { + val a = A("") + a.foo = "a" + println("a.foo = ${a.foo}") + + val b = B() + b.foo = "b" + println("b.foo = ${b.foo}") + } +} diff --git a/idea/testData/findUsages/kotlin/findPropertyUsages/kotlinPropertyWriteUsages2.results.txt b/idea/testData/findUsages/kotlin/findPropertyUsages/kotlinPropertyWriteUsages2.results.txt new file mode 100644 index 00000000000..4f4b1927587 --- /dev/null +++ b/idea/testData/findUsages/kotlin/findPropertyUsages/kotlinPropertyWriteUsages2.results.txt @@ -0,0 +1,3 @@ +Value write (10: 11) b.foo = "b" +Value write (15: 22) super.foo = value +Value write (6: 11) a.foo = "a" diff --git a/idea/testData/findUsages/kotlin/findTypeParameterUsages/kotlinClassTypeParameterUsages.0.kt b/idea/testData/findUsages/kotlin/findTypeParameterUsages/kotlinClassTypeParameterUsages.0.kt new file mode 100644 index 00000000000..8fb3eb5a4ce --- /dev/null +++ b/idea/testData/findUsages/kotlin/findTypeParameterUsages/kotlinClassTypeParameterUsages.0.kt @@ -0,0 +1,12 @@ +// PSI_ELEMENT: org.jetbrains.jet.lang.psi.JetTypeParameter +// OPTIONS: usages +open class A<T>(foo: T, list: List) { + { + fun T.bar() {} + + foo.bar() + } + + val t: T = foo + fun bar(t: T): T = t +} \ No newline at end of file diff --git a/idea/testData/findUsages/kotlin/findTypeParameterUsages/kotlinClassTypeParameterUsages.results.txt b/idea/testData/findUsages/kotlin/findTypeParameterUsages/kotlinClassTypeParameterUsages.results.txt new file mode 100644 index 00000000000..4565a4ad784 --- /dev/null +++ b/idea/testData/findUsages/kotlin/findTypeParameterUsages/kotlinClassTypeParameterUsages.results.txt @@ -0,0 +1,6 @@ +Class/object property type (10: 12) val t: T = foo +Extension receiver type (5: 13) fun T.bar() {} +Function return types (11: 20) fun bar(t: T): T = t +Parameter type (11: 16) fun bar(t: T): T = t +Parameter type (3: 22) open class A(foo: T, list: List) { +Type parameter (3: 36) open class A(foo: T, list: List) { diff --git a/idea/testData/findUsages/kotlin/findTypeParameterUsages/kotlinFunctionTypeParameterUsages.0.kt b/idea/testData/findUsages/kotlin/findTypeParameterUsages/kotlinFunctionTypeParameterUsages.0.kt new file mode 100644 index 00000000000..73bf172eaa5 --- /dev/null +++ b/idea/testData/findUsages/kotlin/findTypeParameterUsages/kotlinFunctionTypeParameterUsages.0.kt @@ -0,0 +1,5 @@ +// PSI_ELEMENT: org.jetbrains.jet.lang.psi.JetTypeParameter +// OPTIONS: usages +fun <T> T.foo(t: T, list: List): T { + return t +} \ No newline at end of file diff --git a/idea/testData/findUsages/kotlin/findTypeParameterUsages/kotlinFunctionTypeParameterUsages.results.txt b/idea/testData/findUsages/kotlin/findTypeParameterUsages/kotlinFunctionTypeParameterUsages.results.txt new file mode 100644 index 00000000000..2d8663370df --- /dev/null +++ b/idea/testData/findUsages/kotlin/findTypeParameterUsages/kotlinFunctionTypeParameterUsages.results.txt @@ -0,0 +1,4 @@ +Extension receiver type (3: 9) fun T.foo(t: T, list: List): T { +Function return types (3: 37) fun T.foo(t: T, list: List): T { +Parameter type (3: 18) fun T.foo(t: T, list: List): T { +Type parameter (3: 32) fun T.foo(t: T, list: List): T { diff --git a/idea/tests/org/jetbrains/jet/findUsages/AbstractJetFindUsagesTest.java b/idea/tests/org/jetbrains/jet/findUsages/AbstractJetFindUsagesTest.java index c6697aebd42..db8b96e177d 100644 --- a/idea/tests/org/jetbrains/jet/findUsages/AbstractJetFindUsagesTest.java +++ b/idea/tests/org/jetbrains/jet/findUsages/AbstractJetFindUsagesTest.java @@ -42,9 +42,7 @@ import com.intellij.util.CommonProcessors; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.InTextDirectivesUtils; -import org.jetbrains.jet.lang.psi.JetClass; -import org.jetbrains.jet.lang.psi.JetNamedFunction; -import org.jetbrains.jet.lang.psi.JetProperty; +import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.plugin.JetLightProjectDescriptor; import org.jetbrains.jet.plugin.PluginTestCaseBase; import org.jetbrains.jet.plugin.findUsages.KotlinClassFindUsagesOptions; @@ -194,6 +192,13 @@ public abstract class AbstractJetFindUsagesTest extends LightCodeInsightFixtureT public FindUsagesOptions parse(@NotNull String text, @NotNull Project project) { return new JavaVariableFindUsagesOptions(project); } + }, + DEFAULT { + @NotNull + @Override + public FindUsagesOptions parse(@NotNull String text, @NotNull Project project) { + return new FindUsagesOptions(project); + } }; protected static boolean parseCommonOptions(JavaFindUsagesOptions options, String s) { @@ -218,7 +223,7 @@ public abstract class AbstractJetFindUsagesTest extends LightCodeInsightFixtureT if (klass == JetNamedFunction.class) { return FUNCTION; } - if (klass == JetProperty.class) { + if (klass == JetProperty.class || klass == JetParameter.class) { return PROPERTY; } if (klass == JetClass.class) { @@ -233,6 +238,9 @@ public abstract class AbstractJetFindUsagesTest extends LightCodeInsightFixtureT if (klass == PsiField.class) { return JAVA_FIELD; } + if (klass == JetTypeParameter.class) { + return DEFAULT; + } return null; } diff --git a/idea/tests/org/jetbrains/jet/findUsages/JetFindUsagesTestGenerated.java b/idea/tests/org/jetbrains/jet/findUsages/JetFindUsagesTestGenerated.java index c14feb7437b..c071bdebaaa 100644 --- a/idea/tests/org/jetbrains/jet/findUsages/JetFindUsagesTestGenerated.java +++ b/idea/tests/org/jetbrains/jet/findUsages/JetFindUsagesTestGenerated.java @@ -33,7 +33,7 @@ import org.jetbrains.jet.findUsages.AbstractJetFindUsagesTest; @InnerTestClasses({JetFindUsagesTestGenerated.Kotlin.class, JetFindUsagesTestGenerated.Java.class}) public class JetFindUsagesTestGenerated extends AbstractJetFindUsagesTest { @TestMetadata("idea/testData/findUsages/kotlin") - @InnerTestClasses({Kotlin.FindClassUsages.class, Kotlin.FindFunctionUsages.class, Kotlin.FindObjectUsages.class, Kotlin.FindPropertyUsages.class, Kotlin.FindWithFilteringImports.class, Kotlin.UnresolvedAnnotation.class}) + @InnerTestClasses({Kotlin.FindClassUsages.class, Kotlin.FindFunctionUsages.class, Kotlin.FindObjectUsages.class, Kotlin.FindParameterUsages.class, Kotlin.FindPropertyUsages.class, Kotlin.FindTypeParameterUsages.class, Kotlin.FindWithFilteringImports.class, Kotlin.UnresolvedAnnotation.class}) public static class Kotlin extends AbstractJetFindUsagesTest { public void testAllFilesPresentInKotlin() throws Exception { JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.GenerateTests", new File("idea/testData/findUsages/kotlin"), Pattern.compile("^(.+)\\.0\\.kt$"), true); @@ -293,6 +293,24 @@ public class JetFindUsagesTestGenerated extends AbstractJetFindUsagesTest { } + @TestMetadata("idea/testData/findUsages/kotlin/findParameterUsages") + public static class FindParameterUsages extends AbstractJetFindUsagesTest { + public void testAllFilesPresentInFindParameterUsages() throws Exception { + JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.GenerateTests", new File("idea/testData/findUsages/kotlin/findParameterUsages"), Pattern.compile("^(.+)\\.0\\.kt$"), true); + } + + @TestMetadata("kotlinConstructorParameterUsages.0.kt") + public void testKotlinConstructorParameterUsages() throws Exception { + doTest("idea/testData/findUsages/kotlin/findParameterUsages/kotlinConstructorParameterUsages.0.kt"); + } + + @TestMetadata("kotlinFunctionParameterUsages.0.kt") + public void testKotlinFunctionParameterUsages() throws Exception { + doTest("idea/testData/findUsages/kotlin/findParameterUsages/kotlinFunctionParameterUsages.0.kt"); + } + + } + @TestMetadata("idea/testData/findUsages/kotlin/findPropertyUsages") public static class FindPropertyUsages extends AbstractJetFindUsagesTest { public void testAllFilesPresentInFindPropertyUsages() throws Exception { @@ -304,21 +322,41 @@ public class JetFindUsagesTestGenerated extends AbstractJetFindUsagesTest { doTest("idea/testData/findUsages/kotlin/findPropertyUsages/javaAndKotlinOverrides.0.kt"); } + @TestMetadata("javaAndKotlinOverrides2.0.kt") + public void testJavaAndKotlinOverrides2() throws Exception { + doTest("idea/testData/findUsages/kotlin/findPropertyUsages/javaAndKotlinOverrides2.0.kt"); + } + @TestMetadata("javaPropertyReadUsages.0.kt") public void testJavaPropertyReadUsages() throws Exception { doTest("idea/testData/findUsages/kotlin/findPropertyUsages/javaPropertyReadUsages.0.kt"); } + @TestMetadata("javaPropertyReadUsages2.0.kt") + public void testJavaPropertyReadUsages2() throws Exception { + doTest("idea/testData/findUsages/kotlin/findPropertyUsages/javaPropertyReadUsages2.0.kt"); + } + @TestMetadata("javaPropertyUsages.0.kt") public void testJavaPropertyUsages() throws Exception { doTest("idea/testData/findUsages/kotlin/findPropertyUsages/javaPropertyUsages.0.kt"); } + @TestMetadata("javaPropertyUsages2.0.kt") + public void testJavaPropertyUsages2() throws Exception { + doTest("idea/testData/findUsages/kotlin/findPropertyUsages/javaPropertyUsages2.0.kt"); + } + @TestMetadata("javaPropertyWriteUsages.0.kt") public void testJavaPropertyWriteUsages() throws Exception { doTest("idea/testData/findUsages/kotlin/findPropertyUsages/javaPropertyWriteUsages.0.kt"); } + @TestMetadata("javaPropertyWriteUsages2.0.kt") + public void testJavaPropertyWriteUsages2() throws Exception { + doTest("idea/testData/findUsages/kotlin/findPropertyUsages/javaPropertyWriteUsages2.0.kt"); + } + @TestMetadata("kotlinLocalPropertyUsages1.0.kt") public void testKotlinLocalPropertyUsages1() throws Exception { doTest("idea/testData/findUsages/kotlin/findPropertyUsages/kotlinLocalPropertyUsages1.0.kt"); @@ -334,21 +372,41 @@ public class JetFindUsagesTestGenerated extends AbstractJetFindUsagesTest { doTest("idea/testData/findUsages/kotlin/findPropertyUsages/kotlinPrivatePropertyUsages.0.kt"); } + @TestMetadata("kotlinPrivatePropertyUsages2.0.kt") + public void testKotlinPrivatePropertyUsages2() throws Exception { + doTest("idea/testData/findUsages/kotlin/findPropertyUsages/kotlinPrivatePropertyUsages2.0.kt"); + } + @TestMetadata("kotlinPropertyReadUsages.0.kt") public void testKotlinPropertyReadUsages() throws Exception { doTest("idea/testData/findUsages/kotlin/findPropertyUsages/kotlinPropertyReadUsages.0.kt"); } + @TestMetadata("kotlinPropertyReadUsages2.0.kt") + public void testKotlinPropertyReadUsages2() throws Exception { + doTest("idea/testData/findUsages/kotlin/findPropertyUsages/kotlinPropertyReadUsages2.0.kt"); + } + @TestMetadata("kotlinPropertyUsages.0.kt") public void testKotlinPropertyUsages() throws Exception { doTest("idea/testData/findUsages/kotlin/findPropertyUsages/kotlinPropertyUsages.0.kt"); } + @TestMetadata("kotlinPropertyUsages2.0.kt") + public void testKotlinPropertyUsages2() throws Exception { + doTest("idea/testData/findUsages/kotlin/findPropertyUsages/kotlinPropertyUsages2.0.kt"); + } + @TestMetadata("kotlinPropertyWriteUsages.0.kt") public void testKotlinPropertyWriteUsages() throws Exception { doTest("idea/testData/findUsages/kotlin/findPropertyUsages/kotlinPropertyWriteUsages.0.kt"); } + @TestMetadata("kotlinPropertyWriteUsages2.0.kt") + public void testKotlinPropertyWriteUsages2() throws Exception { + doTest("idea/testData/findUsages/kotlin/findPropertyUsages/kotlinPropertyWriteUsages2.0.kt"); + } + @TestMetadata("kotlinTopLevelPropertyUsages.0.kt") public void testKotlinTopLevelPropertyUsages() throws Exception { doTest("idea/testData/findUsages/kotlin/findPropertyUsages/kotlinTopLevelPropertyUsages.0.kt"); @@ -356,6 +414,24 @@ public class JetFindUsagesTestGenerated extends AbstractJetFindUsagesTest { } + @TestMetadata("idea/testData/findUsages/kotlin/findTypeParameterUsages") + public static class FindTypeParameterUsages extends AbstractJetFindUsagesTest { + public void testAllFilesPresentInFindTypeParameterUsages() throws Exception { + JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.GenerateTests", new File("idea/testData/findUsages/kotlin/findTypeParameterUsages"), Pattern.compile("^(.+)\\.0\\.kt$"), true); + } + + @TestMetadata("kotlinClassTypeParameterUsages.0.kt") + public void testKotlinClassTypeParameterUsages() throws Exception { + doTest("idea/testData/findUsages/kotlin/findTypeParameterUsages/kotlinClassTypeParameterUsages.0.kt"); + } + + @TestMetadata("kotlinFunctionTypeParameterUsages.0.kt") + public void testKotlinFunctionTypeParameterUsages() throws Exception { + doTest("idea/testData/findUsages/kotlin/findTypeParameterUsages/kotlinFunctionTypeParameterUsages.0.kt"); + } + + } + @TestMetadata("idea/testData/findUsages/kotlin/findWithFilteringImports") public static class FindWithFilteringImports extends AbstractJetFindUsagesTest { public void testAllFilesPresentInFindWithFilteringImports() throws Exception { @@ -388,7 +464,9 @@ public class JetFindUsagesTestGenerated extends AbstractJetFindUsagesTest { suite.addTestSuite(FindClassUsages.class); suite.addTestSuite(FindFunctionUsages.class); suite.addTestSuite(FindObjectUsages.class); + suite.addTestSuite(FindParameterUsages.class); suite.addTestSuite(FindPropertyUsages.class); + suite.addTestSuite(FindTypeParameterUsages.class); suite.addTestSuite(FindWithFilteringImports.class); suite.addTestSuite(UnresolvedAnnotation.class); return suite;