From b47b6be577b9c9bb430a34c9c7f3b44b09c2cfbe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Kubitz?= Date: Mon, 20 Jan 2025 17:20:16 +0100 Subject: [PATCH] ClasspathMultiDirectory: cache the missing Package As in ClasspathDirectory. Reduces calls to Container.findMember(String) for example in org.eclipse.jdt.core.tests.model.ModuleBuilderTests.test008() --- .../jdt/internal/core/builder/ClasspathDirectory.java | 4 ++-- .../internal/core/builder/ClasspathMultiDirectory.java | 10 ++++++---- 2 files changed, 8 insertions(+), 6 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 7deb71ec64b..4d5f72a5760 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 @@ -108,8 +108,8 @@ String[] directoryList(String qualifiedPackageName) { try { IResource container = this.binaryFolder.findMember(qualifiedPackageName); // this is a case-sensitive check - if (container instanceof IContainer) { - IResource[] members = ((IContainer) container).members(); + if (container instanceof IContainer binaryContainer) { + IResource[] members = binaryContainer.members(); dirList = new String[members.length]; int index = 0; for (IResource m : members) { 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 664f3ab7831..c9854f7eb33 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 @@ -77,12 +77,13 @@ protected boolean isExcluded(IResource resource) { @Override String[] directoryList(String qualifiedPackageName) { String[] dirList = this.directoryCache.get(qualifiedPackageName); + if (dirList == this.missingPackageHolder) return null; // package exists in another classpath directory or jar if (dirList != null) return dirList; try { IResource container = this.binaryFolder.findMember(qualifiedPackageName); // this is a case-sensitive check - if (container instanceof IContainer) { - IResource[] members = ((IContainer) container).members(); + if (container instanceof IContainer binaryContainer) { + IResource[] members = binaryContainer.members(); dirList = new String[members.length]; int index = 0; boolean foundClass = false; @@ -99,8 +100,8 @@ String[] directoryList(String qualifiedPackageName) { } if(!foundClass) { container = this.sourceFolder.findMember(qualifiedPackageName); - if (container instanceof IContainer) { - members = ((IContainer) container).members(); + if (container instanceof IContainer sourceContainer) { + members = sourceContainer.members(); if (members.length > 0) { dirList = new String[members.length]; index = 0; @@ -123,6 +124,7 @@ String[] directoryList(String qualifiedPackageName) { } catch(CoreException ignored) { // ignore } + this.directoryCache.put(qualifiedPackageName, this.missingPackageHolder); return null; }