Idea "Extract variable" refactoring may change program behavior for classes with var-args used, like log4j

Answered

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.

0
1 comment

Hi. I have raised a ticket, please follow: https://youtrack.jetbrains.com/issue/IDEA-194701

0

Please sign in to leave a comment.