From 47764add2261781205dc24141f1f349f2d923fda Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Thu, 9 Feb 2012 21:47:20 +0400 Subject: [PATCH] Changed completion for 'iter' live template, now check is the same as used in checking real for loops. --- .../jetbrains/jet/compiler/TipsManager.java | 4 +-- .../macro/BaseJetVariableMacro.java | 36 ++++++++++--------- .../macro/JetAnyVariableMacro.java | 4 ++- .../macro/JetIterableVariableMacro.java | 30 +++------------- 4 files changed, 29 insertions(+), 45 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/jet/compiler/TipsManager.java b/compiler/backend/src/org/jetbrains/jet/compiler/TipsManager.java index fc967aff6b9..790a11c348d 100644 --- a/compiler/backend/src/org/jetbrains/jet/compiler/TipsManager.java +++ b/compiler/backend/src/org/jetbrains/jet/compiler/TipsManager.java @@ -76,8 +76,8 @@ public final class TipsManager { return Collections.emptyList(); } - private static Collection excludeNotCallableExtensions( - @NotNull Collection descriptors, @NotNull final JetScope scope + public static Collection excludeNotCallableExtensions( + @NotNull Collection descriptors, @NotNull final JetScope scope ) { final Set descriptorsSet = Sets.newHashSet(descriptors); diff --git a/idea/src/org/jetbrains/jet/plugin/liveTemplates/macro/BaseJetVariableMacro.java b/idea/src/org/jetbrains/jet/plugin/liveTemplates/macro/BaseJetVariableMacro.java index 6ffcfd19482..f9f969e5efc 100644 --- a/idea/src/org/jetbrains/jet/plugin/liveTemplates/macro/BaseJetVariableMacro.java +++ b/idea/src/org/jetbrains/jet/plugin/liveTemplates/macro/BaseJetVariableMacro.java @@ -13,6 +13,7 @@ import com.intellij.psi.PsiFile; import com.intellij.psi.PsiNamedElement; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.jet.compiler.TipsManager; import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; import org.jetbrains.jet.lang.descriptors.VariableDescriptor; import org.jetbrains.jet.lang.psi.*; @@ -20,10 +21,7 @@ import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.scopes.JetScope; import org.jetbrains.jet.plugin.compiler.WholeProjectAnalyzerFacade; -import java.util.ArrayList; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Set; +import java.util.*; /** * @author Evgeny Gerashchenko @@ -49,26 +47,30 @@ public abstract class BaseJetVariableMacro extends Macro { return null; } - List elements = new ArrayList(); - + List filteredDescriptors = new ArrayList(); for (DeclarationDescriptor declarationDescriptor : scope.getAllDescriptors()) { - if (declarationDescriptor instanceof VariableDescriptor && isSuitable((VariableDescriptor) declarationDescriptor)) { - PsiElement declaration = bc.get(BindingContext.DESCRIPTOR_TO_DECLARATION, declarationDescriptor); - assert declaration == null || declaration instanceof PsiNamedElement; - - if (declaration instanceof JetProperty) { - elements.add((JetProperty) declaration); - } - else if (declaration instanceof JetParameter) { - elements.add((JetParameter) declaration); + if (declarationDescriptor instanceof VariableDescriptor) { + VariableDescriptor variableDescriptor = (VariableDescriptor) declarationDescriptor; + if (isSuitable(variableDescriptor, scope, project)) { + filteredDescriptors.add(variableDescriptor); } } } - return elements.toArray(new JetNamedDeclaration[elements.size()]); + List declarations = new ArrayList(); + for (DeclarationDescriptor declarationDescriptor : TipsManager.excludeNotCallableExtensions(filteredDescriptors, scope)) { + PsiElement declaration = bc.get(BindingContext.DESCRIPTOR_TO_DECLARATION, declarationDescriptor); + assert declaration == null || declaration instanceof PsiNamedElement; + + if (declaration instanceof JetProperty || declaration instanceof JetParameter) { + declarations.add((JetNamedDeclaration) declaration); + } + } + + return declarations.toArray(new JetNamedDeclaration[declarations.size()]); } - protected abstract boolean isSuitable(@NotNull VariableDescriptor variableDescriptor); + protected abstract boolean isSuitable(@NotNull VariableDescriptor variableDescriptor, @NotNull JetScope scope, @NotNull Project project); @Nullable private static JetExpression findContextExpression(PsiFile psiFile, int startOffset) { diff --git a/idea/src/org/jetbrains/jet/plugin/liveTemplates/macro/JetAnyVariableMacro.java b/idea/src/org/jetbrains/jet/plugin/liveTemplates/macro/JetAnyVariableMacro.java index e18dd131326..0ed732b9fb1 100644 --- a/idea/src/org/jetbrains/jet/plugin/liveTemplates/macro/JetAnyVariableMacro.java +++ b/idea/src/org/jetbrains/jet/plugin/liveTemplates/macro/JetAnyVariableMacro.java @@ -1,7 +1,9 @@ package org.jetbrains.jet.plugin.liveTemplates.macro; +import com.intellij.openapi.project.Project; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.descriptors.VariableDescriptor; +import org.jetbrains.jet.lang.resolve.scopes.JetScope; import org.jetbrains.jet.plugin.JetBundle; /** @@ -20,7 +22,7 @@ public class JetAnyVariableMacro extends BaseJetVariableMacro { } @Override - protected boolean isSuitable(@NotNull VariableDescriptor variableDescriptor) { + protected boolean isSuitable(@NotNull VariableDescriptor variableDescriptor, @NotNull JetScope scope, @NotNull Project project) { return true; } } diff --git a/idea/src/org/jetbrains/jet/plugin/liveTemplates/macro/JetIterableVariableMacro.java b/idea/src/org/jetbrains/jet/plugin/liveTemplates/macro/JetIterableVariableMacro.java index 5de7c2b0141..a7c8618de4b 100644 --- a/idea/src/org/jetbrains/jet/plugin/liveTemplates/macro/JetIterableVariableMacro.java +++ b/idea/src/org/jetbrains/jet/plugin/liveTemplates/macro/JetIterableVariableMacro.java @@ -1,26 +1,17 @@ package org.jetbrains.jet.plugin.liveTemplates.macro; +import com.intellij.openapi.project.Project; import org.jetbrains.annotations.NotNull; -import org.jetbrains.jet.lang.descriptors.ClassifierDescriptor; import org.jetbrains.jet.lang.descriptors.VariableDescriptor; -import org.jetbrains.jet.lang.resolve.DescriptorUtils; -import org.jetbrains.jet.lang.types.JetType; -import org.jetbrains.jet.lang.types.TypeUtils; +import org.jetbrains.jet.lang.resolve.scopes.JetScope; +import org.jetbrains.jet.lang.types.expressions.ExpressionTypingUtils; import org.jetbrains.jet.plugin.JetBundle; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - /** * @author Evgeny Gerashchenko * @since 2/7/12 */ public class JetIterableVariableMacro extends BaseJetVariableMacro { - - private static final List ACCEPTED_FQ_NAMES = Arrays.asList( - "jet.Array", "java.lang.Iterable", ".java.lang.Iterable", "jet.Iterable"); - @Override public String getName() { return "kotlinIterableVariable"; @@ -32,18 +23,7 @@ public class JetIterableVariableMacro extends BaseJetVariableMacro { } @Override - protected boolean isSuitable(@NotNull VariableDescriptor variableDescriptor) { - // TODO more sophisticated check needed - - JetType outType = variableDescriptor.getOutType(); - List types = new ArrayList(TypeUtils.getAllSupertypes(outType)); - types.add(outType); - for (JetType type : types) { - ClassifierDescriptor declarationDescriptor = type.getConstructor().getDeclarationDescriptor(); - if (ACCEPTED_FQ_NAMES.contains(DescriptorUtils.getFQName(declarationDescriptor))) { - return true; - } - } - return false; + protected boolean isSuitable(@NotNull VariableDescriptor variableDescriptor, @NotNull JetScope scope, @NotNull Project project) { + return ExpressionTypingUtils.isVariableIterable(project, variableDescriptor, scope); } }