package com.haskforce.psi.impl; import com.haskforce.HaskellLanguage; import com.haskforce.psi.*; import com.intellij.openapi.project.Project; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFileFactory; import com.intellij.psi.PsiWhiteSpace; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; /** * Performs creation of element types. */ public class HaskellElementFactory { /** * Takes a name and returns a Psi node of that name, or null. */ @Nullable public static HaskellVarid createVaridFromText(@NotNull Project project, @NotNull String name) { PsiElement e = createExpressionFromText(project, name + "uniq = " + name).getFirstChild(); if (e instanceof HaskellVarid) return (HaskellVarid) e; return null; } /** * Takes a name and returns a Psi node of that name, or null. */ @NotNull public static HaskellQvarid createQvaridFromText(@NotNull Project project, @NotNull String name) { return ((HaskellQvarid) (createExpressionFromText(project, name + "uniq = " + name)).getFirstChild()); } /** * Takes a name and returns a Psi node of that name, or null. */ @Nullable public static HaskellConid createConidFromText(@NotNull Project project, @NotNull String name) { PsiElement e = createExpressionFromText(project, name + "uniq = " + name).getFirstChild(); if (e instanceof HaskellConid) return (HaskellConid) e; return null; } /** * Takes a name and returns a Psi node of that name, or null. */ @NotNull public static HaskellTycon createTyconFromText(@NotNull Project project, @NotNull String name) { return ((HaskellTycon) (createExpressionFromText(project, name + "uniq = " + name)).getFirstChild()); } /** * Takes a name and returns a Psi node of that name, or null. */ @NotNull public static HaskellTycls createTyclsFromText(@NotNull Project project, @NotNull String name) { return ((HaskellTycls) (createExpressionFromText(project, name + "uniq = " + name)).getFirstChild()); } @NotNull public static HaskellPpragma createPpragmaFromText(@NotNull Project project, @NotNull String text) { return ((HaskellPpragma) (createFileFromText(project, text + "\nmodule Foo where").getFirstChild())); } @NotNull public static HaskellGendecl createGendeclFromText(@NotNull Project project, @NotNull String text) { return ((HaskellGendecl) (createFileFromText(project, text).getFirstChild().getFirstChild())); } @NotNull public static PsiWhiteSpace createNewLine(@NotNull Project project) { return ((PsiWhiteSpace) (createFileFromText(project, "\n")).getFirstChild()); } /** * Takes an expression in text and returns a Psi tree of that program. */ @NotNull public static PsiElement createExpressionFromText(@NotNull Project project, @NotNull String name) { HaskellFile fileFromText = createFileFromText(project, name); PsiElement rhs = fileFromText.getFirstChild().getFirstChild().getLastChild(); PsiElement nodeOfInterest = rhs.getLastChild().getLastChild().getLastChild(); return nodeOfInterest; } /** * Create a file containing text. */ @NotNull public static HaskellFile createFileFromText(@NotNull Project project, @NotNull String text) { return (HaskellFile) PsiFileFactory.getInstance(project).createFileFromText("A.hs", HaskellLanguage.INSTANCE, text); } }