package org.fandev.lang.fan.psi; import com.intellij.openapi.project.Project; import com.intellij.openapi.components.ServiceManager; import com.intellij.psi.*; import org.jetbrains.annotations.Nullable; import org.fandev.lang.fan.psi.api.topLevel.FanTopStatement; import org.fandev.lang.fan.psi.api.statements.typeDefs.members.FanMethod; import org.fandev.lang.fan.psi.api.statements.typeDefs.FanTypeDefinition; import org.fandev.lang.fan.FanFileType; /** * Date: Sep 26, 2009 * Time: 4:33:50 PM * * @author Dror Bereznitsky */ public class FanPsiElementFactory { private Project myProject; private static String DUMMY = "dummy."; public FanPsiElementFactory(final Project project) { myProject = project; } public static FanPsiElementFactory getInstance(final Project project) { return ServiceManager.getService(project, FanPsiElementFactory.class); } @Nullable public FanTopStatement createTopElementFromText(final String text) { final PsiFile dummyFile = PsiFileFactory.getInstance(myProject).createFileFromText(DUMMY + FanFileType.FAN_FILE_TYPE.getDefaultExtension(), text); final PsiElement firstChild = dummyFile.getFirstChild(); if (!(firstChild instanceof FanTopStatement)){ return null; } return (FanTopStatement) firstChild; } public PsiCodeBlock createMethodBodyFromText(final String text) { final StringBuilder sb = new StringBuilder(); sb.append("class foo {\n"); sb.append("public Void bar() {\n"); sb.append(text); sb.append("}"); final FanFile file = createDummyFile(sb.toString()); final FanTypeDefinition type = (FanTypeDefinition) file.getTopLevelDefinitions()[0]; final PsiMethod method = type.getMethods()[0]; return method.getBody(); } private FanFile createDummyFile(final String s, final boolean isPhisical) { return (FanFile) PsiFileFactory.getInstance(myProject).createFileFromText("DUMMY__." + FanFileType.FAN_FILE_TYPE.getDefaultExtension(), FanFileType.FAN_FILE_TYPE, s, System.currentTimeMillis(), isPhisical); } private FanFile createDummyFile(String s) { return createDummyFile(s, false); } }