Skip to content

Commit c49c85f

Browse files
authored
[25] Merge BETA_JAVA25 into master
#2491
2 parents 1e844f8 + 2440202 commit c49c85f

17 files changed

Lines changed: 613 additions & 20 deletions

File tree

org.eclipse.jdt.core.manipulation/.settings/.api_filters

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,22 @@
88
</message_arguments>
99
</filter>
1010
</resource>
11+
<resource path="common/org/eclipse/jdt/core/manipulation/OrganizeImportsOperation.java" type="org.eclipse.jdt.core.manipulation.OrganizeImportsOperation">
12+
<filter comment="Use of import module modifiers" id="640712815">
13+
<message_arguments>
14+
<message_argument value="ImportDeclaration"/>
15+
<message_argument value="OrganizeImportsOperation"/>
16+
<message_argument value="getModifiers()"/>
17+
</message_arguments>
18+
</filter>
19+
<filter comment="Use of import module APIs" id="640712815">
20+
<message_arguments>
21+
<message_argument value="Modifier"/>
22+
<message_argument value="OrganizeImportsOperation"/>
23+
<message_argument value="isModule(int)"/>
24+
</message_arguments>
25+
</filter>
26+
</resource>
1127
<resource path="core extension/org/eclipse/jdt/internal/corext/dom/ASTFlattener.java" type="org.eclipse.jdt.internal.corext.dom.ASTFlattener">
1228
<filter comment="Java preview feature API" id="640712815">
1329
<message_arguments>

org.eclipse.jdt.core.manipulation/common/org/eclipse/jdt/core/manipulation/OrganizeImportsOperation.java

Lines changed: 81 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*******************************************************************************
2-
* Copyright (c) 2000, 2024 IBM Corporation and others.
2+
* Copyright (c) 2000, 2025 IBM Corporation and others.
33
*
44
* This program and the accompanying materials
55
* are made available under the terms of the Eclipse Public License 2.0
@@ -39,17 +39,21 @@
3939
import org.eclipse.jdt.core.ICompilationUnit;
4040
import org.eclipse.jdt.core.IJavaElement;
4141
import org.eclipse.jdt.core.IJavaProject;
42+
import org.eclipse.jdt.core.IModuleDescription;
4243
import org.eclipse.jdt.core.IPackageFragment;
4344
import org.eclipse.jdt.core.IPackageFragmentRoot;
4445
import org.eclipse.jdt.core.ISourceRange;
46+
import org.eclipse.jdt.core.IType;
4547
import org.eclipse.jdt.core.JavaModelException;
4648
import org.eclipse.jdt.core.Signature;
4749
import org.eclipse.jdt.core.SourceRange;
4850
import org.eclipse.jdt.core.compiler.IProblem;
51+
import org.eclipse.jdt.core.dom.AST;
4952
import org.eclipse.jdt.core.dom.ASTNode;
5053
import org.eclipse.jdt.core.dom.AbstractTypeDeclaration;
5154
import org.eclipse.jdt.core.dom.CompilationUnit;
5255
import org.eclipse.jdt.core.dom.IBinding;
56+
import org.eclipse.jdt.core.dom.IModuleBinding;
5357
import org.eclipse.jdt.core.dom.ITypeBinding;
5458
import org.eclipse.jdt.core.dom.ImportDeclaration;
5559
import org.eclipse.jdt.core.dom.MethodInvocation;
@@ -77,6 +81,7 @@
7781
import org.eclipse.jdt.internal.corext.util.JdtFlags;
7882
import org.eclipse.jdt.internal.corext.util.StaticImportFavoritesCompletionInvoker;
7983

84+
import org.eclipse.jdt.internal.ui.text.correction.proposals.AddImportCorrectionProposalCore;
8085

8186

