/// <summary> /// Extracts the method contracts. Does not visit property accessors. /// </summary> public override void Visit(IMethodDefinition methodDefinition) { Contract.Assert(methodDefinition != null); if (CCDocContractHelper.IsCompilerGenerated(this.host, methodDefinition)) { return; //Don't continue traverser } if (MethodHelper.IsGetter(methodDefinition) || MethodHelper.IsSetter(methodDefinition)) { return; } string methodId = MemberHelper.GetMemberSignature(methodDefinition, NameFormattingOptions.DocumentationId); docTracker.WriteLine(methodId); bool isPure = IsPure(methodDefinition);//TODO: Remove, this should be handled on the packager side. ContractPackager packager = new ContractPackager(host, docTracker); packager.PackageMethodContracts(methodDefinition, isPure); XContract[] contractArray; if (packager.TryGetContracts(out contractArray)) { docTracker.AddMemberInfo(contractArray.Length, MemberKind.Method); contracts.Add(new KeyValuePair <string, XContract[]>(methodId, contractArray)); } else { docTracker.AddMemberInfo(0, MemberKind.Method); } //base.TraverseChildren(methodDefinition); }
/// <summary> /// Extracts object invariants. /// </summary> public override void Visit(ITypeDefinition typeDefinition) { Contract.Assert(typeDefinition != null); string typeId = TypeHelper.GetTypeName(typeDefinition, NameFormattingOptions.DocumentationId); docTracker.WriteLine(typeId); ContractPackager packager = new ContractPackager(host, docTracker); packager.PackageTypeContracts(typeDefinition); XContract[] contractArray; if (packager.TryGetContracts(out contractArray)) { docTracker.AddMemberInfo(contractArray.Length, MemberKind.Type); contracts.Add(new KeyValuePair <string, XContract[]>(typeId, contractArray)); } else { docTracker.AddMemberInfo(0, MemberKind.Type); } //base.TraverseChildren(typeDefinition); }
/// <summary> /// Extracts the method contracts. Does not visit property accessors. /// </summary> public override void Visit(IMethodDefinition methodDefinition) { Contract.Assert(methodDefinition != null); if (CCDocContractHelper.IsCompilerGenerated(this.host, methodDefinition)) return; //Don't continue traverser if (MethodHelper.IsGetter(methodDefinition) || MethodHelper.IsSetter(methodDefinition)) { return; } string methodId = MemberHelper.GetMemberSignature(methodDefinition, NameFormattingOptions.DocumentationId); docTracker.WriteLine(methodId); bool isPure = IsPure(methodDefinition);//TODO: Remove, this should be handled on the packager side. ContractPackager packager = new ContractPackager(host, docTracker); packager.PackageMethodContracts(methodDefinition, isPure); XContract[] contractArray; if (packager.TryGetContracts(out contractArray)) { docTracker.AddMemberInfo(contractArray.Length, MemberKind.Method); contracts.Add(new KeyValuePair<string, XContract[]>(methodId, contractArray)); } else { docTracker.AddMemberInfo(0, MemberKind.Method); } //base.TraverseChildren(methodDefinition); }
/// <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 object invariants. /// </summary> public override void Visit(ITypeDefinition typeDefinition) { Contract.Assert(typeDefinition != null); string typeId = TypeHelper.GetTypeName(typeDefinition, NameFormattingOptions.DocumentationId); docTracker.WriteLine(typeId); ContractPackager packager = new ContractPackager(host, docTracker); packager.PackageTypeContracts(typeDefinition); XContract[] contractArray; if (packager.TryGetContracts(out contractArray)) { docTracker.AddMemberInfo(contractArray.Length, MemberKind.Type); contracts.Add(new KeyValuePair<string, XContract[]>(typeId, contractArray)); } else { docTracker.AddMemberInfo(0, MemberKind.Type); } //base.TraverseChildren(typeDefinition); }
/// <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); }