From 5f464e9558c516df4535f7d20fd398993ce53208 Mon Sep 17 00:00:00 2001 From: Jakub Valtar Date: Thu, 15 Dec 2016 22:47:09 +0100 Subject: [PATCH] PDEX: simplify import suggestion handling --- java/src/processing/mode/java/pdex/PDEX.java | 51 +++++++++----------- 1 file changed, 23 insertions(+), 28 deletions(-) diff --git a/java/src/processing/mode/java/pdex/PDEX.java b/java/src/processing/mode/java/pdex/PDEX.java index 6182faed3..37b0d9b8e 100644 --- a/java/src/processing/mode/java/pdex/PDEX.java +++ b/java/src/processing/mode/java/pdex/PDEX.java @@ -36,8 +36,10 @@ import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util.Deque; +import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; @@ -1074,6 +1076,9 @@ public class PDEX { private void handleSketchProblems(PreprocessedSketch ps) { + Map suggCache = + JavaMode.importSuggestEnabled ? new HashMap<>() : Collections.emptyMap(); + // Process problems IProblem[] iproblems = ps.compilationUnit.getProblems(); final List problems = Arrays.stream(iproblems) @@ -1095,38 +1100,20 @@ public class PDEX { int line = ps.tabOffsetToTabLine(in.tabIndex, in.startTabOffset); JavaProblem p = new JavaProblem(iproblem, in.tabIndex, line); p.setPDEOffsets(in.startTabOffset, in.stopTabOffset); + + // Handle import suggestions + if (JavaMode.importSuggestEnabled && isUndefinedTypeProblem(iproblem)) { + ClassPath cp = ps.searchClassPath; + String[] s = suggCache.computeIfAbsent(iproblem.getArguments()[0], + name -> getImportSuggestions(cp, name)); + p.setImportSuggestions(s); + } + return p; }) - .filter(p -> p != null) + .filter(Objects::nonNull) .collect(Collectors.toList()); - // Handle import suggestions - if (JavaMode.importSuggestEnabled) { - Map> undefinedTypeProblems = problems.stream() - // Get only problems with undefined types/names - .filter(p -> { - int id = ((JavaProblem) p).getIProblem().getID(); - return id == IProblem.UndefinedType || - id == IProblem.UndefinedName || - id == IProblem.UnresolvedVariable; - }) - // Group problems by the missing type/name - .collect(Collectors.groupingBy(p -> ((JavaProblem) p).getIProblem().getArguments()[0])); - - if (!undefinedTypeProblems.isEmpty()) { - final ClassPath cp = ps.searchClassPath; - - // Get suggestions for each missing type, update the problems - undefinedTypeProblems.entrySet().stream() - .forEach(entry -> { - String missingClass = entry.getKey(); - List affectedProblems = entry.getValue(); - String[] suggestions = getImportSuggestions(cp, missingClass); - affectedProblems.forEach(p -> ((JavaProblem) p).setImportSuggestions(suggestions)); - }); - } - } - if (scheduledUiUpdate != null) { scheduledUiUpdate.cancel(true); } @@ -1142,6 +1129,14 @@ public class PDEX { } + private boolean isUndefinedTypeProblem(IProblem iproblem) { + int id = iproblem.getID(); + return id == IProblem.UndefinedType || + id == IProblem.UndefinedName || + id == IProblem.UnresolvedVariable; + } + + public static String[] getImportSuggestions(ClassPath cp, String className) { RegExpResourceFilter regf = new RegExpResourceFilter( Pattern.compile(".*"),