package org.jetbrains.plugins.ruby.motion;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.ModuleRootManager;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiFile;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.plugins.ruby.ruby.codeInsight.symbols.ImplicitRequireProvider;
import org.jetbrains.plugins.ruby.utils.RubyVirtualFileScanner;
import org.jetbrains.plugins.ruby.utils.VirtualFileUtil;
import java.util.Collection;
import java.util.Collections;
import java.util.LinkedHashSet;
import static com.intellij.util.containers.ContainerUtil.addIfNotNull;
/**
* @author Dennis.Ushakov
*/
public class RubyMotionRequireProvider implements ImplicitRequireProvider {
@NotNull
@Override
public Collection<VirtualFile> getLoadPath(@Nullable Module module, PsiFile file) {
if (module == null) return Collections.emptySet();
if (!RubyMotionUtil.getInstance().hasMacRubySupport(file)) return Collections.emptySet();
final LinkedHashSet<VirtualFile> result = new LinkedHashSet<>();
final VirtualFile motion = VirtualFileUtil.findFileBy(RubyMotionUtil.getInstance().getRubyMotionPath() + "/lib");
addIfNotNull(result, motion);
for (VirtualFile root : ModuleRootManager.getInstance(module).getContentRoots()) {
addIfNotNull(result, root.findChild("app"));
}
return result;
}
@NotNull
@Override
public Collection<VirtualFile> getImplicitRequires(@NotNull Module module, PsiFile file) {
if (!RubyMotionUtil.getInstance().hasMacRubySupport(file)) return Collections.emptySet();
final VirtualFile vFile = file.getVirtualFile();
final boolean isTestFile = vFile != null && vFile.getPath().contains("/spec/");
final LinkedHashSet<VirtualFile> result = new LinkedHashSet<>();
final Collection<VirtualFile> loadPath = getLoadPath(module, file);
for (VirtualFile path : loadPath) {
if (path.getPath().startsWith(RubyMotionUtil.getInstance().getRubyMotionPath())) {
if (isTestFile) {
addIfNotNull(result, path.findFileByRelativePath("motion/spec.rb"));
}
continue;
}
RubyVirtualFileScanner.addRubyFiles(path, result);
}
return result;
}
@Override
public boolean gemAutoRequireSuppressedFor(@NotNull Project project, @NotNull VirtualFile location) {
return false;
}
}