static HighlightInfo.Builder checkTemplateExpression(@NotNull PsiTemplateExpression templateExpression) {
    HighlightInfo.Builder builder = checkFeature(templateExpression, JavaFeature.STRING_TEMPLATES,
                                                 PsiUtil.getLanguageLevel(templateExpression), templateExpression.getContainingFile());
    if (builder != null) return builder;
    PsiExpression processor = templateExpression.getProcessor();
    if (processor == null) {
      String message = JavaErrorBundle.message("processor.missing.from.string.template.expression");
      return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(templateExpression).descriptionAndTooltip(message)
        .registerFix(new MissingStrProcessorFix(templateExpression), null, null, null, null);
    }
    PsiType type = processor.getType();
    if (type == null) return null;

    PsiElementFactory factory = JavaPsiFacade.getElementFactory(processor.getProject());
    PsiClassType processorType = factory.createTypeByFQClassName(CommonClassNames.JAVA_LANG_STRING_TEMPLATE_PROCESSOR, processor.getResolveScope());
    if (!TypeConversionUtil.isAssignable(processorType, type)) {
      if (IncompleteModelUtil.isIncompleteModel(templateExpression) && IncompleteModelUtil.isPotentiallyConvertible(processorType, processor)) return null;
      return createIncompatibleTypeHighlightInfo(processorType, type, processor.getTextRange(), 0);
    }

    PsiClass processorClass = processorType.resolve();
    if (processorClass == null) return null;
    for (PsiClassType classType : PsiTypesUtil.getClassTypeComponents(type)) {
      if (!TypeConversionUtil.isAssignable(processorType, classType)) continue;
      PsiClassType.ClassResolveResult resolveResult = classType.resolveGenerics();
      PsiClass aClass = resolveResult.getElement();
      if (aClass == null) continue;
      PsiSubstitutor substitutor = TypeConversionUtil.getClassSubstitutor(processorClass, aClass, resolveResult.getSubstitutor());
      if (substitutor == null) continue;
      Map<PsiTypeParameter, PsiType> substitutionMap = substitutor.getSubstitutionMap();
      if (substitutionMap.isEmpty() || substitutionMap.containsValue(null)) {
        String text = JavaErrorBundle.message("raw.processor.type.not.allowed", type.getPresentableText());
        return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(processor).descriptionAndTooltip(text);
      }
    }

    return null;
  }
static HighlightInfo.Builder checkTemplateExpression(@NotNull PsiTemplateExpression templateExpression)