Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

OrderImports breaks the build by collapsing enum import + whitespace inconsistencies #4165

Closed
timo-a opened this issue May 2, 2024 · 8 comments
Assignees
Labels
bug Something isn't working test provided Already replicated with a unit test, using JUnit pioneer's ExpectedToFail

Comments

@timo-a
Copy link

timo-a commented May 2, 2024

What version of OpenRewrite are you using?

I am using

  • Maven/Gradle plugin v5.29.0

How are you running OpenRewrite?

I am using the Maven plugin, and my project is a single module project.

  <profiles>
    <profile>
      <id>openrewrite</id>
      <!-- `mvn -P openrewrite org.openrewrite.maven:rewrite-maven-plugin:run` -->
      <build>
        <plugins>
          <plugin>
            <groupId>org.openrewrite.maven</groupId>
            <artifactId>rewrite-maven-plugin</artifactId>
            <version>5.29.0</version>
            <configuration>
              <activeRecipes>
                <recipe>org.openrewrite.java.OrderImports</recipe>
              </activeRecipes>
              <activeStyles>
                <style>com.yourorg.JacksonImportStyle</style>
              </activeStyles>
              <failOnDryRunResults>true</failOnDryRunResults>
            </configuration>
            <dependencies>
              <dependency>
                <groupId>com.yourorg</groupId>
                <artifactId>rewrite-recipe-starter</artifactId>
                <version>0.1.0-SNAPSHOT</version>
              </dependency>
            </dependencies>
          </plugin>
        </plugins>
      </build>
    </profile>
  </profiles>

What is the smallest, simplest way to reproduce the problem?

This example is not minimal, but it is reproducible.

  1. Checkout timo-a/rewrite-recipe-starter@297e72f which adds a custom style:
    public static ImportLayoutStyle importLayout() {
        return ImportLayoutStyle.builder()
                .importAllOthers()
                .blankLine()
                .importPackage("com.fasterxml.jackson.core.*")
                .importPackage("tools.jackson.*")
                .blankLine()
                .importStaticAllOthers()
                .build();
    }
  1. publish this style locally with ./gradlew publishToMavenLocal
  2. checkout timo-a/jackson-core@4e44f2d
  3. run mvn -P openrewrite org.openrewrite.maven:rewrite-maven-plugin:run

What did you see?

this change set: timo-a/jackson-core@c2970c0

  1. Collapsing enum imports into a wildcard breaks the build.
import com.fasterxml.jackson.core.util.DefaultIndenter;
import com.fasterxml.jackson.core.util.DefaultPrettyPrinter;
import com.fasterxml.jackson.core.util.MinimalPrettyPrinter;
import com.fasterxml.jackson.core.util.Separators;
import com.fasterxml.jackson.core.util.Separators.Spacing;

are replaced with

import com.fasterxml.jackson.core.util.*;

in PrettyPrinterTest. As a consequence Spacing.NONE in line 271 can no longer be resolved. I don't know what issue the compiler has here, but apparently there is an edge case concerning enum imports. Other files are affected as well, but it is the same pattern there.

  1. extends on new line is indented
    Example: timo-a/jackson-core@c2970c0#diff-88fe5e2a29aa76eab8d3ec510f7aeb1ed3505a08c183f74e01543ff398ef7d0d
    The docs only speak of ordering imports:

Groups and orders import statements. If a style has been defined, this recipe will order the imports according to that style. If no style is detected, this recipe will default to ordering imports in the same way that IntelliJ IDEA does.

so this is unexpected.

  1. Unwanted blank lines
    Based on my style specification, I expect imports to be split in at most three groups: other, my explicitly defined package and static imports. However there is always (?) a blank line after java imports while not necessarily above it,
    example: timo-a/jackson-core@c2970c0#diff-fc3028f1ae776b0c8a46f8cacd73ecad36c879df456fb575d69ff48f5a2c3291

Are you interested in contributing a fix to OpenRewrite?

no, just reporting

@timo-a timo-a added the bug Something isn't working label May 2, 2024
@timtebeek timtebeek added the test provided Already replicated with a unit test, using JUnit pioneer's ExpectedToFail label May 3, 2024
@timtebeek
Copy link
Contributor

Hi! Thanks for reporting in such detail with reproduction samples; looking above this seems at least closely related to this issue:

Would you say those are the same case? Or do you think your use of a custom style factors in here as well?

What I like about that other issue is that we have a fairly simple unit test to replicate the issue there: #3283 (comment)
We just haven't yet gotten around to a fix of this particular issue, as it's hard to get to everything.

Do appreciate you calling this out! Definitely something we should fix to have a good experience running OrderImports.

@timo-a
Copy link
Author

timo-a commented May 6, 2024

Yeah, I think that PR is similar to my first observation.

@Laurens-W
Copy link
Contributor

@timo-a we have recently made some improvements to the RemoveImports recipe that might also have an effect on the problem you've described here. Could you re-evaluate whether the behavior you've described still occurs?

@timtebeek
Copy link
Contributor

Specifically, these changes were made just now, and are available in the latest snapshot ; a release will go out tomorrow:

@timo-a
Copy link
Author

timo-a commented Sep 13, 2024

I just had another look at it with rewrite-maven-plugin 5.40.2.
Observation 1:
still stands, but I managed to write a test case for it, see above, so you can verify this by yourselves in the future.
Observation 2:
extends on new line is still indented
Observation 3:
There are still unwanted lines, but maybe I am defining my style wrong?
needs to be examined first: timo-a/rewrite-recipe-starter#3

@timtebeek
Copy link
Contributor

Thanks a lot for the runnable test! That should really help pinpoint a cause and get it fixed. I've asked Laurens to have a look.

@timtebeek
Copy link
Contributor

@timo-a
Copy link
Author

timo-a commented Oct 3, 2024

Observation 3 has resolved itself, but observation 2 has not. I've opened #4548 as a reproducible example.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working test provided Already replicated with a unit test, using JUnit pioneer's ExpectedToFail
Projects
Archived in project
Development

Successfully merging a pull request may close this issue.

3 participants