@@ -152,17 +152,13 @@ public String getMessage() {
152152 }
153153
154154 /**
155- * Error context information for ImportClassContent operations
155+ * Error context information for operations
156156 */
157157 public static class ErrorContext {
158- public final String uri ; // Original URI from arguments
159- public final String parsedPath ; // Parsed file path (if successful)
160- public final String projectName ; // Project name (if found)
158+ public final String errorValue ; // The value that caused the error (e.g., invalid URI, null parsedPath, etc.)
161159
162- public ErrorContext (String uri , String parsedPath , String projectName ) {
163- this .uri = uri ;
164- this .parsedPath = parsedPath ;
165- this .projectName = projectName ;
160+ public ErrorContext (String errorValue ) {
161+ this .errorValue = errorValue ;
166162 }
167163 }
168164
@@ -189,11 +185,11 @@ public ImportClassContentResult(ImportClassContentErrorReason errorReason) {
189185 this .errorContext = null ;
190186 }
191187
192- public ImportClassContentResult (ImportClassContentErrorReason errorReason , String uri , String parsedPath , String projectName ) {
188+ public ImportClassContentResult (ImportClassContentErrorReason errorReason , String errorValue ) {
193189 this .classInfoList = Collections .emptyList ();
194190 this .emptyReason = errorReason .getMessage ();
195191 this .isEmpty = true ;
196- this .errorContext = new ErrorContext (uri , parsedPath , projectName );
192+ this .errorContext = new ErrorContext (errorValue );
197193 }
198194 }
199195
@@ -220,11 +216,11 @@ public ProjectDependenciesResult(ProjectDependenciesErrorReason errorReason) {
220216 this .errorContext = null ;
221217 }
222218
223- public ProjectDependenciesResult (ProjectDependenciesErrorReason errorReason , String uri , String parsedPath , String projectName ) {
219+ public ProjectDependenciesResult (ProjectDependenciesErrorReason errorReason , String errorValue ) {
224220 this .dependencyInfoList = new ArrayList <>();
225221 this .emptyReason = errorReason .getMessage ();
226222 this .isEmpty = true ;
227- this .errorContext = new ErrorContext (uri , parsedPath , projectName );
223+ this .errorContext = new ErrorContext (errorValue );
228224 }
229225 }
230226
@@ -492,20 +488,24 @@ public static boolean checkImportStatus() {
492488 */
493489 public static ImportClassContentResult getImportClassContent (List <Object > arguments ,
494490 IProgressMonitor monitor ) {
491+ // Record start time for timeout control
492+ long startTime = System .currentTimeMillis ();
493+ final long TIMEOUT_MS = 80 ; // 80ms timeout
494+
495495 if (arguments == null || arguments .isEmpty ()) {
496- return new ImportClassContentResult (ImportClassContentErrorReason .NULL_ARGUMENTS , null , null , null );
496+ return new ImportClassContentResult (ImportClassContentErrorReason .NULL_ARGUMENTS );
497497 }
498498
499499 try {
500500 String fileUri = (String ) arguments .get (0 );
501501 if (fileUri == null || fileUri .trim ().isEmpty ()) {
502- return new ImportClassContentResult (ImportClassContentErrorReason .INVALID_URI , fileUri , null , null );
502+ return new ImportClassContentResult (ImportClassContentErrorReason .INVALID_URI , fileUri );
503503 }
504504 // Parse URI manually to avoid restricted API
505505 java .net .URI uri = new java .net .URI (fileUri );
506506 String filePath = uri .getPath ();
507507 if (filePath == null ) {
508- return new ImportClassContentResult (ImportClassContentErrorReason .URI_PARSE_FAILED , fileUri , null , null );
508+ return new ImportClassContentResult (ImportClassContentErrorReason .URI_PARSE_FAILED , filePath );
509509 }
510510
511511 IPath path = new Path (filePath );
@@ -514,27 +514,26 @@ public static ImportClassContentResult getImportClassContent(List<Object> argume
514514 IWorkspaceRoot root = ResourcesPlugin .getWorkspace ().getRoot ();
515515 IFile file = root .getFileForLocation (path );
516516 if (file == null || !file .exists ()) {
517- return new ImportClassContentResult (ImportClassContentErrorReason .FILE_NOT_FOUND , fileUri , filePath , null );
517+ return new ImportClassContentResult (ImportClassContentErrorReason .FILE_NOT_FOUND , filePath );
518518 }
519519 if (!file .exists ()) {
520- return new ImportClassContentResult (ImportClassContentErrorReason .FILE_NOT_EXISTS , fileUri , filePath , null );
520+ return new ImportClassContentResult (ImportClassContentErrorReason .FILE_NOT_EXISTS , filePath );
521521 }
522522
523523 // Get the Java project
524524 IJavaProject javaProject = JavaCore .create (file .getProject ());
525525 if (javaProject == null ) {
526- return new ImportClassContentResult (ImportClassContentErrorReason .NOT_JAVA_PROJECT , fileUri , filePath , null );
526+ return new ImportClassContentResult (ImportClassContentErrorReason .NOT_JAVA_PROJECT , filePath );
527527 }
528528 if (!javaProject .exists ()) {
529529 String projectName = javaProject .getProject ().getName ();
530- return new ImportClassContentResult (ImportClassContentErrorReason .PROJECT_NOT_EXISTS , fileUri , filePath , projectName );
530+ return new ImportClassContentResult (ImportClassContentErrorReason .PROJECT_NOT_EXISTS , projectName );
531531 }
532532
533533 // Find the compilation unit
534534 IJavaElement javaElement = JavaCore .create (file );
535535 if (!(javaElement instanceof org .eclipse .jdt .core .ICompilationUnit )) {
536- String projectName = javaProject .getProject ().getName ();
537- return new ImportClassContentResult (ImportClassContentErrorReason .NOT_COMPILATION_UNIT , fileUri , filePath , projectName );
536+ return new ImportClassContentResult (ImportClassContentErrorReason .NOT_COMPILATION_UNIT , filePath );
538537 }
539538
540539 org .eclipse .jdt .core .ICompilationUnit compilationUnit = (org .eclipse .jdt .core .ICompilationUnit ) javaElement ;
@@ -548,16 +547,14 @@ public static ImportClassContentResult getImportClassContent(List<Object> argume
548547
549548 // Check if file has no imports
550549 if (imports == null || imports .length == 0 ) {
551- String projectName = javaProject .getProject ().getName ();
552- return new ImportClassContentResult (ImportClassContentErrorReason .NO_IMPORTS , fileUri , filePath , projectName );
550+ return new ImportClassContentResult (ImportClassContentErrorReason .NO_IMPORTS );
553551 }
554552
555553 // Phase 1: Priority - Resolve project source classes (internal)
556- String projectName = javaProject .getProject ().getName ();
557554 for (org .eclipse .jdt .core .IImportDeclaration importDecl : imports ) {
558555 // Check cancellation before each operation
559556 if (monitor .isCanceled ()) {
560- return new ImportClassContentResult (ImportClassContentErrorReason .OPERATION_CANCELLED , fileUri , filePath , projectName );
557+ return new ImportClassContentResult (ImportClassContentErrorReason .OPERATION_CANCELLED );
561558 }
562559
563560 String importName = importDecl .getElementName ();
@@ -578,15 +575,35 @@ public static ImportClassContentResult getImportClassContent(List<Object> argume
578575 }
579576 }
580577
581- // Phase 2: Resolve external dependencies if not cancelled
578+ // Phase 2: Resolve external dependencies if not cancelled and within time limit
582579 if (!monitor .isCanceled ()) {
580+ // Check if we have exceeded the timeout before starting external resolution
581+ long currentTime = System .currentTimeMillis ();
582+ long elapsedTime = currentTime - startTime ;
583+
584+ if (elapsedTime >= TIMEOUT_MS ) {
585+ // Return early due to timeout, but still return what we have collected so far
586+ if (classInfoList .isEmpty ()) {
587+ return new ImportClassContentResult (ImportClassContentErrorReason .TIME_LIMIT_EXCEEDED , String .valueOf (elapsedTime ) + "ms" );
588+ }
589+ return new ImportClassContentResult (classInfoList );
590+ }
591+
583592 List <ImportClassInfo > externalClasses = new ArrayList <>();
584593
585594 for (org .eclipse .jdt .core .IImportDeclaration importDecl : imports ) {
586595 // Check cancellation before each external resolution
587596 if (monitor .isCanceled ()) {
588597 break ;
589598 }
599+
600+ // Check timeout before each external resolution
601+ currentTime = System .currentTimeMillis ();
602+ elapsedTime = currentTime - startTime ;
603+ if (elapsedTime >= TIMEOUT_MS ) {
604+ // Timeout reached, stop processing external dependencies but keep existing results
605+ break ;
606+ }
590607
591608 String importName = importDecl .getElementName ();
592609 boolean isStatic = (importDecl .getFlags () & org .eclipse .jdt .core .Flags .AccStatic ) != 0 ;
@@ -608,7 +625,7 @@ public static ImportClassContentResult getImportClassContent(List<Object> argume
608625 }
609626 // Success case - return the resolved class information
610627 if (classInfoList .isEmpty ()) {
611- return new ImportClassContentResult (ImportClassContentErrorReason .NO_RESULTS , fileUri , filePath , projectName );
628+ return new ImportClassContentResult (ImportClassContentErrorReason .NO_RESULTS );
612629 }
613630 return new ImportClassContentResult (classInfoList );
614631
@@ -623,7 +640,7 @@ public static ImportClassContentResult getImportClassContent(List<Object> argume
623640 } catch (Exception ignored ) {
624641 // Ignore any further exceptions when trying to get context
625642 }
626- return new ImportClassContentResult (ImportClassContentErrorReason .PROCESSING_EXCEPTION , errorUri , null , null );
643+ return new ImportClassContentResult (ImportClassContentErrorReason .PROCESSING_EXCEPTION , errorUri );
627644 }
628645 }
629646
@@ -662,37 +679,37 @@ private static String getSeverityString(int severity) {
662679 public static ProjectDependenciesResult getProjectDependencies (List <Object > arguments ,
663680 IProgressMonitor monitor ) {
664681 if (arguments == null || arguments .isEmpty ()) {
665- return new ProjectDependenciesResult (ProjectDependenciesErrorReason .NULL_ARGUMENTS , null , null , null );
682+ return new ProjectDependenciesResult (ProjectDependenciesErrorReason .NULL_ARGUMENTS );
666683 }
667684
668685 try {
669- String projectUri = (String ) arguments .get (0 );
670- if (projectUri == null || projectUri .trim ().isEmpty ()) {
671- return new ProjectDependenciesResult (ProjectDependenciesErrorReason .INVALID_URI , projectUri , null , null );
686+ String fileUri = (String ) arguments .get (0 );
687+ if (fileUri == null || fileUri .trim ().isEmpty ()) {
688+ return new ProjectDependenciesResult (ProjectDependenciesErrorReason .INVALID_URI , fileUri );
672689 }
673690
674691 // Validate URI format
675692 String parsedPath = null ;
676693 try {
677- java .net .URI uri = new java .net .URI (projectUri );
694+ java .net .URI uri = new java .net .URI (fileUri );
678695 parsedPath = uri .getPath ();
679696 if (parsedPath == null ) {
680- return new ProjectDependenciesResult (ProjectDependenciesErrorReason .URI_PARSE_FAILED , projectUri , null , null );
697+ return new ProjectDependenciesResult (ProjectDependenciesErrorReason .URI_PARSE_FAILED , parsedPath );
681698 }
682699 } catch (java .net .URISyntaxException e ) {
683- return new ProjectDependenciesResult (ProjectDependenciesErrorReason .MALFORMED_URI , projectUri , null , null );
700+ return new ProjectDependenciesResult (ProjectDependenciesErrorReason .MALFORMED_URI , fileUri );
684701 }
685702
686703 // Check if monitor is cancelled before processing
687704 if (monitor .isCanceled ()) {
688- return new ProjectDependenciesResult (ProjectDependenciesErrorReason .OPERATION_CANCELLED , projectUri , parsedPath , null );
705+ return new ProjectDependenciesResult (ProjectDependenciesErrorReason .OPERATION_CANCELLED );
689706 }
690- List <ProjectResolver .DependencyInfo > resolverResult = ProjectResolver .resolveProjectDependencies (projectUri ,
707+ List <ProjectResolver .DependencyInfo > resolverResult = ProjectResolver .resolveProjectDependencies (fileUri ,
691708 monitor );
692709 // Check if resolver returned null (should not happen, but defensive
693710 // programming)
694711 if (resolverResult == null ) {
695- return new ProjectDependenciesResult (ProjectDependenciesErrorReason .RESOLVER_NULL_RESULT , projectUri , parsedPath , null );
712+ return new ProjectDependenciesResult (ProjectDependenciesErrorReason .RESOLVER_NULL_RESULT );
696713 }
697714 // Convert ProjectResolver.DependencyInfo to ProjectCommand.DependencyInfo
698715 List <DependencyInfo > result = new ArrayList <>();
@@ -704,7 +721,7 @@ public static ProjectDependenciesResult getProjectDependencies(List<Object> argu
704721
705722 // Check if no dependencies were resolved
706723 if (result .isEmpty ()) {
707- return new ProjectDependenciesResult (ProjectDependenciesErrorReason .NO_DEPENDENCIES , projectUri , parsedPath , null );
724+ return new ProjectDependenciesResult (ProjectDependenciesErrorReason .NO_DEPENDENCIES );
708725 }
709726
710727 return new ProjectDependenciesResult (result );
@@ -719,7 +736,7 @@ public static ProjectDependenciesResult getProjectDependencies(List<Object> argu
719736 } catch (Exception ignored ) {
720737 // Ignore any further exceptions when trying to get context
721738 }
722- return new ProjectDependenciesResult (ProjectDependenciesErrorReason .PROCESSING_EXCEPTION , errorUri , null , null );
739+ return new ProjectDependenciesResult (ProjectDependenciesErrorReason .PROCESSING_EXCEPTION , errorUri );
723740 }
724741 }
725742
0 commit comments