package org.intellij.plugins.markdown.lang; import com.intellij.lang.ASTNode; import com.intellij.lang.PsiBuilder; import com.intellij.lang.PsiBuilderFactory; import com.intellij.lexer.Lexer; import com.intellij.openapi.project.Project; import com.intellij.psi.PsiElement; import com.intellij.psi.tree.ILazyParseableElementType; import org.intellij.markdown.parser.MarkdownParser; import org.intellij.plugins.markdown.lang.lexer.MarkdownLexerAdapter; import org.intellij.plugins.markdown.lang.parser.MarkdownParserManager; import org.intellij.plugins.markdown.lang.parser.PsiBuilderFillingVisitor; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; public class MarkdownLazyElementType extends ILazyParseableElementType { public MarkdownLazyElementType(@NotNull @NonNls String debugName) { super(debugName, MarkdownLanguage.INSTANCE); } @Override protected ASTNode doParseContents(@NotNull ASTNode chameleon, @NotNull PsiElement psi) { final Project project = psi.getProject(); final Lexer lexer = new MarkdownLexerAdapter(); final CharSequence chars = chameleon.getChars(); final org.intellij.markdown.ast.ASTNode node = new MarkdownParser(MarkdownParserManager.FLAVOUR) .parseInline(MarkdownElementType.markdownType(chameleon.getElementType()), chars, 0, chars.length()); final PsiBuilder builder = PsiBuilderFactory.getInstance().createBuilder(project, chameleon, lexer, getLanguage(), chars); assert builder.getCurrentOffset() == 0; new PsiBuilderFillingVisitor(builder).visitNode(node); assert builder.eof(); return builder.getTreeBuilt().getFirstChildNode(); } }