public override bool IsServerDelegatable(CallNode callNode, TexlBinding binding) { Contracts.AssertValue(callNode); Contracts.AssertValue(binding); if (FunctionDelegationCapability.Capabilities == DelegationCapability.None) { return(false); } if (!CheckArgsCount(callNode, binding)) { return(false); } IExternalDataSource dataSource; if (!TryGetValidDataSourceForDelegation(callNode, binding, FunctionDelegationCapability, out dataSource)) { if (dataSource != null && dataSource.IsDelegatable) { binding.ErrorContainer.EnsureError(DocumentErrorSeverity.Warning, callNode, TexlStrings.OpNotSupportedByServiceSuggestionMessage_OpNotSupportedByService, Name); } return(false); } var args = callNode.Args.Children.VerifyValue(); if (binding.GetType(args[0]).HasExpandInfo || (!binding.IsFullRecordRowScopeAccess(args[1]) && args[1].Kind != NodeKind.FirstName) || !binding.IsRowScope(args[1]) || binding.GetType(args[1]) != DType.Number || ExpressionContainsView(callNode, binding)) { SuggestDelegationHint(callNode, binding); if (binding.GetType(args[1]) != DType.Number) { DelegationTrackerCore.SetDelegationTrackerStatus(DelegationStatus.NotANumberArgType, callNode, binding, this, DelegationTelemetryInfo.CreateEmptyDelegationTelemetryInfo()); } else { DelegationTrackerCore.SetDelegationTrackerStatus(DelegationStatus.InvalidArgType, callNode, binding, this, DelegationTelemetryInfo.CreateEmptyDelegationTelemetryInfo()); } return(false); } if (binding.IsFullRecordRowScopeAccess(args[1])) { return(GetDottedNameNodeDelegationStrategy().IsValidDottedNameNode(args[1].AsDottedName(), binding, null, null)); } var firstNameStrategy = GetFirstNameNodeDelegationStrategy().VerifyValue(); return(firstNameStrategy.IsValidFirstNameNode(args[1].AsFirstName(), binding, null)); }
public override bool IsRowScopedServerDelegatable(CallNode callNode, TexlBinding binding, OperationCapabilityMetadata metadata) { Contracts.AssertValue(callNode); Contracts.AssertValue(binding); Contracts.AssertValue(metadata); if (binding.ErrorContainer.HasErrors(callNode)) { return(false); } if (!CheckArgsCount(callNode, binding)) { return(false); } TexlNode[] args = callNode.Args.Children.VerifyValue(); var opStrategy = GetOpDelegationStrategy(BinaryOp.Equal, null); if (binding.IsFullRecordRowScopeAccess(args[0])) { return(GetDottedNameNodeDelegationStrategy().IsValidDottedNameNode(args[0] as DottedNameNode, binding, metadata, opStrategy)); } FirstNameNode node = args[0] as FirstNameNode; if (node == null) { var message = string.Format("Arg1 is not a firstname node, instead it is {0}", args[0].Kind); AddSuggestionMessageToTelemetry(message, args[0], binding); return(false); } if (!binding.IsRowScope(node)) { return(false); } var firstNameNodeValidationStrategy = GetFirstNameNodeDelegationStrategy(); return(firstNameNodeValidationStrategy.IsValidFirstNameNode(node, binding, opStrategy)); }
public bool IsRHSDelegableTable(TexlBinding binding, BinaryOpNode binaryOpNode, OperationCapabilityMetadata metadata) { Contracts.AssertValue(binding); Contracts.AssertValue(binaryOpNode); Contracts.AssertValue(metadata); var rightNodeType = binding.GetType(binaryOpNode.Right); var hasEnhancedDelegation = binding.Document.Properties.EnabledFeatures.IsEnhancedDelegationEnabled; var isColumn = rightNodeType?.IsColumn == true; var isDelegationSupportedByTable = metadata.IsDelegationSupportedByTable(DelegationCapability.CdsIn); var HasLeftFirstNameNodeOrIsFullRecordRowScopeAccess = binaryOpNode.Left?.AsFirstName() != null || binding.IsFullRecordRowScopeAccess(binaryOpNode.Left); return(hasEnhancedDelegation && isColumn && isDelegationSupportedByTable && HasLeftFirstNameNodeOrIsFullRecordRowScopeAccess); }