Community
Participate
Working Groups
In IncrementalImageBuilder.updateProblemsFor(), the following code exists: protected void updateProblemsFor(SourceFile sourceFile, CompilationResult result) throws CoreException { IMarker[] markers = JavaBuilder.getProblemsFor(sourceFile.resource); CategorizedProblem[] problems = result.getProblems(); if (problems == null && markers.length == 0) return; notifier.updateProblemCounts(markers, problems); JavaBuilder.removeProblemsFor(sourceFile.resource); storeProblemsFor(sourceFile, problems); } Before updating the problems, JavaBuilder.getProblemsFor() is called, and the update is short-circuited if no problems are found. But this only returns Java problems, not contributed problems, so if there are none, this code returns early before processing the contributed problems from compilation participants.
Patch would look like: public static IMarker[] getProblemsFor(IResource resource) { try { if (resource != null && resource.exists()) { IMarker[] markers = resource.findMarkers(IJavaModelMarker.JAVA_MODEL_PROBLEM_MARKER, false, IResource.DEPTH_INFINITE); Set markerTypes = JavaModelManager.getJavaModelManager().compilationParticipants.managedMarkerTypes(); if (markerTypes.isEmpty()) return markers; ArrayList markerList = new ArrayList(5); Iterator iterator = markerTypes.iterator(); do { for (int i = 0, length = markers.length; i < length; i++) { markerList.add(markers[i]); } markers = resource.findMarkers((String) iterator.next(), false, IResource.DEPTH_INFINITE); } while (iterator.hasNext()); IMarker[] result; markerList.toArray(result = new IMarker[markerList.size()]); return result; } } catch (CoreException e) { // assume there are no problems } return new IMarker[0]; }
Actually, this should be better: public static IMarker[] getProblemsFor(IResource resource) { try { if (resource != null && resource.exists()) { IMarker[] markers = resource.findMarkers(IJavaModelMarker.JAVA_MODEL_PROBLEM_MARKER, false, IResource.DEPTH_INFINITE); Set markerTypes = JavaModelManager.getJavaModelManager().compilationParticipants.managedMarkerTypes(); if (markerTypes.isEmpty()) return markers; ArrayList markerList = new ArrayList(5); for (int i = 0, length = markers.length; i < length; i++) { markerList.add(markers[i]); } Iterator iterator = markerTypes.iterator(); while (iterator.hasNext()) { markers = resource.findMarkers((String) iterator.next(), false, IResource.DEPTH_INFINITE); for (int i = 0, length = markers.length; i < length; i++) { markerList.add(markers[i]); } } IMarker[] result; markerList.toArray(result = new IMarker[markerList.size()]); return result; } } catch (CoreException e) { // assume there are no problems } return new IMarker[0]; }
Jerome - pls add a testcase, and optimize all other iterator creations near manager marker types, to check for emptyness before allocating iterator.
Added ParticipantBuildTests#testParticipantProblems(). Changed JavaBuilder#removeProblemsAndTasksFor(IResource) and removeProblemsFor(IResource) to first check for the empty managed marker list case.
Verified for 3.2 RC1 using Build id: I20060413-0010.