package org.elixir_lang.psi;
import com.intellij.extapi.psi.PsiFileBase;
import com.intellij.openapi.fileTypes.FileType;
import com.intellij.psi.FileViewProvider;
import com.intellij.psi.PsiElement;
import com.intellij.psi.ResolveState;
import com.intellij.psi.scope.PsiScopeProcessor;
import com.intellij.psi.util.PsiTreeUtil;
import org.elixir_lang.ElixirFileType;
import org.elixir_lang.ElixirLanguage;
import org.elixir_lang.psi.call.StubBased;
import org.elixir_lang.psi.impl.ElixirPsiImplUtil;
import org.elixir_lang.structure_view.element.modular.Implementation;
import org.elixir_lang.structure_view.element.modular.Module;
import org.elixir_lang.structure_view.element.modular.Protocol;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import java.util.ArrayList;
import java.util.List;
/**
* Created by luke.imhoff on 8/2/14.
*/
public class ElixirFile extends PsiFileBase implements ModuleOwner {
public ElixirFile(@NotNull FileViewProvider viewProvider) {
super(viewProvider, ElixirLanguage.INSTANCE);
}
@NotNull
@Override
public FileType getFileType() {
return ElixirFileType.INSTANCE;
}
@Override
public String toString() {
return "Elixir File";
}
@Override
public Icon getIcon(int flags) {
return super.getIcon(flags);
}
@Override
public boolean processDeclarations(@NotNull PsiScopeProcessor processor,
@NotNull ResolveState state,
PsiElement lastParent,
@NotNull PsiElement place) {
boolean keepProcessing = ElixirPsiImplUtil.processDeclarationsInPreviousSibling(this, processor, state, lastParent, place);
if (keepProcessing) {
processor.execute(this, state);
}
return keepProcessing;
}
/**
* @return modulars owned (declared) by this element.
*/
@NotNull
@Override
public StubBased[] modulars() {
StubBased[] stubBaseds = PsiTreeUtil.getChildrenOfType(
this,
StubBased.class
);
List<StubBased> modularList = new ArrayList<StubBased>();
if (stubBaseds != null) {
for (StubBased stubBased : stubBaseds) {
if (Implementation.is(stubBased) || Module.is(stubBased) || Protocol.is(stubBased)) {
modularList.add(stubBased);
}
}
}
return modularList.toArray(new StubBased[modularList.size()]);
}
}