{"record":{"id":"091b8d8d2b6fc329","repo":"stride3d/stride","slug":"properties","errorCode":null,"errorMessage":"properties","messagePattern":"properties","errorType":"validation","errorClass":"ArgumentNullException","httpStatus":null,"severity":"error","filePath":"sources/shaders/Stride.Shaders.Effects/ShaderMixinManager.cs","lineNumber":95,"sourceCode":"\n        /// <summary>\n        /// Generates a <see cref=\"ShaderMixinSource\" /> for the specified names and parameters.\n        /// </summary>\n        /// <param name=\"sdfxEffectName\">The name.</param>\n        /// <param name=\"properties\">The properties.</param>\n        /// <returns>The result of the mixin.</returns>\n        /// <exception cref=\"System.ArgumentNullException\">\n        /// sdfxEffectName\n        /// or\n        /// properties\n        /// </exception>\n        /// <exception cref=\"System.ArgumentException\">sdfxEffectName</exception>\n        public static ShaderMixinSource Generate(string sdfxEffectName, ParameterCollection properties)\n        {\n            if (sdfxEffectName == null) throw new ArgumentNullException(\"sdfxEffectName\");\n\n            if (properties == null)\n                throw new ArgumentNullException(\"properties\");\n\n            // Get the effect name and child effect name \"RootEffectName.ChildEffectName\"\n            var effectName = GetEffectName(sdfxEffectName);\n            var rootEffectName = effectName.Key;\n            var childEffectName = effectName.Value;\n\n            IShaderMixinBuilder builder;\n            Dictionary<string, IShaderMixinBuilder> builders;\n            lock (RegisteredBuilders)\n            {\n                if (!TryGet(rootEffectName, out builder))\n                    throw new ArgumentException(string.Format(\"Xkfx effect [{0}] not found\", rootEffectName), \"sdfxEffectName\");\n\n                builders = new Dictionary<string, IShaderMixinBuilder>(RegisteredBuilders);\n            }\n\n            // TODO cache mixin context and avoid to recreate one (check if if thread concurrency could occur here)\n            var mixinTree = new ShaderMixinSource() { Name = sdfxEffectName };","sourceCodeStart":77,"sourceCodeEnd":113,"githubUrl":"https://github.com/stride3d/stride/blob/96fad776d210c221682aac1ccdf4c79dc046fc38/sources/shaders/Stride.Shaders.Effects/ShaderMixinManager.cs#L77-L113","documentation":"ShaderMixinManager.Generate throws ArgumentNullException when the properties (ParameterCollection) argument is null. The mixin generation reads compilation parameters (macros, permutations) from this collection, so it is mandatory.","triggerScenarios":"Calling Generate(effectName, null) — e.g. constructing parameters lazily and forgetting to instantiate ParameterCollection.","commonSituations":"Custom effect compilers passing a parameters field never initialized; refactoring that removed a parameter-collection constructor call.","solutions":["Pass a valid, non-null ParameterCollection (an empty one is acceptable if no parameters are needed).","Initialize the collection before the call: new ParameterCollection().","Add a null check at the call site."],"exampleFix":"// before\nvar mixin = ShaderMixinManager.Generate(\"MyEffect\", parameters);\n// after\nparameters ??= new ParameterCollection();\nvar mixin = ShaderMixinManager.Generate(\"MyEffect\", parameters);","handlingStrategy":"validation","validationCode":"parameters ??= new ParameterCollection();\nvar mixin = ShaderMixinManager.Generate(effectName, parameters);","typeGuard":null,"tryCatchPattern":"try { mixin = ShaderMixinManager.Generate(name, parameters); }\ncatch (ArgumentNullException ex) when (ex.ParamName == \"properties\") { parameters = new ParameterCollection(); mixin = ShaderMixinManager.Generate(name, parameters); }","preventionTips":["Initialize ParameterCollection in constructors of compiler contexts","Never leave parameter fields null after object construction"],"tags":["csharp","argument-null","parameters"],"backgroundTag":"null-argument","analyzedSha":"96fad776d210c221682aac1ccdf4c79dc046fc38","analyzedAt":"2026-09-14T02:59:31.279Z","contentChangedAt":"2026-09-14T02:59:31.279Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}