1use crate::functions::Function;
2
3use super::Node;
4
5#[cfg(target_arch = "wasm32")]
6use regex_lite as regex;
7
8use regex::Regex;
9use std::sync::OnceLock;
10
11static RANGE_REFERENCE_REGEX: OnceLock<Regex> = OnceLock::new();
12
13#[allow(clippy::expect_used)]
14fn get_re() -> &'static Regex {
15 RANGE_REFERENCE_REGEX
16 .get_or_init(|| Regex::new(r":[A-Z]*[0-9]*$").expect("Regex is known to be valid"))
17}
18
19fn is_range_reference(s: &str) -> bool {
20 get_re().is_match(s)
21}
22
23pub fn add_implicit_intersection(node: &mut Node, add: bool) {
66 match node {
67 Node::BooleanKind(_)
68 | Node::NumberKind(_)
69 | Node::StringKind(_)
70 | Node::ErrorKind(_)
71 | Node::EmptyArgKind
72 | Node::ParseErrorKind { .. }
73 | Node::WrongReferenceKind { .. }
74 | Node::WrongRangeKind { .. }
75 | Node::NamedFunctionKind { .. }
76 | Node::ArrayKind(_)
77 | Node::ReferenceKind { .. }
78 | Node::LambdaDefKind { .. }
79 | Node::LambdaCallKind { .. } => {}
80 Node::ImplicitIntersection { child, .. } => {
81 let mut new_node = child.as_ref().clone();
83 add_implicit_intersection(&mut new_node, add);
84 if matches!(&new_node, Node::ImplicitIntersection { .. }) {
85 *node = new_node
86 }
87 }
88 Node::SpillRangeOperator { child } => {
89 add_implicit_intersection(child, add);
90 }
91 Node::RangeKind {
92 row1,
93 column1,
94 row2,
95 column2,
96 sheet_name,
97 sheet_index,
98 absolute_row1,
99 absolute_column1,
100 absolute_row2,
101 absolute_column2,
102 } => {
103 if add {
104 *node = Node::ImplicitIntersection {
105 automatic: true,
106 child: Box::new(Node::RangeKind {
107 sheet_name: sheet_name.clone(),
108 sheet_index: *sheet_index,
109 absolute_row1: *absolute_row1,
110 absolute_column1: *absolute_column1,
111 row1: *row1,
112 column1: *column1,
113 absolute_row2: *absolute_row2,
114 absolute_column2: *absolute_column2,
115 row2: *row2,
116 column2: *column2,
117 }),
118 };
119 }
120 }
121 Node::OpRangeKind { left, right } => {
122 if add {
123 *node = Node::ImplicitIntersection {
124 automatic: true,
125 child: Box::new(Node::OpRangeKind {
126 left: left.clone(),
127 right: right.clone(),
128 }),
129 }
130 }
131 }
132
133 Node::UnaryKind { right, .. } => add_implicit_intersection(right, add),
135 Node::OpConcatenateKind { left, right }
136 | Node::OpSumKind { left, right, .. }
137 | Node::OpProductKind { left, right, .. }
138 | Node::OpPowerKind { left, right, .. }
139 | Node::CompareKind { left, right, .. } => {
140 add_implicit_intersection(left, add);
141 add_implicit_intersection(right, add);
142 }
143
144 Node::DefinedNameKind(v) => {
145 if add {
146 if is_range_reference(&v.2) {
149 *node = Node::ImplicitIntersection {
150 automatic: true,
151 child: Box::new(Node::DefinedNameKind(v.to_owned())),
152 }
153 }
154 }
155 }
156 Node::NamedVariableKind { name, id } => {
157 if add {
158 *node = Node::ImplicitIntersection {
159 automatic: true,
160 child: Box::new(Node::NamedVariableKind {
161 name: name.clone(),
162 id: *id,
163 }),
164 }
165 }
166 }
167 Node::TableNameKind(_) => {
168 }
170 Node::FunctionKind { kind, args } => {
171 let arg_count = args.len();
172 let signature = get_function_args_signature(kind, arg_count);
173 for index in 0..arg_count {
174 if matches!(signature[index], Signature::Scalar)
175 && matches!(
176 run_static_analysis_on_node(&args[index]),
177 StaticResult::Range(_, _) | StaticResult::Unknown
178 )
179 {
180 add_implicit_intersection(&mut args[index], true);
181 } else {
182 add_implicit_intersection(&mut args[index], false);
183 }
184 }
185 let new_function = matches!(kind, Function::Let | Function::Lambda);
187 if !new_function
188 && add
189 && matches!(
190 run_static_analysis_on_node(node),
191 StaticResult::Range(_, _) | StaticResult::Unknown
192 )
193 {
194 *node = Node::ImplicitIntersection {
195 automatic: true,
196 child: Box::new(node.clone()),
197 }
198 }
199 }
200 };
201}
202
203pub fn remove_redundant_implicit_intersection(node: &mut Node, add: bool) {
222 match node {
223 Node::BooleanKind(_)
225 | Node::NumberKind(_)
226 | Node::StringKind(_)
227 | Node::ErrorKind(_)
228 | Node::EmptyArgKind
229 | Node::ParseErrorKind { .. }
230 | Node::WrongReferenceKind { .. }
231 | Node::WrongRangeKind { .. }
232 | Node::NamedFunctionKind { .. }
233 | Node::ArrayKind(_)
234 | Node::ReferenceKind { .. }
235 | Node::RangeKind { .. }
236 | Node::OpRangeKind { .. }
237 | Node::DefinedNameKind(_)
238 | Node::NamedVariableKind { .. }
239 | Node::TableNameKind(_)
240 | Node::LambdaDefKind { .. }
241 | Node::LambdaCallKind { .. } => {}
242 Node::ImplicitIntersection { child, .. } => {
243 if add {
244 let mut probe = child.as_ref().clone();
247 add_implicit_intersection(&mut probe, true);
248 if matches!(probe, Node::ImplicitIntersection { .. }) {
249 let mut inner = child.as_ref().clone();
253 remove_redundant_implicit_intersection(&mut inner, add);
254 *node = inner;
255 return;
256 }
257 }
258 remove_redundant_implicit_intersection(child, false);
260 }
261 Node::SpillRangeOperator { child } => {
262 remove_redundant_implicit_intersection(child, add);
263 }
264 Node::UnaryKind { right, .. } => remove_redundant_implicit_intersection(right, add),
265 Node::OpConcatenateKind { left, right }
266 | Node::OpSumKind { left, right, .. }
267 | Node::OpProductKind { left, right, .. }
268 | Node::OpPowerKind { left, right, .. }
269 | Node::CompareKind { left, right, .. } => {
270 remove_redundant_implicit_intersection(left, add);
271 remove_redundant_implicit_intersection(right, add);
272 }
273 Node::FunctionKind { kind, args } => {
274 let arg_count = args.len();
275 let signature = get_function_args_signature(kind, arg_count);
276 for index in 0..arg_count {
277 let child_add = matches!(signature[index], Signature::Scalar);
280 remove_redundant_implicit_intersection(&mut args[index], child_add);
281 }
282 }
283 };
284}
285
286pub enum StaticResult {
288 Scalar,
290 Array(i32, i32),
292 Range(i32, i32),
294 Unknown,
296 }
299
300fn static_analysis_op_nodes(left: &Node, right: &Node) -> StaticResult {
301 let lhs = run_static_analysis_on_node(left);
302 let rhs = run_static_analysis_on_node(right);
303 match (lhs, rhs) {
304 (StaticResult::Scalar, StaticResult::Scalar) => StaticResult::Scalar,
305 (StaticResult::Scalar, StaticResult::Array(a, b) | StaticResult::Range(a, b)) => {
306 StaticResult::Array(a, b)
307 }
308
309 (StaticResult::Array(a, b) | StaticResult::Range(a, b), StaticResult::Scalar) => {
310 StaticResult::Array(a, b)
311 }
312 (
313 StaticResult::Array(a1, b1) | StaticResult::Range(a1, b1),
314 StaticResult::Array(a2, b2) | StaticResult::Range(a2, b2),
315 ) => StaticResult::Array(a1.max(a2), b1.max(b2)),
316
317 (_, StaticResult::Unknown) => StaticResult::Unknown,
318 (StaticResult::Unknown, _) => StaticResult::Unknown,
319 }
320}
321
322pub(crate) fn run_static_analysis_on_node(node: &Node) -> StaticResult {
328 match node {
329 Node::BooleanKind(_)
330 | Node::NumberKind(_)
331 | Node::StringKind(_)
332 | Node::ErrorKind(_)
333 | Node::EmptyArgKind => StaticResult::Scalar,
334 Node::UnaryKind { right, .. } => run_static_analysis_on_node(right),
335 Node::ParseErrorKind { .. } => {
336 StaticResult::Scalar
338 }
339 Node::WrongReferenceKind { .. } => {
340 StaticResult::Scalar
342 }
343 Node::WrongRangeKind { .. } => {
344 StaticResult::Scalar
346 }
347 Node::NamedFunctionKind { .. } => {
348 StaticResult::Unknown
352 }
353 Node::ArrayKind(array) => {
354 let n = array.len() as i32;
355 let m = array.first().map(|row| row.len() as i32).unwrap_or(0);
356 StaticResult::Array(n, m)
357 }
358 Node::RangeKind {
359 row1,
360 column1,
361 row2,
362 column2,
363 ..
364 } => StaticResult::Range(row2 - row1, column2 - column1),
365 Node::OpRangeKind { .. } => {
366 StaticResult::Unknown
368 }
369 Node::ReferenceKind { .. } => StaticResult::Scalar,
370
371 Node::OpConcatenateKind { left, right }
373 | Node::OpSumKind { left, right, .. }
374 | Node::OpProductKind { left, right, .. }
375 | Node::OpPowerKind { left, right, .. }
376 | Node::CompareKind { left, right, .. } => static_analysis_op_nodes(left, right),
377
378 Node::DefinedNameKind(_) => {
380 StaticResult::Unknown
382 }
383 Node::NamedVariableKind { .. } => StaticResult::Scalar,
384 Node::TableNameKind(_) => StaticResult::Unknown,
385 Node::FunctionKind { kind, args } => static_analysis_on_function(kind, args),
386 Node::ImplicitIntersection { .. } => StaticResult::Scalar,
387 Node::SpillRangeOperator { .. } => StaticResult::Unknown,
388 Node::LambdaDefKind { .. } => StaticResult::Unknown,
389 Node::LambdaCallKind { .. } => StaticResult::Unknown,
390 }
391}
392
393fn scalar_arguments(args: &[Node]) -> StaticResult {
396 let mut n = 0;
397 let mut m = 0;
398 for arg in args {
399 match run_static_analysis_on_node(arg) {
400 StaticResult::Scalar => {
401 }
403 StaticResult::Array(a, b) | StaticResult::Range(a, b) => {
404 n = n.max(a);
405 m = m.max(b);
406 }
407 StaticResult::Unknown => return StaticResult::Unknown,
408 }
409 }
410 if n == 0 && m == 0 {
411 return StaticResult::Scalar;
412 }
413 StaticResult::Array(n, m)
414}
415
416fn not_implemented(_args: &[Node]) -> StaticResult {
418 StaticResult::Scalar
419}
420
421fn sumif_static_result(args: &[Node]) -> StaticResult {
426 match args.get(1) {
427 Some(criteria) => match run_static_analysis_on_node(criteria) {
428 StaticResult::Array(a, b) | StaticResult::Range(a, b) => StaticResult::Array(a, b),
429 StaticResult::Scalar => StaticResult::Scalar,
430 StaticResult::Unknown => StaticResult::Unknown,
431 },
432 None => StaticResult::Scalar,
433 }
434}
435
436fn static_analysis_offset(args: &[Node]) -> StaticResult {
437 let arg_count = args.len();
440 if arg_count < 3 {
441 return StaticResult::Scalar;
443 }
444 if !matches!(args[0], Node::ReferenceKind { .. }) {
445 return StaticResult::Unknown;
446 }
447 if arg_count == 3 {
448 return StaticResult::Scalar;
449 }
450 match args[3] {
451 Node::NumberKind(f) => {
452 if f != 1.0 {
453 return StaticResult::Unknown;
454 }
455 }
456 _ => return StaticResult::Unknown,
457 };
458 if arg_count == 4 {
459 return StaticResult::Scalar;
460 }
461 match args[4] {
462 Node::NumberKind(f) => {
463 if f != 1.0 {
464 return StaticResult::Unknown;
465 }
466 }
467 _ => return StaticResult::Unknown,
468 };
469 StaticResult::Scalar
471}
472
473fn static_analysis_indirect(_args: &[Node]) -> StaticResult {
479 StaticResult::Unknown
481}
482
483fn static_analysis_index(_args: &[Node]) -> StaticResult {
484 StaticResult::Unknown
486}
487
488#[derive(Clone)]
489enum Signature {
490 Scalar,
491 Vector,
492 Error,
493}
494
495fn args_signature_no_args(arg_count: usize) -> Vec<Signature> {
496 if arg_count == 0 {
497 vec![]
498 } else {
499 vec![Signature::Error; arg_count]
500 }
501}
502
503fn args_signature_scalars(
504 arg_count: usize,
505 required_count: usize,
506 optional_count: usize,
507) -> Vec<Signature> {
508 if arg_count >= required_count && arg_count <= required_count + optional_count {
509 vec![Signature::Scalar; arg_count]
510 } else {
511 vec![Signature::Error; arg_count]
512 }
513}
514
515fn args_signature_lambda(arg_count: usize) -> Vec<Signature> {
516 if arg_count == 0 {
518 return vec![Signature::Error; arg_count];
519 }
520 let mut sig = vec![Signature::Scalar; arg_count];
522 sig[arg_count - 1] = Signature::Vector;
523 sig
524}
525
526fn args_signature_let(arg_count: usize) -> Vec<Signature> {
527 if arg_count < 3 || arg_count.is_multiple_of(2) {
529 return vec![Signature::Error; arg_count];
530 }
531 (0..arg_count)
532 .map(|i| {
533 if i % 2 == 1 || i == arg_count - 1 {
538 Signature::Vector
539 } else {
540 Signature::Scalar
541 }
542 })
543 .collect()
544}
545
546fn args_signature_arraytotext(arg_count: usize) -> Vec<Signature> {
547 match arg_count {
548 1 => vec![Signature::Vector],
549 2 => vec![Signature::Vector, Signature::Scalar],
550 _ => vec![Signature::Error; arg_count],
551 }
552}
553
554fn args_signature_one_vector(arg_count: usize) -> Vec<Signature> {
555 if arg_count == 1 {
556 vec![Signature::Vector]
557 } else {
558 vec![Signature::Error; arg_count]
559 }
560}
561
562fn args_signature_sumif(arg_count: usize) -> Vec<Signature> {
563 if arg_count == 2 {
564 vec![Signature::Vector, Signature::Scalar]
565 } else if arg_count == 3 {
566 vec![Signature::Vector, Signature::Scalar, Signature::Vector]
567 } else {
568 vec![Signature::Error; arg_count]
569 }
570}
571
572fn args_signature_sumif_spill(arg_count: usize) -> Vec<Signature> {
577 if arg_count == 2 {
578 vec![Signature::Vector, Signature::Vector]
579 } else if arg_count == 3 {
580 vec![Signature::Vector, Signature::Vector, Signature::Vector]
581 } else {
582 vec![Signature::Error; arg_count]
583 }
584}
585
586fn args_signature_sheet(arg_count: usize) -> Vec<Signature> {
588 if arg_count == 0 {
589 vec![]
590 } else if arg_count == 1 {
591 vec![Signature::Scalar]
592 } else {
593 vec![Signature::Error; arg_count]
594 }
595}
596
597fn args_signature_hlookup(arg_count: usize) -> Vec<Signature> {
598 if arg_count == 3 {
599 vec![Signature::Vector, Signature::Vector, Signature::Scalar]
600 } else if arg_count == 4 {
601 vec![
602 Signature::Vector,
603 Signature::Vector,
604 Signature::Scalar,
605 Signature::Vector,
606 ]
607 } else {
608 vec![Signature::Error; arg_count]
609 }
610}
611
612fn args_signature_index(arg_count: usize) -> Vec<Signature> {
613 if arg_count == 2 {
614 vec![Signature::Vector, Signature::Scalar]
615 } else if arg_count == 3 {
616 vec![Signature::Vector, Signature::Scalar, Signature::Scalar]
617 } else if arg_count == 4 {
618 vec![
619 Signature::Vector,
620 Signature::Scalar,
621 Signature::Scalar,
622 Signature::Scalar,
623 ]
624 } else {
625 vec![Signature::Error; arg_count]
626 }
627}
628
629fn args_signature_lookup(arg_count: usize) -> Vec<Signature> {
630 if arg_count == 2 {
631 vec![Signature::Vector, Signature::Vector]
632 } else if arg_count == 3 {
633 vec![Signature::Vector, Signature::Vector, Signature::Vector]
634 } else {
635 vec![Signature::Error; arg_count]
636 }
637}
638
639fn args_signature_match(arg_count: usize) -> Vec<Signature> {
640 if arg_count == 2 {
641 vec![Signature::Vector, Signature::Vector]
642 } else if arg_count == 3 {
643 vec![Signature::Vector, Signature::Vector, Signature::Scalar]
644 } else {
645 vec![Signature::Error; arg_count]
646 }
647}
648
649fn args_signature_offset(arg_count: usize) -> Vec<Signature> {
650 if arg_count == 3 {
651 vec![Signature::Vector, Signature::Scalar, Signature::Scalar]
652 } else if arg_count == 4 {
653 vec![
654 Signature::Vector,
655 Signature::Scalar,
656 Signature::Scalar,
657 Signature::Scalar,
658 ]
659 } else if arg_count == 5 {
660 vec![
661 Signature::Vector,
662 Signature::Scalar,
663 Signature::Scalar,
664 Signature::Scalar,
665 Signature::Scalar,
666 ]
667 } else {
668 vec![Signature::Error; arg_count]
669 }
670}
671
672fn args_signature_row(arg_count: usize) -> Vec<Signature> {
673 if arg_count == 0 {
674 vec![]
675 } else if arg_count == 1 {
676 vec![Signature::Vector]
677 } else {
678 vec![Signature::Error; arg_count]
679 }
680}
681
682fn args_signature_xlookup(arg_count: usize) -> Vec<Signature> {
683 if !(3..=6).contains(&arg_count) {
684 return vec![Signature::Error; arg_count];
685 }
686 let mut result = vec![Signature::Scalar; arg_count];
687 result[0] = Signature::Vector;
688 result[1] = Signature::Vector;
689 result[2] = Signature::Vector;
690 result
691}
692
693fn args_signature_sort(arg_count: usize) -> Vec<Signature> {
694 if !(1..=4).contains(&arg_count) {
695 return vec![Signature::Error; arg_count];
696 }
697 let mut result = vec![Signature::Scalar; arg_count];
698 result[0] = Signature::Vector;
699 result
700}
701
702fn args_signature_sortby(arg_count: usize) -> Vec<Signature> {
703 if arg_count < 2 || (arg_count > 3 && arg_count.is_multiple_of(2)) {
705 return vec![Signature::Error; arg_count];
706 }
707 let mut result = vec![Signature::Scalar; arg_count];
710 result[0] = Signature::Vector;
711 let mut i = 1;
712 while i < arg_count {
713 result[i] = Signature::Vector; i += 2; }
716 result
717}
718
719fn args_signature_unique(arg_count: usize) -> Vec<Signature> {
720 if !(1..=3).contains(&arg_count) {
721 return vec![Signature::Error; arg_count];
722 }
723 let mut result = vec![Signature::Scalar; arg_count];
724 result[0] = Signature::Vector;
725 result
726}
727
728fn args_signature_filter(arg_count: usize) -> Vec<Signature> {
729 if !(2..=3).contains(&arg_count) {
730 return vec![Signature::Error; arg_count];
731 }
732 let mut result = vec![Signature::Scalar; arg_count];
733 result[0] = Signature::Vector;
734 result[1] = Signature::Vector;
735 result
736}
737
738fn args_signature_sequence(arg_count: usize) -> Vec<Signature> {
739 if !(1..=4).contains(&arg_count) {
740 return vec![Signature::Error; arg_count];
741 }
742 vec![Signature::Scalar; arg_count]
743}
744
745fn args_signature_randarray(arg_count: usize) -> Vec<Signature> {
746 if arg_count > 5 {
747 return vec![Signature::Error; arg_count];
748 }
749 vec![Signature::Scalar; arg_count]
750}
751
752fn args_signature_take(arg_count: usize) -> Vec<Signature> {
753 if !(2..=3).contains(&arg_count) {
754 return vec![Signature::Error; arg_count];
755 }
756 let mut result = vec![Signature::Scalar; arg_count];
757 result[0] = Signature::Vector;
758 result
759}
760
761fn args_signature_drop(arg_count: usize) -> Vec<Signature> {
762 if !(2..=3).contains(&arg_count) {
763 return vec![Signature::Error; arg_count];
764 }
765 let mut result = vec![Signature::Scalar; arg_count];
766 result[0] = Signature::Vector;
767 result
768}
769
770fn args_signature_tocol(arg_count: usize) -> Vec<Signature> {
771 if !(1..=3).contains(&arg_count) {
772 return vec![Signature::Error; arg_count];
773 }
774 let mut result = vec![Signature::Scalar; arg_count];
775 result[0] = Signature::Vector;
776 result
777}
778
779fn args_signature_bycol_byrow(arg_count: usize) -> Vec<Signature> {
780 if arg_count != 2 {
781 return vec![Signature::Error; arg_count];
782 }
783 vec![Signature::Vector, Signature::Scalar]
784}
785
786fn args_signature_map(arg_count: usize) -> Vec<Signature> {
787 if arg_count < 2 {
788 return vec![Signature::Error; arg_count];
789 }
790 let mut result = vec![Signature::Vector; arg_count];
792 result[arg_count - 1] = Signature::Scalar;
793 result
794}
795
796fn args_signature_reduce(arg_count: usize) -> Vec<Signature> {
797 match arg_count {
798 2 => vec![Signature::Vector, Signature::Scalar],
799 3 => vec![Signature::Scalar, Signature::Vector, Signature::Scalar],
800 _ => vec![Signature::Error; arg_count],
801 }
802}
803
804fn args_signature_scan(arg_count: usize) -> Vec<Signature> {
805 match arg_count {
806 2 => vec![Signature::Vector, Signature::Scalar],
807 3 => vec![Signature::Scalar, Signature::Vector, Signature::Scalar],
808 _ => vec![Signature::Error; arg_count],
809 }
810}
811
812fn args_signature_textsplit(arg_count: usize) -> Vec<Signature> {
813 if !(2..=6).contains(&arg_count) {
814 return vec![Signature::Error; arg_count];
815 }
816 let mut result = vec![Signature::Scalar; arg_count];
818 result[1] = Signature::Vector;
819 if arg_count >= 3 {
820 result[2] = Signature::Vector;
821 }
822 result
823}
824
825fn args_signature_textafter(arg_count: usize) -> Vec<Signature> {
826 if !(2..=6).contains(&arg_count) {
827 vec![Signature::Scalar; arg_count]
828 } else {
829 vec![Signature::Error; arg_count]
830 }
831}
832
833fn args_signature_textjoin(arg_count: usize) -> Vec<Signature> {
834 if arg_count >= 3 {
835 let mut result = vec![Signature::Vector; arg_count];
836 result[0] = Signature::Scalar;
837 result[1] = Signature::Scalar;
838 result
839 } else {
840 vec![Signature::Error; arg_count]
841 }
842}
843
844fn args_signature_npv(arg_count: usize) -> Vec<Signature> {
845 if arg_count < 2 {
846 return vec![Signature::Error; arg_count];
847 }
848 let mut result = vec![Signature::Vector; arg_count];
849 result[0] = Signature::Scalar;
850 result
851}
852
853fn args_signature_irr(arg_count: usize) -> Vec<Signature> {
854 if arg_count > 2 {
855 vec![Signature::Error; arg_count]
856 } else if arg_count == 1 {
857 vec![Signature::Vector]
858 } else {
859 vec![Signature::Vector, Signature::Scalar]
860 }
861}
862
863fn args_signature_xirr(arg_count: usize) -> Vec<Signature> {
864 if arg_count == 2 {
865 vec![Signature::Vector; arg_count]
866 } else if arg_count == 3 {
867 vec![Signature::Vector, Signature::Vector, Signature::Scalar]
868 } else {
869 vec![Signature::Error; arg_count]
870 }
871}
872
873fn args_signature_mirr(arg_count: usize) -> Vec<Signature> {
874 if arg_count != 3 {
875 vec![Signature::Error; arg_count]
876 } else {
877 vec![Signature::Vector, Signature::Scalar, Signature::Scalar]
878 }
879}
880
881fn args_signature_xnpv(arg_count: usize) -> Vec<Signature> {
882 if arg_count != 3 {
883 vec![Signature::Error; arg_count]
884 } else {
885 vec![Signature::Scalar, Signature::Vector, Signature::Vector]
886 }
887}
888
889fn args_signature_networkdays(arg_count: usize) -> Vec<Signature> {
892 if arg_count == 2 {
893 vec![Signature::Scalar, Signature::Scalar]
894 } else if arg_count == 3 {
895 vec![Signature::Scalar, Signature::Scalar, Signature::Vector]
896 } else {
897 vec![Signature::Error; arg_count]
898 }
899}
900
901fn args_signature_networkdays_intl(arg_count: usize) -> Vec<Signature> {
904 if arg_count == 2 {
905 vec![Signature::Scalar, Signature::Scalar]
906 } else if arg_count == 3 {
907 vec![Signature::Scalar, Signature::Scalar, Signature::Scalar]
908 } else if arg_count == 4 {
909 vec![
910 Signature::Scalar,
911 Signature::Scalar,
912 Signature::Scalar,
913 Signature::Vector,
914 ]
915 } else {
916 vec![Signature::Error; arg_count]
917 }
918}
919
920fn args_signature_xmatch(arg_count: usize) -> Vec<Signature> {
926 if !(2..=4).contains(&arg_count) {
927 return vec![Signature::Error; arg_count];
928 }
929 let mut result = vec![Signature::Scalar; arg_count];
930 result[1] = Signature::Vector;
931 result
932}
933
934fn args_signature_trimrange(arg_count: usize) -> Vec<Signature> {
935 if !(1..=3).contains(&arg_count) {
936 return vec![Signature::Error; arg_count];
937 }
938 let mut result = vec![Signature::Scalar; arg_count];
939 result[0] = Signature::Vector;
940 result
941}
942
943fn args_signature_address(arg_count: usize) -> Vec<Signature> {
944 if !(2..=5).contains(&arg_count) {
945 return vec![Signature::Error; arg_count];
946 }
947 vec![Signature::Scalar; arg_count]
948}
949
950fn args_signature_choosecols(arg_count: usize) -> Vec<Signature> {
951 if arg_count < 2 {
952 return vec![Signature::Error; arg_count];
953 }
954 let mut result = vec![Signature::Scalar; arg_count];
955 result[0] = Signature::Vector;
956 result
957}
958
959fn args_signature_expand(arg_count: usize) -> Vec<Signature> {
960 if !(2..=4).contains(&arg_count) {
961 return vec![Signature::Error; arg_count];
962 }
963 let mut result = vec![Signature::Scalar; arg_count];
964 result[0] = Signature::Vector;
965 result
966}
967
968fn args_signature_wrapcols(arg_count: usize) -> Vec<Signature> {
969 if !(2..=3).contains(&arg_count) {
970 return vec![Signature::Error; arg_count];
971 }
972 let mut result = vec![Signature::Scalar; arg_count];
973 result[0] = Signature::Vector;
974 result
975}
976
977fn get_function_args_signature(kind: &Function, arg_count: usize) -> Vec<Signature> {
983 match kind {
984 Function::And => vec![Signature::Vector; arg_count],
985 Function::False => args_signature_no_args(arg_count),
986 Function::If => args_signature_scalars(arg_count, 2, 1),
987 Function::Iferror => args_signature_scalars(arg_count, 2, 0),
988 Function::Ifna => args_signature_scalars(arg_count, 2, 0),
989 Function::Ifs => vec![Signature::Scalar; arg_count],
990 Function::Lambda => args_signature_lambda(arg_count),
991 Function::Let => args_signature_let(arg_count),
992 Function::Not => args_signature_scalars(arg_count, 1, 0),
993 Function::Or => vec![Signature::Vector; arg_count],
994 Function::Switch => vec![Signature::Scalar; arg_count],
995 Function::True => args_signature_no_args(arg_count),
996 Function::Xor => vec![Signature::Vector; arg_count],
997 Function::Abs => args_signature_scalars(arg_count, 1, 0),
998 Function::Acos => args_signature_scalars(arg_count, 1, 0),
999 Function::Acosh => args_signature_scalars(arg_count, 1, 0),
1000 Function::Asin => args_signature_scalars(arg_count, 1, 0),
1001 Function::Asinh => args_signature_scalars(arg_count, 1, 0),
1002 Function::Atan => args_signature_scalars(arg_count, 1, 0),
1003 Function::Atan2 => args_signature_scalars(arg_count, 2, 0),
1004 Function::Atanh => args_signature_scalars(arg_count, 1, 0),
1005 Function::Choose => vec![Signature::Scalar; arg_count],
1006 Function::Column => args_signature_row(arg_count),
1007 Function::Columns => args_signature_one_vector(arg_count),
1008 Function::Ln => args_signature_scalars(arg_count, 1, 0),
1009 Function::Log => args_signature_scalars(arg_count, 1, 1),
1010 Function::Log10 => args_signature_scalars(arg_count, 1, 0),
1011 Function::Cos => args_signature_scalars(arg_count, 1, 0),
1012 Function::Cosh => args_signature_scalars(arg_count, 1, 0),
1013 Function::Max => vec![Signature::Vector; arg_count],
1014 Function::Min => vec![Signature::Vector; arg_count],
1015 Function::Pi => args_signature_no_args(arg_count),
1016 Function::Power => args_signature_scalars(arg_count, 2, 0),
1017 Function::Product => vec![Signature::Vector; arg_count],
1018 Function::Round => args_signature_scalars(arg_count, 2, 0),
1019 Function::Rounddown => args_signature_scalars(arg_count, 2, 0),
1020 Function::Roundup => args_signature_scalars(arg_count, 2, 0),
1021 Function::Sin => args_signature_scalars(arg_count, 1, 0),
1022 Function::Sinh => args_signature_scalars(arg_count, 1, 0),
1023 Function::Sqrt => args_signature_scalars(arg_count, 1, 0),
1024 Function::Sqrtpi => args_signature_scalars(arg_count, 1, 0),
1025 Function::Sum => vec![Signature::Vector; arg_count],
1026 Function::Sumif => args_signature_sumif_spill(arg_count),
1027 Function::Sumifs => vec![Signature::Vector; arg_count],
1028 Function::Tan => args_signature_scalars(arg_count, 1, 0),
1029 Function::Tanh => args_signature_scalars(arg_count, 1, 0),
1030 Function::ErrorType => args_signature_scalars(arg_count, 1, 0),
1031 Function::Isblank => args_signature_scalars(arg_count, 1, 0),
1032 Function::Iserr => args_signature_scalars(arg_count, 1, 0),
1033 Function::Iserror => args_signature_scalars(arg_count, 1, 0),
1034 Function::Iseven => args_signature_scalars(arg_count, 1, 0),
1035 Function::Isformula => args_signature_scalars(arg_count, 1, 0),
1036 Function::Islogical => args_signature_scalars(arg_count, 1, 0),
1037 Function::Isna => args_signature_scalars(arg_count, 1, 0),
1038 Function::Isnontext => args_signature_scalars(arg_count, 1, 0),
1039 Function::Isnumber => args_signature_scalars(arg_count, 1, 0),
1040 Function::Isodd => args_signature_scalars(arg_count, 1, 0),
1041 Function::Isomitted => args_signature_scalars(arg_count, 1, 0),
1042 Function::Isref => args_signature_one_vector(arg_count),
1043 Function::Istext => args_signature_scalars(arg_count, 1, 0),
1044 Function::Na => args_signature_no_args(arg_count),
1045 Function::Sheet => args_signature_sheet(arg_count),
1046 Function::Type => args_signature_one_vector(arg_count),
1047 Function::Address => args_signature_address(arg_count),
1048 Function::Areas => args_signature_one_vector(arg_count),
1049 Function::Choosecols => args_signature_choosecols(arg_count),
1050 Function::Chooserows => args_signature_choosecols(arg_count),
1051 Function::Expand => args_signature_expand(arg_count),
1052 Function::Hlookup => args_signature_hlookup(arg_count),
1053 Function::Hstack => vec![Signature::Vector; arg_count],
1054 Function::Hyperlink => args_signature_scalars(arg_count, 1, 1),
1055 Function::Index => args_signature_index(arg_count),
1056 Function::Indirect => args_signature_scalars(arg_count, 1, 0),
1057 Function::Lookup => args_signature_lookup(arg_count),
1058 Function::Match => args_signature_match(arg_count),
1059 Function::Offset => args_signature_offset(arg_count),
1060 Function::Row => args_signature_row(arg_count),
1061 Function::Rows => args_signature_one_vector(arg_count),
1062 Function::Vlookup => args_signature_hlookup(arg_count),
1063 Function::Vstack => vec![Signature::Vector; arg_count],
1064 Function::Wrapcols => args_signature_wrapcols(arg_count),
1065 Function::Wraprows => args_signature_wrapcols(arg_count),
1066 Function::Xlookup => args_signature_xlookup(arg_count),
1067 Function::Xmatch => args_signature_xmatch(arg_count),
1068 Function::Trimrange => args_signature_trimrange(arg_count),
1069 Function::Sort => args_signature_sort(arg_count),
1070 Function::Sortby => args_signature_sortby(arg_count),
1071 Function::Unique => args_signature_unique(arg_count),
1072 Function::Filter => args_signature_filter(arg_count),
1073 Function::Take => args_signature_take(arg_count),
1074 Function::Drop => args_signature_drop(arg_count),
1075 Function::Tocol => args_signature_tocol(arg_count),
1076 Function::Torow => args_signature_tocol(arg_count),
1077 Function::Transpose => args_signature_one_vector(arg_count),
1078 Function::Mmult => {
1079 if arg_count == 2 {
1080 vec![Signature::Vector, Signature::Vector]
1081 } else {
1082 vec![Signature::Error; arg_count]
1083 }
1084 }
1085 Function::Bycol => args_signature_bycol_byrow(arg_count),
1086 Function::Byrow => args_signature_bycol_byrow(arg_count),
1087 Function::Map => args_signature_map(arg_count),
1088 Function::Reduce => args_signature_reduce(arg_count),
1089 Function::Scan => args_signature_scan(arg_count),
1090 Function::Makearray => vec![Signature::Scalar; 3],
1091 Function::Sequence => args_signature_sequence(arg_count),
1092 Function::Randarray => args_signature_randarray(arg_count),
1093 Function::Textsplit => args_signature_textsplit(arg_count),
1094 Function::Concat => vec![Signature::Vector; arg_count],
1095 Function::Concatenate => vec![Signature::Scalar; arg_count],
1096 Function::Exact => args_signature_scalars(arg_count, 2, 0),
1097 Function::Find => args_signature_scalars(arg_count, 2, 1),
1098 Function::Left => args_signature_scalars(arg_count, 1, 1),
1099 Function::Len => args_signature_scalars(arg_count, 1, 0),
1100 Function::Lower => args_signature_scalars(arg_count, 1, 0),
1101 Function::Mid => args_signature_scalars(arg_count, 3, 0),
1102 Function::Rept => args_signature_scalars(arg_count, 2, 0),
1103 Function::Right => args_signature_scalars(arg_count, 2, 1),
1104 Function::Search => args_signature_scalars(arg_count, 2, 1),
1105 Function::Substitute => args_signature_scalars(arg_count, 3, 1),
1106 Function::Regexextract => args_signature_scalars(arg_count, 2, 1),
1107 Function::Regexreplace => args_signature_scalars(arg_count, 3, 0),
1108 Function::Regextest => args_signature_scalars(arg_count, 2, 0),
1109 Function::T => args_signature_scalars(arg_count, 1, 0),
1110 Function::Text => args_signature_scalars(arg_count, 2, 0),
1111 Function::Textafter => args_signature_textafter(arg_count),
1112 Function::Textbefore => args_signature_textafter(arg_count),
1113 Function::Textjoin => args_signature_textjoin(arg_count),
1114 Function::Trim => args_signature_scalars(arg_count, 1, 0),
1115 Function::Upper => args_signature_scalars(arg_count, 1, 0),
1116 Function::Value => args_signature_scalars(arg_count, 1, 0),
1117 Function::Valuetotext => args_signature_scalars(arg_count, 1, 1),
1118 Function::Average => vec![Signature::Vector; arg_count],
1119 Function::Avedev => vec![Signature::Vector; arg_count],
1120 Function::Averagea => vec![Signature::Vector; arg_count],
1121 Function::Averageif => args_signature_sumif(arg_count),
1122 Function::Averageifs => vec![Signature::Vector; arg_count],
1123 Function::Count => vec![Signature::Vector; arg_count],
1124 Function::Counta => vec![Signature::Vector; arg_count],
1125 Function::Countblank => vec![Signature::Vector; arg_count],
1126 Function::Countif => args_signature_sumif(arg_count),
1127 Function::Countifs => vec![Signature::Vector; arg_count],
1128 Function::Maxifs => vec![Signature::Vector; arg_count],
1129 Function::Minifs => vec![Signature::Vector; arg_count],
1130 Function::Date => args_signature_scalars(arg_count, 3, 0),
1131 Function::Datedif => args_signature_scalars(arg_count, 3, 0),
1132 Function::Datevalue => args_signature_scalars(arg_count, 1, 0),
1133 Function::Day => args_signature_scalars(arg_count, 1, 0),
1134 Function::Edate => args_signature_scalars(arg_count, 2, 0),
1135 Function::Eomonth => args_signature_scalars(arg_count, 2, 0),
1136 Function::Month => args_signature_scalars(arg_count, 1, 0),
1137 Function::Time => args_signature_scalars(arg_count, 3, 0),
1138 Function::Timevalue => args_signature_scalars(arg_count, 1, 0),
1139 Function::Hour => args_signature_scalars(arg_count, 1, 0),
1140 Function::Minute => args_signature_scalars(arg_count, 1, 0),
1141 Function::Second => args_signature_scalars(arg_count, 1, 0),
1142 Function::Now => args_signature_no_args(arg_count),
1143 Function::Today => args_signature_no_args(arg_count),
1144 Function::Year => args_signature_scalars(arg_count, 1, 0),
1145 Function::Days => args_signature_scalars(arg_count, 2, 0),
1146 Function::Days360 => args_signature_scalars(arg_count, 2, 1),
1147 Function::Weekday => args_signature_scalars(arg_count, 1, 1),
1148 Function::Weeknum => args_signature_scalars(arg_count, 1, 1),
1149 Function::Workday => args_signature_scalars(arg_count, 2, 1),
1150 Function::WorkdayIntl => args_signature_scalars(arg_count, 2, 2),
1151 Function::Yearfrac => args_signature_scalars(arg_count, 2, 1),
1152 Function::Isoweeknum => args_signature_scalars(arg_count, 1, 0),
1153 Function::Accrint => args_signature_scalars(arg_count, 6, 2),
1154 Function::Accrintm => args_signature_scalars(arg_count, 3, 2),
1155 Function::Disc => args_signature_scalars(arg_count, 4, 1),
1156 Function::Fvschedule => vec![Signature::Scalar, Signature::Vector],
1157 Function::Intrate => args_signature_scalars(arg_count, 4, 1),
1158 Function::Pricedisc => args_signature_scalars(arg_count, 4, 1),
1159 Function::Pricemat => args_signature_scalars(arg_count, 5, 1),
1160 Function::Received => args_signature_scalars(arg_count, 4, 1),
1161 Function::Yielddisc => args_signature_scalars(arg_count, 4, 1),
1162 Function::Yieldmat => args_signature_scalars(arg_count, 5, 1),
1163 Function::Cumipmt => args_signature_scalars(arg_count, 6, 0),
1164 Function::Cumprinc => args_signature_scalars(arg_count, 6, 0),
1165 Function::Db => args_signature_scalars(arg_count, 4, 1),
1166 Function::Ddb => args_signature_scalars(arg_count, 4, 1),
1167 Function::Dollarde => args_signature_scalars(arg_count, 2, 0),
1168 Function::Dollarfr => args_signature_scalars(arg_count, 2, 0),
1169 Function::Effect => args_signature_scalars(arg_count, 2, 0),
1170 Function::Fv => args_signature_scalars(arg_count, 3, 2),
1171 Function::Ipmt => args_signature_scalars(arg_count, 4, 2),
1172 Function::Irr => args_signature_irr(arg_count),
1173 Function::Ispmt => args_signature_scalars(arg_count, 4, 0),
1174 Function::Mirr => args_signature_mirr(arg_count),
1175 Function::Nominal => args_signature_scalars(arg_count, 2, 0),
1176 Function::Nper => args_signature_scalars(arg_count, 3, 2),
1177 Function::Npv => args_signature_npv(arg_count),
1178 Function::Pduration => args_signature_scalars(arg_count, 3, 0),
1179 Function::Pmt => args_signature_scalars(arg_count, 3, 2),
1180 Function::Ppmt => args_signature_scalars(arg_count, 4, 2),
1181 Function::Pv => args_signature_scalars(arg_count, 3, 2),
1182 Function::Rate => args_signature_scalars(arg_count, 3, 3),
1183 Function::Rri => args_signature_scalars(arg_count, 3, 0),
1184 Function::Sln => args_signature_scalars(arg_count, 3, 0),
1185 Function::Syd => args_signature_scalars(arg_count, 4, 0),
1186 Function::Tbilleq => args_signature_scalars(arg_count, 3, 0),
1187 Function::Tbillprice => args_signature_scalars(arg_count, 3, 0),
1188 Function::Tbillyield => args_signature_scalars(arg_count, 3, 0),
1189 Function::Xirr => args_signature_xirr(arg_count),
1190 Function::Xnpv => args_signature_xnpv(arg_count),
1191 Function::Duration => args_signature_scalars(arg_count, 5, 1),
1192 Function::Mduration => args_signature_scalars(arg_count, 5, 1),
1193 Function::Price => args_signature_scalars(arg_count, 6, 1),
1194 Function::Yield => args_signature_scalars(arg_count, 6, 1),
1195 Function::Oddfprice => args_signature_scalars(arg_count, 8, 1),
1196 Function::Oddfyield => args_signature_scalars(arg_count, 8, 1),
1197 Function::Oddlprice => args_signature_scalars(arg_count, 7, 1),
1198 Function::Oddlyield => args_signature_scalars(arg_count, 7, 1),
1199 Function::Coupdaybs => args_signature_scalars(arg_count, 3, 1),
1200 Function::Coupdays => args_signature_scalars(arg_count, 3, 1),
1201 Function::Coupdaysnc => args_signature_scalars(arg_count, 3, 1),
1202 Function::Coupncd => args_signature_scalars(arg_count, 3, 1),
1203 Function::Coupnum => args_signature_scalars(arg_count, 3, 1),
1204 Function::Couppcd => args_signature_scalars(arg_count, 3, 1),
1205 Function::Amordegrc => args_signature_scalars(arg_count, 6, 1),
1206 Function::Amorlinc => args_signature_scalars(arg_count, 6, 1),
1207 Function::Vdb => args_signature_scalars(arg_count, 5, 2),
1208 Function::Besseli => args_signature_scalars(arg_count, 2, 0),
1209 Function::Besselj => args_signature_scalars(arg_count, 2, 0),
1210 Function::Besselk => args_signature_scalars(arg_count, 2, 0),
1211 Function::Bessely => args_signature_scalars(arg_count, 2, 0),
1212 Function::Erf => args_signature_scalars(arg_count, 1, 1),
1213 Function::Erfc => args_signature_scalars(arg_count, 1, 0),
1214 Function::ErfcPrecise => args_signature_scalars(arg_count, 1, 0),
1215 Function::ErfPrecise => args_signature_scalars(arg_count, 1, 0),
1216 Function::Bin2dec => args_signature_scalars(arg_count, 1, 0),
1217 Function::Bin2hex => args_signature_scalars(arg_count, 1, 0),
1218 Function::Bin2oct => args_signature_scalars(arg_count, 1, 0),
1219 Function::Dec2Bin => args_signature_scalars(arg_count, 1, 0),
1220 Function::Dec2hex => args_signature_scalars(arg_count, 1, 0),
1221 Function::Dec2oct => args_signature_scalars(arg_count, 1, 0),
1222 Function::Hex2bin => args_signature_scalars(arg_count, 1, 0),
1223 Function::Hex2dec => args_signature_scalars(arg_count, 1, 0),
1224 Function::Hex2oct => args_signature_scalars(arg_count, 1, 0),
1225 Function::Oct2bin => args_signature_scalars(arg_count, 1, 0),
1226 Function::Oct2dec => args_signature_scalars(arg_count, 1, 0),
1227 Function::Oct2hex => args_signature_scalars(arg_count, 1, 0),
1228 Function::Bitand => args_signature_scalars(arg_count, 2, 0),
1229 Function::Bitlshift => args_signature_scalars(arg_count, 2, 0),
1230 Function::Bitor => args_signature_scalars(arg_count, 2, 0),
1231 Function::Bitrshift => args_signature_scalars(arg_count, 2, 0),
1232 Function::Bitxor => args_signature_scalars(arg_count, 2, 0),
1233 Function::Complex => args_signature_scalars(arg_count, 2, 1),
1234 Function::Imabs => args_signature_scalars(arg_count, 1, 0),
1235 Function::Imaginary => args_signature_scalars(arg_count, 1, 0),
1236 Function::Imargument => args_signature_scalars(arg_count, 1, 0),
1237 Function::Imconjugate => args_signature_scalars(arg_count, 1, 0),
1238 Function::Imcos => args_signature_scalars(arg_count, 1, 0),
1239 Function::Imcosh => args_signature_scalars(arg_count, 1, 0),
1240 Function::Imcot => args_signature_scalars(arg_count, 1, 0),
1241 Function::Imcsc => args_signature_scalars(arg_count, 1, 0),
1242 Function::Imcsch => args_signature_scalars(arg_count, 1, 0),
1243 Function::Imdiv => args_signature_scalars(arg_count, 2, 0),
1244 Function::Imexp => args_signature_scalars(arg_count, 1, 0),
1245 Function::Imln => args_signature_scalars(arg_count, 1, 0),
1246 Function::Imlog10 => args_signature_scalars(arg_count, 1, 0),
1247 Function::Imlog2 => args_signature_scalars(arg_count, 1, 0),
1248 Function::Impower => args_signature_scalars(arg_count, 2, 0),
1249 Function::Improduct => args_signature_scalars(arg_count, 2, 0),
1250 Function::Imreal => args_signature_scalars(arg_count, 1, 0),
1251 Function::Imsec => args_signature_scalars(arg_count, 1, 0),
1252 Function::Imsech => args_signature_scalars(arg_count, 1, 0),
1253 Function::Imsin => args_signature_scalars(arg_count, 1, 0),
1254 Function::Imsinh => args_signature_scalars(arg_count, 1, 0),
1255 Function::Imsqrt => args_signature_scalars(arg_count, 1, 0),
1256 Function::Imsub => args_signature_scalars(arg_count, 2, 0),
1257 Function::Imsum => args_signature_scalars(arg_count, 2, 0),
1258 Function::Imtan => args_signature_scalars(arg_count, 1, 0),
1259 Function::Convert => args_signature_scalars(arg_count, 3, 0),
1260 Function::Delta => args_signature_scalars(arg_count, 1, 1),
1261 Function::Gestep => args_signature_scalars(arg_count, 1, 1),
1262 Function::Subtotal => args_signature_npv(arg_count),
1263 Function::Rand => args_signature_no_args(arg_count),
1264 Function::Randbetween => args_signature_scalars(arg_count, 2, 0),
1265 Function::Formulatext => args_signature_scalars(arg_count, 1, 0),
1266 Function::Unicode => args_signature_scalars(arg_count, 1, 0),
1267 Function::Unichar => args_signature_scalars(arg_count, 1, 0),
1268 Function::Char => args_signature_scalars(arg_count, 1, 0),
1269 Function::Clean => args_signature_scalars(arg_count, 1, 0),
1270 Function::Code => args_signature_scalars(arg_count, 1, 0),
1271 Function::Asc => args_signature_scalars(arg_count, 1, 0),
1272 Function::Arraytotext => args_signature_arraytotext(arg_count),
1273 Function::Dollar => args_signature_scalars(arg_count, 1, 1),
1274 Function::Findb => args_signature_scalars(arg_count, 2, 1),
1275 Function::Fixed => args_signature_scalars(arg_count, 1, 2),
1276 Function::Leftb => args_signature_scalars(arg_count, 1, 1),
1277 Function::Lenb => args_signature_scalars(arg_count, 1, 0),
1278 Function::Midb => args_signature_scalars(arg_count, 3, 0),
1279 Function::Numbervalue => args_signature_scalars(arg_count, 1, 2),
1280 Function::Proper => args_signature_scalars(arg_count, 1, 0),
1281 Function::Replace => args_signature_scalars(arg_count, 4, 0),
1282 Function::Replaceb => args_signature_scalars(arg_count, 4, 0),
1283 Function::Rightb => args_signature_scalars(arg_count, 1, 1),
1284 Function::Searchb => args_signature_scalars(arg_count, 2, 1),
1285 Function::Geomean => vec![Signature::Vector; arg_count],
1286 Function::Networkdays => args_signature_networkdays(arg_count),
1287 Function::NetworkdaysIntl => args_signature_networkdays_intl(arg_count),
1288 Function::Acot => args_signature_scalars(arg_count, 1, 0),
1289 Function::Acoth => args_signature_scalars(arg_count, 1, 0),
1290 Function::Cot => args_signature_scalars(arg_count, 1, 0),
1291 Function::Coth => args_signature_scalars(arg_count, 1, 0),
1292 Function::Csc => args_signature_scalars(arg_count, 1, 0),
1293 Function::Csch => args_signature_scalars(arg_count, 1, 0),
1294 Function::Sec => args_signature_scalars(arg_count, 1, 0),
1295 Function::Sech => args_signature_scalars(arg_count, 1, 0),
1296 Function::Exp => args_signature_scalars(arg_count, 1, 0),
1297 Function::Fact => args_signature_scalars(arg_count, 1, 0),
1298 Function::Factdouble => args_signature_scalars(arg_count, 1, 0),
1299 Function::Sign => args_signature_scalars(arg_count, 1, 0),
1300 Function::Radians => args_signature_scalars(arg_count, 1, 0),
1301 Function::Degrees => args_signature_scalars(arg_count, 1, 0),
1302 Function::Int => args_signature_scalars(arg_count, 1, 0),
1303 Function::Even => args_signature_scalars(arg_count, 1, 0),
1304 Function::Odd => args_signature_scalars(arg_count, 1, 0),
1305 Function::Ceiling => args_signature_scalars(arg_count, 2, 0),
1306 Function::CeilingMath => args_signature_scalars(arg_count, 1, 2),
1307 Function::CeilingPrecise => args_signature_scalars(arg_count, 1, 1),
1308 Function::Floor => args_signature_scalars(arg_count, 2, 0),
1309 Function::FloorMath => args_signature_scalars(arg_count, 1, 2),
1310 Function::FloorPrecise => args_signature_scalars(arg_count, 1, 1),
1311 Function::IsoCeiling => args_signature_scalars(arg_count, 1, 1),
1312 Function::Mod => args_signature_scalars(arg_count, 2, 0),
1313 Function::Quotient => args_signature_scalars(arg_count, 2, 0),
1314 Function::Mround => args_signature_scalars(arg_count, 2, 0),
1315 Function::Trunc => args_signature_scalars(arg_count, 1, 1),
1316 Function::Gcd => vec![Signature::Vector; arg_count],
1317 Function::Lcm => vec![Signature::Vector; arg_count],
1318 Function::Base => args_signature_scalars(arg_count, 2, 1),
1319 Function::Decimal => args_signature_scalars(arg_count, 2, 0),
1320 Function::Roman => args_signature_scalars(arg_count, 1, 1),
1321 Function::Arabic => args_signature_scalars(arg_count, 1, 0),
1322 Function::Combin => args_signature_scalars(arg_count, 2, 0),
1323 Function::Combina => args_signature_scalars(arg_count, 2, 0),
1324 Function::Sumsq => vec![Signature::Vector; arg_count],
1325 Function::Mdeterm => args_signature_one_vector(arg_count),
1326 Function::Minverse => args_signature_one_vector(arg_count),
1327 Function::Munit => args_signature_scalars(arg_count, 1, 0),
1328 Function::Multinomial => vec![Signature::Vector; arg_count],
1329 Function::Seriessum => {
1330 if arg_count == 4 {
1331 vec![
1332 Signature::Scalar,
1333 Signature::Scalar,
1334 Signature::Scalar,
1335 Signature::Vector,
1336 ]
1337 } else {
1338 vec![Signature::Error; arg_count]
1339 }
1340 }
1341 Function::Sumproduct => vec![Signature::Vector; arg_count],
1342 Function::Percentof => {
1343 if arg_count == 2 {
1344 vec![Signature::Vector, Signature::Vector]
1345 } else {
1346 vec![Signature::Error; arg_count]
1347 }
1348 }
1349 Function::N => args_signature_scalars(arg_count, 1, 0),
1350 Function::Sheets => args_signature_scalars(arg_count, 0, 1),
1351 Function::Cell => args_signature_scalars(arg_count, 1, 1),
1352 Function::Info => args_signature_scalars(arg_count, 1, 1),
1353 Function::Daverage => vec![Signature::Vector, Signature::Scalar, Signature::Vector],
1354 Function::Dcount => vec![Signature::Vector, Signature::Scalar, Signature::Vector],
1355 Function::Dget => vec![Signature::Vector, Signature::Scalar, Signature::Vector],
1356 Function::Dmax => vec![Signature::Vector, Signature::Scalar, Signature::Vector],
1357 Function::Dmin => vec![Signature::Vector, Signature::Scalar, Signature::Vector],
1358 Function::Dsum => vec![Signature::Vector, Signature::Scalar, Signature::Vector],
1359 Function::Dcounta => vec![Signature::Vector, Signature::Scalar, Signature::Vector],
1360 Function::Dproduct => vec![Signature::Vector, Signature::Scalar, Signature::Vector],
1361 Function::Dstdev => vec![Signature::Vector, Signature::Scalar, Signature::Vector],
1362 Function::Dvar => vec![Signature::Vector, Signature::Scalar, Signature::Vector],
1363 Function::Dvarp => vec![Signature::Vector, Signature::Scalar, Signature::Vector],
1364 Function::Dstdevp => vec![Signature::Vector, Signature::Scalar, Signature::Vector],
1365 Function::BetaDist => args_signature_scalars(arg_count, 4, 2),
1366 Function::BetaInv => args_signature_scalars(arg_count, 3, 2),
1367 Function::BinomDist => args_signature_scalars(arg_count, 4, 0),
1368 Function::BinomDistRange => args_signature_scalars(arg_count, 3, 1),
1369 Function::BinomInv => args_signature_scalars(arg_count, 3, 0),
1370 Function::ChisqDist => args_signature_scalars(arg_count, 4, 0),
1371 Function::ChisqDistRT => args_signature_scalars(arg_count, 3, 0),
1372 Function::ChisqInv => args_signature_scalars(arg_count, 3, 0),
1373 Function::ChisqInvRT => args_signature_scalars(arg_count, 2, 0),
1374 Function::ChisqTest => {
1375 if arg_count == 2 {
1376 vec![Signature::Vector, Signature::Vector]
1377 } else {
1378 vec![Signature::Error; arg_count]
1379 }
1380 }
1381 Function::ConfidenceNorm => args_signature_scalars(arg_count, 3, 0),
1382 Function::ConfidenceT => args_signature_scalars(arg_count, 3, 0),
1383 Function::CovarianceP => {
1384 if arg_count == 2 {
1385 vec![Signature::Vector, Signature::Vector]
1386 } else {
1387 vec![Signature::Error; arg_count]
1388 }
1389 }
1390 Function::CovarianceS => {
1391 if arg_count == 2 {
1392 vec![Signature::Vector, Signature::Vector]
1393 } else {
1394 vec![Signature::Error; arg_count]
1395 }
1396 }
1397 Function::Devsq => vec![Signature::Vector; arg_count],
1398 Function::ExponDist => args_signature_scalars(arg_count, 3, 0),
1399 Function::FDist => args_signature_scalars(arg_count, 4, 0),
1400 Function::FDistRT => args_signature_scalars(arg_count, 3, 0),
1401 Function::FInv => args_signature_scalars(arg_count, 3, 0),
1402 Function::FInvRT => args_signature_scalars(arg_count, 3, 0),
1403 Function::FTest => vec![Signature::Vector; 2],
1404 Function::Fisher => args_signature_scalars(arg_count, 1, 0),
1405 Function::FisherInv => args_signature_scalars(arg_count, 1, 0),
1406 Function::Gamma => args_signature_scalars(arg_count, 1, 0),
1407 Function::GammaDist => args_signature_scalars(arg_count, 4, 0),
1408 Function::GammaInv => args_signature_scalars(arg_count, 3, 0),
1409 Function::GammaLn => args_signature_scalars(arg_count, 1, 0),
1410 Function::GammaLnPrecise => args_signature_scalars(arg_count, 1, 0),
1411 Function::HypGeomDist => args_signature_scalars(arg_count, 5, 0),
1412 Function::LogNormDist => args_signature_scalars(arg_count, 4, 0),
1413 Function::LogNormInv => args_signature_scalars(arg_count, 3, 0),
1414 Function::NegbinomDist => args_signature_scalars(arg_count, 4, 0),
1415 Function::NormDist => args_signature_scalars(arg_count, 4, 0),
1416 Function::NormInv => args_signature_scalars(arg_count, 3, 0),
1417 Function::NormSdist => args_signature_scalars(arg_count, 2, 0),
1418 Function::NormSInv => args_signature_scalars(arg_count, 1, 0),
1419 Function::Pearson => {
1420 if arg_count == 2 {
1421 vec![Signature::Vector, Signature::Vector]
1422 } else {
1423 vec![Signature::Error; arg_count]
1424 }
1425 }
1426 Function::Phi => args_signature_scalars(arg_count, 1, 0),
1427 Function::PoissonDist => args_signature_scalars(arg_count, 3, 0),
1428 Function::Standardize => args_signature_scalars(arg_count, 3, 0),
1429 Function::Stdev => vec![Signature::Vector; arg_count],
1430 Function::StDevP => vec![Signature::Vector; arg_count],
1431 Function::StDevS => vec![Signature::Vector; arg_count],
1432 Function::Stdeva => vec![Signature::Vector; arg_count],
1433 Function::Stdevpa => vec![Signature::Vector; arg_count],
1434 Function::TDist => args_signature_scalars(arg_count, 3, 0),
1435 Function::TDist2T => args_signature_scalars(arg_count, 2, 0),
1436 Function::TDistRT => args_signature_scalars(arg_count, 2, 0),
1437 Function::TInv => args_signature_scalars(arg_count, 2, 0),
1438 Function::TInv2T => args_signature_scalars(arg_count, 2, 0),
1439 Function::TTest => {
1440 if arg_count == 4 {
1441 vec![
1442 Signature::Vector,
1443 Signature::Vector,
1444 Signature::Scalar,
1445 Signature::Scalar,
1446 ]
1447 } else {
1448 vec![Signature::Error; arg_count]
1449 }
1450 }
1451 Function::VarP => vec![Signature::Vector; arg_count],
1452 Function::VarS => vec![Signature::Vector; arg_count],
1453 Function::VarpA => vec![Signature::Vector; arg_count],
1454 Function::VarA => vec![Signature::Vector; arg_count],
1455 Function::WeibullDist => args_signature_scalars(arg_count, 4, 0),
1456 Function::ZTest => {
1457 if arg_count == 2 {
1458 vec![Signature::Vector, Signature::Scalar]
1459 } else if arg_count == 3 {
1460 vec![Signature::Vector, Signature::Scalar, Signature::Scalar]
1461 } else {
1462 vec![Signature::Error; arg_count]
1463 }
1464 }
1465 Function::BetaDistCompat => args_signature_scalars(arg_count, 3, 2),
1467 Function::HypGeomDistCompat => args_signature_scalars(arg_count, 4, 0),
1468 Function::LogNormDistCompat => args_signature_scalars(arg_count, 3, 0),
1469 Function::NegbinomDistCompat => args_signature_scalars(arg_count, 3, 0),
1470 Function::NormSDistCompat => args_signature_scalars(arg_count, 1, 0),
1471 Function::TDistCompat => args_signature_scalars(arg_count, 3, 0),
1472 Function::BetaInvCompat => args_signature_scalars(arg_count, 3, 2),
1474 Function::BinomDistCompat => args_signature_scalars(arg_count, 4, 0),
1475 Function::ChiDistCompat => args_signature_scalars(arg_count, 2, 0),
1476 Function::ChiInvCompat => args_signature_scalars(arg_count, 2, 0),
1477 Function::ChiTestCompat => {
1478 if arg_count == 2 {
1479 vec![Signature::Vector, Signature::Vector]
1480 } else {
1481 vec![Signature::Error; arg_count]
1482 }
1483 }
1484 Function::ConfidenceCompat => args_signature_scalars(arg_count, 3, 0),
1485 Function::CovarCompat => {
1486 if arg_count == 2 {
1487 vec![Signature::Vector, Signature::Vector]
1488 } else {
1489 vec![Signature::Error; arg_count]
1490 }
1491 }
1492 Function::CritbinomCompat => args_signature_scalars(arg_count, 3, 0),
1493 Function::ExponDistCompat => args_signature_scalars(arg_count, 3, 0),
1494 Function::FDistCompat => args_signature_scalars(arg_count, 3, 0),
1495 Function::FInvCompat => args_signature_scalars(arg_count, 3, 0),
1496 Function::FTestCompat => vec![Signature::Vector; 2],
1497 Function::GammaDistCompat => args_signature_scalars(arg_count, 4, 0),
1498 Function::GammaInvCompat => args_signature_scalars(arg_count, 3, 0),
1499 Function::LoginvCompat => args_signature_scalars(arg_count, 3, 0),
1500 Function::ModeCompat => vec![Signature::Vector; arg_count],
1501 Function::NormDistCompat => args_signature_scalars(arg_count, 4, 0),
1502 Function::NormInvCompat => args_signature_scalars(arg_count, 3, 0),
1503 Function::NormSInvCompat => args_signature_scalars(arg_count, 1, 0),
1504 Function::PercentileCompat => {
1505 if arg_count == 2 {
1506 vec![Signature::Vector, Signature::Scalar]
1507 } else {
1508 vec![Signature::Error; arg_count]
1509 }
1510 }
1511 Function::PercentrankCompat => {
1512 if arg_count == 2 {
1513 vec![Signature::Vector, Signature::Scalar]
1514 } else if arg_count == 3 {
1515 vec![Signature::Vector, Signature::Scalar, Signature::Scalar]
1516 } else {
1517 vec![Signature::Error; arg_count]
1518 }
1519 }
1520 Function::PoissonCompat => args_signature_scalars(arg_count, 3, 0),
1521 Function::QuartileCompat => {
1522 if arg_count == 2 {
1523 vec![Signature::Vector, Signature::Scalar]
1524 } else {
1525 vec![Signature::Error; arg_count]
1526 }
1527 }
1528 Function::RankCompat => vec![Signature::Scalar, Signature::Vector, Signature::Scalar],
1529 Function::StDevPCompat => vec![Signature::Vector; arg_count],
1530 Function::TInvCompat => args_signature_scalars(arg_count, 2, 0),
1531 Function::TTestCompat => {
1532 if arg_count == 4 {
1533 vec![
1534 Signature::Vector,
1535 Signature::Vector,
1536 Signature::Scalar,
1537 Signature::Scalar,
1538 ]
1539 } else {
1540 vec![Signature::Error; arg_count]
1541 }
1542 }
1543 Function::VarCompat => vec![Signature::Vector; arg_count],
1544 Function::VarPCompat => vec![Signature::Vector; arg_count],
1545 Function::WeibullCompat => args_signature_scalars(arg_count, 4, 0),
1546 Function::ZTestCompat => {
1547 if arg_count == 2 {
1548 vec![Signature::Vector, Signature::Scalar]
1549 } else if arg_count == 3 {
1550 vec![Signature::Vector, Signature::Scalar, Signature::Scalar]
1551 } else {
1552 vec![Signature::Error; arg_count]
1553 }
1554 }
1555 Function::Sumx2my2 => vec![Signature::Vector; 2],
1556 Function::Sumx2py2 => vec![Signature::Vector; 2],
1557 Function::Sumxmy2 => vec![Signature::Vector; 2],
1558 Function::Correl => vec![Signature::Vector; 2],
1559 Function::Rsq => vec![Signature::Vector; 2],
1560 Function::Intercept => vec![Signature::Vector; 2],
1561 Function::Slope => vec![Signature::Vector; 2],
1562 Function::Steyx => vec![Signature::Vector; 2],
1563 Function::Forecast | Function::ForecastLinear => {
1564 vec![Signature::Scalar, Signature::Vector, Signature::Vector]
1565 }
1566 Function::ForecastEts
1567 | Function::ForecastEtsConfint
1568 | Function::ForecastEtsSeasonality
1569 | Function::ForecastEtsStat => vec![Signature::Vector; arg_count],
1570 Function::Frequency => vec![Signature::Vector, Signature::Vector],
1571 Function::Growth | Function::Trend => match arg_count {
1572 1 => vec![Signature::Vector],
1573 2 => vec![Signature::Vector, Signature::Vector],
1574 3 => vec![Signature::Vector, Signature::Vector, Signature::Vector],
1575 4 => vec![
1576 Signature::Vector,
1577 Signature::Vector,
1578 Signature::Vector,
1579 Signature::Scalar,
1580 ],
1581 _ => vec![Signature::Error; arg_count],
1582 },
1583 Function::Linest | Function::Logest => match arg_count {
1584 1 => vec![Signature::Vector],
1585 2 => vec![Signature::Vector, Signature::Vector],
1586 3 => vec![Signature::Vector, Signature::Vector, Signature::Scalar],
1587 4 => vec![
1588 Signature::Vector,
1589 Signature::Vector,
1590 Signature::Scalar,
1591 Signature::Scalar,
1592 ],
1593 _ => vec![Signature::Error; arg_count],
1594 },
1595 Function::ModeMult | Function::ModeSingl => vec![Signature::Vector; arg_count],
1596 Function::PercentileExc | Function::PercentileInc => {
1597 vec![Signature::Vector, Signature::Scalar]
1598 }
1599 Function::PercentrankExc | Function::PercentrankInc => {
1600 vec![Signature::Vector, Signature::Scalar, Signature::Scalar]
1601 }
1602 Function::Permut | Function::Permutationa => vec![Signature::Scalar; 2],
1603 Function::Prob => match arg_count {
1604 3 => vec![Signature::Vector, Signature::Vector, Signature::Scalar],
1605 4 => vec![
1606 Signature::Vector,
1607 Signature::Vector,
1608 Signature::Scalar,
1609 Signature::Scalar,
1610 ],
1611 _ => vec![Signature::Error; arg_count],
1612 },
1613 Function::QuartileExc | Function::QuartileInc => {
1614 vec![Signature::Vector, Signature::Scalar]
1615 }
1616 Function::Trimmean => vec![Signature::Vector, Signature::Scalar],
1617 Function::Gauss => args_signature_scalars(arg_count, 1, 0),
1618 Function::Harmean => vec![Signature::Vector; arg_count],
1619 Function::Kurt => vec![Signature::Vector; arg_count],
1620 Function::Large => vec![Signature::Vector, Signature::Scalar],
1621 Function::MaxA => vec![Signature::Vector; arg_count],
1622 Function::Median => vec![Signature::Vector; arg_count],
1623 Function::MinA => vec![Signature::Vector; arg_count],
1624 Function::RankAvg => vec![Signature::Scalar, Signature::Vector, Signature::Scalar],
1625 Function::RankEq => vec![Signature::Scalar, Signature::Vector, Signature::Scalar],
1626 Function::Skew => vec![Signature::Vector; arg_count],
1627 Function::SkewP => vec![Signature::Vector; arg_count],
1628 Function::Small => vec![Signature::Vector, Signature::Scalar],
1629 }
1630}
1631
1632fn static_analysis_on_function(kind: &Function, args: &[Node]) -> StaticResult {
1634 match kind {
1635 Function::And => StaticResult::Scalar,
1636 Function::False => StaticResult::Scalar,
1637 Function::If => scalar_arguments(args),
1638 Function::Iferror => scalar_arguments(args),
1639 Function::Ifna => scalar_arguments(args),
1640 Function::Ifs => not_implemented(args),
1641 Function::Lambda => StaticResult::Unknown,
1642 Function::Let => StaticResult::Unknown,
1643 Function::Not => StaticResult::Scalar,
1644 Function::Or => StaticResult::Scalar,
1645 Function::Switch => not_implemented(args),
1646 Function::True => StaticResult::Scalar,
1647 Function::Xor => StaticResult::Scalar,
1648 Function::Abs => scalar_arguments(args),
1649 Function::Acos => scalar_arguments(args),
1650 Function::Acosh => scalar_arguments(args),
1651 Function::Asin => scalar_arguments(args),
1652 Function::Asinh => scalar_arguments(args),
1653 Function::Atan => scalar_arguments(args),
1654 Function::Atan2 => scalar_arguments(args),
1655 Function::Atanh => scalar_arguments(args),
1656 Function::Choose => scalar_arguments(args),
1657 Function::Column => not_implemented(args),
1658 Function::Columns => not_implemented(args),
1659 Function::Cos => scalar_arguments(args),
1660 Function::Cosh => scalar_arguments(args),
1661 Function::Max => StaticResult::Scalar,
1662 Function::Min => StaticResult::Scalar,
1663 Function::Pi => StaticResult::Scalar,
1664 Function::Power => scalar_arguments(args),
1665 Function::Product => not_implemented(args),
1666 Function::Round => scalar_arguments(args),
1667 Function::Rounddown => scalar_arguments(args),
1668 Function::Roundup => scalar_arguments(args),
1669 Function::Ln => scalar_arguments(args),
1670 Function::Log => scalar_arguments(args),
1671 Function::Log10 => scalar_arguments(args),
1672 Function::Sin => scalar_arguments(args),
1673 Function::Sinh => scalar_arguments(args),
1674 Function::Sqrt => scalar_arguments(args),
1675 Function::Sqrtpi => StaticResult::Scalar,
1676 Function::Sum => StaticResult::Scalar,
1677 Function::Sumif => sumif_static_result(args),
1678 Function::Sumifs => not_implemented(args),
1679 Function::Tan => scalar_arguments(args),
1680 Function::Tanh => scalar_arguments(args),
1681 Function::ErrorType => not_implemented(args),
1682 Function::Isblank => not_implemented(args),
1683 Function::Iserr => not_implemented(args),
1684 Function::Iserror => not_implemented(args),
1685 Function::Iseven => not_implemented(args),
1686 Function::Isformula => not_implemented(args),
1687 Function::Islogical => not_implemented(args),
1688 Function::Isna => not_implemented(args),
1689 Function::Isnontext => not_implemented(args),
1690 Function::Isnumber => not_implemented(args),
1691 Function::Isodd => not_implemented(args),
1692 Function::Isomitted => not_implemented(args),
1693 Function::Isref => not_implemented(args),
1694 Function::Istext => not_implemented(args),
1695 Function::Na => StaticResult::Scalar,
1696 Function::Sheet => StaticResult::Scalar,
1697 Function::Type => not_implemented(args),
1698 Function::Address => not_implemented(args),
1699 Function::Areas => StaticResult::Scalar,
1700 Function::Choosecols => StaticResult::Unknown,
1701 Function::Chooserows => StaticResult::Unknown,
1702 Function::Expand => StaticResult::Unknown,
1703 Function::Hlookup => not_implemented(args),
1704 Function::Hstack => StaticResult::Unknown,
1705 Function::Hyperlink => StaticResult::Scalar,
1706 Function::Index => static_analysis_index(args),
1707 Function::Indirect => static_analysis_indirect(args),
1708 Function::Lookup => not_implemented(args),
1709 Function::Match => not_implemented(args),
1710 Function::Offset => static_analysis_offset(args),
1711 Function::Row => StaticResult::Scalar,
1712 Function::Rows => not_implemented(args),
1713 Function::Vlookup => not_implemented(args),
1714 Function::Vstack => StaticResult::Unknown,
1715 Function::Wrapcols => StaticResult::Unknown,
1716 Function::Wraprows => StaticResult::Unknown,
1717 Function::Xlookup => not_implemented(args),
1718 Function::Xmatch => not_implemented(args),
1719 Function::Trimrange => StaticResult::Unknown,
1720 Function::Sort => StaticResult::Unknown,
1721 Function::Sortby => StaticResult::Unknown,
1722 Function::Unique => StaticResult::Unknown,
1723 Function::Filter => StaticResult::Unknown,
1724 Function::Take => StaticResult::Unknown,
1725 Function::Drop => StaticResult::Unknown,
1726 Function::Tocol => StaticResult::Unknown,
1727 Function::Torow => StaticResult::Unknown,
1728 Function::Transpose => StaticResult::Unknown,
1729 Function::Mmult => StaticResult::Unknown,
1730 Function::Bycol => StaticResult::Unknown,
1731 Function::Byrow => StaticResult::Unknown,
1732 Function::Map => StaticResult::Unknown,
1733 Function::Reduce => StaticResult::Unknown,
1734 Function::Scan => StaticResult::Unknown,
1735 Function::Makearray => StaticResult::Unknown,
1736 Function::Sequence => StaticResult::Unknown,
1737 Function::Randarray => StaticResult::Unknown,
1738 Function::Textsplit => StaticResult::Unknown,
1739 Function::Concat => not_implemented(args),
1740 Function::Concatenate => not_implemented(args),
1741 Function::Exact => not_implemented(args),
1742 Function::Find => not_implemented(args),
1743 Function::Left => scalar_arguments(args),
1745 Function::Len => not_implemented(args),
1746 Function::Lower => scalar_arguments(args),
1748 Function::Mid => scalar_arguments(args),
1749 Function::Rept => not_implemented(args),
1750 Function::Right => scalar_arguments(args),
1751 Function::Search => not_implemented(args),
1752 Function::Substitute => not_implemented(args),
1753 Function::Regexextract => {
1754 if args.len() == 3 {
1755 StaticResult::Unknown
1756 } else {
1757 not_implemented(args)
1758 }
1759 }
1760 Function::Regexreplace => not_implemented(args),
1761 Function::Regextest => not_implemented(args),
1762 Function::T => not_implemented(args),
1763 Function::Text => scalar_arguments(args),
1764 Function::Textafter => not_implemented(args),
1765 Function::Textbefore => not_implemented(args),
1766 Function::Textjoin => not_implemented(args),
1767 Function::Trim => not_implemented(args),
1768 Function::Unicode => not_implemented(args),
1769 Function::Unichar => not_implemented(args),
1770 Function::Char => not_implemented(args),
1771 Function::Clean => not_implemented(args),
1772 Function::Code => not_implemented(args),
1773 Function::Asc => not_implemented(args),
1774 Function::Arraytotext => not_implemented(args),
1775 Function::Dollar => not_implemented(args),
1776 Function::Findb => not_implemented(args),
1777 Function::Fixed => not_implemented(args),
1778 Function::Leftb => not_implemented(args),
1779 Function::Lenb => not_implemented(args),
1780 Function::Midb => not_implemented(args),
1781 Function::Numbervalue => not_implemented(args),
1782 Function::Proper => not_implemented(args),
1783 Function::Replace => not_implemented(args),
1784 Function::Replaceb => not_implemented(args),
1785 Function::Rightb => not_implemented(args),
1786 Function::Searchb => not_implemented(args),
1787 Function::Upper => scalar_arguments(args),
1788 Function::Value => not_implemented(args),
1789 Function::Valuetotext => not_implemented(args),
1790 Function::Average => not_implemented(args),
1791 Function::Averagea => not_implemented(args),
1792 Function::Avedev => not_implemented(args),
1793 Function::Averageif => not_implemented(args),
1794 Function::Averageifs => not_implemented(args),
1795 Function::Count => not_implemented(args),
1796 Function::Counta => not_implemented(args),
1797 Function::Countblank => not_implemented(args),
1798 Function::Countif => not_implemented(args),
1799 Function::Countifs => not_implemented(args),
1800 Function::Maxifs => not_implemented(args),
1801 Function::Minifs => not_implemented(args),
1802 Function::Date => scalar_arguments(args),
1804 Function::Datedif => not_implemented(args),
1805 Function::Datevalue => not_implemented(args),
1806 Function::Day => scalar_arguments(args),
1807 Function::Edate => not_implemented(args),
1808 Function::Month => scalar_arguments(args),
1809 Function::Time => not_implemented(args),
1810 Function::Timevalue => not_implemented(args),
1811 Function::Hour => not_implemented(args),
1812 Function::Minute => not_implemented(args),
1813 Function::Second => not_implemented(args),
1814 Function::Now => not_implemented(args),
1815 Function::Today => not_implemented(args),
1816 Function::Year => scalar_arguments(args),
1817 Function::Days => not_implemented(args),
1818 Function::Days360 => not_implemented(args),
1819 Function::Weekday => scalar_arguments(args),
1820 Function::Weeknum => not_implemented(args),
1821 Function::Workday => not_implemented(args),
1822 Function::WorkdayIntl => not_implemented(args),
1823 Function::Yearfrac => not_implemented(args),
1824 Function::Isoweeknum => scalar_arguments(args),
1825 Function::Accrint => scalar_arguments(args),
1826 Function::Accrintm => scalar_arguments(args),
1827 Function::Disc => StaticResult::Scalar,
1828 Function::Fvschedule => StaticResult::Scalar,
1829 Function::Intrate => StaticResult::Scalar,
1830 Function::Pricedisc => StaticResult::Scalar,
1831 Function::Pricemat => StaticResult::Scalar,
1832 Function::Received => StaticResult::Scalar,
1833 Function::Yielddisc => StaticResult::Scalar,
1834 Function::Yieldmat => StaticResult::Scalar,
1835 Function::Cumipmt => not_implemented(args),
1836 Function::Cumprinc => not_implemented(args),
1837 Function::Db => not_implemented(args),
1838 Function::Ddb => not_implemented(args),
1839 Function::Dollarde => not_implemented(args),
1840 Function::Dollarfr => not_implemented(args),
1841 Function::Effect => not_implemented(args),
1842 Function::Fv => not_implemented(args),
1843 Function::Ipmt => not_implemented(args),
1844 Function::Irr => not_implemented(args),
1845 Function::Ispmt => not_implemented(args),
1846 Function::Mirr => not_implemented(args),
1847 Function::Nominal => not_implemented(args),
1848 Function::Nper => not_implemented(args),
1849 Function::Npv => not_implemented(args),
1850 Function::Pduration => not_implemented(args),
1851 Function::Pmt => not_implemented(args),
1852 Function::Ppmt => not_implemented(args),
1853 Function::Pv => not_implemented(args),
1854 Function::Rate => not_implemented(args),
1855 Function::Rri => not_implemented(args),
1856 Function::Sln => not_implemented(args),
1857 Function::Syd => not_implemented(args),
1858 Function::Tbilleq => not_implemented(args),
1859 Function::Tbillprice => not_implemented(args),
1860 Function::Tbillyield => not_implemented(args),
1861 Function::Xirr => not_implemented(args),
1862 Function::Xnpv => not_implemented(args),
1863 Function::Duration => StaticResult::Scalar,
1864 Function::Mduration => StaticResult::Scalar,
1865 Function::Price => StaticResult::Scalar,
1866 Function::Yield => StaticResult::Scalar,
1867 Function::Oddfprice => StaticResult::Scalar,
1868 Function::Oddfyield => StaticResult::Scalar,
1869 Function::Oddlprice => StaticResult::Scalar,
1870 Function::Oddlyield => StaticResult::Scalar,
1871 Function::Coupdaybs => StaticResult::Scalar,
1872 Function::Coupdays => StaticResult::Scalar,
1873 Function::Coupdaysnc => StaticResult::Scalar,
1874 Function::Coupncd => StaticResult::Scalar,
1875 Function::Coupnum => StaticResult::Scalar,
1876 Function::Couppcd => StaticResult::Scalar,
1877 Function::Amordegrc => StaticResult::Scalar,
1878 Function::Amorlinc => StaticResult::Scalar,
1879 Function::Vdb => StaticResult::Scalar,
1880 Function::Besseli => scalar_arguments(args),
1881 Function::Besselj => scalar_arguments(args),
1882 Function::Besselk => scalar_arguments(args),
1883 Function::Bessely => scalar_arguments(args),
1884 Function::Erf => scalar_arguments(args),
1885 Function::Erfc => scalar_arguments(args),
1886 Function::ErfcPrecise => scalar_arguments(args),
1887 Function::ErfPrecise => scalar_arguments(args),
1888 Function::Bin2dec => scalar_arguments(args),
1889 Function::Bin2hex => scalar_arguments(args),
1890 Function::Bin2oct => scalar_arguments(args),
1891 Function::Dec2Bin => scalar_arguments(args),
1892 Function::Dec2hex => scalar_arguments(args),
1893 Function::Dec2oct => scalar_arguments(args),
1894 Function::Hex2bin => scalar_arguments(args),
1895 Function::Hex2dec => scalar_arguments(args),
1896 Function::Hex2oct => scalar_arguments(args),
1897 Function::Oct2bin => scalar_arguments(args),
1898 Function::Oct2dec => scalar_arguments(args),
1899 Function::Oct2hex => scalar_arguments(args),
1900 Function::Bitand => scalar_arguments(args),
1901 Function::Bitlshift => scalar_arguments(args),
1902 Function::Bitor => scalar_arguments(args),
1903 Function::Bitrshift => scalar_arguments(args),
1904 Function::Bitxor => scalar_arguments(args),
1905 Function::Complex => scalar_arguments(args),
1906 Function::Imabs => scalar_arguments(args),
1907 Function::Imaginary => scalar_arguments(args),
1908 Function::Imargument => scalar_arguments(args),
1909 Function::Imconjugate => scalar_arguments(args),
1910 Function::Imcos => scalar_arguments(args),
1911 Function::Imcosh => scalar_arguments(args),
1912 Function::Imcot => scalar_arguments(args),
1913 Function::Imcsc => scalar_arguments(args),
1914 Function::Imcsch => scalar_arguments(args),
1915 Function::Imdiv => scalar_arguments(args),
1916 Function::Imexp => scalar_arguments(args),
1917 Function::Imln => scalar_arguments(args),
1918 Function::Imlog10 => scalar_arguments(args),
1919 Function::Imlog2 => scalar_arguments(args),
1920 Function::Impower => scalar_arguments(args),
1921 Function::Improduct => scalar_arguments(args),
1922 Function::Imreal => scalar_arguments(args),
1923 Function::Imsec => scalar_arguments(args),
1924 Function::Imsech => scalar_arguments(args),
1925 Function::Imsin => scalar_arguments(args),
1926 Function::Imsinh => scalar_arguments(args),
1927 Function::Imsqrt => scalar_arguments(args),
1928 Function::Imsub => scalar_arguments(args),
1929 Function::Imsum => scalar_arguments(args),
1930 Function::Imtan => scalar_arguments(args),
1931 Function::Convert => not_implemented(args),
1932 Function::Delta => not_implemented(args),
1933 Function::Gestep => not_implemented(args),
1934 Function::Subtotal => not_implemented(args),
1935 Function::Rand => not_implemented(args),
1936 Function::Randbetween => scalar_arguments(args),
1937 Function::Eomonth => scalar_arguments(args),
1938 Function::Formulatext => not_implemented(args),
1939 Function::Geomean => not_implemented(args),
1940 Function::Networkdays => not_implemented(args),
1941 Function::NetworkdaysIntl => not_implemented(args),
1942 Function::Acot => scalar_arguments(args),
1943 Function::Acoth => scalar_arguments(args),
1944 Function::Cot => scalar_arguments(args),
1945 Function::Coth => scalar_arguments(args),
1946 Function::Csc => scalar_arguments(args),
1947 Function::Csch => scalar_arguments(args),
1948 Function::Sec => scalar_arguments(args),
1949 Function::Sech => scalar_arguments(args),
1950 Function::Exp => scalar_arguments(args),
1951 Function::Fact => scalar_arguments(args),
1952 Function::Factdouble => scalar_arguments(args),
1953 Function::Sign => scalar_arguments(args),
1954 Function::Radians => scalar_arguments(args),
1955 Function::Degrees => scalar_arguments(args),
1956 Function::Int => scalar_arguments(args),
1957 Function::Even => scalar_arguments(args),
1958 Function::Odd => scalar_arguments(args),
1959 Function::Ceiling => scalar_arguments(args),
1960 Function::CeilingMath => scalar_arguments(args),
1961 Function::CeilingPrecise => scalar_arguments(args),
1962 Function::Floor => scalar_arguments(args),
1963 Function::FloorMath => scalar_arguments(args),
1964 Function::FloorPrecise => scalar_arguments(args),
1965 Function::IsoCeiling => scalar_arguments(args),
1966 Function::Mod => scalar_arguments(args),
1967 Function::Quotient => scalar_arguments(args),
1968 Function::Mround => scalar_arguments(args),
1969 Function::Trunc => scalar_arguments(args),
1970 Function::Gcd => StaticResult::Scalar,
1971 Function::Lcm => StaticResult::Scalar,
1972 Function::Base => scalar_arguments(args),
1973 Function::Decimal => scalar_arguments(args),
1974 Function::Roman => scalar_arguments(args),
1975 Function::Arabic => scalar_arguments(args),
1976 Function::Combin => scalar_arguments(args),
1977 Function::Combina => scalar_arguments(args),
1978 Function::Sumsq => StaticResult::Scalar,
1979 Function::Mdeterm => StaticResult::Scalar,
1980 Function::Minverse => StaticResult::Unknown,
1981 Function::Munit => StaticResult::Unknown,
1982 Function::Multinomial => StaticResult::Scalar,
1983 Function::Seriessum => StaticResult::Scalar,
1984 Function::Sumproduct => StaticResult::Scalar,
1985 Function::Percentof => StaticResult::Scalar,
1986 Function::N => scalar_arguments(args),
1987 Function::Sheets => scalar_arguments(args),
1988 Function::Cell => StaticResult::Unknown,
1989 Function::Info => StaticResult::Unknown,
1990 Function::Dget => not_implemented(args),
1991 Function::Dmax => not_implemented(args),
1992 Function::Dmin => not_implemented(args),
1993 Function::Dcount => not_implemented(args),
1994 Function::Daverage => not_implemented(args),
1995 Function::Dsum => not_implemented(args),
1996 Function::Dcounta => not_implemented(args),
1997 Function::Dproduct => not_implemented(args),
1998 Function::Dstdev => not_implemented(args),
1999 Function::Dvar => not_implemented(args),
2000 Function::Dvarp => not_implemented(args),
2001 Function::Dstdevp => not_implemented(args),
2002 Function::BetaDist => StaticResult::Scalar,
2003 Function::BetaInv => StaticResult::Scalar,
2004 Function::BinomDist => StaticResult::Scalar,
2005 Function::BinomDistRange => StaticResult::Scalar,
2006 Function::BinomInv => StaticResult::Scalar,
2007 Function::ChisqDist => StaticResult::Scalar,
2008 Function::ChisqDistRT => StaticResult::Scalar,
2009 Function::ChisqInv => StaticResult::Scalar,
2010 Function::ChisqInvRT => StaticResult::Scalar,
2011 Function::ChisqTest => StaticResult::Scalar,
2012 Function::ConfidenceNorm => StaticResult::Scalar,
2013 Function::ConfidenceT => StaticResult::Scalar,
2014 Function::CovarianceP => StaticResult::Scalar,
2015 Function::CovarianceS => StaticResult::Scalar,
2016 Function::Devsq => StaticResult::Scalar,
2017 Function::ExponDist => StaticResult::Scalar,
2018 Function::FDist => StaticResult::Scalar,
2019 Function::FDistRT => StaticResult::Scalar,
2020 Function::FInv => StaticResult::Scalar,
2021 Function::FInvRT => StaticResult::Scalar,
2022 Function::FTest => StaticResult::Scalar,
2023 Function::Fisher => StaticResult::Scalar,
2024 Function::FisherInv => StaticResult::Scalar,
2025 Function::Gamma => StaticResult::Scalar,
2026 Function::GammaDist => StaticResult::Scalar,
2027 Function::GammaInv => StaticResult::Scalar,
2028 Function::GammaLn => StaticResult::Scalar,
2029 Function::GammaLnPrecise => StaticResult::Scalar,
2030 Function::HypGeomDist => StaticResult::Scalar,
2031 Function::LogNormDist => StaticResult::Scalar,
2032 Function::LogNormInv => StaticResult::Scalar,
2033 Function::NegbinomDist => StaticResult::Scalar,
2034 Function::NormDist => StaticResult::Scalar,
2035 Function::NormInv => StaticResult::Scalar,
2036 Function::NormSdist => StaticResult::Scalar,
2037 Function::NormSInv => StaticResult::Scalar,
2038 Function::Pearson => StaticResult::Scalar,
2039 Function::Phi => StaticResult::Scalar,
2040 Function::PoissonDist => StaticResult::Scalar,
2041 Function::Standardize => StaticResult::Scalar,
2042 Function::Stdev => StaticResult::Scalar,
2043 Function::StDevP => StaticResult::Scalar,
2044 Function::StDevS => StaticResult::Scalar,
2045 Function::Stdeva => StaticResult::Scalar,
2046 Function::Stdevpa => StaticResult::Scalar,
2047 Function::TDist => StaticResult::Scalar,
2048 Function::TDist2T => StaticResult::Scalar,
2049 Function::TDistRT => StaticResult::Scalar,
2050 Function::TInv => StaticResult::Scalar,
2051 Function::TInv2T => StaticResult::Scalar,
2052 Function::TTest => StaticResult::Scalar,
2053 Function::VarP => StaticResult::Scalar,
2054 Function::VarS => StaticResult::Scalar,
2055 Function::VarpA => StaticResult::Scalar,
2056 Function::VarA => StaticResult::Scalar,
2057 Function::WeibullDist => StaticResult::Scalar,
2058 Function::ZTest => StaticResult::Scalar,
2059 Function::BetaDistCompat => StaticResult::Scalar,
2060 Function::HypGeomDistCompat => StaticResult::Scalar,
2061 Function::LogNormDistCompat => StaticResult::Scalar,
2062 Function::NegbinomDistCompat => StaticResult::Scalar,
2063 Function::NormSDistCompat => StaticResult::Scalar,
2064 Function::TDistCompat => StaticResult::Scalar,
2065 Function::BetaInvCompat => StaticResult::Scalar,
2066 Function::BinomDistCompat => StaticResult::Scalar,
2067 Function::ChiDistCompat => StaticResult::Scalar,
2068 Function::ChiInvCompat => StaticResult::Scalar,
2069 Function::ChiTestCompat => StaticResult::Scalar,
2070 Function::ConfidenceCompat => StaticResult::Scalar,
2071 Function::CovarCompat => StaticResult::Scalar,
2072 Function::CritbinomCompat => StaticResult::Scalar,
2073 Function::ExponDistCompat => StaticResult::Scalar,
2074 Function::FDistCompat => StaticResult::Scalar,
2075 Function::FInvCompat => StaticResult::Scalar,
2076 Function::FTestCompat => StaticResult::Scalar,
2077 Function::GammaDistCompat => StaticResult::Scalar,
2078 Function::GammaInvCompat => StaticResult::Scalar,
2079 Function::LoginvCompat => StaticResult::Scalar,
2080 Function::ModeCompat => StaticResult::Scalar,
2081 Function::NormDistCompat => StaticResult::Scalar,
2082 Function::NormInvCompat => StaticResult::Scalar,
2083 Function::NormSInvCompat => StaticResult::Scalar,
2084 Function::PercentileCompat => StaticResult::Scalar,
2085 Function::PercentrankCompat => StaticResult::Scalar,
2086 Function::PoissonCompat => StaticResult::Scalar,
2087 Function::QuartileCompat => StaticResult::Scalar,
2088 Function::RankCompat => StaticResult::Scalar,
2089 Function::StDevPCompat => StaticResult::Scalar,
2090 Function::TInvCompat => StaticResult::Scalar,
2091 Function::TTestCompat => StaticResult::Scalar,
2092 Function::VarCompat => StaticResult::Scalar,
2093 Function::VarPCompat => StaticResult::Scalar,
2094 Function::WeibullCompat => StaticResult::Scalar,
2095 Function::ZTestCompat => StaticResult::Scalar,
2096 Function::Sumx2my2 => StaticResult::Scalar,
2097 Function::Sumx2py2 => StaticResult::Scalar,
2098 Function::Sumxmy2 => StaticResult::Scalar,
2099 Function::Correl => StaticResult::Scalar,
2100 Function::Rsq => StaticResult::Scalar,
2101 Function::Intercept => StaticResult::Scalar,
2102 Function::Slope => StaticResult::Scalar,
2103 Function::Steyx => StaticResult::Scalar,
2104 Function::Forecast => StaticResult::Scalar,
2105 Function::ForecastLinear => StaticResult::Scalar,
2106 Function::ForecastEts => StaticResult::Scalar,
2107 Function::ForecastEtsConfint => StaticResult::Scalar,
2108 Function::ForecastEtsSeasonality => StaticResult::Scalar,
2109 Function::ForecastEtsStat => StaticResult::Scalar,
2110 Function::Frequency => StaticResult::Unknown,
2112 Function::Growth => StaticResult::Unknown,
2113 Function::Linest => StaticResult::Unknown,
2114 Function::Logest => StaticResult::Unknown,
2115 Function::ModeMult => StaticResult::Unknown,
2116 Function::Trend => StaticResult::Unknown,
2117 Function::ModeSingl => StaticResult::Scalar,
2119 Function::PercentileExc => StaticResult::Scalar,
2120 Function::PercentileInc => StaticResult::Scalar,
2121 Function::PercentrankExc => StaticResult::Scalar,
2122 Function::PercentrankInc => StaticResult::Scalar,
2123 Function::Permut => StaticResult::Scalar,
2124 Function::Permutationa => StaticResult::Scalar,
2125 Function::Prob => StaticResult::Scalar,
2126 Function::QuartileExc => StaticResult::Scalar,
2127 Function::QuartileInc => StaticResult::Scalar,
2128 Function::Trimmean => StaticResult::Scalar,
2129 Function::Gauss => StaticResult::Scalar,
2130 Function::Harmean => StaticResult::Scalar,
2131 Function::Kurt => StaticResult::Scalar,
2132 Function::Large => StaticResult::Scalar,
2133 Function::MaxA => StaticResult::Scalar,
2134 Function::Median => StaticResult::Scalar,
2135 Function::MinA => StaticResult::Scalar,
2136 Function::RankAvg => StaticResult::Scalar,
2137 Function::RankEq => StaticResult::Scalar,
2138 Function::Skew => StaticResult::Scalar,
2139 Function::SkewP => StaticResult::Scalar,
2140 Function::Small => StaticResult::Scalar,
2141 }
2142}