/* * Copyright 2012-2014 Sergey Ignatov * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.intellij.erlang.psi.impl; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFileFactory; import org.intellij.erlang.ErlangLanguage; import org.intellij.erlang.psi.*; import org.jetbrains.annotations.NotNull; @SuppressWarnings("ConstantConditions") public class ErlangElementFactory { private ErlangElementFactory() { } @NotNull public static ErlangAtom createAtomFromText(@NotNull Project project, @NotNull String text) { ErlangFile fileFromText = createFileFromText(project, text + "() -> ok."); return fileFromText.getFunctions().get(0).getFirstClause().getQAtom().getAtom(); } @NotNull public static PsiElement createQVarFromText(@NotNull Project project, @NotNull String text) { return ((ErlangMaxExpression) createExpressionFromText(project, text)).getQVar(); } @NotNull public static ErlangExpression createExpressionFromText(@NotNull Project project, @NotNull String text) { ErlangFile fileFromText = createFileFromText(project, "f() -> " + text + "."); return fileFromText.getFunctions().get(0).getFirstClause().getClauseBody().getExpressionList().get(0); } @NotNull public static ErlangArgumentDefinition createFunExpressionNameFromText(@NotNull Project project, @NotNull String text) { ErlangFile fileFromText = createFileFromText(project, "foo() -> fun " + text + "() -> ok end."); ErlangFunctionClause clause = fileFromText.getFunctions().get(0).getFirstClause(); ErlangFunExpression funExpression = (ErlangFunExpression)clause.getClauseBody().getExpressionList().get(0); return funExpression.getFunClauses().getFunClauseList().get(0).getArgumentDefinition(); } @NotNull public static ErlangFunction createFunctionFromText(@NotNull Project project, @NotNull String text) { ErlangFile fileFromText = createFileFromText(project, text); return fileFromText.getFunctions().get(0); } @NotNull public static PsiElement createMacrosFromText(@NotNull Project project, @NotNull String text) { ErlangFile fileFromText = createFileFromText(project, "-define(" + text + ", 1)."); return fileFromText.getMacroses().get(0).getMacrosName(); } @NotNull public static ErlangGlobalFunctionCallExpression createFunctionWithModuleCallExpression(@NotNull Project project, @NotNull String moduleName, @NotNull String functionCallExpr) { ErlangFile fileFromText = createFileFromText(project, "f() -> " + moduleName + ":" + functionCallExpr + "."); return (ErlangGlobalFunctionCallExpression) fileFromText.getFunctions().get(0).getFirstClause().getClauseBody().getExpressionList().get(0); } @NotNull public static PsiElement createStringFromText(@NotNull Project project, @NotNull String text) { return createIncludeString(project, text).getString(); } @NotNull public static ErlangIncludeString createIncludeString(@NotNull Project project, @NotNull String text) { ErlangFile fileFromText = createFileFromText(project, "-include(\"" + text + "\")."); return fileFromText.getIncludes().get(0).getIncludeStringSafe(); } @NotNull public static PsiElement createExportFromText(@NotNull Project project, @NotNull String text) { return createAttributeFromText(project, "-export([" + text + "])."); } @NotNull public static PsiElement createExportTypeFromText(@NotNull Project project, @NotNull String text) { return createAttributeFromText(project, "-export_type([" + text + "])."); } @NotNull public static PsiElement createRecordFromText(@NotNull Project project, @NotNull String text, @NotNull String ... fields) { String fieldsText = StringUtil.join(fields, ","); ErlangFile fileFromText = createFileFromText(project, "-record(" + text + ", {" + fieldsText + "})."); return fileFromText.getRecords().get(0); } @NotNull public static PsiElement createRecordFieldsFromText(@NotNull Project project, @NotNull String text) { ErlangFile fileFromText = createFileFromText(project, "-record(text{" + text + "})."); return fileFromText.getRecords().get(0).getTypedRecordFields(); } @NotNull public static PsiElement createLeafFromText(@NotNull Project project, @NotNull String text) { return createFileFromText(project, text).getFirstChild(); } @NotNull public static PsiElement createSpecFromText(@NotNull Project project, @NotNull String text) { return createAttributeFromText(project, "-spec " + text); } @NotNull public static PsiElement createWhitespaceFromText(@NotNull Project project, @NotNull String text) { ErlangFile file = createFileFromText(project, text); return file.getFirstChild(); } @NotNull private static PsiElement createAttributeFromText(@NotNull Project project, @NotNull String text) { ErlangFile fileFromText = createFileFromText(project, text); return fileFromText.getAttributes().get(0); } @NotNull private static ErlangFile createFileFromText(@NotNull Project project, @NotNull String text) { return (ErlangFile) PsiFileFactory.getInstance(project).createFileFromText("a.erl", ErlangLanguage.INSTANCE, text); } }