package org.fandev.lang.fan.parsing; import com.intellij.lang.ASTNode; import com.intellij.lang.PsiBuilder; import com.intellij.lang.PsiParser; import com.intellij.openapi.diagnostic.Logger; import com.intellij.psi.tree.IElementType; import com.intellij.psi.text.BlockSupport; import org.fandev.lang.fan.FanBundle; import org.fandev.lang.fan.parsing.topLevel.CompilationUnit; import org.jetbrains.annotations.NotNull; /** * @author Dror * @date Dec 11, 2008 11:54:37 PM */ public class FanParser implements PsiParser { private final static Logger logger = Logger.getInstance(FanParser.class.getName()); @NotNull public ASTNode parse(final IElementType root, final PsiBuilder psiBuilder) { psiBuilder.setDebugMode(true); final PsiBuilder.Marker rootMarker = psiBuilder.mark(); CompilationUnit.parse(psiBuilder); // Make sure we ate it all if (!psiBuilder.eof()) { final PsiBuilder.Marker errorMark = psiBuilder.mark(); while (!psiBuilder.eof()) { psiBuilder.advanceLexer(); } errorMark.error(FanBundle.message("typedef.expected")); } rootMarker.done(root); try { return psiBuilder.getTreeBuilt(); } catch(BlockSupport.ReparsedSuccessfullyException e) { throw e; } catch (Throwable t) { final StringBuilder sb = new StringBuilder(); while (!psiBuilder.eof()) { sb.append(psiBuilder.getTokenText()); psiBuilder.advanceLexer(); } logger.error("Parsing error, current offset is: " + psiBuilder.getCurrentOffset() + " Remaining text is: " + sb.toString(), t); // Notice - this puts the application in an very unstable situation !!! // The action that starts the parsing never finish and so other write actions are blocked for good // ApplicationManager.getApplication(). throw new RuntimeException(t); } } }