Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/builder')
-rw-r--r--org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/builder/ClasspathDirectory.java20
-rw-r--r--org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/builder/ClasspathJar.java33
-rw-r--r--org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/builder/ClasspathLocation.java4
-rw-r--r--org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/builder/ClasspathMultiDirectory.java31
-rw-r--r--org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/builder/ModulePathEntry.java12
-rw-r--r--org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/builder/NameEnvironment.java18
6 files changed, 102 insertions, 16 deletions
diff --git a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/builder/ClasspathDirectory.java b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/builder/ClasspathDirectory.java
index 3e01d29d8a..bffce17c78 100644
--- a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/builder/ClasspathDirectory.java
+++ b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/builder/ClasspathDirectory.java
@@ -14,10 +14,13 @@
package org.eclipse.jdt.internal.core.builder;
import java.io.IOException;
+import java.util.HashSet;
+import java.util.Set;
import java.util.function.Predicate;
import java.util.zip.ZipFile;
import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
@@ -254,4 +257,21 @@ public NameEnvironmentAnswer findClass(String typeName, String qualifiedPackageN
return findClass(typeName, qualifiedPackageName, moduleName, qualifiedBinaryFileName, false, null);
}
+@Override
+public char[][] listPackages() {
+ Set<String> packageNames = new HashSet<>();
+ IPath basePath = this.binaryFolder.getFullPath();
+ try {
+ this.binaryFolder.accept(r -> {
+ if (r instanceof IFile && SuffixConstants.EXTENSION_class.equals(r.getFileExtension().toLowerCase())) {
+ packageNames.add(r.getParent().getFullPath().makeRelativeTo(basePath).toString().replace('/', '.'));
+ }
+ return true;
+ });
+ } catch (CoreException e) {
+ Util.log(e, "Failed to scan packages of "+this.binaryFolder); //$NON-NLS-1$
+ }
+ return packageNames.stream().map(String::toCharArray).toArray(char[][]::new);
+}
+
}
diff --git a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/builder/ClasspathJar.java b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/builder/ClasspathJar.java
index 27c8f298b1..c03f8a1ffe 100644
--- a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/builder/ClasspathJar.java
+++ b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/builder/ClasspathJar.java
@@ -18,6 +18,7 @@ package org.eclipse.jdt.internal.core.builder;
import java.io.File;
import java.io.IOException;
+import java.util.Arrays;
import java.util.Date;
import java.util.Enumeration;
import java.util.function.Predicate;
@@ -323,13 +324,15 @@ public boolean isPackage(String qualifiedPackageName, String moduleName) {
}
@Override
public boolean hasCompilationUnit(String pkgName, String moduleName) {
- for (Enumeration<? extends ZipEntry> e = this.zipFile.entries(); e.hasMoreElements(); ) {
- String fileName = e.nextElement().getName();
- if (fileName.startsWith(pkgName)
- && fileName.toLowerCase().endsWith(SuffixConstants.SUFFIX_STRING_class)
- && fileName.indexOf('/', pkgName.length()+1) == -1)
- return true;
- }
+ if (scanContent()) {
+ for (Enumeration<? extends ZipEntry> e = this.zipFile.entries(); e.hasMoreElements(); ) {
+ String fileName = e.nextElement().getName();
+ if (fileName.startsWith(pkgName)
+ && fileName.toLowerCase().endsWith(SuffixConstants.SUFFIX_STRING_class)
+ && fileName.indexOf('/', pkgName.length()+1) == -1)
+ return true;
+ }
+ }
return false;
}
@@ -399,4 +402,20 @@ public Manifest getManifest() {
}
return null;
}
+@Override
+public char[][] listPackages() {
+ if (!scanContent()) // ensure zipFile is initialized
+ return null;
+ char[][] result = new char[this.knownPackageNames.elementSize][];
+ int count = 0;
+ for (int i=0; i<this.knownPackageNames.values.length; i++) {
+ String string = (String) this.knownPackageNames.values[i];
+ if (string != null &&!string.isEmpty()) {
+ result[count++] = string.replace('/', '.').toCharArray();
+ }
+ }
+ if (count < result.length)
+ return Arrays.copyOf(result, count);
+ return result;
+}
}
diff --git a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/builder/ClasspathLocation.java b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/builder/ClasspathLocation.java
index 52cd7e0c31..891aedec64 100644
--- a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/builder/ClasspathLocation.java
+++ b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/builder/ClasspathLocation.java
@@ -25,6 +25,7 @@ import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
+import org.eclipse.jdt.core.compiler.CharOperation;
import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;
import org.eclipse.jdt.internal.compiler.env.AccessRuleSet;
import org.eclipse.jdt.internal.compiler.env.IModule;
@@ -186,4 +187,7 @@ public char[][] singletonModuleNameIf(boolean condition) {
return new char[][] { this.module.name() };
return new char[][] { ModuleBinding.UNNAMED };
}
+public char[][] listPackages() {
+ return CharOperation.NO_CHAR_CHAR;
+}
}
diff --git a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/builder/ClasspathMultiDirectory.java b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/builder/ClasspathMultiDirectory.java
index 8137e61ea8..9c6865e4a6 100644
--- a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/builder/ClasspathMultiDirectory.java
+++ b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/builder/ClasspathMultiDirectory.java
@@ -82,12 +82,31 @@ String[] directoryList(String qualifiedPackageName) {
IResource[] members = ((IContainer) container).members();
dirList = new String[members.length];
int index = 0;
- for (int i = 0, l = members.length; i < l; i++) {
- IResource m = members[i];
- String name = m.getName();
- if (m.getType() == IResource.FILE && org.eclipse.jdt.internal.compiler.util.Util.isClassFileName(name)) {
- // add exclusion pattern check here if we want to hide .class files
- dirList[index++] = name;
+ if (members.length > 0) {
+ for (int i = 0, l = members.length; i < l; i++) {
+ IResource m = members[i];
+ String name = m.getName();
+ if (m.getType() == IResource.FILE && org.eclipse.jdt.internal.compiler.util.Util.isClassFileName(name)) {
+ // add exclusion pattern check here if we want to hide .class files
+ dirList[index++] = name;
+ }
+ }
+ } else {
+ container = this.sourceFolder.findMember(qualifiedPackageName);
+ if (container instanceof IContainer) {
+ members = ((IContainer) container).members();
+ if (members.length > 0) {
+ dirList = new String[members.length];
+ index = 0;
+ for (int i = 0, l = members.length; i < l; i++) {
+ IResource m = members[i];
+ String name = m.getName();
+ if (m.getType() == IResource.FILE && org.eclipse.jdt.internal.compiler.util.Util.isJavaFileName(name)) {
+ // FIXME: check if .java file has any declarations?
+ dirList[index++] = name;
+ }
+ }
+ }
}
}
if (index < dirList.length)
diff --git a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/builder/ModulePathEntry.java b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/builder/ModulePathEntry.java
index 61161cc2ea..f3332ed0b8 100644
--- a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/builder/ModulePathEntry.java
+++ b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/builder/ModulePathEntry.java
@@ -121,6 +121,18 @@ public class ModulePathEntry implements IModulePathEntry {
return false;
}
+ @Override
+ public char[][] listPackages() {
+ char[][] packages = CharOperation.NO_CHAR_CHAR;
+ if (this.isAutomaticModule) {
+ for (ClasspathLocation cp : this.locations) {
+ packages = CharOperation.arrayConcat(packages, cp.listPackages());
+ }
+ return packages;
+ }
+ return packages;
+ }
+
/**
* Combines an IMultiModuleEntry with further locations in order to support patch-module.
* Implemented by adding IMultiModuleEntry functionality to ModulePathEntry.
diff --git a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/builder/NameEnvironment.java b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/builder/NameEnvironment.java
index ba00f5f45c..d94b9ac094 100644
--- a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/builder/NameEnvironment.java
+++ b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/builder/NameEnvironment.java
@@ -561,8 +561,8 @@ public NameEnvironmentAnswer findType(char[] typeName, char[][] packageName, cha
}
@Override
-public char[][] getModulesDeclaringPackage(char[][] parentPackageName, char[] name, char[] moduleName) {
- String pkgName = new String(CharOperation.concatWith(parentPackageName, name, '/'));
+public char[][] getModulesDeclaringPackage(char[][] packageName, char[] moduleName) {
+ String pkgName = new String(CharOperation.concatWith(packageName, '/'));
String modName = new String(moduleName);
LookupStrategy strategy = LookupStrategy.get(moduleName);
switch (strategy) {
@@ -685,7 +685,19 @@ public boolean isPackage(String qualifiedPackageName, char[] moduleName) {
}
return false;
}
-
+@Override
+public char[][] listPackages(char[] moduleName) {
+ LookupStrategy strategy = LookupStrategy.get(moduleName);
+ switch (strategy) {
+ case Named:
+ IModulePathEntry entry = this.modulePathEntries.get(String.valueOf(moduleName));
+ if (entry == null)
+ return CharOperation.NO_CHAR_CHAR;
+ return entry.listPackages();
+ default:
+ throw new UnsupportedOperationException("can list packages only of a named module"); //$NON-NLS-1$
+ }
+}
void setNames(String[] typeNames, SourceFile[] additionalFiles) {
// convert the initial typeNames to a set
if (typeNames == null) {

Back to the top