8287
/**
@@ -220,6 +225,7 @@ public void addInfo(TypeNameMatch info) {
220225

221226
private Set<String> fOldSingleImports;
222227
private Set<String> fOldDemandImports;
228+
private Map<String, Set<String>> fOldModuleImports;
223229

224230
private Set<String> fImplicitImports;
225231

@@ -235,13 +241,16 @@ public void addInfo(TypeNameMatch info) {
235241

236242
private Map<String, UnresolvedTypeData> fUnresolvedTypes;
237243
private Set<String> fImportsAdded;
244+
private Set<String> fModuleImportsAdded;
238245
private TypeNameMatch[][] fOpenChoices;
239246
private SourceRange[] fSourceRanges;
240247

241248

242-
public TypeReferenceProcessor(Set<String> oldSingleImports, Set<String> oldDemandImports, CompilationUnit root, ImportRewrite impStructure, boolean ignoreLowerCaseNames, UnresolvableImportMatcher unresolvableImportMatcher) {
249+
public TypeReferenceProcessor(Set<String> oldSingleImports, Set<String> oldDemandImports, Map<String, Set<String>> oldModuleImports,
250+
CompilationUnit root, ImportRewrite impStructure, boolean ignoreLowerCaseNames, UnresolvableImportMatcher unresolvableImportMatcher) {
243251
fOldSingleImports= oldSingleImports;
244252
fOldDemandImports= oldDemandImports;
253+
fOldModuleImports= oldModuleImports;
245254
fImpStructure= impStructure;
246255
fDoIgnoreLowerCaseNames= ignoreLowerCaseNames;
247256
fUnresolvableImportMatcher= unresolvableImportMatcher;
@@ -253,11 +262,32 @@ public TypeReferenceProcessor(Set<String> oldSingleImports, Set<String> oldDeman
253262
fImplicitImports.add("java.lang"); //$NON-NLS-1$
254263
fImplicitImports.add(cu.getParent().getElementName());
255264

265+
if (root.getAST().apiLevel() >= AST.JLS25) {
266+
try {
267+
IType[] types= cu.getAllTypes();
268+
if (types.length > 0 && types[0].isImplicitlyDeclared()) {
269+
IJavaProject javaProject= cu.getJavaProject();
270+
if (javaProject != null) {
271+
IModuleDescription module= javaProject.findModule(AddImportCorrectionProposalCore.JAVA_BASE, cu.getOwner());
272+
if (module != null) {
273+
for (String packageName: module.getExportedPackageNames(null)) {
274+
fImplicitImports.add(packageName);
275+
}
276+
}
277+
}
278+
}
279+
} catch (JavaModelException e) {
280+
// ignore
281+
}
282+
}
283+
284+
256285
fAnalyzer= new ScopeAnalyzer(root);
257286

258287
fCurrPackage= (IPackageFragment) cu.getParent();
259288

260289
fImportsAdded= new HashSet<>();
290+
fModuleImportsAdded= new HashSet<>();
261291
fUnresolvedTypes= new HashMap<>();
262292
}
263293

@@ -323,6 +353,23 @@ public void add(SimpleName ref) {
323353
}
324354
typeBinding= typeBinding.getTypeDeclaration();
325355
if (!typeBinding.isRecovered()) {
356+
String qualifiedTypeName= typeBinding.getQualifiedName();
357+
if (qualifiedTypeName.indexOf('.') > 0) {
358+
String qualifier= qualifiedTypeName.substring(0, qualifiedTypeName.lastIndexOf('.'));
359+
Entry<String, Set<String>> entry= getModuleImportsEntryForQualifier(qualifier);
360+
if (entry != null) {
361+
if (fModuleImportsAdded.contains(entry.getKey())) {
362+
fImportsAdded.add(typeName);
363+
return;
364+
}
365+
fImpStructure.addModuleImport(entry.getKey(), new ArrayList<>(entry.getValue()));
366+
fModuleImportsAdded.add(entry.getKey());
367+
return;
368+
}
369+
if (fImplicitImports.contains(qualifier)) {
370+
return;
371+
}
372+
}
326373
if (needsImport(typeBinding, ref)) {
327374
fImpStructure.addImport(typeBinding);
328375
fImportsAdded.add(typeName);
@@ -408,7 +455,9 @@ private TypeNameMatch[] processTypeInfo(List<TypeNameMatch> typeRefsFound) {
408455
return null;
409456
} else if (nFound == 1) {
410457
TypeNameMatch typeRef= typeRefsFound.get(0);
411-
fImpStructure.addImport(typeRef.getFullyQualifiedName());
458+
if (getModuleImportsEntryForQualifier(typeRef.getTypeContainerName()) == null) {
459+
fImpStructure.addImport(typeRef.getFullyQualifiedName());
460+
}
412461
return null;
413462
} else {
414463
String typeToImport= null;
@@ -429,6 +478,8 @@ private TypeNameMatch[] processTypeInfo(List<TypeNameMatch> typeRefsFound) {
429478
} else { // more than one import-on-demand
430479
ambiguousImports= true;
431480
}
481+
} else if (getModuleImportsEntryForQualifier(containerName) != null) {
482+
return null; // we don't reimport
432483
}
433484
}
434485

@@ -441,6 +492,17 @@ private TypeNameMatch[] processTypeInfo(List<TypeNameMatch> typeRefsFound) {
441492
}
442493
}
443494

495+
private Entry<String, Set<String>> getModuleImportsEntryForQualifier(String qualifier) {
496+
for (Entry<String, Set<String>> entry : fOldModuleImports.entrySet()) {
497+
Set<String> packageNames= entry.getValue();
498+
if (packageNames.contains(qualifier)) {
499+
return entry;
500+
}
501+
}
502+
return null;
503+
}
504+
505+
444506
private boolean isOfKind(TypeNameMatch curr, int typeKinds) {
445507
int flags= curr.getModifiers();
446508
if (Flags.isAnnotation(flags)) {
@@ -587,10 +649,11 @@ public TextEdit createTextEdit(IProgressMonitor m) throws CoreException, Operati
587649

588650
Set<String> oldSingleImports= new HashSet<>();
589651
Set<String> oldDemandImports= new HashSet<>();
652+
Map<String, Set<String>> oldModulePackages= new HashMap<>();
590653
List<SimpleName> typeReferences= new ArrayList<>();
591654
List<SimpleName> staticReferences= new ArrayList<>();
592655

593-
if (!collectReferences(astRoot, typeReferences, staticReferences, oldSingleImports, oldDemandImports))
656+
if (!collectReferences(astRoot, typeReferences, staticReferences, oldSingleImports, oldDemandImports, oldModulePackages))
594657
return null;
595658

596659
subMonitor.split(1);
@@ -600,6 +663,7 @@ public TextEdit createTextEdit(IProgressMonitor m) throws CoreException, Operati
600663
TypeReferenceProcessor processor= new TypeReferenceProcessor(
601664
oldSingleImports,
602665
oldDemandImports,
666+
oldModulePackages,
603667
astRoot,
604668
importsRewrite,
605669
fIgnoreLowerCaseNames,
@@ -650,6 +714,7 @@ private void determineImportDifferences(ImportRewrite importsStructure, Set<Stri
650714
List<String> importsAdded= new ArrayList<>(importsStructure.getCreatedImports().length + importsStructure.getCreatedStaticImports().length);
651715
importsAdded.addAll(Arrays.asList(importsStructure.getCreatedImports()));
652716
importsAdded.addAll(Arrays.asList(importsStructure.getCreatedStaticImports()));
717+
importsAdded.addAll(Arrays.asList(importsStructure.getCreatedModuleImports()));
653718

654719
for (Object element : oldSingleImports.toArray()) {
655720
String importName= (String) element;
@@ -734,7 +799,8 @@ private void addStaticImports(
734799

735800

736801
// find type references in a compilation unit
737-
private boolean collectReferences(CompilationUnit astRoot, List<SimpleName> typeReferences, List<SimpleName> staticReferences, Set<String> oldSingleImports, Set<String> oldDemandImports) {
802+
private boolean collectReferences(CompilationUnit astRoot, List<SimpleName> typeReferences, List<SimpleName> staticReferences, Set<String> oldSingleImports,
803+
Set<String> oldDemandImports, Map<String, Set<String>> oldModuleImports) {
738804
if (!fAllowSyntaxErrors) {
739805
for (IProblem curr : astRoot.getProblems()) {
740806
if (curr.isError() && (curr.getID() & IProblem.Syntax) != 0) {
@@ -744,16 +810,24 @@ private boolean collectReferences(CompilationUnit astRoot, List<SimpleName> type
744810
}
745811
}
746812
List<ImportDeclaration> imports= astRoot.imports();
813+
IJavaProject project= fCompilationUnit.getJavaProject();
747814
for (ImportDeclaration curr : imports) {
748815
String id= ASTResolving.getFullName(curr.getName());
749-
if (curr.isOnDemand()) {
816+
if (Modifier.isModule(curr.getModifiers())) {
817+
Set<String> oldModulePackages= new HashSet<>();
818+
oldModuleImports.put(id, oldModulePackages);
819+
if (curr.resolveBinding() instanceof IModuleBinding binding) {
820+
List<String> exportedPackageNames=
821+
ImportRewrite.getPackageNamesForModule(binding, project);
822+
oldModulePackages.addAll(exportedPackageNames);
823+
}
824+
} else if (curr.isOnDemand()) {
750825
oldDemandImports.add(id);
751826
} else {
752827
oldSingleImports.add(id);
753828
}
754829
}
755830

756-
IJavaProject project= fCompilationUnit.getJavaProject();
757831
ImportReferencesCollector.collect(astRoot, project, null, typeReferences, staticReferences);
758832

759833
return true;

org.eclipse.jdt.core.manipulation/common/org/eclipse/jdt/internal/ui/text/correction/proposals/AddImportCorrectionProposalCore.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535

3636
public class AddImportCorrectionProposalCore extends ASTRewriteCorrectionProposalCore {
3737

38-
static String JAVA_BASE= "java.base"; //$NON-NLS-1$
38+
public static final String JAVA_BASE= "java.base"; //$NON-NLS-1$
3939

4040
private final String fTypeName;
4141

org.eclipse.jdt.core.manipulation/core extension/org/eclipse/jdt/internal/corext/codemanipulation/ContextSensitiveImportRewriteContext.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*******************************************************************************
2-
* Copyright (c) 2000, 2018 IBM Corporation and others.
2+
* Copyright (c) 2000, 2025 IBM Corporation and others.
33
*
44
* This program and the accompanying materials
55
* are made available under the terms of the Eclipse Public License 2.0
@@ -35,9 +35,9 @@
3535
import org.eclipse.jdt.core.dom.NodeFinder;
3636
import org.eclipse.jdt.core.dom.SimpleName;
3737
import org.eclipse.jdt.core.dom.rewrite.ImportRewrite;
38+
import org.eclipse.jdt.core.dom.rewrite.ImportRewrite.ImportRewriteContext;
3839
import org.eclipse.jdt.core.dom.rewrite.ImportRewrite.TypeLocation;
3940
import org.eclipse.jdt.core.manipulation.ImportReferencesCollector;
40-
import org.eclipse.jdt.core.dom.rewrite.ImportRewrite.ImportRewriteContext;
4141

4242
import org.eclipse.jdt.internal.corext.dom.ScopeAnalyzer;
4343
import org.eclipse.jdt.internal.corext.util.JavaModelUtil;
@@ -137,6 +137,15 @@ public int findInContext(String qualifier, String name, int kind) {
137137
}
138138
}
139139

140+
// check if qualifier matches a package provided by an import module statement
141+
for (String moduleName : fImportRewrite.getAddedModuleImports()) {
142+
for (String packageName : fImportRewrite.getAddedModuleExportedPackages(moduleName)) {
143+
if (qualifier.equals(packageName)) {
144+
return RES_NAME_FOUND;
145+
}
146+
}
147+
}
148+
140149
String qualifiedName= JavaModelUtil.concatenateName(qualifier, name);
141150
for (String addedImport : fImportRewrite.getAddedImports()) {
142151
if (qualifiedName.equals(addedImport)) {

org.eclipse.jdt.core.manipulation/core extension/org/eclipse/jdt/internal/corext/util/JavaModelUtil.java

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ public final class JavaModelUtil {
7676
*/
7777
public static final String VERSION_LATEST;
7878
static {
79-
VERSION_LATEST= JavaCore.VERSION_24; // make sure it is not inlined
79+
VERSION_LATEST= JavaCore.VERSION_25; // make sure it is not inlined
8080
}
8181

