public Void visitStringLiteralExpression()

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;
      }