3636import java .util .Collections ;
3737import java .util .Comparator ;
3838import java .util .Deque ;
39+ import java .util .HashMap ;
3940import java .util .List ;
4041import java .util .Map ;
42+ import java .util .Objects ;
4143import java .util .concurrent .Executors ;
4244import java .util .concurrent .ScheduledExecutorService ;
4345import java .util .concurrent .ScheduledFuture ;
@@ -1074,6 +1076,9 @@ public void dispose() {
10741076
10751077
10761078 private void handleSketchProblems (PreprocessedSketch ps ) {
1079+ Map <String , String []> suggCache =
1080+ JavaMode .importSuggestEnabled ? new HashMap <>() : Collections .emptyMap ();
1081+
10771082 // Process problems
10781083 IProblem [] iproblems = ps .compilationUnit .getProblems ();
10791084 final List <Problem > problems = Arrays .stream (iproblems )
@@ -1095,38 +1100,20 @@ private void handleSketchProblems(PreprocessedSketch ps) {
10951100 int line = ps .tabOffsetToTabLine (in .tabIndex , in .startTabOffset );
10961101 JavaProblem p = new JavaProblem (iproblem , in .tabIndex , line );
10971102 p .setPDEOffsets (in .startTabOffset , in .stopTabOffset );
1103+
1104+ // Handle import suggestions
1105+ if (JavaMode .importSuggestEnabled && isUndefinedTypeProblem (iproblem )) {
1106+ ClassPath cp = ps .searchClassPath ;
1107+ String [] s = suggCache .computeIfAbsent (iproblem .getArguments ()[0 ],
1108+ name -> getImportSuggestions (cp , name ));
1109+ p .setImportSuggestions (s );
1110+ }
1111+
10981112 return p ;
10991113 })
1100- .filter (p -> p != null )
1114+ .filter (Objects :: nonNull )
11011115 .collect (Collectors .toList ());
11021116
1103- // Handle import suggestions
1104- if (JavaMode .importSuggestEnabled ) {
1105- Map <String , List <Problem >> undefinedTypeProblems = problems .stream ()
1106- // Get only problems with undefined types/names
1107- .filter (p -> {
1108- int id = ((JavaProblem ) p ).getIProblem ().getID ();
1109- return id == IProblem .UndefinedType ||
1110- id == IProblem .UndefinedName ||
1111- id == IProblem .UnresolvedVariable ;
1112- })
1113- // Group problems by the missing type/name
1114- .collect (Collectors .groupingBy (p -> ((JavaProblem ) p ).getIProblem ().getArguments ()[0 ]));
1115-
1116- if (!undefinedTypeProblems .isEmpty ()) {
1117- final ClassPath cp = ps .searchClassPath ;
1118-
1119- // Get suggestions for each missing type, update the problems
1120- undefinedTypeProblems .entrySet ().stream ()
1121- .forEach (entry -> {
1122- String missingClass = entry .getKey ();
1123- List <Problem > affectedProblems = entry .getValue ();
1124- String [] suggestions = getImportSuggestions (cp , missingClass );
1125- affectedProblems .forEach (p -> ((JavaProblem ) p ).setImportSuggestions (suggestions ));
1126- });
1127- }
1128- }
1129-
11301117 if (scheduledUiUpdate != null ) {
11311118 scheduledUiUpdate .cancel (true );
11321119 }
@@ -1142,6 +1129,14 @@ private void handleSketchProblems(PreprocessedSketch ps) {
11421129 }
11431130
11441131
1132+ private boolean isUndefinedTypeProblem (IProblem iproblem ) {
1133+ int id = iproblem .getID ();
1134+ return id == IProblem .UndefinedType ||
1135+ id == IProblem .UndefinedName ||
1136+ id == IProblem .UnresolvedVariable ;
1137+ }
1138+
1139+
11451140 public static String [] getImportSuggestions (ClassPath cp , String className ) {
11461141 RegExpResourceFilter regf = new RegExpResourceFilter (
11471142 Pattern .compile (".*" ),
0 commit comments