/// <summary>
    /// Extracts method contracts for the accessors and packages them under the property itself.
    /// </summary>
    public override void Visit(IPropertyDefinition propertyDefinition) {
      Contract.Assert(propertyDefinition != null);

      string propertyId = MemberHelper.GetMemberSignature(propertyDefinition, NameFormattingOptions.DocumentationId);
      docTracker.WriteLine(propertyId);

      int contractsCounter = 0;

      XAccessorContract getterContracts = null;
      if (propertyDefinition.Getter != null) {
        var getterMethod = propertyDefinition.Getter.ResolvedMethod;
        Contract.Assume(getterMethod != null);
        bool isPure = IsPure(getterMethod); //TODO: Remove, this should be handled on the packager side.
        ContractPackager packager = new ContractPackager(host, docTracker);
        packager.PackageMethodContracts(getterMethod, isPure);
        XContract[] getterContractArray;
        if (packager.TryGetContracts(out getterContractArray)) {
          contractsCounter += getterContractArray.Length;
          docTracker.AddMemberInfo(getterContractArray.Length, MemberKind.Getter);
          getterContracts = new XAccessorContract(this.host, XAccessorKind.Getter, getterContractArray, docTracker);
        }
      }

      XAccessorContract setterContracts = null;
      if (propertyDefinition.Setter != null) {
        var setterMethod = propertyDefinition.Setter.ResolvedMethod;
        Contract.Assume(setterMethod != null);
        bool isPure = IsPure(setterMethod); //TODO: Remove, this should be handled on the packager side.
        ContractPackager packager = new ContractPackager(host, docTracker);
        packager.PackageMethodContracts(setterMethod, isPure);
        XContract[] setterContractArray;
        if (packager.TryGetContracts(out setterContractArray)) {
          contractsCounter += setterContractArray.Length;
          docTracker.AddMemberInfo(setterContractArray.Length, MemberKind.Setter);
          setterContracts = new XAccessorContract(this.host, XAccessorKind.Setter, setterContractArray, docTracker);
        }
      }

      XContract[] accessorContracts = null;
      if (getterContracts != null && setterContracts != null)
        accessorContracts = new XContract[2] { getterContracts, setterContracts };
      else if (getterContracts != null)
        accessorContracts = new XContract[1] { getterContracts };
      else if (setterContracts != null)
        accessorContracts = new XContract[1] { setterContracts };

      if (accessorContracts != null) {
        contracts.Add(new KeyValuePair<string, XContract[]>(propertyId, accessorContracts));
      }

      docTracker.AddMemberInfo(contractsCounter, MemberKind.Property);

      //base.TraverseChildren(propertyDefinition);
    }
        /// <summary>
        /// Extracts method contracts for the accessors and packages them under the property itself.
        /// </summary>
        public override void Visit(IPropertyDefinition propertyDefinition)
        {
            Contract.Assert(propertyDefinition != null);

            string propertyId = MemberHelper.GetMemberSignature(propertyDefinition, NameFormattingOptions.DocumentationId);

            docTracker.WriteLine(propertyId);

            int contractsCounter = 0;

            XAccessorContract getterContracts = null;

            if (propertyDefinition.Getter != null)
            {
                var getterMethod = propertyDefinition.Getter.ResolvedMethod;
                Contract.Assume(getterMethod != null);
                bool             isPure   = IsPure(getterMethod); //TODO: Remove, this should be handled on the packager side.
                ContractPackager packager = new ContractPackager(host, docTracker);
                packager.PackageMethodContracts(getterMethod, isPure);
                XContract[] getterContractArray;
                if (packager.TryGetContracts(out getterContractArray))
                {
                    contractsCounter += getterContractArray.Length;
                    docTracker.AddMemberInfo(getterContractArray.Length, MemberKind.Getter);
                    getterContracts = new XAccessorContract(this.host, XAccessorKind.Getter, getterContractArray, docTracker);
                }
            }

            XAccessorContract setterContracts = null;

            if (propertyDefinition.Setter != null)
            {
                var setterMethod = propertyDefinition.Setter.ResolvedMethod;
                Contract.Assume(setterMethod != null);
                bool             isPure   = IsPure(setterMethod); //TODO: Remove, this should be handled on the packager side.
                ContractPackager packager = new ContractPackager(host, docTracker);
                packager.PackageMethodContracts(setterMethod, isPure);
                XContract[] setterContractArray;
                if (packager.TryGetContracts(out setterContractArray))
                {
                    contractsCounter += setterContractArray.Length;
                    docTracker.AddMemberInfo(setterContractArray.Length, MemberKind.Setter);
                    setterContracts = new XAccessorContract(this.host, XAccessorKind.Setter, setterContractArray, docTracker);
                }
            }

            XContract[] accessorContracts = null;
            if (getterContracts != null && setterContracts != null)
            {
                accessorContracts = new XContract[2] {
                    getterContracts, setterContracts
                }
            }
            ;
            else if (getterContracts != null)
            {
                accessorContracts = new XContract[1] {
                    getterContracts
                }
            }
            ;
            else if (setterContracts != null)
            {
                accessorContracts = new XContract[1] {
                    setterContracts
                }
            }
            ;

            if (accessorContracts != null)
            {
                contracts.Add(new KeyValuePair <string, XContract[]>(propertyId, accessorContracts));
            }

            docTracker.AddMemberInfo(contractsCounter, MemberKind.Property);

            //base.TraverseChildren(propertyDefinition);
        }