From 5b161d970dabfa33752e71207ca8b7e33fc67aea Mon Sep 17 00:00:00 2001 From: Maxim Medvedev Date: Fri, 1 Oct 2010 16:14:03 +0400 Subject: [PATCH] IDEA-59103 Groovy: IllegalArgumentException at GroovyParameterInfoHandler.updateUI() on viewing Parameter Info of parameterless method in chained methods calls --- .../plugins/groovy/annotator/GroovyAnnotator.java | 2 +- .../parameterInfo/GroovyParameterInfoHandler.java | 4 ++-- .../expressions/CompleteReferenceExpression.java | 7 +++---- .../plugins/groovy/lang/resolve/ResolveUtil.java | 15 +++++++++++++++ 4 files changed, 21 insertions(+), 7 deletions(-) diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/annotator/GroovyAnnotator.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/annotator/GroovyAnnotator.java index 006c1270dfd6..38e0c4f39bc6 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/annotator/GroovyAnnotator.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/annotator/GroovyAnnotator.java @@ -1394,7 +1394,7 @@ public class GroovyAnnotator extends GroovyElementVisitor implements Annotator { } if (argumentTypes != null && !PsiUtil.isApplicable(argumentTypes, method, methodResolveResult.getSubstitutor(), - methodResolveResult.getCurrentFileResolveContext() instanceof GrMethodCallExpression, place)) { + ResolveUtil.isInUseScope(methodResolveResult), place)) { //check for implicit use of property getter which returns closure if (GroovyPropertyUtils.isSimplePropertyGetter(method)) { diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/parameterInfo/GroovyParameterInfoHandler.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/parameterInfo/GroovyParameterInfoHandler.java index 13820441edee..7695e6b782d0 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/parameterInfo/GroovyParameterInfoHandler.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/parameterInfo/GroovyParameterInfoHandler.java @@ -152,7 +152,7 @@ public class GroovyParameterInfoHandler implements ParameterInfoHandler result = new ArrayList(candidates.length); for (GroovyResolveResult resolveResult : candidates) { - if (resolveResult.isStaticsOK() || resolveResult.getCurrentFileResolveContext() instanceof GrMethodCallExpression) { + if (resolveResult.isStaticsOK() || ResolveUtil.isInUseScope(resolveResult)) { result.add(resolveResult); } } @@ -261,11 +260,11 @@ public class CompleteReferenceExpression { PsiMethod method = (PsiMethod)element; String propName = null; PsiType propType = null; - if (isSimplePropertyGetter(method, null, resolveResult.getCurrentFileResolveContext() instanceof GrMethodCallExpression)) { + if (isSimplePropertyGetter(method, null, ResolveUtil.isInUseScope(resolveResult))) { propName = getPropertyNameByGetter(method); propType = PsiUtil.getSmartReturnType(method); } - else if (isSimplePropertySetter(method, null, resolveResult.getCurrentFileResolveContext() instanceof GrMethodCallExpression)) { + else if (isSimplePropertySetter(method, null, ResolveUtil.isInUseScope(resolveResult))) { propName = getPropertyName(method); propType = method.getParameterList().getParameters()[0].getType(); } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/resolve/ResolveUtil.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/resolve/ResolveUtil.java index 515a46cb8b3f..dac0feaaf054 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/resolve/ResolveUtil.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/resolve/ResolveUtil.java @@ -37,6 +37,7 @@ import org.jetbrains.plugins.groovy.lang.psi.api.statements.arguments.GrArgument import org.jetbrains.plugins.groovy.lang.psi.api.statements.blocks.GrClosableBlock; import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrApplicationStatement; import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrExpression; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrMethodCall; import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrReferenceExpression; import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.path.GrCallExpression; import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.path.GrMethodCallExpression; @@ -487,4 +488,18 @@ public class ResolveUtil { } return constructors; } + + public static boolean isInUseScope(GroovyResolveResult resolveResult) { + final GroovyPsiElement context = resolveResult.getCurrentFileResolveContext(); + if (context instanceof GrMethodCall) { + final GrExpression expression = ((GrMethodCall)context).getInvokedExpression(); + if (expression instanceof GrReferenceExpression) { + final PsiElement resolved = ((GrReferenceExpression)expression).resolve(); + if (resolved instanceof GrGdkMethod && "use".equals(((GrGdkMethod)resolved).getStaticMethod().getName())) { + return true; + } + } + } + return false; + } }