in src/org/intellij/grammar/inspection/BnfResolveInspection.java [65:118]
public Void visitStringLiteralExpression(@NotNull BnfStringLiteralExpression o) {
PsiElement parent = o.getParent();
if (parent instanceof BnfAttrPattern) {
PsiReference reference = o.getReference();
if (reference instanceof PsiPolyVariantReference && ((PsiPolyVariantReference)reference).multiResolve(false).length == 0) {
holder.registerProblem(o, GrammarKitBundle.message("inspection.message.pattern.does.not.match.any.rule"));
}
}
else if (parent instanceof BnfAttr || parent instanceof BnfListEntry) {
String attrName = Objects.requireNonNull(PsiTreeUtil.getParentOfType(o, BnfAttr.class)).getName();
KnownAttribute<?> attribute = KnownAttribute.getCompatibleAttribute(attrName);
String value = StringUtil.unquoteString(o.getText());
boolean checkReferences =
attribute != null && attribute != KnownAttribute.NAME && !attribute.getName().endsWith("Factory") &&
!(attribute == KnownAttribute.RECOVER_WHILE &&
(BnfConstants.RECOVER_AUTO.equals(value) ||
GrammarUtil.isDoubleAngles(value) && ParserGeneratorUtil.Rule.isMeta(ParserGeneratorUtil.Rule.of(o))));
if (checkReferences) {
TextRange valueRange = ElementManipulators.getValueTextRange(o);
ThreeState reportAtEnd = ThreeState.UNSURE;
PsiReference refAtEnd = null;
for (PsiReference reference : o.getReferences()) {
if (reference.isSoft()) continue;
boolean atEnd = valueRange.getEndOffset() == reference.getRangeInElement().getEndOffset();
PsiElement resolve = reference.resolve();
if (resolve != null) {
reportAtEnd = ThreeState.NO;
}
else if (!atEnd) {
if (reference.getRangeInElement().getLength() == 1 &&
"?".equals(reference.getCanonicalText()) &&
!(reference instanceof BnfReferenceImpl)) continue;
reportAtEnd = ThreeState.NO;
holder.registerProblem(reference,
ProblemsHolder.unresolvedReferenceMessage(reference),
ProblemHighlightType.GENERIC_ERROR_OR_WARNING);
}
else {
if (reportAtEnd != ThreeState.NO) reportAtEnd = ThreeState.YES;
if (refAtEnd == null ||
refAtEnd.getRangeInElement().getLength() > reference.getRangeInElement().getLength()) {
refAtEnd = reference;
}
}
}
if (reportAtEnd == ThreeState.YES) {
holder.registerProblem(refAtEnd,
ProblemsHolder.unresolvedReferenceMessage(refAtEnd),
ProblemHighlightType.GENERIC_ERROR_OR_WARNING);
}
}
}
return null;
}