in src/org/intellij/grammar/editor/BnfAnnotator.java [33:154]
public void annotate(@NotNull PsiElement psiElement, @NotNull AnnotationHolder annotationHolder) {
PsiElement parent = psiElement.getParent();
if (parent instanceof BnfRule rule && rule.getId() == psiElement) {
addRuleHighlighting(rule, psiElement, annotationHolder);
}
else if (parent instanceof BnfAttr attr && attr.getId() == psiElement) {
annotationHolder.newSilentAnnotation(HighlightSeverity.INFORMATION)
.range(psiElement)
.textAttributes(BnfSyntaxHighlighter.ATTRIBUTE)
.create();
}
else if (parent instanceof BnfModifier) {
annotationHolder.newSilentAnnotation(HighlightSeverity.INFORMATION)
.range(psiElement)
.textAttributes(BnfSyntaxHighlighter.KEYWORD)
.create();
}
else if (parent instanceof BnfListEntry listEntry && listEntry.getId() == psiElement) {
boolean hasValue = listEntry.getLiteralExpression() != null;
BnfAttr attr = PsiTreeUtil.getParentOfType(listEntry, BnfAttr.class);
KnownAttribute<?> attribute = attr != null ? KnownAttribute.getCompatibleAttribute(attr.getName()) : null;
if (attribute == KnownAttribute.METHODS && !hasValue) {
annotationHolder.newSilentAnnotation(HighlightSeverity.INFORMATION)
.range(psiElement)
.textAttributes(BnfSyntaxHighlighter.EXTERNAL)
.create();
}
}
else if (psiElement instanceof BnfReferenceOrToken refOrToken) {
if (parent instanceof BnfAttr) {
String text = refOrToken.getText();
if ("true".equals(text) || "false".equals(text)) {
annotationHolder.newSilentAnnotation(HighlightSeverity.INFORMATION)
.range(refOrToken)
.textAttributes(BnfSyntaxHighlighter.KEYWORD)
.create();
return;
}
}
PsiReference reference = refOrToken.getReference();
Object resolve = reference == null ? null : reference.resolve();
if (resolve instanceof BnfRule rule) {
addRuleHighlighting(rule, refOrToken, annotationHolder);
}
else if (resolve instanceof BnfAttr) {
annotationHolder.newSilentAnnotation(HighlightSeverity.INFORMATION)
.range(refOrToken)
.textAttributes(BnfSyntaxHighlighter.ATTRIBUTE)
.create();
}
else if (GrammarUtil.isExternalReference(refOrToken)) {
if (resolve == null && parent instanceof BnfExternalExpression extExpr && extExpr.getArguments().isEmpty() &&
ParserGeneratorUtil.Rule.isMeta(ParserGeneratorUtil.Rule.of(refOrToken))) {
annotationHolder.newSilentAnnotation(HighlightSeverity.INFORMATION)
.range(parent)
.textAttributes(BnfSyntaxHighlighter.META_PARAM)
.create();
}
else {
annotationHolder.newSilentAnnotation(HighlightSeverity.INFORMATION)
.range(refOrToken)
.textAttributes(BnfSyntaxHighlighter.EXTERNAL)
.create();
}
}
else if (resolve == null) {
var text = refOrToken.getId().getText();
if (RuleGraphHelper.getTokenNameToTextMap((BnfFile)refOrToken.getContainingFile()).containsKey(text)) {
annotationHolder.newSilentAnnotation(HighlightSeverity.INFORMATION)
.range(refOrToken)
.textAttributes(BnfSyntaxHighlighter.EXPLICIT_TOKEN)
.create();
} else {
annotationHolder.newSilentAnnotation(HighlightSeverity.INFORMATION)
.range(refOrToken)
.textAttributes(BnfSyntaxHighlighter.IMPLICIT_TOKEN)
.create();
}
}
}
else if (psiElement instanceof BnfStringLiteralExpression) {
if (parent instanceof BnfAttrPattern || parent instanceof BnfAttr || parent instanceof BnfListEntry) {
annotationHolder.newSilentAnnotation(HighlightSeverity.INFORMATION)
.range(psiElement)
.enforcedTextAttributes(TextAttributes.ERASE_MARKER)
.create();
annotationHolder.newSilentAnnotation(HighlightSeverity.INFORMATION)
.range(psiElement)
.textAttributes(BnfSyntaxHighlighter.PATTERN)
.create();
}
if (parent instanceof BnfAttr || parent instanceof BnfListEntry) {
String attrName = Objects.requireNonNull(PsiTreeUtil.getParentOfType(psiElement, BnfAttr.class)).getName();
KnownAttribute<?> attribute = KnownAttribute.getCompatibleAttribute(attrName);
if (attribute != null) {
BnfReferenceImpl<?> reference = ContainerUtil.findInstance(psiElement.getReferences(), BnfReferenceImpl.class);
PsiElement resolve = reference == null ? null : reference.resolve();
if (resolve instanceof BnfRule) {
TextRange range = reference.getRangeInElement().shiftRight(psiElement.getTextRange().getStartOffset());
annotationHolder.newSilentAnnotation(HighlightSeverity.INFORMATION)
.range(range)
.textAttributes(BnfSyntaxHighlighter.RULE)
.create();
}
}
}
else {
String text = ParserGeneratorUtil.getLiteralValue((BnfStringLiteralExpression)psiElement);
if (!RuleGraphHelper.getTokenTextToNameMap((BnfFile)psiElement.getContainingFile()).containsKey(text)) {
String message = "Tokens matched by text are slower than tokens matched by types";
annotationHolder.newSilentAnnotation(HighlightSeverity.INFORMATION)
.range(psiElement)
.enforcedTextAttributes(TextAttributes.ERASE_MARKER)
.create();
annotationHolder.newAnnotation(HighlightSeverity.INFORMATION, message)
.range(psiElement)
.textAttributes(BnfSyntaxHighlighter.PATTERN)
.create();
}
}
}
}