void () { Set<VirtualFile> parents = new HashSet<>(); final VirtualFile[] roots = ProjectRootManager.getInstance(myProject).getContentSourceRoots(); for (VirtualFile root : roots) { VirtualFile parent = root; while (parent != null && !parents.contains(parent)) { parents.add(parent); parent = parent.getParent(); } } Map<String, String> outputPathContainingSourceRoots = new HashMap<>(); final List<Pair<File, Artifact>> toClean = new ArrayList<>(); Artifact[] artifacts = getArtifacts(myArtifactPopupItems, myProject); for (Artifact artifact : artifacts) { String outputPath = artifact.getOutputFilePath(); if (outputPath != null) { toClean.add(Pair.create(new File(FileUtil.toSystemDependentName(outputPath)), artifact)); final VirtualFile outputFile = LocalFileSystem.getInstance().findFileByPath(outputPath); if (parents.contains(outputFile)) { outputPathContainingSourceRoots.put(artifact.getName(), outputPath); } } } if (!outputPathContainingSourceRoots.isEmpty()) { final String message; if (outputPathContainingSourceRoots.size() == 1) { final String name = ContainerUtil.getFirstItem(outputPathContainingSourceRoots.keySet()); final String output = outputPathContainingSourceRoots.get(name); message = JavaCompilerBundle.message("dialog.message.output.dir.contains.source.roots", output, name); } else { StringBuilder info = new StringBuilder(); for (String name : outputPathContainingSourceRoots.keySet()) { info.append(JavaCompilerBundle.message("dialog.message.output.dir.artifact", name, outputPathContainingSourceRoots.get(name))) .append("\n"); } message = JavaCompilerBundle.message("dialog.message.output.dirs.contain.source.roots", info); } final int answer = Messages.showYesNoDialog(myProject, message, JavaCompilerBundle.message("clean.artifacts"), null); if (answer != Messages.YES) { return; } } new Task.Backgroundable(myProject, JavaCompilerBundle.message("cleaning.artifacts"), true) { @Override public void run(@NotNull ProgressIndicator indicator) { List<File> deleted = new ArrayList<>(); for (Pair<File, Artifact> pair : toClean) { indicator.checkCanceled(); File file = pair.getFirst(); if (!FileUtil.delete(file)) { Holder.NOTIFICATION_GROUP .createNotification(JavaCompilerBundle.message("cannot.clean.0.artifact", pair.getSecond().getName()), JavaCompilerBundle.message("cannot.delete.0", file.getAbsolutePath()), NotificationType.ERROR) .notify(myProject); } else { deleted.add(file); } } LocalFileSystem.getInstance().refreshIoFiles(deleted, true, true, null); } }.queue(); }