package com.intellij.lang.javascript.flex.library;
import com.intellij.ide.util.projectWizard.importSources.util.CommonSourceRootDetectionUtil;
import com.intellij.lang.javascript.ActionScriptFileType;
import com.intellij.lang.javascript.JavaScriptSupportLoader;
import com.intellij.lang.javascript.flex.FlexBundle;
import com.intellij.lang.javascript.flex.projectStructure.detection.FlexProjectStructureDetector;
import com.intellij.openapi.progress.ProgressIndicator;
import com.intellij.openapi.roots.OrderRootType;
import com.intellij.openapi.roots.libraries.ui.RootDetector;
import com.intellij.openapi.util.Pair;
import com.intellij.openapi.vfs.VfsUtilCore;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.vfs.VirtualFileVisitor;
import com.intellij.util.containers.DistinctRootsCollection;
import org.jetbrains.annotations.NotNull;
import java.util.Collection;
/**
* @author ksafonov
*/
class FlexSourcesRootDetector extends RootDetector {
private final boolean myDetectMxml;
public FlexSourcesRootDetector() {
super(OrderRootType.SOURCES, false, FlexBundle.message("sources.root.detector.name"));
myDetectMxml = true;
}
@NotNull
@Override
public Collection<VirtualFile> detectRoots(@NotNull final VirtualFile rootCandidate, @NotNull final ProgressIndicator progressIndicator) {
DistinctRootsCollection<VirtualFile> result = new DistinctRootsCollection<VirtualFile>() {
@Override
protected boolean isAncestor(@NotNull final VirtualFile ancestor, @NotNull final VirtualFile virtualFile) {
return VfsUtilCore.isAncestor(ancestor, virtualFile, false);
}
};
collectRoots(rootCandidate, result, rootCandidate, progressIndicator);
return result;
}
private void collectRoots(final VirtualFile startFile,
final Collection<VirtualFile> result,
final VirtualFile topmostRoot,
final ProgressIndicator progressIndicator) {
VfsUtilCore.visitChildrenRecursively(startFile, new VirtualFileVisitor() {
@NotNull
@Override
public Result visitFileEx(@NotNull VirtualFile file) {
progressIndicator.checkCanceled();
progressIndicator.setText2(file.getPresentableUrl());
if (!file.isDirectory()) {
if (file.getFileType() == ActionScriptFileType.INSTANCE) {
Pair<VirtualFile, String> root =
CommonSourceRootDetectionUtil.VIRTUAL_FILE
.suggestRootForFileWithPackageStatement(file, topmostRoot, FlexProjectStructureDetector.PACKAGE_NAME_FETCHER, false);
if (root != null) {
final VirtualFile detectedRoot = root.first;
result.add(detectedRoot);
if (VfsUtilCore.isAncestor(detectedRoot, startFile, false)) {
return skipTo(detectedRoot); // skip all the directories under detectedRoot
}
}
}
else if (myDetectMxml && JavaScriptSupportLoader.isFlexMxmFile(file.getName())) {
result.add(file.getParent());
// don't skip parent directory since this MXML class may be located in package
}
}
return CONTINUE;
}
});
}
}