void (@NotNull PsiElement element) { final IElementType elementType = element.getNode().getElementType(); if (elementType != XPathTokenTypes.STAR && XPath2TokenTypes.KEYWORDS.contains(elementType)) { final PsiElement leaf = PsiTreeUtil.prevLeaf(element); PsiElement number; if (leaf != null && (number = leaf.getParent()) instanceof XPathNumber && ((XPathNumber)number).getXPathVersion() == XPathVersion.V2) { AnnotationBuilder builder = myHolder.newAnnotation(HighlightSeverity.ERROR, XPathBundle.message("annotator.error.number.literal.must.be.followed.by.whitespace.in.xpath")); final XPathBinaryExpression expression = PsiTreeUtil.getParentOfType(number, XPathBinaryExpression.class, true); if (expression != null) { final XPathExpression lOperand = expression.getLOperand(); if (number == lOperand) { final XPathExpression rOperand = expression.getROperand(); if (rOperand != null) { final String display = number.getText() + " " + expression.getOperationSign(); final String replacement = display + " " + rOperand.getText(); assert PsiEquivalenceUtil.areElementsEquivalent(expression, XPathChangeUtil.createExpression(expression, replacement)); builder = builder.withFix(new ExpressionReplacementFix(replacement, display, expression)); } } else if (number == expression.getROperand()) { final XPathExpression next = PsiTreeUtil.getParentOfType(PsiTreeUtil.nextLeaf(expression), XPathExpression.class, true); if (next instanceof XPathBinaryExpression left) { final XPathExpression rOperand = left.getROperand(); if (rOperand != null && lOperand != null) { final String display = number.getText() + " " + left.getOperationSign(); final String replacement = lOperand.getText() + " " + expression.getOperationSign() + " " + display + " " + rOperand.getText(); assert PsiEquivalenceUtil.areElementsEquivalent(next, XPathChangeUtil.createExpression(next, replacement)); builder = builder.withFix(new ExpressionReplacementFix(replacement, display, next)); } } } } builder.create(); } } super.visitElement(element); }