package org.dlangplugin.library; import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.roots.OrderRootType; import com.intellij.openapi.roots.libraries.ui.RootDetector; import com.intellij.openapi.vfs.JarFileSystem; import com.intellij.openapi.vfs.VfsUtilCore; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.VirtualFileVisitor; import org.dlangplugin.DFileType; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.Collection; import java.util.List; public class DLangLibRootDetector extends RootDetector { protected DLangLibRootDetector(OrderRootType rootType, String presentableRootTypeName) { super(rootType, false, presentableRootTypeName); } @NotNull @Override public Collection<VirtualFile> detectRoots(@NotNull VirtualFile rootCandidate, @NotNull ProgressIndicator progressIndicator) { List<VirtualFile> result = new ArrayList<VirtualFile>(); collectRoots(rootCandidate, result, progressIndicator); return result; } public void collectRoots(VirtualFile file, final List<VirtualFile> result, @Nullable final ProgressIndicator progressIndicator) { if (file.getFileSystem() instanceof JarFileSystem) { return; } final OrderRootType rootType = getRootType(); VfsUtilCore.visitChildrenRecursively(file, new VirtualFileVisitor() { @Override public boolean visitFile(@NotNull VirtualFile file) { if (progressIndicator != null) { progressIndicator.checkCanceled(); } if (!file.isDirectory()) { if( rootType.equals(LibFileRootType.getInstance()) && "lib".equals(file.getExtension())) { result.add(file); } return false; } if (progressIndicator != null) { progressIndicator.setText2(file.getPresentableUrl()); } if (rootType.equals(OrderRootType.CLASSES) && file.getName().equals("source")) { if (containsDLangFiles(file)) { result.add(file); } return false; } return true; } }); } private static boolean containsDLangFiles(final VirtualFile dir) { final VirtualFileVisitor.Result result = VfsUtilCore.visitChildrenRecursively(dir, new VirtualFileVisitor() { @NotNull @Override public Result visitFileEx(@NotNull VirtualFile file) { return !file.isDirectory() && DFileType.DEFAULT_EXTENSION.equalsIgnoreCase(file.getExtension()) ? skipTo(dir) : CONTINUE; } }); return result.skipToParent != null; } }