Skip to content

Commit 9b47a92

Browse files
committed
Prepare the coming
1 parent 2446845 commit 9b47a92

21 files changed

+292
-16
lines changed

CHANGES.MD

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ We adhere to the [keepachangelog](https://keepachangelog.com/en/1.0.0/) format
88
### Changes
99

1010
* `RemoveExplicitCallToSuper` now removes `super();` in constructor only if it is not the only statement.
11-
* Spotless licenseHeader default YearMode has been updated to UPDATE_TO_TODAY, as CleanThat generally behave as if `ratchetFrom` is the base branch
11+
* Spotless licenseHeader default YearMode has been updated to `UPDATE_TO_TODAY`, as CleanThat generally behave as if `ratchetFrom` is the base branch
1212

1313
### Fixed
1414

MUTATORS.generated.MD

+8
Original file line numberDiff line numberDiff line change
@@ -354,6 +354,14 @@ isDraft
354354

355355
languageLevel: jdk11
356356

357+
### [ImportQualifiedTokens](java/src/main/java/eu/solven/cleanthat/engine/java/refactorer/mutators/ImportQualifiedTokens.java)
358+
359+
Cleanthat own ID: ImportQualifiedTokens
360+
361+
isDraft
362+
363+
languageLevel: jdk1
364+
357365
### [JUnit4ToJUnit5](java/src/main/java/eu/solven/cleanthat/engine/java/refactorer/mutators/JUnit4ToJUnit5.java)
358366

359367
Cleanthat own ID: JUnit4ToJUnit5

MUTATORS_BY_TAG.generated.MD

+8
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
- [GuavaImmutableMapBuilderOverVarargs](java/src/main/java/eu/solven/cleanthat/engine/java/refactorer/mutators/GuavaImmutableMapBuilderOverVarargs.java)
4040
- [GuavaInlineStringsRepeat](java/src/main/java/eu/solven/cleanthat/engine/java/refactorer/mutators/GuavaInlineStringsRepeat.java)
4141
- [GuavaStringsIsNullOrEmpty](java/src/main/java/eu/solven/cleanthat/engine/java/refactorer/mutators/GuavaStringsIsNullOrEmpty.java)
42+
- [ImportQualifiedTokens](java/src/main/java/eu/solven/cleanthat/engine/java/refactorer/mutators/ImportQualifiedTokens.java)
4243
- [JUnit4ToJUnit5](java/src/main/java/eu/solven/cleanthat/engine/java/refactorer/mutators/JUnit4ToJUnit5.java)
4344
- [LambdaIsMethodReference](java/src/main/java/eu/solven/cleanthat/engine/java/refactorer/mutators/LambdaIsMethodReference.java)
4445
- [LambdaReturnsSingleStatement](java/src/main/java/eu/solven/cleanthat/engine/java/refactorer/mutators/LambdaReturnsSingleStatement.java)
@@ -81,6 +82,7 @@
8182
## ExplicitToImplicit
8283

8384
- [EmptyControlStatement](java/src/main/java/eu/solven/cleanthat/engine/java/refactorer/mutators/EmptyControlStatement.java)
85+
- [ImportQualifiedTokens](java/src/main/java/eu/solven/cleanthat/engine/java/refactorer/mutators/ImportQualifiedTokens.java)
8486
- [LocalVariableTypeInference](java/src/main/java/eu/solven/cleanthat/engine/java/refactorer/mutators/LocalVariableTypeInference.java)
8587
- [RemoveExplicitCallToSuper](java/src/main/java/eu/solven/cleanthat/engine/java/refactorer/mutators/RemoveExplicitCallToSuper.java)
8688
- [UnnecessaryFullyQualifiedName](java/src/main/java/eu/solven/cleanthat/engine/java/refactorer/mutators/UnnecessaryFullyQualifiedName.java)
@@ -96,6 +98,11 @@
9698
- [GuavaInlineStringsRepeat](java/src/main/java/eu/solven/cleanthat/engine/java/refactorer/mutators/GuavaInlineStringsRepeat.java)
9799
- [GuavaStringsIsNullOrEmpty](java/src/main/java/eu/solven/cleanthat/engine/java/refactorer/mutators/GuavaStringsIsNullOrEmpty.java)
98100

101+
## Import
102+
103+
- [ImportQualifiedTokens](java/src/main/java/eu/solven/cleanthat/engine/java/refactorer/mutators/ImportQualifiedTokens.java)
104+
- [UnnecessaryImport](java/src/main/java/eu/solven/cleanthat/engine/java/refactorer/mutators/UnnecessaryImport.java)
105+
99106
## Initialization
100107

101108
- [ForEachIfBreakToStreamFindFirst](java/src/main/java/eu/solven/cleanthat/engine/java/refactorer/mutators/ForEachIfBreakToStreamFindFirst.java)
@@ -275,6 +282,7 @@
275282
- [AvoidUncheckedExceptionsInSignatures](java/src/main/java/eu/solven/cleanthat/engine/java/refactorer/mutators/AvoidUncheckedExceptionsInSignatures.java)
276283
- [CastMathOperandsBeforeAssignement](java/src/main/java/eu/solven/cleanthat/engine/java/refactorer/mutators/CastMathOperandsBeforeAssignement.java)
277284
- [EmptyControlStatement](java/src/main/java/eu/solven/cleanthat/engine/java/refactorer/mutators/EmptyControlStatement.java)
285+
- [ImportQualifiedTokens](java/src/main/java/eu/solven/cleanthat/engine/java/refactorer/mutators/ImportQualifiedTokens.java)
278286
- [LiteralsFirstInComparisons](java/src/main/java/eu/solven/cleanthat/engine/java/refactorer/mutators/LiteralsFirstInComparisons.java)
279287
- [ModifierOrder](java/src/main/java/eu/solven/cleanthat/engine/java/refactorer/mutators/ModifierOrder.java)
280288
- [ObjectEqualsForPrimitives](java/src/main/java/eu/solven/cleanthat/engine/java/refactorer/mutators/ObjectEqualsForPrimitives.java)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
/*
2+
* Copyright 2023 Benoit Lacelle - SOLVEN
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package eu.solven.cleanthat.engine.java.refactorer.mutators;
17+
18+
import java.util.Set;
19+
20+
import com.google.common.collect.ImmutableSet;
21+
22+
import eu.solven.cleanthat.engine.java.IJdkVersionConstants;
23+
import eu.solven.cleanthat.engine.java.refactorer.ATodoJavaParserMutator;
24+
25+
/**
26+
* This will turn qualified names into imports.
27+
* <p>
28+
* One limitation is it will not qualify any import if current file has any wildcard import.
29+
*
30+
* @author Benoit Lacelle
31+
* @see UnnecessaryFullyQualifiedName
32+
* @see UnnecessaryImport
33+
*/
34+
public class ImportQualifiedTokens extends ATodoJavaParserMutator {
35+
36+
@Override
37+
public String minimalJavaVersion() {
38+
return IJdkVersionConstants.JDK_1;
39+
}
40+
41+
@Override
42+
public Set<String> getTags() {
43+
return ImmutableSet.of("ExplicitToImplicit", "Import");
44+
}
45+
46+
}

java/src/main/java/eu/solven/cleanthat/engine/java/refactorer/mutators/UnnecessaryFullyQualifiedName.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,8 @@
3535
import eu.solven.cleanthat.engine.java.refactorer.NodeAndSymbolSolver;
3636

3737
/**
38-
* Turns 'java.lang.String' into 'String'
38+
* Turns 'java.lang.String' into 'String' if already imported. See `UnnecessaryFullyQualifiedName` for a mutator adding
39+
* proper imports automatically.
3940
*
4041
* @author Benoit Lacelle
4142
*/

java/src/main/java/eu/solven/cleanthat/engine/java/refactorer/mutators/UnnecessaryImport.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ public String minimalJavaVersion() {
6565

6666
@Override
6767
public Set<String> getTags() {
68-
return ImmutableSet.of("ExplicitToImplicit");
68+
return ImmutableSet.of("ExplicitToImplicit", "Import");
6969
}
7070

7171
@Override

java/src/test/java/eu/solven/cleanthat/engine/java/refactorer/cases/do_not_format_me/TestEmptyControlStatementCases.java

-3
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,8 @@
88

99
import eu.solven.cleanthat.codeprovider.ICodeProvider;
1010
import eu.solven.cleanthat.engine.java.refactorer.annotations.CaseNotYetImplemented;
11-
import eu.solven.cleanthat.engine.java.refactorer.annotations.CompareCompilationUnitsAsStrings;
12-
import eu.solven.cleanthat.engine.java.refactorer.annotations.CompareInnerClasses;
1311
import eu.solven.cleanthat.engine.java.refactorer.annotations.CompareMethods;
1412
import eu.solven.cleanthat.engine.java.refactorer.annotations.UnmodifiedInnerClass;
15-
import eu.solven.cleanthat.engine.java.refactorer.annotations.UnmodifiedMethod;
1613
import eu.solven.cleanthat.engine.java.refactorer.meta.IJavaparserAstMutator;
1714
import eu.solven.cleanthat.engine.java.refactorer.mutators.EmptyControlStatement;
1815
import eu.solven.cleanthat.engine.java.refactorer.test.AJavaparserRefactorerCases;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
package eu.solven.cleanthat.engine.java.refactorer.cases.do_not_format_me;
2+
3+
import org.junit.jupiter.api.Disabled;
4+
5+
import eu.solven.cleanthat.engine.java.refactorer.annotations.CompareCompilationUnitsAsResources;
6+
import eu.solven.cleanthat.engine.java.refactorer.annotations.CompareCompilationUnitsAsStrings;
7+
import eu.solven.cleanthat.engine.java.refactorer.annotations.UnmodifiedCompilationUnitAsString;
8+
import eu.solven.cleanthat.engine.java.refactorer.meta.IJavaparserAstMutator;
9+
import eu.solven.cleanthat.engine.java.refactorer.mutators.ImportQualifiedTokens;
10+
import eu.solven.cleanthat.engine.java.refactorer.test.AJavaparserRefactorerCases;
11+
12+
@Disabled("TODO")
13+
public class TestImportQualifiedTokensCases extends AJavaparserRefactorerCases {
14+
static final String PREFIX = "source/do_not_format_me/ImportQualifiedTokens/";
15+
16+
@Override
17+
public IJavaparserAstMutator getTransformer() {
18+
return new ImportQualifiedTokens();
19+
}
20+
21+
@CompareCompilationUnitsAsResources(pre = PREFIX + "NoWildcardImport_IsImported_Pre.java",
22+
post = PREFIX + "NoWildcardImport_IsImported_Post.java")
23+
public static class NoWildcardImport_IsImported {
24+
}
25+
26+
@CompareCompilationUnitsAsResources(pre = PREFIX + "NoWildcardImport_IsNotImported_Pre.java",
27+
post = PREFIX + "NoWildcardImport_IsNotImported_Post.java")
28+
public static class NoWildcardImport_IsNotImported {
29+
}
30+
31+
// We do not turn `java.time.LocalDate` into `LocalDate` as there is an ambiguity in which package would import it
32+
@UnmodifiedCompilationUnitAsString(pre = "package eu.solven.cleanthat.engine.java.refactorer;\n" + "\n"
33+
+ "import java.time.*;\n"
34+
+ "import other.time.*;\n"
35+
+ "\n"
36+
+ "public class NoWildcardImport_IsNotImported_Pre {\n"
37+
+ " public static boolean isEmpty(java.time.LocalDate date) {\n"
38+
+ " return date.isLeapYear();\n"
39+
+ " }\n"
40+
+ "}\n")
41+
public static class WithWildcardImport {
42+
}
43+
44+
/**
45+
* A wildcard-import is present, which does not prevent to qualification.
46+
*/
47+
@CompareCompilationUnitsAsStrings(
48+
pre = "package eu.solven.cleanthat.engine.java.refactorer;\n" + "\n"
49+
+ "import static some.pkg.ImportedClass.*;\n"
50+
+ "\n"
51+
+ "public class NoWildcardImport_IsNotImported_Pre {\n"
52+
+ " public static boolean isLeapYear(java.time.LocalDate date) {\n"
53+
+ " return date.isLeapYear();\n"
54+
+ " }\n"
55+
+ "}\n",
56+
post = "package eu.solven.cleanthat.engine.java.refactorer;\n" + "\n"
57+
+ "import static some.pkg.ImportedClass.*;\n"
58+
+ "import static java.time.LocalDate;\n"
59+
+ "\n"
60+
+ "public class NoWildcardImport_IsNotImported_Pre {\n"
61+
+ " public static boolean isLeapYear(LocalDate date) {\n"
62+
+ " return date.isLeapYear();\n"
63+
+ " }\n"
64+
+ "}\n")
65+
public static class WithWildcardImport_qualify {
66+
}
67+
68+
/**
69+
* A fully qualified name may exist to prevent a conflict with a not-qualified same name.
70+
*
71+
* With a wildcard.
72+
*/
73+
@UnmodifiedCompilationUnitAsString(pre = "package eu.solven.cleanthat.engine.java.refactorer;\n" + "\n"
74+
+ "import static some.pkg.ImportedClass.*;\n"
75+
+ "\n"
76+
+ "public class NoWildcardImport_IsNotImported_Pre {\n"
77+
+ " public static boolean isLeapYearFromJavaTime(java.time.LocalDate date) {\n"
78+
+ " return date.isLeapYear();\n"
79+
+ " }\n"
80+
+ " public static boolean isLeapYearFromImportedClass(LocalDate date) {\n"
81+
+ " return date.isLeapYear();\n"
82+
+ " }\n"
83+
+ "}\n")
84+
public static class WithWildcardImport_conflictWithWildcard {
85+
}
86+
87+
/**
88+
* A fully qualified name may exist to prevent a conflict with a not-qualified same name.
89+
*
90+
* With a wildcard.
91+
*/
92+
@UnmodifiedCompilationUnitAsString(pre = "package eu.solven.cleanthat.engine.java.refactorer;\n" + "\n"
93+
+ "import static some.pkg.ImportedClass.LocalDate;\n"
94+
+ "\n"
95+
+ "public class NoWildcardImport_IsNotImported_Pre {\n"
96+
+ " public static boolean isLeapYearFromJavaTime(java.time.LocalDate date) {\n"
97+
+ " return date.isLeapYear();\n"
98+
+ " }\n"
99+
+ " public static boolean isLeapYearFromImportedClass(LocalDate date) {\n"
100+
+ " return date.isLeapYear();\n"
101+
+ " }\n"
102+
+ "}\n")
103+
public static class WithWildcardImport_conflictWithoutWildcard {
104+
}
105+
106+
/**
107+
* Nominal case where an import can be introduced. No wildcard is present.
108+
*/
109+
@CompareCompilationUnitsAsStrings(
110+
pre = "package eu.solven.cleanthat.engine.java.refactorer;\n" + "\n"
111+
+ "\n"
112+
+ "public class NoWildcardImport_IsNotImported_Pre {\n"
113+
+ " public static boolean isLeapYear(java.time.LocalDate date) {\n"
114+
+ " return date.isLeapYear();\n"
115+
+ " }\n"
116+
+ "}\n",
117+
post = "package eu.solven.cleanthat.engine.java.refactorer;\n" + "\n"
118+
+ "import static java.time.LocalDate;\n"
119+
+ "\n"
120+
+ "public class NoWildcardImport_IsNotImported_Pre {\n"
121+
+ " public static boolean isLeapYear(LocalDate date) {\n"
122+
+ " return date.isLeapYear();\n"
123+
+ " }\n"
124+
+ "}\n")
125+
public static class WithoutWildcardImport_qualify {
126+
}
127+
128+
}

java/src/test/java/eu/solven/cleanthat/engine/java/refactorer/cases/do_not_format_me/TestLambdaReturnsSingleStatementCases.java

+12
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,11 @@
66
import java.util.function.BiFunction;
77
import java.util.function.Consumer;
88
import java.util.function.Function;
9+
import java.util.stream.Stream;
910

1011
import org.assertj.core.api.Assertions;
1112
import org.junit.Ignore;
13+
import org.mockito.Mockito;
1214

1315
import eu.solven.cleanthat.codeprovider.ICodeProvider;
1416
import eu.solven.cleanthat.engine.java.refactorer.annotations.CompareMethods;
@@ -135,4 +137,14 @@ public Consumer<Integer> post() {
135137
return x -> System.out.println(x + 1);
136138
}
137139
}
140+
141+
@UnmodifiedMethod
142+
public static class CaseWithComment_2 {
143+
public void pre(Stream<String> stream) {
144+
stream.forEach(accountId -> {
145+
// inner comment
146+
System.out.println(accountId);
147+
});
148+
}
149+
}
138150
}

