package de.halirutan.mathematica;
import com.intellij.lang.FileASTNode;
import com.intellij.mock.MockProject;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiFileFactory;
import com.intellij.psi.PsiWhiteSpace;
import com.intellij.psi.tree.IElementType;
import com.intellij.psi.tree.TokenSet;
import com.intellij.util.ResourceUtil;
import de.halirutan.mathematica.filetypes.MathematicaFileType;
import de.halirutan.mathematica.parsing.MathematicaElementTypes;
import de.halirutan.mathematica.parsing.psi.api.MathematicaPsiFile;
import java.io.File;
import java.io.IOException;
import java.net.URL;
/**
* @author patrick (25.07.15)
*/
public class Main {
private static final TokenSet atoms = TokenSet.create(
MathematicaElementTypes.STRING_LITERAL_EXPRESSION,
MathematicaElementTypes.NUMBER_EXPRESSION,
MathematicaElementTypes.SYMBOL_EXPRESSION,
MathematicaElementTypes.STRINGIFIED_SYMBOL_EXPRESSION
);
public static void main(String[] args) throws IOException {
PsiFileFactory psiFileFactory = createPsiFactory();
final URL source = ResourceUtil.getResource(
Main.class,
"de/halirutan/mathematica",
"spacingExample.m");
File file = new File(source.getFile());
String javaSource = FileUtil.loadFile(file);
FileASTNode root = parseJavaSource(javaSource, psiFileFactory);
final PsiElement[] children = root.getPsi().getChildren();
for (PsiElement child : children) {
if(child instanceof PsiWhiteSpace) continue;
printFullForm(child);
System.out.println("\n");
}
}
private static void printFullForm(PsiElement psiElement) {
if (psiElement != null) {
final IElementType type = psiElement.getNode().getElementType();
if (atoms.contains(type)) {
System.out.print(psiElement.getText());
return;
}
if (psiElement instanceof PsiWhiteSpace) {
return;
}
final PsiElement[] children = psiElement.getChildren();
if (type == MathematicaElementTypes.FUNCTION_CALL_EXPRESSION) {
System.out.print(psiElement.getFirstChild().getText() + "[");
for (int i = 1; i < children.length; i++) {
PsiElement child = children[i];
printFullForm(child);
}
System.out.print("]");
} else {
System.out.print(psiElement.toString() + "[");
boolean first = true;
for (PsiElement child : children) {
if (first) {
first = false;
} else if(!(child instanceof PsiWhiteSpace)) {
System.out.print(",");
}
printFullForm(child);
}
System.out.print("]");
}
}
}
private static PsiFileFactory createPsiFactory() {
MockProject mockProject = createProject();
return PsiFileFactory.getInstance(mockProject);
}
private static FileASTNode parseJavaSource(String source, PsiFileFactory psiFileFactory) {
PsiFile psiFile = psiFileFactory.createFileFromText("__dummy_file__.m", MathematicaFileType.INSTANCE, source);
MathematicaPsiFile psiFile1 = (MathematicaPsiFile) psiFile;
return psiFile1.getNode();
}
private static MockProject createProject() {
MathematicaCoreProjectEnvironment environment = new MathematicaCoreProjectEnvironment(new Disposable() {
@Override
public void dispose() {
}
}, new MathematicaCoreApplicationEnvironment(new Disposable() {
@Override
public void dispose() {
}
}));
return environment.getProject();
}
}