public static Iterable<IFile> getModifiedFiles(IResourceDelta delta, Iterable<String> extensions, Iterable<String> excludedFolders) { var result = new HashSet<IFile>(); try { delta.accept(p => { var resource = p.getResource(); switch (resource.getType()) { case IResource.FOLDER: return !excludedFolders.contains(resource.getProjectRelativePath().toPortableString()); case IResource.FILE: var file = (IFile)resource; if (extensions.contains(file.getFileExtension())) { //if ((p.getFlags() & IResourceDelta.CONTENT) != 0 || (p.getFlags() & IResourceDelta.MARKERS) == 0) { result.add(file); //} } return false; } return true; }); } catch (CoreException e) { Environment.logException(e); } return result; }
private IProject[] buildDelta(IResourceDelta delta, IProgressMonitor monitor) { Environment.trace(this, "Incremental build"); var t0 = System.nanoTime(); try { monitor.beginTask("", 5); var filesToCompile = EclipseHelper.getModifiedFiles(delta, Query.singleton("stab"), Query.singleton("bin")); var deletedFiles = filesToCompile.where (p => !p.exists()).select(p => p.getProjectRelativePath().toPortableString()); Environment.trace(this, filesToCompile.count() + " files to compile"); var parameters = new SourceCompilerParameters { ProgressiveBuild = true, ClassPath = projectManager.ClassPath, TypeSystem = projectManager.TypeSystem, DependencyInfo = projectManager.DependencyInfo }; parameters.AllFiles.addAll(projectManager.getSourceFiles()); parameters.AllFiles.addAll(filesToCompile); foreach (var f in filesToCompile) { parameters.FilesToCompile.add(parameters.AllFiles.getProjectRelativeName(f)); } foreach (var f in projectManager.FilesToCompile) { parameters.FilesToCompile.add(f); } foreach (var s in projectManager.Properties.PreprocessorSymbols) { parameters.PreprocessorSymbols.add(s); } var compiler = new SourceCompiler(); var results = compiler.compile(parameters, new SubProgressMonitor(monitor, 3)); if (results.Failed) { if (results.MissingType != null) { projectManager.DependencyInfo = null; IMarker marker = getProject().getFile(".stabproperties").createMarker(IMarker.PROBLEM); marker.setAttribute(IMarker.MESSAGE, results.MissingType); marker.setAttribute(IMarker.SEVERITY, IMarker.SEVERITY_ERROR); marker.setAttribute(IMarker.PRIORITY, IMarker.PRIORITY_HIGH); } else { projectManager.FilesToCompile = projectManager.FilesToCompile.union(results.CompiledFiles).toList(); } } else { // Update the .class files var outputFolder = getProject().getFolder(projectManager.Properties.OutputPath); foreach (var typeName in results.CompiledFiles.selectMany(p => results.DependencyInfo.getFileContents(p))) { var file = outputFolder.getFile(typeName + ".class"); if (!file.exists()) { continue; } var type = JvmTypeSystemHelper.getType(results.TypeSystem, typeName); var declaringTypeName = type.Name; var declaringType = type; while ((declaringType = declaringType.DeclaringType) != null) { declaringTypeName = declaringType.Name + "$" + declaringTypeName; } // Deletes all the nested types of the declaring type file.getParent().accept(p => { if (p.getType() == IResource.FILE) { if (p.getName().startsWith(declaringTypeName + "$")) { p.requestResource().delete(IResource.FORCE, null); } return(false); } return(true); }, IResource.NONE); file.delete(IResource.FORCE, null); } foreach (var e in results.ClassFiles.entrySet()) { var fileName = e.Key.replace('.', '/') + ".class"; var file = outputFolder.getFile(fileName); EclipseHelper.createFolders(file); file.create(new ByteArrayInputStream(e.Value), IResource.FORCE, null); } // TODO: delete the .class generated from the types contained in deletedFiles projectManager.DependencyInfo = results.DependencyInfo; projectManager.TypeSystem = results.TypeSystem; projectManager.AnnotatedTypeSystem = results.AnnotatedTypeSystem; projectManager.FilesToCompile = Query.empty(); var compilationUnits = new HashMap <String, CompilationUnitNode>(projectManager.CompilationUnits); foreach (var e in results.CompilationUnits.entrySet()) { compilationUnits[e.Key] = e.Value; } foreach (var s in deletedFiles) { compilationUnits.remove(s); } projectManager.CompilationUnits = compilationUnits; Environment.fireProjectBuildEvent(projectManager); } updateMarkers(results.CodeErrors, parameters.AllFiles); monitor.worked(1); } catch (InterruptedException) { } finally { monitor.done(); } Environment.trace(this, "Incremental build done in " + ((System.nanoTime() - t0) / 1e6) + "ms"); return(null); }