Skip to content
Open
Show file tree
Hide file tree
Changes from 8 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -818,6 +818,8 @@ public J visitImport(ImportTree node, Space fmt) {
return new J.Import(randomId(), fmt, Markers.EMPTY,
new JLeftPadded<>(node.isStatic() ? sourceBefore("static") : EMPTY,
node.isStatic(), Markers.EMPTY),
new JLeftPadded<>(node.isModule() ? sourceBefore("module") : EMPTY,
node.isModule(), Markers.EMPTY),
convert(node.getQualifiedIdentifier()), null);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import org.openrewrite.Issue;
import org.openrewrite.java.MinimumJava25;
import org.openrewrite.test.RewriteTest;
import org.openrewrite.test.TypeValidation;

Expand Down Expand Up @@ -239,4 +240,130 @@ void semicolonAfterImports() {
)
);
}

@Issue("https://openjdk.org/jeps/511")
@MinimumJava25
@Test
void moduleImportBasic() {
rewriteRun(
java(
"""
import module java.base;

public class A {
String s = "test";
List<String> list;
}
"""
)
);
}

@Issue("https://openjdk.org/jeps/511")
@MinimumJava25
@Test
void moduleImportMultiple() {
rewriteRun(
java(
"""
import module java.base;
import module java.sql;

public class A {
Set<String> s;
Connection conn;
}
""",
spec -> spec.afterRecipe(cu -> assertThat(cu.getImports().stream()
.filter(J.Import::isModule)
.map(J.Import::getQualid)
.map(J.FieldAccess::toString))
.containsExactly(
"java.base",
"java.sql"
))
)
);
}

@Issue("https://openjdk.org/jeps/511")
@MinimumJava25
@Test
void moduleImportWithRegularImports() {
rewriteRun(
java(
"""
import module java.base;
import java.util.HashMap;
import static java.util.Collections.emptyList;

public class A {
String s;
HashMap<String, Integer> map;
List<String> list = emptyList();
}
"""
)
);
}

@Issue("https://openjdk.org/jeps/511")
@MinimumJava25
@Test
void moduleImportShadowing() {
rewriteRun(
java(
"""
import module java.base;
// List is ambiguous here because java.awt.List is also in java.base
import java.util.List;
import java.awt.*;

public class A {
List<Date> list;
Color color;
}
"""
)
);
}

@Issue("https://openjdk.org/jeps/511")
@MinimumJava25
@Test
void moduleImportAggregator() {
rewriteRun(
java(
"""
import module java.se;

public class A {
String s;
List<String> list;
Connection conn;
Path path;
}
"""
)
);
}

@Issue("https://openjdk.org/jeps/511")
@MinimumJava25
@Test
void moduleImportOrdering() {
rewriteRun(
java(
"""
import java.util.List;
import module java.base;
import static java.util.Collections.emptyList;
import module java.sql;
import java.util.*;

public class A {}
"""
)
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -716,6 +716,9 @@ public J visitImport(J.Import import_, PrintOutputCapture<P> p) {
if (import_.isStatic()) {
visitSpace(import_.getPadding().getStatic().getBefore(), Space.Location.STATIC_IMPORT, p);
p.append("static");
} else if (import_.isModule()) {
visitSpace(import_.getPadding().getModule().getBefore(), Space.Location.MODULE_IMPORT, p);
p.append("module");
}
visit(import_.getQualid(), p);
afterSyntax(import_, p);
Expand Down
37 changes: 33 additions & 4 deletions rewrite-java/src/main/java/org/openrewrite/java/tree/J.java
Original file line number Diff line number Diff line change
Expand Up @@ -2866,6 +2866,18 @@ public If withThenPart(JRightPadded<Statement> thenPart) {
@RequiredArgsConstructor
@AllArgsConstructor(access = AccessLevel.PRIVATE)
final class Import implements Statement, Comparable<Import> {

@JsonCreator
public Import(UUID id, Space prefix, Markers markers, JLeftPadded<Boolean> statik, FieldAccess qualid, @Nullable JLeftPadded<Identifier> alias) {
this.id = id;
this.prefix = prefix;
this.markers = markers;
this.statik = statik;
this.module = JLeftPadded.build(false);
this.qualid = qualid;
this.alias = alias;
}

@Nullable
@NonFinal
transient WeakReference<Padding> padding;
Expand All @@ -2884,6 +2896,7 @@ final class Import implements Statement, Comparable<Import> {
Markers markers;

JLeftPadded<Boolean> statik;
JLeftPadded<Boolean> module;

@With
@Getter
Expand All @@ -2900,6 +2913,14 @@ public Import withStatic(boolean statik) {
return getPadding().withStatic(this.statik.withElement(statik));
}

public boolean isModule() {
return module.getElement();
}

public Import withModule(boolean module) {
return getPadding().withModule(this.module.withElement(module));
}

public J.@Nullable Identifier getAlias() {
if (alias == null) {
return null;
Expand All @@ -2912,12 +2933,12 @@ public J.Import withAlias(J.@Nullable Identifier alias) {
if (alias == null) {
return this;
}
return new J.Import(null, id, prefix, markers, statik, qualid, JLeftPadded
return new J.Import(null, id, prefix, markers, statik, module, qualid, JLeftPadded
.build(alias)
.withBefore(Space.format(" ")));
}
if (alias == null) {
return new J.Import(null, id, prefix, markers, statik, qualid, null);
return new J.Import(null, id, prefix, markers, statik, module, qualid, null);
}
return getPadding().withAlias(this.alias.withElement(alias));
}
Expand Down Expand Up @@ -3071,15 +3092,23 @@ public JLeftPadded<Boolean> getStatic() {
}

public Import withStatic(JLeftPadded<Boolean> statik) {
return t.statik == statik ? t : new Import(t.id, t.prefix, t.markers, statik, t.qualid, t.alias);
return t.statik == statik ? t : new Import(t.id, t.prefix, t.markers, statik, t.module, t.qualid, t.alias);
}

public JLeftPadded<Boolean> getModule() {
return t.module;
}

public Import withModule(JLeftPadded<Boolean> module) {
return t.module == module ? t : new Import(t.id, t.prefix, t.markers, t.statik, module, t.qualid, t.alias);
}

public @Nullable JLeftPadded<J.Identifier> getAlias() {
return t.alias;
}

public Import withAlias(@Nullable JLeftPadded<J.Identifier> alias) {
return t.alias == alias ? t : new Import(t.id, t.prefix, t.markers, t.statik, t.qualid, alias);
return t.alias == alias ? t : new Import(t.id, t.prefix, t.markers, t.statik, t.module, t.qualid, alias);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -400,6 +400,7 @@ public enum Location {
METHOD_INVOCATION_PREFIX,
METHOD_SELECT_SUFFIX,
MODIFIER_PREFIX,
MODULE_IMPORT,
MULTI_CATCH_PREFIX,
NAMED_VARIABLE_SUFFIX,
NEW_ARRAY_INITIALIZER,
Expand Down