use of com.intellij.psi.XmlElementVisitor in project intellij-community by JetBrains.
the class VariableShadowingInspection method buildVisitor.
@NotNull
public PsiElementVisitor buildVisitor(@NotNull final ProblemsHolder holder, final boolean isOnTheFly) {
if (!(holder.getFile() instanceof XmlFile))
return PsiElementVisitor.EMPTY_VISITOR;
return new XmlElementVisitor() {
@Override
public void visitXmlTag(final XmlTag tag) {
final XmlAttribute nameAttr = tag.getAttribute("name", null);
if (nameAttr == null || PsiTreeUtil.hasErrorElements(nameAttr))
return;
if (XsltSupport.isVariableOrParam(tag)) {
final XmlTag shadowedVariable = DeclarationChecker.getInstance((XmlFile) tag.getContainingFile()).getShadowedVariable(tag);
if (shadowedVariable != null) {
final String innerKind = XsltSupport.isParam(tag) ? "Parameter" : "Variable";
final String outerKind = XsltSupport.isParam(shadowedVariable) ? "parameter" : "variable";
final LocalQuickFix fix1 = new RenameVariableFix(tag, "local").createQuickFix(isOnTheFly);
final LocalQuickFix fix2 = new RenameVariableFix(shadowedVariable, "outer").createQuickFix(isOnTheFly);
final XmlAttribute name = tag.getAttribute("name");
assert name != null;
final PsiElement token = XsltSupport.getAttValueToken(name);
assert token != null;
holder.registerProblem(token, innerKind + " '" + name.getValue() + "' shadows " + outerKind, AbstractFix.createFixes(fix1, fix2));
}
}
}
};
}
use of com.intellij.psi.XmlElementVisitor in project intellij-community by JetBrains.
the class CheckTagEmptyBodyInspection method buildVisitor.
@Override
@NotNull
public PsiElementVisitor buildVisitor(@NotNull final ProblemsHolder holder, boolean isOnTheFly) {
return new XmlElementVisitor() {
@Override
public void visitXmlTag(final XmlTag tag) {
if (!CheckEmptyTagInspection.isTagWithEmptyEndNotAllowed(tag)) {
final ASTNode child = XmlChildRole.START_TAG_END_FINDER.findChild(tag.getNode());
if (child != null) {
final ASTNode node = child.getTreeNext();
if (node != null && node.getElementType() == XmlTokenType.XML_END_TAG_START) {
final LocalQuickFix localQuickFix = new Fix();
holder.registerProblem(tag, XmlBundle.message("xml.inspections.tag.empty.body"), isCollapsibleTag(tag) ? localQuickFix : null);
}
}
}
}
};
}
use of com.intellij.psi.XmlElementVisitor in project intellij-community by JetBrains.
the class CheckValidXmlInScriptBodyInspectionBase method buildVisitor.
@Override
@NotNull
public PsiElementVisitor buildVisitor(@NotNull final ProblemsHolder holder, boolean isOnTheFly) {
return new XmlElementVisitor() {
@Override
public void visitXmlTag(final XmlTag tag) {
if (HtmlUtil.isHtmlTag(tag))
return;
if (HtmlUtil.SCRIPT_TAG_NAME.equals(tag.getName()) || tag instanceof HtmlTag && HtmlUtil.SCRIPT_TAG_NAME.equalsIgnoreCase(tag.getName())) {
final PsiFile psiFile = tag.getContainingFile();
final FileType fileType = psiFile.getFileType();
if (fileType instanceof XmlLikeFileType) {
synchronized (CheckValidXmlInScriptBodyInspectionBase.class) {
if (myXmlLexer == null)
myXmlLexer = new XmlLexer();
final XmlTagValue tagValue = tag.getValue();
final String tagBodyText = tagValue.getText();
if (!tagBodyText.isEmpty()) {
myXmlLexer.start(tagBodyText);
while (myXmlLexer.getTokenType() != null) {
IElementType tokenType = myXmlLexer.getTokenType();
if (tokenType == XmlTokenType.XML_CDATA_START) {
while (tokenType != null && tokenType != XmlTokenType.XML_CDATA_END) {
myXmlLexer.advance();
tokenType = myXmlLexer.getTokenType();
}
if (tokenType == null)
break;
}
if (tokenType == XmlTokenType.XML_BAD_CHARACTER && "&".equals(TreeUtil.getTokenText(myXmlLexer)) || tokenType == XmlTokenType.XML_START_TAG_START) {
final int valueStart = tagValue.getTextRange().getStartOffset();
final int offset = valueStart + myXmlLexer.getTokenStart();
final PsiElement psiElement = psiFile.findElementAt(offset);
final TextRange elementRange = psiElement.getTextRange();
final int offsetInElement = offset - elementRange.getStartOffset();
holder.registerProblem(psiElement, XmlBundle.message("unescaped.xml.character"), ProblemHighlightType.GENERIC_ERROR_OR_WARNING, createFix(psiElement, offsetInElement));
int endOfElementInScriptTag = elementRange.getEndOffset() - valueStart;
while (myXmlLexer.getTokenEnd() < endOfElementInScriptTag) {
myXmlLexer.advance();
if (myXmlLexer.getTokenType() == null)
break;
}
}
myXmlLexer.advance();
}
}
}
}
}
}
};
}
Aggregations