package com.intellij.lang.javascript.flex.library;
import com.intellij.lang.javascript.flex.FlexBundle;
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.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
class FlexSwcFoldersRootDetector extends RootDetector {
public FlexSwcFoldersRootDetector() {
super(OrderRootType.CLASSES, true, FlexBundle.message("swc.folders.root.detector.name"));
}
@NotNull
@Override
public Collection<VirtualFile> detectRoots(@NotNull final VirtualFile rootCandidate, @NotNull final ProgressIndicator progressIndicator) {
List<VirtualFile> result = new ArrayList<>();
collectRoots(rootCandidate, result, progressIndicator);
return result;
}
private static void collectRoots(VirtualFile file, final List<VirtualFile> result, final ProgressIndicator progressIndicator) {
if (!file.isDirectory() || file.getFileSystem() instanceof JarFileSystem) return;
VfsUtilCore.visitChildrenRecursively(file, new VirtualFileVisitor() {
@NotNull
@Override
public Result visitFileEx(@NotNull VirtualFile child) {
progressIndicator.checkCanceled();
if (child.isDirectory()) {
progressIndicator.setText2(child.getPresentableUrl());
}
else if ("swc".equalsIgnoreCase(child.getExtension()) || "ane".equalsIgnoreCase(child.getExtension())) {
final VirtualFile dir = child.getParent();
result.add(dir);
return skipTo(dir);
}
return CONTINUE;
}
});
}
}