From 4905562b804485793a4dfb632cd10a122114bea5 Mon Sep 17 00:00:00 2001 From: "Egor.Ushakov" Date: Tue, 13 Jan 2015 13:37:37 +0300 Subject: [PATCH] IDEA-129869 Evaluating expression for FileSystem API varargs getPath method produces IllegalArgumentException --- .../expression/EvaluatorBuilderImpl.java | 7 ++-- .../expression/MethodEvaluator.java | 33 ++++++++++++++++--- 2 files changed, 34 insertions(+), 6 deletions(-) diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/EvaluatorBuilderImpl.java b/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/EvaluatorBuilderImpl.java index 85e0d4f2656c..be2204ea2224 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/EvaluatorBuilderImpl.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/EvaluatorBuilderImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2014 JetBrains s.r.o. + * Copyright 2000-2015 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. @@ -986,15 +986,18 @@ public class EvaluatorBuilderImpl implements EvaluatorBuilder { } boolean defaultInterfaceMethod = false; + boolean mustBeVararg = false; if (psiMethod != null) { processBoxingConversions(psiMethod.getParameterList().getParameters(), argExpressions, resolveResult.getSubstitutor(), argumentEvaluators); argumentEvaluators = wrapVarargs(psiMethod.getParameterList().getParameters(), argExpressions, resolveResult.getSubstitutor(), argumentEvaluators); defaultInterfaceMethod = psiMethod.hasModifierProperty(PsiModifier.DEFAULT); + mustBeVararg = psiMethod.isVarArgs(); } myResult = new MethodEvaluator(objectEvaluator, contextClass, methodExpr.getReferenceName(), - psiMethod != null ? JVMNameUtil.getJVMSignature(psiMethod) : null, argumentEvaluators, defaultInterfaceMethod); + psiMethod != null ? JVMNameUtil.getJVMSignature(psiMethod) : null, argumentEvaluators, + defaultInterfaceMethod, mustBeVararg); } @Override diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/MethodEvaluator.java b/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/MethodEvaluator.java index 80e42e3b61e2..d495f3d19d08 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/MethodEvaluator.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/MethodEvaluator.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2015 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. @@ -44,18 +44,30 @@ public class MethodEvaluator implements Evaluator { private final Evaluator[] myArgumentEvaluators; private final Evaluator myObjectEvaluator; private final boolean myCheckDefaultInterfaceMethod; + private final boolean myMustBeVararg; - public MethodEvaluator(Evaluator objectEvaluator, JVMName className, String methodName, JVMName signature, Evaluator[] argumentEvaluators) { - this(objectEvaluator, className, methodName, signature, argumentEvaluators, false); + public MethodEvaluator(Evaluator objectEvaluator, + JVMName className, + String methodName, + JVMName signature, + Evaluator[] argumentEvaluators) { + this(objectEvaluator, className, methodName, signature, argumentEvaluators, false, false); } - public MethodEvaluator(Evaluator objectEvaluator, JVMName className, String methodName, JVMName signature, Evaluator[] argumentEvaluators, boolean checkDefaultInterfaceMethod) { + public MethodEvaluator(Evaluator objectEvaluator, + JVMName className, + String methodName, + JVMName signature, + Evaluator[] argumentEvaluators, + boolean checkDefaultInterfaceMethod, + boolean mustBeVararg) { myObjectEvaluator = new DisableGC(objectEvaluator); myClassName = className; myMethodName = methodName; myMethodSignature = signature; myArgumentEvaluators = argumentEvaluators; myCheckDefaultInterfaceMethod = checkDefaultInterfaceMethod; + myMustBeVararg = mustBeVararg; } @Override @@ -147,6 +159,19 @@ public class MethodEvaluator implements Evaluator { } } } + else if (myMustBeVararg && jdiMethod != null && !jdiMethod.isVarArgs() && jdiMethod.isBridge()) { + // see IDEA-129869, avoid bridge methods for varargs + int retTypePos = signature.lastIndexOf(")"); + if (retTypePos >= 0) { + String signatureNoRetType = signature.substring(0, retTypePos + 1); + for (Method method : _refType.visibleMethods()) { + if (method.name().equals(myMethodName) && method.signature().startsWith(signatureNoRetType) && !method.isBridge() && !method.isAbstract()) { + jdiMethod = method; + break; + } + } + } + } if (jdiMethod == null) { throw EvaluateExceptionUtil.createEvaluateException(DebuggerBundle.message("evaluation.error.no.instance.method", methodName)); }