/// <summary>
 /// Check that methods with streams are not called across several stages.
 /// </summary>
 /// <param name="shaderStage">The current shader stage to check.</param>
 /// <param name="methodsWithStreams">The list of methods that need streams in that stage.</param>
 private void CheckCrossStageMethodCall(PdxShaderStage shaderStage, List<MethodDeclaration> methodsWithStreams)
 {
     foreach (var stageList in methodsPerShaderStage)
     {
         var stage = stageList.Key;
         if (stage != shaderStage) // should always be true
         {
             foreach (var method in methodsWithStreams)
             {
                 if (stageList.Value.Contains(method))
                 {
                     errorWarningLog.Error(ParadoxMessageCode.ErrorCrossStageMethodCall, method.Span, method, stage, shaderStage);
                 }
             }
         }
     }
     methodsPerShaderStage.Add(shaderStage, methodsWithStreams);
 }
        /// <summary>
        /// Get the streams usage for this entrypoint
        /// </summary>
        /// <param name="moduleMixin">the current module mixin</param>
        /// <param name="entryPoint">the entrypoint method</param>
        /// <returns>a StreamStageUsage containing the streams usages</returns>
        private StreamStageUsage StreamAnalysisPerShader(ModuleMixin moduleMixin, MethodDeclaration entryPoint, PdxShaderStage shaderStage)
        {
            var visitedMethods = new List<MethodDeclaration>();
            var streamStageUsage = new StreamStageUsage { ShaderStage = shaderStage };
            FindStreamsUsage(entryPoint, streamStageUsage.InStreamList, streamStageUsage.OutStreamList, visitedMethods);
            visitedMethods.Clear();

            return streamStageUsage;
        }