From c6ba1713ac5f2fdbcc6c1a5f99e47bb7d2a1d108 Mon Sep 17 00:00:00 2001 From: Sergey Evdokimov Date: Tue, 6 Sep 2011 21:27:47 +0400 Subject: [PATCH] Bug fix: IDEA can not determinate type for synthetic parameter 'it' in validation closure. --- .../psi/AbstractClosureParameterEnhancer.java | 52 +++++++++---------- 1 file changed, 25 insertions(+), 27 deletions(-) diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/AbstractClosureParameterEnhancer.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/AbstractClosureParameterEnhancer.java index 044b52039a89..f264e0a7e32a 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/AbstractClosureParameterEnhancer.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/AbstractClosureParameterEnhancer.java @@ -1,54 +1,52 @@ package org.jetbrains.plugins.groovy.lang.psi; import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiPrimitiveType; import com.intellij.psi.PsiType; -import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrVariable; import org.jetbrains.plugins.groovy.lang.psi.api.statements.blocks.GrClosableBlock; import org.jetbrains.plugins.groovy.lang.psi.api.statements.params.GrParameter; import org.jetbrains.plugins.groovy.lang.psi.api.statements.params.GrParameterList; -import org.jetbrains.plugins.groovy.lang.psi.impl.statements.expressions.TypesUtil; import org.jetbrains.plugins.groovy.lang.psi.impl.synthetic.ClosureSyntheticParameter; -import java.util.Arrays; -import java.util.List; - /** * @author peter */ public abstract class AbstractClosureParameterEnhancer extends GrVariableEnhancer { @Override - public PsiType getVariableType(GrVariable variable) { + public final PsiType getVariableType(GrVariable variable) { if (!(variable instanceof GrParameter)) { return null; } - assert variable.isValid(); - GrClosableBlock closure = variable instanceof ClosureSyntheticParameter - ? ((ClosureSyntheticParameter)variable).getClosure() : findClosureWithArgument(variable.getParent()); - if (closure == null) { - return null; + GrClosableBlock closure; + int paramIndex; + + if (variable instanceof ClosureSyntheticParameter) { + closure = ((ClosureSyntheticParameter)variable).getClosure(); + paramIndex = 0; + } + else { + PsiElement eParameterList = variable.getParent(); + if (!(eParameterList instanceof GrParameterList)) return null; + + PsiElement eClosure = eParameterList.getParent(); + if (!(eClosure instanceof GrClosableBlock)) return null; + + closure = (GrClosableBlock)eClosure; + + GrParameterList parameterList = (GrParameterList)eParameterList; + paramIndex = parameterList.getParameterNumber((GrParameter)variable); } - assert closure.isValid(); + PsiType res = getClosureParameterType(closure, paramIndex); - List parameters = Arrays.asList(closure.getAllParameters()); - @SuppressWarnings({"SuspiciousMethodCalls"}) - int index = parameters.indexOf(variable); - assert index >= 0 : parameters + "; " + variable; - return TypesUtil.boxPrimitiveType(getClosureParameterType(closure, index), closure.getManager(), closure.getResolveScope()); - } - - @Nullable - private static GrClosableBlock findClosureWithArgument(@NotNull PsiElement parent) { - if (parent instanceof GrParameterList) { - GrParameterList list = (GrParameterList)parent; - if (list.getParent() instanceof GrClosableBlock) { - return (GrClosableBlock)list.getParent(); - } + if (res instanceof PsiPrimitiveType) { + return ((PsiPrimitiveType)res).getBoxedType(closure); } - return null; + + return res; } @Nullable