Skip to content

Commit 0294a40

Browse files
committed
feat: adjust logic
1 parent 3219310 commit 0294a40

File tree

3 files changed

+290
-233
lines changed

3 files changed

+290
-233
lines changed

jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ProjectCommand.java

Lines changed: 9 additions & 129 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@
4444
import org.eclipse.core.runtime.MultiStatus;
4545
import org.eclipse.core.runtime.OperationCanceledException;
4646
import org.eclipse.core.runtime.Path;
47-
import org.eclipse.jdt.core.IClasspathEntry;
4847
import org.eclipse.jdt.core.IJavaElement;
4948
import org.eclipse.jdt.core.IJavaProject;
5049
import org.eclipse.jdt.core.IMethod;
@@ -72,6 +71,7 @@
7271
import com.google.gson.GsonBuilder;
7372
import com.microsoft.jdtls.ext.core.parser.ContextResolver;
7473
import com.microsoft.jdtls.ext.core.parser.ContextResolver.ImportClassInfo;
74+
import com.microsoft.jdtls.ext.core.parser.ProjectResolver;
7575
import com.microsoft.jdtls.ext.core.model.PackageNode;
7676

7777
public final class ProjectCommand {
@@ -508,137 +508,17 @@ private static String getSeverityString(int severity) {
508508
* @return List of DependencyInfo containing key-value pairs of project information
509509
*/
510510
public static List<DependencyInfo> getProjectDependencies(List<Object> arguments, IProgressMonitor monitor) {
511-
List<DependencyInfo> result = new ArrayList<>();
512-
513511
if (arguments == null || arguments.isEmpty()) {
514-
return result;
512+
return new ArrayList<>();
515513
}
516514

517-
try {
518-
String projectUri = (String) arguments.get(0);
519-
IPath projectPath = ResourceUtils.canonicalFilePathFromURI(projectUri);
520-
521-
// Find the project
522-
IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
523-
IProject project = null;
524-
525-
for (IProject p : ProjectUtils.getAllProjects()) {
526-
if (p.getLocation() != null && p.getLocation().equals(projectPath)) {
527-
project = p;
528-
break;
529-
}
530-
}
531-
532-
if (project == null || !project.isAccessible()) {
533-
return result;
534-
}
535-
536-
IJavaProject javaProject = JavaCore.create(project);
537-
if (javaProject == null || !javaProject.exists()) {
538-
return result;
539-
}
540-
541-
// Add project name
542-
result.add(new DependencyInfo("projectName", project.getName()));
543-
544-
// Add project location
545-
if (project.getLocation() != null) {
546-
result.add(new DependencyInfo("projectLocation", project.getLocation().toOSString()));
547-
}
548-
549-
// Add JDK version
550-
String javaVersion = javaProject.getOption(JavaCore.COMPILER_COMPLIANCE, true);
551-
if (javaVersion != null) {
552-
result.add(new DependencyInfo("javaVersion", javaVersion));
553-
}
554-
555-
// Add source compatibility
556-
String sourceCompliance = javaProject.getOption(JavaCore.COMPILER_SOURCE, true);
557-
if (sourceCompliance != null) {
558-
result.add(new DependencyInfo("sourceCompatibility", sourceCompliance));
559-
}
560-
561-
// Add target compatibility
562-
String targetCompliance = javaProject.getOption(JavaCore.COMPILER_CODEGEN_TARGET_PLATFORM, true);
563-
if (targetCompliance != null) {
564-
result.add(new DependencyInfo("targetCompatibility", targetCompliance));
565-
}
566-
567-
// Add module name if it's a modular project
568-
String moduleName = getModuleName(javaProject);
569-
if (moduleName != null) {
570-
result.add(new DependencyInfo("moduleName", moduleName));
571-
}
572-
573-
// Get classpath entries (dependencies)
574-
try {
575-
IClasspathEntry[] classpathEntries = javaProject.getResolvedClasspath(true);
576-
int libCount = 0;
577-
int projectRefCount = 0;
578-
579-
for (IClasspathEntry entry : classpathEntries) {
580-
if (monitor.isCanceled()) {
581-
break;
582-
}
583-
584-
switch (entry.getEntryKind()) {
585-
case IClasspathEntry.CPE_LIBRARY:
586-
libCount++;
587-
IPath libPath = entry.getPath();
588-
if (libPath != null) {
589-
String libName = libPath.lastSegment();
590-
result.add(new DependencyInfo("library_" + libCount,
591-
libName + " (" + libPath.toOSString() + ")"));
592-
}
593-
break;
594-
case IClasspathEntry.CPE_PROJECT:
595-
projectRefCount++;
596-
IPath projectRefPath = entry.getPath();
597-
if (projectRefPath != null) {
598-
result.add(new DependencyInfo("projectReference_" + projectRefCount,
599-
projectRefPath.lastSegment()));
600-
}
601-
break;
602-
case IClasspathEntry.CPE_CONTAINER:
603-
String containerPath = entry.getPath().toString();
604-
if (containerPath.contains("JRE_CONTAINER")) {
605-
result.add(new DependencyInfo("jreContainerPath", containerPath));
606-
// Try to extract JRE name from container path
607-
try {
608-
IPath containerIPath = entry.getPath();
609-
String vmInstallName = JavaRuntime.getVMInstallName(containerIPath);
610-
if (vmInstallName != null) {
611-
result.add(new DependencyInfo("jreContainer", vmInstallName));
612-
}
613-
} catch (Exception e) {
614-
// Ignore if unable to get VM install name
615-
}
616-
} else if (containerPath.contains("MAVEN")) {
617-
result.add(new DependencyInfo("buildTool", "Maven"));
618-
} else if (containerPath.contains("GRADLE")) {
619-
result.add(new DependencyInfo("buildTool", "Gradle"));
620-
}
621-
break;
622-
}
623-
}
624-
625-
// Add summary counts
626-
result.add(new DependencyInfo("totalLibraries", String.valueOf(libCount)));
627-
result.add(new DependencyInfo("totalProjectReferences", String.valueOf(projectRefCount)));
628-
629-
} catch (JavaModelException e) {
630-
JdtlsExtActivator.logException("Error getting classpath entries", e);
631-
}
632-
633-
// Add build tool info by checking for build files
634-
if (project.getFile("pom.xml").exists()) {
635-
result.add(new DependencyInfo("buildTool", "Maven"));
636-
} else if (project.getFile("build.gradle").exists() || project.getFile("build.gradle.kts").exists()) {
637-
result.add(new DependencyInfo("buildTool", "Gradle"));
638-
}
639-
640-
} catch (Exception e) {
641-
JdtlsExtActivator.logException("Error in getProjectDependencies", e);
515+
String projectUri = (String) arguments.get(0);
516+
List<ProjectResolver.DependencyInfo> resolverResult = ProjectResolver.resolveProjectDependencies(projectUri, monitor);
517+
518+
// Convert ProjectResolver.DependencyInfo to ProjectCommand.DependencyInfo
519+
List<DependencyInfo> result = new ArrayList<>();
520+
for (ProjectResolver.DependencyInfo info : resolverResult) {
521+
result.add(new DependencyInfo(info.key, info.value));
642522
}
643523

644524
return result;

jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/parser/ContextResolver.java

Lines changed: 47 additions & 104 deletions
Original file line numberDiff line numberDiff line change
@@ -43,109 +43,26 @@ public class ContextResolver {
4343
private static final int MAX_STATIC_METHODS_TO_DISPLAY = 10;
4444
private static final int MAX_STATIC_FIELDS_TO_DISPLAY = 10;
4545

46-
// Common JDK types to skip (Copilot already has good understanding of these)
47-
// These are well-known classes that don't need to be extracted from JARs
48-
private static final Set<String> SKIP_COMMON_JDK_TYPES = new HashSet<>();
46+
// Common JDK packages to skip (Copilot already has good understanding of these)
47+
// These are well-known packages whose classes don't need to be extracted from JARs
48+
private static final Set<String> SKIP_COMMON_JDK_PACKAGES = new HashSet<>();
4949
static {
50-
// java.lang - fundamental types
51-
SKIP_COMMON_JDK_TYPES.add("java.lang.Object");
52-
SKIP_COMMON_JDK_TYPES.add("java.lang.String");
53-
SKIP_COMMON_JDK_TYPES.add("java.lang.Integer");
54-
SKIP_COMMON_JDK_TYPES.add("java.lang.Long");
55-
SKIP_COMMON_JDK_TYPES.add("java.lang.Double");
56-
SKIP_COMMON_JDK_TYPES.add("java.lang.Float");
57-
SKIP_COMMON_JDK_TYPES.add("java.lang.Boolean");
58-
SKIP_COMMON_JDK_TYPES.add("java.lang.Character");
59-
SKIP_COMMON_JDK_TYPES.add("java.lang.Byte");
60-
SKIP_COMMON_JDK_TYPES.add("java.lang.Short");
61-
SKIP_COMMON_JDK_TYPES.add("java.lang.Number");
62-
SKIP_COMMON_JDK_TYPES.add("java.lang.Void");
63-
SKIP_COMMON_JDK_TYPES.add("java.lang.Class");
64-
SKIP_COMMON_JDK_TYPES.add("java.lang.System");
65-
SKIP_COMMON_JDK_TYPES.add("java.lang.Math");
66-
SKIP_COMMON_JDK_TYPES.add("java.lang.Thread");
67-
SKIP_COMMON_JDK_TYPES.add("java.lang.Runnable");
68-
SKIP_COMMON_JDK_TYPES.add("java.lang.Exception");
69-
SKIP_COMMON_JDK_TYPES.add("java.lang.RuntimeException");
70-
SKIP_COMMON_JDK_TYPES.add("java.lang.Throwable");
71-
SKIP_COMMON_JDK_TYPES.add("java.lang.Error");
72-
73-
// java.util - collections
74-
SKIP_COMMON_JDK_TYPES.add("java.util.List");
75-
SKIP_COMMON_JDK_TYPES.add("java.util.ArrayList");
76-
SKIP_COMMON_JDK_TYPES.add("java.util.LinkedList");
77-
SKIP_COMMON_JDK_TYPES.add("java.util.Map");
78-
SKIP_COMMON_JDK_TYPES.add("java.util.HashMap");
79-
SKIP_COMMON_JDK_TYPES.add("java.util.LinkedHashMap");
80-
SKIP_COMMON_JDK_TYPES.add("java.util.TreeMap");
81-
SKIP_COMMON_JDK_TYPES.add("java.util.Set");
82-
SKIP_COMMON_JDK_TYPES.add("java.util.HashSet");
83-
SKIP_COMMON_JDK_TYPES.add("java.util.LinkedHashSet");
84-
SKIP_COMMON_JDK_TYPES.add("java.util.TreeSet");
85-
SKIP_COMMON_JDK_TYPES.add("java.util.Collection");
86-
SKIP_COMMON_JDK_TYPES.add("java.util.Iterator");
87-
SKIP_COMMON_JDK_TYPES.add("java.util.Queue");
88-
SKIP_COMMON_JDK_TYPES.add("java.util.Deque");
89-
SKIP_COMMON_JDK_TYPES.add("java.util.Stack");
90-
SKIP_COMMON_JDK_TYPES.add("java.util.Vector");
91-
SKIP_COMMON_JDK_TYPES.add("java.util.Optional");
92-
SKIP_COMMON_JDK_TYPES.add("java.util.Arrays");
93-
SKIP_COMMON_JDK_TYPES.add("java.util.Collections");
94-
SKIP_COMMON_JDK_TYPES.add("java.util.Comparator");
95-
96-
// java.io - I/O
97-
SKIP_COMMON_JDK_TYPES.add("java.io.File");
98-
SKIP_COMMON_JDK_TYPES.add("java.io.IOException");
99-
SKIP_COMMON_JDK_TYPES.add("java.io.InputStream");
100-
SKIP_COMMON_JDK_TYPES.add("java.io.OutputStream");
101-
SKIP_COMMON_JDK_TYPES.add("java.io.Reader");
102-
SKIP_COMMON_JDK_TYPES.add("java.io.Writer");
103-
SKIP_COMMON_JDK_TYPES.add("java.io.BufferedReader");
104-
SKIP_COMMON_JDK_TYPES.add("java.io.BufferedWriter");
105-
SKIP_COMMON_JDK_TYPES.add("java.io.FileReader");
106-
SKIP_COMMON_JDK_TYPES.add("java.io.FileWriter");
107-
SKIP_COMMON_JDK_TYPES.add("java.io.PrintWriter");
108-
SKIP_COMMON_JDK_TYPES.add("java.io.Serializable");
109-
110-
// java.nio - NIO
111-
SKIP_COMMON_JDK_TYPES.add("java.nio.file.Path");
112-
SKIP_COMMON_JDK_TYPES.add("java.nio.file.Paths");
113-
SKIP_COMMON_JDK_TYPES.add("java.nio.file.Files");
114-
SKIP_COMMON_JDK_TYPES.add("java.nio.ByteBuffer");
115-
116-
// java.time - Date/Time API
117-
SKIP_COMMON_JDK_TYPES.add("java.time.LocalDate");
118-
SKIP_COMMON_JDK_TYPES.add("java.time.LocalDateTime");
119-
SKIP_COMMON_JDK_TYPES.add("java.time.LocalTime");
120-
SKIP_COMMON_JDK_TYPES.add("java.time.Instant");
121-
SKIP_COMMON_JDK_TYPES.add("java.time.Duration");
122-
SKIP_COMMON_JDK_TYPES.add("java.time.Period");
123-
SKIP_COMMON_JDK_TYPES.add("java.time.ZonedDateTime");
124-
125-
// java.util.concurrent - Concurrency
126-
SKIP_COMMON_JDK_TYPES.add("java.util.concurrent.ExecutorService");
127-
SKIP_COMMON_JDK_TYPES.add("java.util.concurrent.Future");
128-
SKIP_COMMON_JDK_TYPES.add("java.util.concurrent.CompletableFuture");
129-
SKIP_COMMON_JDK_TYPES.add("java.util.concurrent.ConcurrentHashMap");
130-
131-
// java.util.stream - Streams
132-
SKIP_COMMON_JDK_TYPES.add("java.util.stream.Stream");
133-
SKIP_COMMON_JDK_TYPES.add("java.util.stream.Collectors");
134-
135-
// java.util.function - Functional interfaces
136-
SKIP_COMMON_JDK_TYPES.add("java.util.function.Function");
137-
SKIP_COMMON_JDK_TYPES.add("java.util.function.Consumer");
138-
SKIP_COMMON_JDK_TYPES.add("java.util.function.Supplier");
139-
SKIP_COMMON_JDK_TYPES.add("java.util.function.Predicate");
140-
141-
// java.net - Networking
142-
SKIP_COMMON_JDK_TYPES.add("java.net.URL");
143-
SKIP_COMMON_JDK_TYPES.add("java.net.URI");
144-
SKIP_COMMON_JDK_TYPES.add("java.net.HttpURLConnection");
145-
146-
// java.util.regex - Regular expressions
147-
SKIP_COMMON_JDK_TYPES.add("java.util.regex.Pattern");
148-
SKIP_COMMON_JDK_TYPES.add("java.util.regex.Matcher");
50+
// Core Java packages - Copilot has excellent understanding of these
51+
SKIP_COMMON_JDK_PACKAGES.add("java.lang"); // Object, String, Integer, etc.
52+
SKIP_COMMON_JDK_PACKAGES.add("java.util"); // Collections, List, Map, Set, etc.
53+
SKIP_COMMON_JDK_PACKAGES.add("java.io"); // File, InputStream, Reader, etc.
54+
SKIP_COMMON_JDK_PACKAGES.add("java.nio"); // ByteBuffer, etc.
55+
SKIP_COMMON_JDK_PACKAGES.add("java.nio.file"); // Path, Paths, Files
56+
SKIP_COMMON_JDK_PACKAGES.add("java.time"); // LocalDate, LocalDateTime, Instant, etc.
57+
SKIP_COMMON_JDK_PACKAGES.add("java.util.concurrent"); // ExecutorService, Future, CompletableFuture, etc.
58+
SKIP_COMMON_JDK_PACKAGES.add("java.util.stream"); // Stream, Collectors
59+
SKIP_COMMON_JDK_PACKAGES.add("java.util.function"); // Function, Consumer, Supplier, Predicate
60+
SKIP_COMMON_JDK_PACKAGES.add("java.net"); // URL, URI, HttpURLConnection
61+
SKIP_COMMON_JDK_PACKAGES.add("java.util.regex"); // Pattern, Matcher
62+
SKIP_COMMON_JDK_PACKAGES.add("java.math"); // BigDecimal, BigInteger
63+
SKIP_COMMON_JDK_PACKAGES.add("java.text"); // DateFormat, SimpleDateFormat, etc.
64+
SKIP_COMMON_JDK_PACKAGES.add("java.sql"); // Connection, ResultSet, etc.
65+
SKIP_COMMON_JDK_PACKAGES.add("javax.sql"); // DataSource, etc.
14966
}
15067

15168
/**
@@ -251,6 +168,32 @@ public static void resolveSingleType(IJavaProject javaProject, String typeName,
251168
}
252169
}
253170

171+
/**
172+
* Check if a type belongs to a common JDK package that should be skipped.
173+
* Uses package-level matching for efficient filtering.
174+
*
175+
* @param typeName Fully qualified type name (e.g., "java.lang.String")
176+
* @return true if the type is from a common JDK package
177+
*/
178+
private static boolean isCommonJdkType(String typeName) {
179+
if (typeName == null || typeName.isEmpty()) {
180+
return false;
181+
}
182+
183+
// Extract package name from fully qualified type name
184+
int lastDotIndex = typeName.lastIndexOf('.');
185+
if (lastDotIndex == -1) {
186+
return false; // No package (default package)
187+
}
188+
189+
String packageName = typeName.substring(0, lastDotIndex);
190+
191+
// Check if package matches any common JDK package
192+
// This includes both exact matches and sub-packages
193+
return SKIP_COMMON_JDK_PACKAGES.contains(packageName) ||
194+
SKIP_COMMON_JDK_PACKAGES.stream().anyMatch(pkg -> packageName.startsWith(pkg + "."));
195+
}
196+
254197
/**
255198
* Resolve a static import statement
256199
*/
@@ -418,9 +361,9 @@ public static void resolveBinaryType(IJavaProject javaProject, String typeName,
418361
return;
419362
}
420363

421-
// Performance optimization: Skip common JDK types that Copilot already understands well
364+
// Performance optimization: Skip common JDK packages that Copilot already understands well
422365
// This significantly reduces processing time for external dependencies
423-
if (SKIP_COMMON_JDK_TYPES.contains(typeName)) {
366+
if (isCommonJdkType(typeName)) {
424367
processedTypes.add(typeName);
425368
return;
426369
}

0 commit comments

Comments
 (0)