package fr.adrienbrault.idea.symfony2plugin.util.yaml; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Ref; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiFileFactory; import com.intellij.psi.PsiRecursiveElementWalkingVisitor; import com.intellij.psi.tree.IElementType; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.yaml.YAMLFileType; /** * @author Daniel Espendiller <daniel@espendiller.net> */ public class YamlPsiElementFactory { @NotNull public static PsiElement createYamlPsiFromText(Project p, final IElementType type, @NotNull String text) { final Ref<PsiElement> ret = new Ref<>(); PsiFile dummyFile = createDummyFile(p, text); dummyFile.accept(new PsiRecursiveElementWalkingVisitor() { @Override public void visitElement(PsiElement element) { if(element.getNode() == type) { ret.set(element); } super.visitElement(element); } }); assert !ret.isNull() : "cannot create element from text:\n" + dummyFile.getText(); return ret.get(); } @Nullable public static <T extends PsiElement> T createFromText(@NotNull Project p, final Class<T> aClass, String text) { final PsiElement[] ret = new PsiElement[]{null}; createDummyFile(p, text).accept(new PsiRecursiveElementWalkingVisitor() { public void visitElement(PsiElement element) { if(ret[0] == null && aClass.isInstance(element)) { ret[0] = element; } super.visitElement(element); } }); return (T) ret[0]; } @NotNull private static PsiFile createDummyFile(Project p, String fileText) { return PsiFileFactory.getInstance(p).createFileFromText("DUMMY__." + YAMLFileType.YML.getDefaultExtension(), YAMLFileType.YML, fileText, System.currentTimeMillis(), false); } @NotNull public static PsiFile createDummyFile(@NotNull Project project, @NotNull String filename, @NotNull String content) { return PsiFileFactory.getInstance(project).createFileFromText(filename, YAMLFileType.YML, content, System.currentTimeMillis(), false); } }