package com.jetbrains.lang.dart.util;
import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiFileFactory;
import com.intellij.psi.impl.PsiFileFactoryImpl;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.testFramework.LightVirtualFile;
import com.jetbrains.lang.dart.DartFileType;
import com.jetbrains.lang.dart.DartLanguage;
import com.jetbrains.lang.dart.psi.*;
import com.jetbrains.lang.dart.psi.impl.DartExpressionCodeFragmentImpl;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public class DartElementGenerator {
@Nullable
public static DartReference createReferenceFromText(Project myProject, String text) {
final DartExpression expression = createExpressionFromText(myProject, text);
return expression instanceof DartReference ? (DartReference)expression : null;
}
@Nullable
public static DartExpression createExpressionFromText(Project myProject, String text) {
final PsiFile file = createDummyFile(myProject, "var dummy = " + text + ";");
final PsiElement child = file.getFirstChild();
if (child instanceof DartVarDeclarationList) {
final DartVarInit varInit = ((DartVarDeclarationList)child).getVarInit();
return varInit == null ? null : varInit.getExpression();
}
return null;
}
public static PsiFile createExpressionCodeFragment(Project myProject, String text, PsiElement context) {
final String name = "dummy." + DartFileType.DEFAULT_EXTENSION;
final DartExpressionCodeFragmentImpl codeFragment = new DartExpressionCodeFragmentImpl(myProject, name, text, true);
codeFragment.setContext(context);
return codeFragment;
}
@Nullable
public static PsiElement createStatementFromText(Project myProject, String text) {
final PsiFile file = createDummyFile(myProject, "dummy(){" + text + "}");
final PsiElement child = file.getFirstChild();
if (child instanceof DartFunctionDeclarationWithBodyOrNative) {
final DartFunctionBody functionBody = ((DartFunctionDeclarationWithBodyOrNative)child).getFunctionBody();
final IDartBlock block = PsiTreeUtil.getChildOfType(functionBody, IDartBlock.class);
final DartStatements statements = block == null ? null : block.getStatements();
return statements == null ? null : statements.getFirstChild();
}
return null;
}
@Nullable
public static DartId createIdentifierFromText(Project myProject, String name) {
final PsiFile dummyFile = createDummyFile(myProject, name + "(){}");
final DartComponent dartComponent = PsiTreeUtil.getChildOfType(dummyFile, DartComponent.class);
final DartComponentName componentName = dartComponent == null ? null : dartComponent.getComponentName();
return componentName == null ? null : componentName.getId();
}
@Nullable
public static DartLibraryNameElement createLibraryNameElementFromText(@NotNull final Project project, @NotNull final String libraryName) {
final PsiFile dummyFile = createDummyFile(project, "library " + libraryName + ";");
final DartLibraryStatement libraryStatement = PsiTreeUtil.getChildOfType(dummyFile, DartLibraryStatement.class);
return libraryStatement == null ? null : libraryStatement.getLibraryNameElement();
}
public static PsiFile createDummyFile(Project myProject, String text) {
final PsiFileFactory factory = PsiFileFactory.getInstance(myProject);
final String name = "dummy." + DartFileType.INSTANCE.getDefaultExtension();
final LightVirtualFile virtualFile = new LightVirtualFile(name, DartFileType.INSTANCE, text);
final PsiFile psiFile = ((PsiFileFactoryImpl)factory).trySetupPsiForFile(virtualFile, DartLanguage.INSTANCE, false, true);
assert psiFile != null;
return psiFile;
}
}