diff options
Diffstat (limited to 'org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/builder')
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) { |