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

Open
timo-a opened this issue May 2, 2024 · 2 comments
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.

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
Status: Backlog
Development

No branches or pull requests

2 participants