package com.dmarcotte.handlebars.inspections; import com.dmarcotte.handlebars.file.HbFileViewProvider; import com.intellij.codeInsight.highlighting.TemplateLanguageErrorFilter; import com.intellij.psi.FileViewProvider; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiWhiteSpace; import com.intellij.psi.templateLanguages.TemplateLanguageFileViewProvider; import com.intellij.psi.tree.TokenSet; import org.jetbrains.annotations.NotNull; import static com.dmarcotte.handlebars.parsing.HbTokenTypes.*; public class HbErrorFilter extends TemplateLanguageErrorFilter { private static final TokenSet START_TEMPLATE_TOKENS = TokenSet.create(OPEN, OPEN_PARTIAL, OPEN_BLOCK, OPEN_INVERSE); protected HbErrorFilter() { super(START_TEMPLATE_TOKENS, HbFileViewProvider.class, "HTML"); } protected boolean shouldIgnoreErrorAt(@NotNull FileViewProvider viewProvider, int offset) { if (super.shouldIgnoreErrorAt(viewProvider, offset)) return true; return hasWhitespacesInHtmlBetweenErrorAndOpenTokens(offset, (TemplateLanguageFileViewProvider)viewProvider); } private static boolean hasWhitespacesInHtmlBetweenErrorAndOpenTokens(int offset, TemplateLanguageFileViewProvider viewProvider) { PsiElement at = viewProvider.findElementAt(offset, viewProvider.getTemplateDataLanguage()); if (!(at instanceof PsiWhiteSpace)) return false; PsiElement elementAt = viewProvider.findElementAt(at.getTextRange().getEndOffset() + 1, viewProvider.getBaseLanguage()); if (elementAt != null && START_TEMPLATE_TOKENS.contains(elementAt.getNode().getElementType())) return true; return false; } }