java/src/test/java/eu/solven/cleanthat/engine/java/refactorer/cases/do_not_format_me/TestLiteralsFirstInComparisonsCases.java

-2
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,6 @@
1111
import com.fasterxml.jackson.core.JsonFactory;
1212
import com.fasterxml.jackson.databind.ObjectMapper;
1313

14-
import eu.solven.cleanthat.engine.java.refactorer.annotations.CompareCompilationUnitsAsResources;
15-
import eu.solven.cleanthat.engine.java.refactorer.annotations.CompareCompilationUnitsAsStrings;
1614
import eu.solven.cleanthat.engine.java.refactorer.annotations.CompareMethods;
1715
import eu.solven.cleanthat.engine.java.refactorer.annotations.UnmodifiedCompilationUnitAsString;
1816
import eu.solven.cleanthat.engine.java.refactorer.annotations.UnmodifiedMethod;

java/src/test/java/eu/solven/cleanthat/engine/java/refactorer/cases/do_not_format_me/TestLocalVariableTypeInferenceCases.java

-3
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,10 @@
66
import java.util.List;
77
import java.util.Map;
88
import java.util.Optional;
9-
import java.util.concurrent.CopyOnWriteArrayList;
109
import java.util.function.Consumer;
1110
import java.util.function.Function;
1211
import java.util.stream.Collectors;
1312