8282
public static final int VALIDATE_EDIT_CHANGED_CONTENT= 10003;
@@ -851,6 +851,10 @@ public static boolean is24OrHigher(String compliance) {
851851
return !isVersionLessThan(compliance, JavaCore.VERSION_24);
852852
}
853853

854+
public static boolean is25OrHigher(String compliance) {
855+
return !isVersionLessThan(compliance, JavaCore.VERSION_25);
856+
}
857+
854858
/**
855859
* Checks if the given project or workspace has source compliance 9 or greater.
856860
*
@@ -1017,6 +1021,17 @@ public static boolean is24OrHigher(IJavaProject project) {
10171021
return is24OrHigher(getSourceCompliance(project));
10181022
}
10191023

1024+
/**
1025+
* Checks if the given project or workspace has source compliance 25 or greater.
1026+
*
1027+
* @param project the project to test or <code>null</code> to test the workspace settings
1028+
* @return <code>true</code> if the given project or workspace has source compliance 25 or
1029+
* greater.
1030+
*/
1031+
public static boolean is25OrHigher(IJavaProject project) {
1032+
return is25OrHigher(getSourceCompliance(project));
1033+
}
1034+
10201035
public static String getSourceCompliance(IJavaProject project) {
10211036
return project != null ? project.getOption(JavaCore.COMPILER_SOURCE, true) : JavaCore.getOption(JavaCore.COMPILER_SOURCE);
10221037
}
@@ -1042,6 +1057,8 @@ public static String getCompilerCompliance(IVMInstall2 vMInstall, String default
10421057
String version= vMInstall.getJavaVersion();
10431058
if (version == null) {
10441059
return defaultCompliance;
1060+
} else if (version.startsWith(JavaCore.VERSION_25)) {
1061+
return JavaCore.VERSION_25;
10451062
} else if (version.startsWith(JavaCore.VERSION_24)) {
10461063
return JavaCore.VERSION_24;
10471064
} else if (version.startsWith(JavaCore.VERSION_23)) {
@@ -1094,7 +1111,9 @@ public static String getExecutionEnvironmentCompliance(IExecutionEnvironment exe
10941111

10951112
// fallback:
10961113
String desc= executionEnvironment.getId();
1097-
if (desc.indexOf(JavaCore.VERSION_24) != -1) {
1114+
if (desc.indexOf(JavaCore.VERSION_25) != -1) {
1115+
return JavaCore.VERSION_25;
1116+
} else if (desc.indexOf(JavaCore.VERSION_24) != -1) {
10981117
return JavaCore.VERSION_24;
10991118
} else if (desc.indexOf(JavaCore.VERSION_23) != -1) {
11001119
return JavaCore.VERSION_23;

org.eclipse.jdt.text.tests/src/org/eclipse/jdt/text/tests/Java24SemanticHighlightingTest.java renamed to org.eclipse.jdt.text.tests/src/org/eclipse/jdt/text/tests/Java25SemanticHighlightingTest.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,14 @@
2121

2222
import org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlightingsCore;
2323

24-
public class Java24SemanticHighlightingTest extends AbstractSemanticHighlightingTest {
24+
public class Java25SemanticHighlightingTest extends AbstractSemanticHighlightingTest {
2525

2626
@RegisterExtension
27-
public SemanticHighlightingTestSetup shts= new SemanticHighlightingTestSetup( "/SHTest/src/Java24.java");
27+
public SemanticHighlightingTestSetup shts= new SemanticHighlightingTestSetup( "/SHTest/src/Java25.java");
2828

2929
@BeforeEach
3030
public void updateCompliance() {
31-
shts.updateCompliance("24", true);
31+
shts.updateCompliance("25", false);
3232
}
3333

3434
@Test

org.eclipse.jdt.text.tests/src/org/eclipse/jdt/text/tests/JdtTextTestSuite.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@
5656
SemanticHighlightingTest.class,
5757
SemanticTokensProviderTest.class,
5858
AutoboxingSemanticHighlightingTest.class,
59-
Java24SemanticHighlightingTest.class,
59+
Java25SemanticHighlightingTest.class,
6060
NewForLoopJavaContextTest.class,
6161
IteratorForLoopJavaContextTest.class,
6262
ArrayWithTempVarForLoopJavaContextTest.class,

org.eclipse.jdt.text.tests/testResources/semanticHighlightingTest1/Java24.java renamed to org.eclipse.jdt.text.tests/testResources/semanticHighlightingTest1/Java25.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import module java.base;
22

3-
public class Java24 {
3+
public class Java25 {
44
sealed record SampleRecord(String left, String right) {
55

66
}

0 commit comments

Comments
 (0)