{"record":{"id":"c07b06be4a1e3580","repo":"stride3d/stride","slug":"unknown-qualifier-str","errorCode":null,"errorMessage":"Unknown qualifier: {str}","messagePattern":"Unknown qualifier: (.+?)","errorType":"validation","errorClass":"ArgumentException","httpStatus":null,"severity":"error","filePath":"sources/shaders/Stride.Shaders.Parsers/Core/IntrinsicsParameters.cs","lineNumber":100,"sourceCode":"public record struct Parameter(Qualifier? Qualifier, OptionalQualifier? OptionalQualifier, ParameterType Type, string Name);\n\npublic record class IntrinsicDefinition(ParameterType Return, Parameter[] Parameters)\n{\n    public IntrinsicDefinition(ParameterType @return, params ReadOnlySpan<Parameter> parameters)\n        : this(@return, parameters.ToArray())\n    { }\n}\n\n\npublic static partial class IntrinsicsDefinitions\n{\n    static Qualifier FromString(string str) => str switch\n    {\n        \"in\" => Qualifier.In,\n        \"out\" => Qualifier.Out,\n        \"inout\" => Qualifier.InOut,\n        \"ref\" => Qualifier.Ref,\n        _ => throw new ArgumentException($\"Unknown qualifier: {str}\"),\n    };\n    static OptionalQualifier FromStringOptional(string str) => str switch\n    {\n        \"row_major\" => OptionalQualifier.RowMajor,\n        \"col_major\" => OptionalQualifier.ColumnMajor,\n        _ => throw new ArgumentException($\"Unknown optional qualifier: {str}\"),\n    };\n}\n\npublic enum BaseType\n{\n    Bool,\n    Int,\n    Int32Only,\n    Int16,\n    Int64,\n    SInt16Or32,\n    AnyInt,","sourceCodeStart":82,"sourceCodeEnd":118,"githubUrl":"https://github.com/stride3d/stride/blob/96fad776d210c221682aac1ccdf4c79dc046fc38/sources/shaders/Stride.Shaders.Parsers/Core/IntrinsicsParameters.cs#L82-L118","documentation":"IntrinsicsDefinitions.FromString parses qualifier strings from intrinsic definitions into the Qualifier enum. Only 'in', 'out', 'inout' and 'ref' are accepted; anything else throws ArgumentException('Unknown qualifier: ...'). This is a fail-fast parser for the intrinsic table DSL.","triggerScenarios":"Calling IntrinsicsDefinitions.FromString (directly or via intrinsic-table deserialization) with a string other than 'in'/'out'/'inout'/'ref' — e.g. 'inout ' with trailing whitespace, 'IN', 'InOut', 'const', or a malformed line in an intrinsics definition source that was split into a qualifier column.","commonSituations":"Hand-written intrinsic signature files containing a typo or uppercase qualifier; locale/language extensions ('inout' vs HLSL 'inout' is fine, but 'uniform' or 'static' are not qualifiers here); trimming bugs where whitespace survives into the token; new qualifier added to the enum but not to FromString.","solutions":["Fix the input string to be exactly one of 'in', 'out', 'inout', 'ref' (lowercase, no whitespace) — e.g. Trim() tokens before calling FromString.","If a new qualifier is genuinely needed, add an arm to the FromString switch in IntrinsicsParameters.cs.","Intercept malformed lines in the intrinsics definition source and log/fix them before parsing."],"exampleFix":"// before\nvar q = IntrinsicsDefinitions.FromString(rawToken); // \"InOut \" -> ArgumentException\n\n// after\nvar q = IntrinsicsDefinitions.FromString(rawToken.Trim().ToLowerInvariant());","handlingStrategy":"validation","validationCode":"if (!str.Trim().EqualsInvariant(\"in\") && !str.Trim().EqualsInvariant(\"out\") &&\n    !str.Trim().EqualsInvariant(\"inout\") && !str.Trim().EqualsInvariant(\"ref\"))\n    throw new FormatException($\"Qualifier must be in|out|inout|ref, got '{str}'\");","typeGuard":"bool IsValidQualifier(string s) => s is \"in\" or \"out\" or \"inout\" or \"ref\";","tryCatchPattern":"try { qualifier = IntrinsicsDefinitions.FromString(token); }\ncatch (ArgumentException ex) when (ex.Message.StartsWith(\"Unknown qualifier:\"))\n{\n    logger.LogError(\"Bad qualifier token '{Token}' in intrinsics definition at line {Line}\", token, lineNo);\n    throw;\n}","preventionTips":["Trim and lowercase qualifier tokens parsed from definition files before dispatching.","Keep a single normalization helper for qualifier strings instead of passing raw table text.","Add a startup pass that parses all intrinsic definitions and reports every bad token with its source line."],"tags":["argument","enum-mapping","intrinsics","parsing"],"backgroundTag":"invalid-enum-value","analyzedSha":"96fad776d210c221682aac1ccdf4c79dc046fc38","analyzedAt":"2026-09-14T02:59:31.279Z","contentChangedAt":"2026-09-14T02:59:31.279Z","schemaVersion":2},"datasetVersion":"2026-09-15T23:17:13.987Z"}