14-
import com.google.common.collect.ImmutableList;
15-
1613
import eu.solven.cleanthat.codeprovider.ICodeProviderFile;
1714
import eu.solven.cleanthat.engine.java.refactorer.annotations.CompareMethods;
1815
import eu.solven.cleanthat.engine.java.refactorer.annotations.UnmodifiedCompilationUnitAsString;

java/src/test/java/eu/solven/cleanthat/engine/java/refactorer/cases/do_not_format_me/TestSimplifyBooleanInitializationCases.java

-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import java.util.List;
44

5-
import eu.solven.cleanthat.engine.java.refactorer.annotations.CaseNotYetImplemented;
65
import eu.solven.cleanthat.engine.java.refactorer.annotations.CompareMethods;
76
import eu.solven.cleanthat.engine.java.refactorer.meta.IJavaparserAstMutator;
87
import eu.solven.cleanthat.engine.java.refactorer.mutators.SimplifyBooleanInitialization;

java/src/test/java/eu/solven/cleanthat/engine/java/refactorer/cases/do_not_format_me/TestStreamMapIdentityCases.java

-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
import java.util.stream.Collectors;
77
import java.util.stream.IntStream;
88

9-
import eu.solven.cleanthat.engine.java.refactorer.annotations.CaseNotYetImplemented;
109
import eu.solven.cleanthat.engine.java.refactorer.annotations.CompareMethods;
1110
import eu.solven.cleanthat.engine.java.refactorer.annotations.UnmodifiedMethod;
1211
import eu.solven.cleanthat.engine.java.refactorer.meta.IJavaparserAstMutator;

