openrewrite / rewrite

Automated mass refactoring of source code.
https://docs.openrewrite.org
Apache License 2.0
2.03k stars 300 forks source link

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

Open timo-a opened 2 months ago

timo-a commented 2 months ago

What version of OpenRewrite are you using?

I am using

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 https://github.com/timo-a/rewrite-recipe-starter/commit/297e72f259f17cae8d62dd7c29b8481f426a37ca 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 https://github.com/timo-a/jackson-core/commit/4e44f2d2ca9b98f8fd2d094d9982b793ddf60121
  3. run mvn -P openrewrite org.openrewrite.maven:rewrite-maven-plugin:run

What did you see?

this change set: https://github.com/timo-a/jackson-core/commit/c2970c0192090c3cb35f7bd32332d5dd49cde76f

  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.

  2. extends on new line is indented Example: https://github.com/timo-a/jackson-core/commit/c2970c0192090c3cb35f7bd32332d5dd49cde76f#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: https://github.com/timo-a/jackson-core/commit/c2970c0192090c3cb35f7bd32332d5dd49cde76f#diff-fc3028f1ae776b0c8a46f8cacd73ecad36c879df456fb575d69ff48f5a2c3291

Are you interested in contributing a fix to OpenRewrite?

no, just reporting

timtebeek commented 2 months ago

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: https://github.com/openrewrite/rewrite/issues/3283#issuecomment-1927091821 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 commented 2 months ago

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