package com.haskforce.psi;
import com.haskforce.HaskellIcons;
import com.haskforce.stubs.HaskellFileStub;
import com.intellij.extapi.psi.PsiFileBase;
import com.intellij.openapi.fileTypes.FileType;
import com.intellij.psi.FileViewProvider;
import com.intellij.psi.stubs.StubElement;
import com.intellij.psi.util.PsiTreeUtil;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import com.haskforce.HaskellFileType;
import com.haskforce.HaskellLanguage;
import org.jetbrains.annotations.Nullable;
public class HaskellFile extends PsiFileBase {
public HaskellFile(@NotNull FileViewProvider viewProvider) {
super(viewProvider, HaskellLanguage.INSTANCE);
}
@NotNull
@Override
public FileType getFileType() {
return HaskellFileType.INSTANCE;
}
@Override
public String toString() {
return "Haskell File";
}
@Override
public Icon getIcon(int flags) {
return HaskellIcons.FILE;
}
/**
* Returns the module name defined in the file or null if it doesn't exist.
*/
@Nullable
public String getModuleName() {
final HaskellQconid qconid = getModuleElement();
return qconid == null ? null : qconid.getText();
}
@Nullable
public HaskellQconid getModuleElement() {
final HaskellModuledecl moduledecl = findChildByClass(HaskellModuledecl.class);
if (moduledecl == null) { return null; }
return moduledecl.getQconid();
}
/**
* Returns the module name if it exists, otherwise returns the file name.
*/
@NotNull
public String getModuleOrFileName() {
final String moduleName = getModuleName();
return moduleName == null ? getName() : moduleName;
}
@Nullable
public HaskellBody getBody() {
return PsiTreeUtil.getChildOfType(this, HaskellBody.class);
}
/**
* Generates a stub for the current file, particularly so we can index names.
*/
@Nullable
@Override
public HaskellFileStub getStub() {
final StubElement stub = super.getStub();
if (stub == null) return null;
return (HaskellFileStub)stub;
}
}