java/src/test/java/eu/solven/cleanthat/engine/java/refactorer/cases/do_not_format_me/TestStringFromStringCases.java

-3
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,5 @@
11
package eu.solven.cleanthat.engine.java.refactorer.cases.do_not_format_me;
22

3-
import java.util.List;
4-
import java.util.stream.Collectors;
5-
63
import eu.solven.cleanthat.engine.java.refactorer.annotations.CompareMethods;
74
import eu.solven.cleanthat.engine.java.refactorer.annotations.UnmodifiedMethod;
85
import eu.solven.cleanthat.engine.java.refactorer.meta.IJavaparserAstMutator;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package eu.solven.cleanthat.engine.java.refactorer;
2+
3+
import java.time.*;
4+
import java.time.LocalDateTime;
5+
6+
public class NoWildcardImport_IsWildcardImported_Pre {
7+
public static boolean isLeapYear(LocalDate date) {
8+
return date.isLeapYear();
9+
}
10+
11+
public static LocalDateTime isEmpty(LocalDate date) {
12+
return date.atStartOfDay();
13+
}
14+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package eu.solven.cleanthat.engine.java.refactorer;
2+
3+
import java.time.LocalDate;
4+
import java.time.LocalDateTime;
5+
6+
public class NoWildcardImport_IsImported_Post {
7+
public static boolean isLeapYear(LocalDate date) {
8+
return date.isLeapYear();
9+
}
10+
11+
public static LocalDateTime isEmpty(LocalDate date) {
12+
return date.atStartOfDay();
13+
}
14+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package eu.solven.cleanthat.engine.java.refactorer;
2+
3+
import java.time.LocalDate;
4+
import java.time.LocalDateTime;
5+
6+
public class NoWildcardImport_IsImported_Pre {
7+
public static boolean isLeapYear(java.time.LocalDate date) {
8+
return date.isLeapYear();
9+
}
10+
11+
public static LocalDateTime isEmpty(LocalDate date) {
12+
return date.atStartOfDay();
13+
}
14+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package eu.solven.cleanthat.engine.java.refactorer;
2+
3+
import java.time.LocalDate;
4+
5+
public class NoWildcardImport_IsNotImported_Post {
6+
public static boolean isEmpty(LocalDate date) {
7+
return date.isLeapYear();
8+
}
9+
}

0 commit comments

Comments
 (0)