// Typecheck an invocation of Table. public override bool CheckInvocation(TexlBinding binding, TexlNode[] args, DType[] argTypes, IErrorContainer errors, out DType returnType, out Dictionary <TexlNode, DType> nodeToCoercedTypeMap) { Contracts.AssertValue(args); Contracts.AssertAllValues(args); Contracts.AssertValue(argTypes); Contracts.Assert(args.Length == argTypes.Length); Contracts.AssertValue(errors); Contracts.Assert(MinArity <= args.Length && args.Length <= MaxArity); bool isValid = base.CheckInvocation(args, argTypes, errors, out returnType, out nodeToCoercedTypeMap); Contracts.Assert(returnType.IsTable); // Ensure that all args (if any) are records with compatible schemas. DType rowType = DType.EmptyRecord; for (int i = 0; i < argTypes.Length; i++) { DType argType = argTypes[i]; if (!argType.IsRecord) { errors.EnsureError(DocumentErrorSeverity.Severe, args[i], TexlStrings.ErrNeedRecord); isValid = false; } else if (!rowType.CanUnionWith(argType)) { errors.EnsureError(DocumentErrorSeverity.Severe, args[i], TexlStrings.ErrIncompatibleRecord); isValid = false; } else { bool isUnionError = false; rowType = DType.Union(ref isUnionError, rowType, argType); Contracts.Assert(!isUnionError); Contracts.Assert(rowType.IsRecord); } } Contracts.Assert(rowType.IsRecord); returnType = rowType.ToTable(); return(isValid); }