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 == 2); Contracts.Assert(argTypes.Length == 2); Contracts.AssertValue(errors); if (!base.CheckInvocation(binding, args, argTypes, errors, out returnType, out nodeToCoercedTypeMap)) { return(false); } // Check if first argument is poly type or an activity pointer if (!argTypes[0].IsPolymorphic && !argTypes[0].IsActivityPointer) { errors.EnsureError(DocumentErrorSeverity.Severe, args[0], TexlStrings.ErrBadType_ExpectedType_ProvidedType, DKind.Polymorphic.ToString(), argTypes[0].GetKindString()); return(false); } // Check if table arg referrs to a connected data source. TexlNode tableArg = args[1]; FirstNameInfo tableInfo; IExternalDataSource tableDsInfo; if (!binding.TryGetFirstNameInfo(tableArg.Id, out tableInfo) || (tableDsInfo = (tableInfo.Data as IExternalDataSource)) == null || !(tableDsInfo is IExternalTabularDataSource)) { errors.EnsureError(tableArg, TexlStrings.ErrAsTypeAndIsTypeExpectConnectedDataSource); return(false); } if (binding.Document.Properties.EnabledFeatures.IsEnhancedDelegationEnabled && (tableDsInfo is IExternalCdsDataSource) && argTypes[0].HasPolymorphicInfo) { var expandInfo = argTypes[0].PolymorphicInfo.TryGetExpandInfo(tableDsInfo.TableMetadata.Name); if (expandInfo != null) { returnType = argTypes[0].ExpandPolymorphic(argTypes[1], expandInfo); return(true); } } returnType = argTypes[1].ToRecord(); return(true); }