ASTNode (@NotNull ASTNode chameleon) { final CharTable charTable = SharedImplUtil.findCharTableByTree(chameleon); final FileElement fileElement = TreeUtil.getFileElement((TreeElement)chameleon); final PsiFile psiFile = (PsiFile)fileElement.getPsi(); PsiFile originalPsiFile = psiFile.getOriginalFile(); final TemplateLanguageFileViewProvider viewProvider = (TemplateLanguageFileViewProvider)originalPsiFile.getViewProvider(); final Language templateLanguage = getTemplateFileLanguage(viewProvider); final CharSequence sourceCode = chameleon.getChars(); RangeCollectorImpl collector = new RangeCollectorImpl(this); final PsiFile templatePsiFile = createTemplateFile(psiFile, templateLanguage, sourceCode, viewProvider, collector); final FileElement templateFileElement = ((PsiFileImpl)templatePsiFile).calcTreeElement(); return DebugUtil.performPsiModification("template language parsing", () -> { collector.insertOuterElementsAndRemoveRanges(templateFileElement, sourceCode, charTable, templateFileElement.getPsi().getLanguage()); TreeElement childNode = templateFileElement.getFirstChildNode(); DebugUtil.checkTreeStructure(templateFileElement); DebugUtil.checkTreeStructure(chameleon); if (fileElement != chameleon) { DebugUtil.checkTreeStructure(psiFile.getNode()); DebugUtil.checkTreeStructure(originalPsiFile.getNode()); } return childNode; }); }