Idea "Extract variable" refactoring may change program behavior for classes with var-args used, like log4j
I have no idea how to format code using this interface, so sorry about unformatted code. "```" doesn't work and UI doesn't have "code" button or something like this.
I've created such class
package com.olegvazhnev;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class IdeaRefactoringFail {
private static final Logger logger = LogManager.getLogger(IdeaRefactoringFail.class);
public static void main(String[] args) {
logger.error("Result of expensive calc is: {}", () -> doExpensiveCalc());
}
private static int doExpensiveCalc() {
return 100;
}
}
It prints:
23:45:26.765 [main] ERROR com.olegvazhnev.IdeaRefactoringFail - Result of expensive calc is: 100
Then I've used "Extract variable" Refactoring for "() -> doExpensiveCalc()"
Program after refactoring:
package com.olegvazhnev;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.util.Supplier;
public class IdeaRefactoringFail {
private static final Logger logger = LogManager.getLogger(IdeaRefactoringFail.class);
public static void main(String[] args) {
final Supplier<Object> objectSupplier = () -> doExpensiveCalc();
logger.error("Result of expensive calc is: {}", objectSupplier);
}
private static int doExpensiveCalc() {
return 100;
}
}
Output after refactoring:
23:46:53.948 [main] ERROR com.olegvazhnev.IdeaRefactoringFail - Result of expensive calc is: com.olegvazhnev.IdeaRefactoringFail$$Lambda$1/473581465@4e7dc304
I'm using latest version 2018.1.5
This is because logger class contains two methods:
void debug(String var1, Supplier... var2);
void debug(String var1, Object var2);
And (String, Supplier) args match (String, Object) version, not (String, Supplier...) version
log4j 2.6.2 was used
If I'm correct then I think Idea should prohibit "Extract variable" refactoring in such (rare) cases.
Please sign in to leave a comment.
Hi. I have raised a ticket, please follow: https://youtrack.jetbrains.com/issue/IDEA-194701