anchor.diff:      member this.Position =
           match this with
           | Named(pos, _) | Unnamed(pos) -> pos
  +    member this.Name =
  +        match this with
  +        | Named(_, name) -> Some name
  +        | Unnamed _ -> None
   
   type XamlElementInfo =
   | XamlElementInfo of XamlId * string
  
positive.code:                 match infoOfXamlElement filename xaml with
                  | Some (XamlElementInfo(data, typeName)) ->
                      let has_children = not xaml.IsEmptyElement
                      { NodeType = typeOfXamlElement typeName ;
                        Data = data ;
                        Children =
                          (if has_children then
                              readNewElement []
                           else
                              []) }
                      :: siblings
                      |> readNewElement
                  | None -> failwithf "Error near %A" (posOfReader filename xaml)
              | XmlNodeType.EndElement ->
                  siblings
  
negative.code:         createXmlReader(reader) 
          |> readXamlFile xamlInfo.FileName
  
      let rec checkConflictingNames root =
          let dups =
              root.Children
              |> Seq.groupBy (fun node -> node.Data.Name)
              |> Seq.tryFind (fun (key, values) -> Seq.length values > 1)
          match dups with
          | Some (_, nodes) ->
              failwithf
                  "Components at %A under %A at %A have identical names"
                  (nodes
                   |> Seq.map (fun node -> node.Data.Position)
                   |> List.ofSeq)
                  (root.Data.Name)
                  (root.Data.Position)
          | None ->
              root.Children
              |> Seq.iter checkConflictingNames
  
      checkConflictingNames root
  
      eraseType thisAssembly rootNamespace typeName root.NodeType
          |> addDefinitionLocation root.Data.Position
          |+> (provideConstructor
  