docs: private Description matchInvocation(
        ExpressionTree tree,
        MethodSymbol symbol,
        List<? extends ExpressionTree> args,
        VisitorState state) {
      if (!ASTHelpers.hasAnnotation(symbol, FormatMethod.class, state)) {
        return Description.NO_MATCH;
      }
  
      Type stringType = state.getSymtab().stringType;
  
      List<VarSymbol> params = symbol.getParameters();
      int firstStringIndex = -1;
      int formatString = -1;
      for (int i = 0; i < params.size(); i++) {
        VarSymbol param = params.get(i);
        if (ASTHelpers.hasAnnotation(param, FormatString.class, state)) {
          formatString = i;
          break;
        }
        if (firstStringIndex < 0 && ASTHelpers.isSameType(params.get(i).type, stringType, state)) {
          firstStringIndex = i;
        }
      }
  
      if (formatString < 0) {
        formatString = firstStringIndex;
      }
  
      FormatStringValidation.ValidationResult result =
          StrictFormatStringValidation.validate(
              args.get(formatString), args.subList(formatString + 1, args.size()), state);
  
      if (result != null) {
        return buildDescription(tree).setMessage(result.message()).build();
      } else {
        return Description.NO_MATCH;
      }
    }