public static void ReportProblems( CompilationAnalysisContext context, SemanticModel semanticModel, IEnumerable <ActivityFunctionDefinition> availableFunctions, IEnumerable <ActivityFunctionCall> calledFunctions) { foreach (var activityInvocation in calledFunctions) { var functionDefinition = availableFunctions.Where(x => x.FunctionName == activityInvocation.Name).FirstOrDefault(); if (functionDefinition != null) { var isInvokedWithNonNullInput = TryGetInvocationInputType(semanticModel, activityInvocation, out ITypeSymbol invocationInputType); var functionDefinitionUsesInput = TryGetDefinitionInputType(semanticModel, functionDefinition, out ITypeSymbol definitionInputType); if (!functionDefinitionUsesInput) { if (isInvokedWithNonNullInput) { var diagnostic = Diagnostic.Create(InputNotUsedRule, activityInvocation.ParameterNode.GetLocation(), activityInvocation.Name); context.ReportDiagnostic(diagnostic); } } else if (!SyntaxNodeUtils.InputMatchesOrCompatibleType(invocationInputType, definitionInputType)) { var invocationTypeName = SyntaxNodeUtils.GetQualifiedTypeName(invocationInputType); var definitionTypeName = SyntaxNodeUtils.GetQualifiedTypeName(definitionInputType); var diagnostic = Diagnostic.Create(MismatchRule, activityInvocation.ParameterNode.GetLocation(), activityInvocation.Name, definitionTypeName, invocationTypeName); context.ReportDiagnostic(diagnostic); } } } }
private static bool IsValidReturnTypeForDefinition(ITypeSymbol invocationReturnType, ITypeSymbol definitionReturnType) { if (TryGetTaskTypeArgument(definitionReturnType, out ITypeSymbol taskTypeArgument)) { definitionReturnType = taskTypeArgument; } return(SyntaxNodeUtils.InputMatchesOrCompatibleType(invocationReturnType, definitionReturnType) || SyntaxNodeUtils.TypeNodeImplementsOrExtendsType(definitionReturnType, invocationReturnType.ToString())); }
private static bool IsValidArgumentForDefinition(ITypeSymbol invocationInputType, ITypeSymbol definitionInputType) { return(SyntaxNodeUtils.InputMatchesOrCompatibleType(invocationInputType, definitionInputType) || SyntaxNodeUtils.TypeNodeImplementsOrExtendsType(invocationInputType, definitionInputType.ToString())); }
private static bool InputMatchesOrTaskOrCompatibleType(ITypeSymbol invocationReturnType, ITypeSymbol definitionReturnType) { return(SyntaxNodeUtils.InputMatchesOrCompatibleType(invocationReturnType, definitionReturnType) || DefinitionReturnsTask(invocationReturnType, definitionReturnType)); }