{"record":{"id":"caa5ed231adca15e","repo":"unoplatform/uno","slug":"expected-in-attached-property-syntax","errorCode":null,"errorMessage":"Expected ')' in attached property syntax.","messagePattern":"Expected '\\)' in attached property syntax\\.","errorType":"exception","errorClass":"Exception","httpStatus":null,"severity":"error","filePath":"src/SourceGenerators/Uno.UI.SourceGenerators/XamlGenerator/Utils/XBindExpressionParser.CoreParser.cs","lineNumber":194,"sourceCode":"\t\t\twhile (true)\n\t\t\t{\n\t\t\t\tif (Current == '.')\n\t\t\t\t{\n\t\t\t\t\t_position++;\n\t\t\t\t\tif (Current == '(')\n\t\t\t\t\t{\n\t\t\t\t\t\t_position++;\n\n\t\t\t\t\t\tvar attachedPropertyPath = ParseXBindPath();\n\n\t\t\t\t\t\tif (attachedPropertyPath is not XBindMemberAccess memberAccess)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tthrow new Exception(\"Expected attached property path to be member access.\");\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (Current != ')')\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tthrow new Exception(\"Expected ')' in attached property syntax.\");\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tpath = new XBindAttachedPropertyAccess() { Member = path, PropertyClass = memberAccess.Path, PropertyName = memberAccess.Identifier };\n\n\t\t\t\t\t\t_position++;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tpath = new XBindMemberAccess() { Path = path, Identifier = ParseXBindIdentifier() };\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (Current == '[')\n\t\t\t\t{\n\t\t\t\t\tvar currentPosition = ++_position;\n\t\t\t\t\twhile (Current != ']')\n\t\t\t\t\t{\n\t\t\t\t\t\t_position++;\n\t\t\t\t\t}","sourceCodeStart":176,"sourceCodeEnd":212,"githubUrl":"https://github.com/unoplatform/uno/blob/04183404888ea21b4e5bfa3493e8d5f15e972c3a/src/SourceGenerators/Uno.UI.SourceGenerators/XamlGenerator/Utils/XBindExpressionParser.CoreParser.cs#L176-L212","documentation":"Thrown by the x:Bind path parser during attached-property syntax parsing. After '.(' is consumed and the inner path is confirmed to be a member access node 'Owner.Property', the parser checks for the closing ')'. If the next character is not ')', this exception fires.","triggerScenarios":"An x:Bind attached-property path is missing its closing ')' — e.g. {x:Bind Element.(Canvas.Left} or {x:Bind Element.(Canvas.Left. Extra}.","commonSituations":"Typo or truncation in the closing parenthesis of an attached property path; an XAML merge or formatter introduced an extra character between the property name and ')'.","solutions":["Add the missing ')' immediately after 'ClassName.PropertyName' in the '.(...)' group.","Remove any stray characters between the property name and the closing ')'.","Validate the full x:Bind string reads as Element.(Class.Property)."],"exampleFix":"<!-- before -->\n<Text Canvas.Left=\"{x:Bind MyElement.(Canvas.Left}\" />\n<!-- after -->\n<Text Canvas.Left=\"{x:Bind MyElement.(Canvas.Left)}\" />","handlingStrategy":"validation","validationCode":"// Ensure the closing ')' is present in attached-property x:Bind syntax.\n// Linting check: every '.(' in an x:Bind path must be followed eventually by ')'\n// after exactly 'Class.Property'.","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Double-check closing ')' when writing attached property bindings.","Use IDE autocomplete/snippets that insert the full '.(Class.Property)' pattern."],"tags":["xbind","xaml","parser","source-generator","attached-property"],"backgroundTag":null,"analyzedSha":"04183404888ea21b4e5bfa3493e8d5f15e972c3a","analyzedAt":"2026-08-13T21:08:11.651Z","schemaVersion":2},"datasetVersion":"2026-08-14T00:17:13.853Z"}