コード例 #1
0
 private CodeDocRepositorySearchContext(ReadOnlyCollection<ICodeDocMemberRepository> allRepositories, CodeDocMemberDetailLevel detailLevel = CodeDocMemberDetailLevel.Full)
 {
     Contract.Requires(allRepositories != null);
     _visitedRepositories = new HashSet<ICodeDocMemberRepository>();
     AllRepositories = allRepositories;
     DetailLevel = detailLevel;
 }
コード例 #2
0
 /// <summary>
 /// Clones this search context with only the given repository marked as unvisited and an overridden detail level.
 /// </summary>
 /// <param name="targetRepository">The repository that is to be unvisited.</param>
 /// <param name="detailLevel">The desired detail level.</param>
 /// <returns>A search context.</returns>
 public CodeDocRepositorySearchContext CloneWithOneUnvisited(ICodeDocMemberRepository targetRepository, CodeDocMemberDetailLevel detailLevel)
 {
     Contract.Ensures(Contract.Result<CodeDocRepositorySearchContext>() != null);
     var result = CloneWithoutVisits(detailLevel);
     foreach (var repository in result.AllRepositories)
         if (repository != targetRepository)
             result.Visit(repository);
     return result;
 }
コード例 #3
0
 /// <summary>
 /// Creates a member model for the given code reference.
 /// </summary>
 /// <param name="cRef">The code reference to generate a model for.</param>
 /// <param name="searchContext">The serach context to use when locating related members.</param>
 /// <param name="detailLevel">Indicates the desired detail level of the generated model.</param>
 /// <returns>The generated member if possible.</returns>
 public virtual ICodeDocMember GetMemberModel(CRefIdentifier cRef, CodeDocRepositorySearchContext searchContext = null, CodeDocMemberDetailLevel detailLevel = CodeDocMemberDetailLevel.Full)
 {
     return CreateGenerator(searchContext).GetMemberModel(cRef, detailLevel);
 }
コード例 #4
0
 /// <summary>
 /// Gets a type model for the given code reference or creates a new one.
 /// </summary>
 /// <param name="cRef">The code reference to get a model for.</param>
 /// <param name="detailLevel">Indicates the desired detail level of the generated model.</param>
 /// <returns>A code doc model for the given code reference.</returns>
 protected CodeDocType GetOrConvertType(CRefIdentifier cRef, CodeDocMemberDetailLevel detailLevel)
 {
     Contract.Requires(cRef != null);
     Contract.Ensures(Contract.Result<ICodeDocMember>() != null);
     return ToTypeModel(GetOrConvert(cRef, detailLevel));
 }
コード例 #5
0
 protected CodeDocType GetOnlyType(CRefIdentifier cRef, CodeDocMemberDetailLevel detailLevel)
 {
     Contract.Requires(cRef != null);
     return ToTypeModel(GetOnly(cRef, detailLevel));
 }
コード例 #6
0
 protected CodeDocMethod GetOnlyMethod(CRefIdentifier cRef, CodeDocMemberDetailLevel detailLevel)
 {
     Contract.Requires(cRef != null);
     return ToMethodModel(GetOnly(cRef, detailLevel));
 }
コード例 #7
0
            protected ICodeDocMember GetOnly(CRefIdentifier cRef, CodeDocMemberDetailLevel detailLevel)
            {
                Contract.Requires(cRef != null);

                if(HasSearchContext){
                    var searchContext = SearchContext.CloneWithoutVisits(detailLevel);
                    var searchResult = searchContext.Search(cRef);
                    if (searchResult != null)
                        return searchResult;
                }

                if (!HasSearchContext || !SearchContext.IsReferenced(Repository)) {
                    var localModel = GetMemberModel(cRef, detailLevel);
                    if (localModel != null)
                        return localModel;
                }

                return null;
            }
コード例 #8
0
            private CodeDocType ConvertToModel(Type type, CodeDocMemberDetailLevel detailLevel, ICodeDocMemberDataProvider extraMemberDataProvider = null)
            {
                Contract.Requires(type != null);
                Contract.Ensures(Contract.Result<CodeDocType>() != null);
                Contract.Ensures(!String.IsNullOrEmpty(Contract.Result<CodeDocType>().ShortName));
                Contract.Ensures(!String.IsNullOrEmpty(Contract.Result<CodeDocType>().FullName));
                Contract.Ensures(!String.IsNullOrEmpty(Contract.Result<CodeDocType>().Title));
                Contract.Ensures(Contract.Result<CodeDocType>().Title == Contract.Result<CodeDocType>().ShortName);
                Contract.Ensures(!String.IsNullOrEmpty(Contract.Result<CodeDocType>().SubTitle));

                var includeExceptions = detailLevel != CodeDocMemberDetailLevel.Minimum;
                var appendXmlDoc = detailLevel.HasFlag(CodeDocMemberDetailLevel.Summary) || detailLevel.HasFlag(CodeDocMemberDetailLevel.AdditionalContents);
                var provideXmlDoc = includeExceptions || detailLevel != CodeDocMemberDetailLevel.Minimum;
                var includeMembers = detailLevel.HasFlag(CodeDocMemberDetailLevel.Members);
                var includeInheritance = detailLevel.HasFlag(CodeDocMemberDetailLevel.Inheritance);
                var includeParameters = detailLevel != CodeDocMemberDetailLevel.Minimum;

                var cRef = GetCRefIdentifier(type);
                var model = type.IsDelegateType()
                    ? new CodeDocDelegate(cRef)
                    : new CodeDocType(cRef);
                model.Uri = GetUri(type);
                var delegateModel = model as CodeDocDelegate;

                var memberDataProvider = new CodeDocMemberInfoProvider<Type>(type);

                XmlDocMember xmlDocs = null;
                if (provideXmlDoc) {
                    xmlDocs = XmlDocs.GetMember(cRef.FullCRef);
                    if (xmlDocs != null)
                        memberDataProvider.Add(new CodeDocMemberXmlDataProvider(xmlDocs));
                }

                if (extraMemberDataProvider != null)
                    memberDataProvider.Add(extraMemberDataProvider);

                if (includeInheritance && type.BaseType != null) {
                    if (ImplicitlyInheritDataProvider(type.BaseType) || (xmlDocs != null && xmlDocs.HasInheritDoc)) {
                        var baseModel = GetOrConvert(type.BaseType, detailLevel);
                        memberDataProvider.Add(new CodeDocMemberDataProvider(baseModel));
                    }
                }

                if (appendXmlDoc)
                    ApplyContentXmlDocs(model, memberDataProvider);

                model.ExternalVisibility = memberDataProvider.ExternalVisibility ?? ExternalVisibilityKind.Public;
                model.ShortName = RegularTypeDisplayNameOverlay.GetDisplayName(type);
                model.FullName = FullTypeDisplayNameOverlay.GetDisplayName(type);
                model.Title = model.ShortName;
                model.NamespaceName = type.Namespace;

                if (type.IsEnum)
                    model.SubTitle = "Enumeration";
                else if (type.IsValueType)
                    model.SubTitle = "Structure";
                else if (type.IsInterface)
                    model.SubTitle = "Interface";
                else if (type.IsDelegateType())
                    model.SubTitle = "Delegate";
                else
                    model.SubTitle = "Class";

                model.Namespace = GetOrCreateNamespaceByName(type.Namespace);
                model.Assembly = GetCodeDocAssembly(type.Assembly);
                model.IsEnum = type.IsEnum;
                model.IsFlagsEnum = type.IsEnum && type.HasAttribute(typeof(FlagsAttribute));
                model.IsSealed = type.IsSealed;
                model.IsValueType = type.IsValueType;
                model.IsStatic = memberDataProvider.IsStatic.GetValueOrDefault();
                model.IsObsolete = memberDataProvider.IsObsolete.GetValueOrDefault();

                if (type.DeclaringType != null)
                    model.DeclaringType = GetOrConvert(type.DeclaringType, CodeDocMemberDetailLevel.Minimum);

                if (delegateModel != null)
                    delegateModel.IsPure = memberDataProvider.IsPure.GetValueOrDefault();

                if (includeInheritance && !type.IsInterface) {
                    var currentBase = type.BaseType;
                    if (null != currentBase) {
                        var baseChain = new List<CodeDocType>() {
                            GetOrConvert(currentBase, detailLevel)
                        };
                        currentBase = currentBase.BaseType;
                        while (currentBase != null) {
                            baseChain.Add(GetOrConvert(currentBase, CodeDocMemberDetailLevel.Minimum));
                            currentBase = currentBase.BaseType;
                        }
                        model.BaseChain = baseChain;
                    }

                    var implementedInterfaces = type.GetInterfaces();
                    if (implementedInterfaces.Length > 0) {
                        model.Interfaces = Array.ConvertAll(
                            implementedInterfaces,
                            t => GetOrConvert(t, CodeDocMemberDetailLevel.Minimum));
                    }
                }

                if (includeParameters && type.IsGenericType) {
                    var genericDefinition = type.IsGenericTypeDefinition
                        ? type
                        : type.GetGenericTypeDefinition();
                    if (genericDefinition != null) {
                        var genericArguments = genericDefinition.GetGenericArguments();
                        if (type.IsNested && genericArguments.Length > 0) {
                            Contract.Assume(type.DeclaringType != null);
                            var parentGenericArguments = type.DeclaringType.GetGenericArguments();
                            genericArguments = genericArguments
                                .Where(a => parentGenericArguments.All(p => p.Name != a.Name))
                                .ToArray();
                        }
                        if (genericArguments.Length > 0) {
                            model.GenericParameters = CreateGenericTypeParameters(
                                genericArguments,
                                memberDataProvider);
                        }
                    }
                }

                if (delegateModel != null) {
                    if (includeParameters) {
                        delegateModel.Parameters = Array.ConvertAll(
                            type.GetDelegateTypeParameters(),
                            p => CreateArgument(p, memberDataProvider));

                        var returnParameter = type.GetDelegateReturnParameter();
                        if (returnParameter != null && returnParameter.ParameterType != typeof (void))
                            delegateModel.Return = CreateReturn(returnParameter, memberDataProvider);
                    }

                    if (includeExceptions) {
                        if (memberDataProvider.HasExceptions)
                            delegateModel.Exceptions = CreateExceptionModels(memberDataProvider.GetExceptions()).ToArray();
                        if (memberDataProvider.HasEnsures)
                            delegateModel.Ensures = memberDataProvider.GetEnsures().ToArray();
                        if (memberDataProvider.HasRequires)
                            delegateModel.Requires = memberDataProvider.GetRequires().ToArray();
                    }
                }

                if (includeMembers) {
                    var nestedTypeModels = new List<ICodeDocMember>();
                    var nestedDelegateModels = new List<ICodeDocMember>();
                    foreach (var nestedType in type.GetAllNestedTypes().Where(ReflectionRepository.MemberFilter)) {
                        var nestedTypeModel = GetOrConvert(nestedType, CodeDocMemberDetailLevel.QuickSummary);
                        if (nestedType.IsDelegateType())
                            nestedDelegateModels.Add(nestedTypeModel);
                        else
                            nestedTypeModels.Add(nestedTypeModel);
                    }
                    model.NestedTypes = nestedTypeModels;
                    model.NestedDelegates = nestedDelegateModels;

                    var methodModels = new List<ICodeDocMember>();
                    var operatorModels = new List<ICodeDocMember>();
                    foreach (var methodInfo in type.GetAllMethods().Where(ReflectionRepository.MemberFilter)) {
                        var methodModel = GetOrConvert(methodInfo, CodeDocMemberDetailLevel.QuickSummary);
                        if (methodInfo.IsOperatorOverload())
                            operatorModels.Add(methodModel);
                        else
                            methodModels.Add(methodModel);
                    }
                    model.Methods = methodModels;
                    model.Operators = operatorModels;

                    model.Constructors = type
                        .GetAllConstructors()
                        .Where(ReflectionRepository.MemberFilter)
                        .Select(methodInfo => GetOrConvert(methodInfo, CodeDocMemberDetailLevel.QuickSummary))
                        .ToArray();

                    model.Properties = type
                        .GetAllProperties()
                        .Where(ReflectionRepository.MemberFilter)
                        .Select(propertyInfo => GetOrConvert(propertyInfo, CodeDocMemberDetailLevel.QuickSummary))
                        .ToArray();

                    model.Fields = type
                        .GetAllFields()
                        .Where(ReflectionRepository.MemberFilter)
                        .Select(fieldInfo => GetOrConvert(fieldInfo, CodeDocMemberDetailLevel.QuickSummary))
                        .ToArray();

                    model.Events = type
                        .GetAllEvents()
                        .Where(ReflectionRepository.MemberFilter)
                        .Select(eventInfo => GetOrConvert(eventInfo, CodeDocMemberDetailLevel.QuickSummary))
                        .ToArray();
                }

                return model;
            }
コード例 #9
0
 private CodeDocMethod GetOrConvert(MethodBase methodBase, CodeDocMemberDetailLevel detailLevel)
 {
     Contract.Requires(methodBase != null);
     Contract.Ensures(Contract.Result<CodeDocMethod>() != null);
     var getResult = GetOnlyMethod(GetCRefIdentifier(methodBase), detailLevel);
     return getResult ?? ConvertToModel(methodBase, detailLevel);
 }
コード例 #10
0
 private CodeDocType GetOrConvert(Type type, CodeDocMemberDetailLevel detailLevel)
 {
     Contract.Requires(type != null);
     Contract.Ensures(Contract.Result<CodeDocType>() != null);
     var getResult = GetOnlyType(GetCRefIdentifier(type), detailLevel);
     return getResult ?? ConvertToModel(type, detailLevel);
 }
コード例 #11
0
 /// <summary>
 /// Constructs a new search context with the given repositories and detail level.
 /// </summary>
 /// <param name="repository">The repository that is to be searched.</param>
 /// <param name="detailLevel">The desired detail level.</param>
 public CodeDocRepositorySearchContext(ICodeDocMemberRepository repository, CodeDocMemberDetailLevel detailLevel = CodeDocMemberDetailLevel.Full)
     : this(new ReadOnlyCollection<ICodeDocMemberRepository>(new[] { repository }), detailLevel)
 {
     if(repository == null) throw new ArgumentNullException("repository");
     Contract.EndContractBlock();
 }
コード例 #12
0
 /// <summary>
 /// Constructs a new search context with the given repositories and detail level.
 /// </summary>
 /// <param name="allRepositories">The repositories that are to be searched.</param>
 /// <param name="detailLevel">The desired detail level.</param>
 public CodeDocRepositorySearchContext(IEnumerable<ICodeDocMemberRepository> allRepositories, CodeDocMemberDetailLevel detailLevel = CodeDocMemberDetailLevel.Full)
     : this(new ReadOnlyCollection<ICodeDocMemberRepository>(allRepositories.ToArray()), detailLevel)
 {
     Contract.Requires(allRepositories != null);
 }
コード例 #13
0
 /// <summary>
 /// Clones this search context with only the given repository marked as visited and an overridden detail level.
 /// </summary>
 /// <param name="repository">The repository that is to be marked as visited.</param>
 /// <param name="detailLevel">The desired detail level.</param>
 /// <returns>A search context.</returns>
 public CodeDocRepositorySearchContext CloneWithSingleVisit(ICodeDocMemberRepository repository, CodeDocMemberDetailLevel detailLevel)
 {
     if(repository == null) throw new ArgumentNullException("repository");
     Contract.Ensures(Contract.Result<CodeDocRepositorySearchContext>() != null);
     var result = CloneWithoutVisits(detailLevel);
     result.Visit(repository);
     return result;
 }
コード例 #14
0
 /// <summary>
 /// Clones this search context with no repositories visited and an overridden detail level.
 /// </summary>
 /// <param name="detailLevel">The desired detail level.</param>
 /// <returns>A search context.</returns>
 public CodeDocRepositorySearchContext CloneWithoutVisits(CodeDocMemberDetailLevel detailLevel)
 {
     Contract.Ensures(Contract.Result<CodeDocRepositorySearchContext>() != null);
     return new CodeDocRepositorySearchContext(AllRepositories, detailLevel);
 }
コード例 #15
0
            private CodeDocProperty ConvertToModel(PropertyInfo propertyInfo, CodeDocMemberDetailLevel detailLevel, ICodeDocMemberDataProvider extraMemberDataProvider = null)
            {
                Contract.Requires(propertyInfo != null);
                Contract.Ensures(Contract.Result<CodeDocProperty>() != null);
                Contract.Ensures(!String.IsNullOrEmpty(Contract.Result<CodeDocProperty>().ShortName));
                Contract.Ensures(!String.IsNullOrEmpty(Contract.Result<CodeDocProperty>().FullName));
                Contract.Ensures(!String.IsNullOrEmpty(Contract.Result<CodeDocProperty>().Title));
                Contract.Ensures(Contract.Result<CodeDocProperty>().Title == Contract.Result<CodeDocProperty>().ShortName);
                Contract.Ensures(!String.IsNullOrEmpty(Contract.Result<CodeDocProperty>().SubTitle));

                var includeExceptions = detailLevel != CodeDocMemberDetailLevel.Minimum;
                var appendXmlDoc = detailLevel.HasFlag(CodeDocMemberDetailLevel.Summary) || detailLevel.HasFlag(CodeDocMemberDetailLevel.AdditionalContents);
                var provideXmlDoc = includeExceptions || detailLevel != CodeDocMemberDetailLevel.Minimum;
                var includeInheritance = detailLevel.HasFlag(CodeDocMemberDetailLevel.Inheritance);
                var includeParameters = detailLevel != CodeDocMemberDetailLevel.Minimum;

                var propertyCRef = GetCRefIdentifier(propertyInfo);
                var model = new CodeDocProperty(propertyCRef);
                model.Uri = GetUri(propertyInfo);

                var memberDataProvider = new CodeDocMemberInfoProvider<PropertyInfo>(propertyInfo);

                XmlDocMember xmlDocs = null;
                if (provideXmlDoc) {
                    xmlDocs = XmlDocs.GetMember(propertyCRef.FullCRef);
                    if (xmlDocs != null)
                        memberDataProvider.Add(new CodeDocMemberXmlDataProvider(xmlDocs));
                }

                if (extraMemberDataProvider != null)
                    memberDataProvider.Add(extraMemberDataProvider);

                if (includeInheritance) {
                    var propertyBase = propertyInfo.FindNextAncestor();
                    if (propertyBase != null) {
                        var propertyBaseModel = GetOnly(GetCRefIdentifier(propertyBase), detailLevel);
                        if (propertyBaseModel != null)
                            memberDataProvider.Add(new CodeDocMemberDataProvider(propertyBaseModel));
                    }
                }

                if (appendXmlDoc) {
                    ApplyContentXmlDocs(model, memberDataProvider);
                    model.ValueDescriptionContents = memberDataProvider.GeValueDescriptionContents().ToArray();
                }

                model.ExternalVisibility = memberDataProvider.ExternalVisibility ?? ExternalVisibilityKind.Public;
                model.ShortName = RegularTypeDisplayNameOverlay.GetDisplayName(propertyInfo);
                model.FullName = FullTypeDisplayNameOverlay.GetDisplayName(propertyInfo);
                model.Title = model.ShortName;
                Contract.Assume(propertyInfo.DeclaringType != null);
                model.NamespaceName = propertyInfo.DeclaringType.Namespace;
                model.SubTitle = propertyInfo.IsItemIndexerProperty() ? "Indexer" : "Property";

                model.IsStatic = memberDataProvider.IsStatic.GetValueOrDefault();
                model.IsObsolete = memberDataProvider.IsObsolete.GetValueOrDefault();

                model.ValueType = GetOrConvert(propertyInfo.PropertyType, CodeDocMemberDetailLevel.Minimum);
                Contract.Assume(propertyInfo.DeclaringType != null);
                model.Namespace = GetOrCreateNamespaceByName(propertyInfo.DeclaringType.Namespace);
                model.Assembly = GetCodeDocAssembly(propertyInfo.DeclaringType.Assembly);
                model.DeclaringType = GetOrConvert(propertyInfo.DeclaringType, CodeDocMemberDetailLevel.Minimum);

                if (includeParameters) {
                    var parameters = propertyInfo.GetIndexParameters();
                    if (parameters.Length > 0)
                        model.Parameters = Array.ConvertAll(parameters, p => CreateArgument(p, memberDataProvider));
                }

                var getterMethodInfo = propertyInfo.GetGetMethod(true);
                if (getterMethodInfo != null && ReflectionRepository.MemberFilter(getterMethodInfo, true)) {
                    var accessorExtraProvider = (xmlDocs != null && xmlDocs.HasGetterElement)
                        ? new CodeDocMemberXmlDataProvider(xmlDocs.GetterElement)
                        : null;
                    model.Getter = ConvertToModel(getterMethodInfo, detailLevel, accessorExtraProvider);
                }

                var setterMethodInfo = propertyInfo.GetSetMethod(true);
                if (setterMethodInfo != null && ReflectionRepository.MemberFilter(setterMethodInfo, true)) {
                    var accessorExtraProvider = (xmlDocs != null && xmlDocs.HasSetterElement)
                        ? new CodeDocMemberXmlDataProvider(xmlDocs.SetterElement)
                        : null;
                    model.Setter = ConvertToModel(setterMethodInfo, detailLevel, accessorExtraProvider);
                }

                return model;
            }
コード例 #16
0
 private CodeDocProperty GetOrConvert(PropertyInfo propertyInfo, CodeDocMemberDetailLevel detailLevel)
 {
     Contract.Requires(propertyInfo != null);
     Contract.Ensures(Contract.Result<CodeDocProperty>() != null);
     var getResult = GetOnlyProperty(GetCRefIdentifier(propertyInfo), detailLevel);
     return getResult ?? ConvertToModel(propertyInfo, detailLevel);
 }
コード例 #17
0
            private CodeDocMethod ConvertToModel(MethodBase methodBase, CodeDocMemberDetailLevel detailLevel, ICodeDocMemberDataProvider extraMemberDataProvider = null)
            {
                Contract.Requires(methodBase != null);
                Contract.Ensures(Contract.Result<CodeDocMethod>() != null);
                Contract.Ensures(!String.IsNullOrEmpty(Contract.Result<CodeDocMethod>().ShortName));
                Contract.Ensures(!String.IsNullOrEmpty(Contract.Result<CodeDocMethod>().FullName));
                Contract.Ensures(!String.IsNullOrEmpty(Contract.Result<CodeDocMethod>().Title));
                Contract.Ensures(Contract.Result<CodeDocMethod>().Title == Contract.Result<CodeDocMethod>().ShortName);
                Contract.Ensures(!String.IsNullOrEmpty(Contract.Result<CodeDocMethod>().SubTitle));

                var includeExceptions = detailLevel != CodeDocMemberDetailLevel.Minimum;
                var appendXmlDoc = detailLevel.HasFlag(CodeDocMemberDetailLevel.Summary) || detailLevel.HasFlag(CodeDocMemberDetailLevel.AdditionalContents);
                var provideXmlDoc = includeExceptions || detailLevel != CodeDocMemberDetailLevel.Minimum;
                var includeInheritance = detailLevel.HasFlag(CodeDocMemberDetailLevel.Inheritance);
                var includeParameters = detailLevel != CodeDocMemberDetailLevel.Minimum;

                var methodInfo = methodBase as MethodInfo;
                var methodCRef = GetCRefIdentifier(methodBase);
                var model = new CodeDocMethod(methodCRef);
                model.Uri = GetUri(methodBase);

                var memberDataProvider = new CodeDocMemberInfoProvider<MethodBase>(methodBase);

                if (provideXmlDoc) {
                    var xmlDocs = XmlDocs.GetMember(methodCRef.FullCRef);
                    if (xmlDocs != null)
                        memberDataProvider.Add(new CodeDocMemberXmlDataProvider(xmlDocs));
                }

                if (extraMemberDataProvider != null)
                    memberDataProvider.Add(extraMemberDataProvider);

                if (includeInheritance && methodInfo != null) {
                    var baseDefinition = methodInfo.FindNextAncestor();
                    if (baseDefinition != null) {
                        var baseDefinitionModel = GetOnly(GetCRefIdentifier(baseDefinition), detailLevel);
                        if (baseDefinitionModel != null)
                            memberDataProvider.Add(new CodeDocMemberDataProvider(baseDefinitionModel));
                    }
                }

                if (appendXmlDoc)
                    ApplyContentXmlDocs(model, memberDataProvider);

                model.ExternalVisibility = memberDataProvider.ExternalVisibility ?? ExternalVisibilityKind.Public;
                model.ShortName = RegularTypeDisplayNameOverlay.GetDisplayName(methodBase);
                model.FullName = FullTypeDisplayNameOverlay.GetDisplayName(methodBase);
                model.Title = model.ShortName;
                Contract.Assume(methodBase.DeclaringType != null);
                model.NamespaceName = methodBase.DeclaringType.Namespace;

                if (includeParameters) {
                    model.Parameters = Array.ConvertAll(
                        methodBase.GetParameters(),
                        p => CreateArgument(p, memberDataProvider));

                    if (methodInfo != null && methodInfo.ReturnParameter != null &&
                        methodInfo.ReturnType != typeof (void))
                        model.Return = CreateReturn(methodInfo.ReturnParameter, memberDataProvider);
                }

                if (methodBase.IsConstructor)
                    model.SubTitle = "Constructor";
                else if (model.Parameters != null && model.Parameters.Count == 1 && model.HasReturn && CSharpOperatorNameSymbolMap.IsConversionOperatorMethodName(methodBase.Name)) {
                    model.SubTitle = "Conversion";

                    string conversionOperationName;
                    if (methodBase.Name.EndsWith("Explicit", StringComparison.OrdinalIgnoreCase))
                        conversionOperationName = "Explicit";
                    else if (methodBase.Name.EndsWith("Implicit", StringComparison.OrdinalIgnoreCase))
                        conversionOperationName = "Implicit";
                    else
                        conversionOperationName = String.Empty;

                    var conversionParameterPart = String.Concat(
                        model.Parameters[0].ParameterType.ShortName,
                        " to ",
                        model.Return.ParameterType.ShortName);

                    model.ShortName = String.IsNullOrEmpty(conversionOperationName)
                        ? conversionParameterPart
                        : String.Concat(conversionOperationName, ' ', conversionParameterPart);
                    model.Title = model.ShortName;
                }
                else if (methodBase.IsOperatorOverload())
                    model.SubTitle = "Operator";
                else
                    model.SubTitle = "Method";

                Contract.Assume(methodBase.DeclaringType != null);
                model.Namespace = GetOrCreateNamespaceByName(methodBase.DeclaringType.Namespace);
                model.Assembly = GetCodeDocAssembly(methodBase.DeclaringType.Assembly);
                model.DeclaringType = GetOrConvert(methodBase.DeclaringType, CodeDocMemberDetailLevel.Minimum);
                model.IsOperatorOverload = methodBase.IsOperatorOverload();
                model.IsExtensionMethod = methodBase.IsExtensionMethod();
                model.IsSealed = methodBase.IsSealed();
                model.IsStatic = memberDataProvider.IsStatic.GetValueOrDefault();
                model.IsObsolete = memberDataProvider.IsObsolete.GetValueOrDefault();
                model.IsPure = memberDataProvider.IsPure.GetValueOrDefault();

                if (methodBase.DeclaringType != null && !methodBase.DeclaringType.IsInterface) {
                    if (methodBase.IsAbstract)
                        model.IsAbstract = true;
                    else if (methodBase.IsVirtual && !methodBase.IsFinal && methodBase.Attributes.HasFlag(MethodAttributes.NewSlot))
                        model.IsVirtual = true;
                }

                if (includeExceptions){
                    if (memberDataProvider.HasExceptions)
                        model.Exceptions = CreateExceptionModels(memberDataProvider.GetExceptions()).ToArray();
                    if (memberDataProvider.HasEnsures)
                        model.Ensures = memberDataProvider.GetEnsures().ToArray();
                    if (memberDataProvider.HasRequires)
                        model.Requires = memberDataProvider.GetRequires().ToArray();
                }

                if (includeParameters && methodBase.IsGenericMethod) {
                    var genericDefinition = methodBase.IsGenericMethodDefinition
                        ? methodBase
                        : methodInfo == null ? null : methodInfo.GetGenericMethodDefinition();
                    if (genericDefinition != null) {
                        var genericArguments = genericDefinition.GetGenericArguments();
                        if (genericArguments.Length > 0) {
                            model.GenericParameters = CreateGenericTypeParameters(
                                genericArguments,
                                memberDataProvider);
                        }
                    }
                }

                return model;
            }
コード例 #18
0
 private CodeDocField GetOrConvert(FieldInfo fieldInfo, CodeDocMemberDetailLevel detailLevel)
 {
     Contract.Requires(fieldInfo != null);
     Contract.Ensures(Contract.Result<CodeDocField>() != null);
     var getResult = GetOnlyField(GetCRefIdentifier(fieldInfo), detailLevel);
     return getResult ?? ConvertToModel(fieldInfo, detailLevel);
 }
コード例 #19
0
 /// <summary>
 /// Creates a member model for the given code reference.
 /// </summary>
 /// <param name="cRef">The code reference to generate a model for.</param>
 /// <param name="detailLevel">Indicates the desired detail level of the generated model.</param>
 /// <returns>The generated member if possible.</returns>
 public abstract ICodeDocMember GetMemberModel(CRefIdentifier cRef, CodeDocMemberDetailLevel detailLevel);
コード例 #20
0
 private CodeDocEvent GetOrConvert(EventInfo eventInfo, CodeDocMemberDetailLevel detailLevel)
 {
     Contract.Requires(eventInfo != null);
     Contract.Ensures(Contract.Result<CodeDocEvent>() != null);
     var getResult = GetOnlyEvent(GetCRefIdentifier(eventInfo), detailLevel);
     return getResult ?? ConvertToModel(eventInfo, detailLevel);
 }
コード例 #21
0
 protected CodeDocEvent GetOnlyEvent(CRefIdentifier cRef, CodeDocMemberDetailLevel detailLevel)
 {
     Contract.Requires(cRef != null);
     return ToEventModel(GetOnly(cRef, detailLevel));
 }
コード例 #22
0
            /// <summary>
            /// Gets a code doc model for a reflected member.
            /// </summary>
            /// <param name="cRef">The code reference of a reflected member to create a model from.</param>
            /// <param name="detailLevel">Indicates the desired detail level of the model.</param>
            /// <returns>A code doc model.</returns>
            public override ICodeDocMember GetMemberModel(CRefIdentifier cRef, CodeDocMemberDetailLevel detailLevel)
            {
                if (cRef == null) throw new ArgumentNullException("cRef");
                Contract.EndContractBlock();

                if ("N".Equals(cRef.TargetType, StringComparison.OrdinalIgnoreCase))
                    return ToFullNamespace(GetCodeDocSimpleNamespace(cRef));
                if ("A".Equals(cRef.TargetType, StringComparison.OrdinalIgnoreCase))
                    return GetCodeDocSimpleAssembly(cRef);

                var memberInfo = ReflectionRepository.CRefLookup.GetMember(cRef);
                if (memberInfo == null || !ReflectionRepository.MemberFilter(memberInfo))
                    return null;

                return ConvertToModel(memberInfo, detailLevel);
            }
コード例 #23
0
 protected CodeDocProperty GetOnlyProperty(CRefIdentifier cRef, CodeDocMemberDetailLevel detailLevel)
 {
     Contract.Requires(cRef != null);
     return ToPropertyModel(GetOnly(cRef, detailLevel));
 }
コード例 #24
0
 /// <summary>
 /// Converts a reflected member to a code doc model.
 /// </summary>
 /// <param name="memberInfo">A reflected member.</param>
 /// <param name="detailLevel">Indicates the desired detail level of the model.</param>
 /// <param name="extraMemberDataProvider">A member data provider to include additional information that may be be easily obtained from normal sources.</param>
 /// <returns>A code doc model for the given member.</returns>
 protected virtual CodeDocMemberContentBase ConvertToModel(MemberInfo memberInfo, CodeDocMemberDetailLevel detailLevel, ICodeDocMemberDataProvider extraMemberDataProvider = null)
 {
     if (memberInfo == null) throw new ArgumentNullException("memberInfo");
     Contract.Ensures(Contract.Result<ICodeDocMember>() != null);
     if (memberInfo is Type)
         return ConvertToModel((Type)memberInfo, detailLevel, extraMemberDataProvider);
     if (memberInfo is FieldInfo)
         return ConvertToModel((FieldInfo)memberInfo, detailLevel, extraMemberDataProvider);
     if (memberInfo is MethodBase)
         return ConvertToModel((MethodBase)memberInfo, detailLevel, extraMemberDataProvider);
     if (memberInfo is EventInfo)
         return ConvertToModel((EventInfo)memberInfo, detailLevel, extraMemberDataProvider);
     if (memberInfo is PropertyInfo)
         return ConvertToModel((PropertyInfo)memberInfo, detailLevel, extraMemberDataProvider);
     throw new NotSupportedException();
 }
コード例 #25
0
 /// <summary>
 /// Gets a model for the given code reference or creates a new one.
 /// </summary>
 /// <param name="cRef">The code reference to get a model for.</param>
 /// <param name="detailLevel">Indicates the desired detail level of the generated model.</param>
 /// <returns>A code doc model for the given code reference.</returns>
 protected ICodeDocMember GetOrConvert(CRefIdentifier cRef, CodeDocMemberDetailLevel detailLevel)
 {
     Contract.Requires(cRef != null);
     Contract.Ensures(Contract.Result<ICodeDocMember>() != null);
     return GetOnly(cRef, detailLevel)
         ?? CreateGeneralMemberPlaceholder(cRef);
 }
コード例 #26
0
            private CodeDocEvent ConvertToModel(EventInfo eventInfo, CodeDocMemberDetailLevel detailLevel, ICodeDocMemberDataProvider extraMemberDataProvider = null)
            {
                Contract.Requires(eventInfo != null);
                Contract.Ensures(Contract.Result<CodeDocEvent>() != null);
                Contract.Ensures(!String.IsNullOrEmpty(Contract.Result<CodeDocEvent>().ShortName));
                Contract.Ensures(!String.IsNullOrEmpty(Contract.Result<CodeDocEvent>().FullName));
                Contract.Ensures(!String.IsNullOrEmpty(Contract.Result<CodeDocEvent>().Title));
                Contract.Ensures(Contract.Result<CodeDocEvent>().Title == Contract.Result<CodeDocEvent>().ShortName);
                Contract.Ensures(!String.IsNullOrEmpty(Contract.Result<CodeDocEvent>().SubTitle));

                var includeInheritance = detailLevel.HasFlag(CodeDocMemberDetailLevel.Inheritance);
                var appendXmlDoc = detailLevel.HasFlag(CodeDocMemberDetailLevel.Summary) || detailLevel.HasFlag(CodeDocMemberDetailLevel.AdditionalContents);
                var provideXmlDoc = detailLevel != CodeDocMemberDetailLevel.Minimum;

                var eventCRef = GetCRefIdentifier(eventInfo);
                var model = new CodeDocEvent(eventCRef);
                model.Uri = GetUri(eventInfo);

                var memberDataProvider = new CodeDocMemberInfoProvider<EventInfo>(eventInfo);

                if (provideXmlDoc) {
                    var xmlDocs = XmlDocs.GetMember(eventCRef.FullCRef);
                    if (xmlDocs != null)
                        memberDataProvider.Add(new CodeDocMemberXmlDataProvider(xmlDocs));
                }

                if (extraMemberDataProvider != null)
                    memberDataProvider.Add(extraMemberDataProvider);

                if (includeInheritance) {
                    var baseEvent = eventInfo.FindNextAncestor();
                    if (baseEvent != null) {
                        var baseEventModel = GetOnly(GetCRefIdentifier(baseEvent), detailLevel);
                        if (baseEventModel != null)
                            memberDataProvider.Add(new CodeDocMemberDataProvider(baseEventModel));
                    }
                }

                if (appendXmlDoc)
                    ApplyContentXmlDocs(model, memberDataProvider);

                model.ExternalVisibility = memberDataProvider.ExternalVisibility ?? ExternalVisibilityKind.Public;
                model.ShortName = RegularTypeDisplayNameOverlay.GetDisplayName(memberDataProvider.Member);
                model.FullName = FullTypeDisplayNameOverlay.GetDisplayName(memberDataProvider.Member);
                model.Title = model.ShortName;
                Contract.Assume(memberDataProvider.Member.DeclaringType != null);
                model.NamespaceName = memberDataProvider.Member.DeclaringType.Namespace;
                model.SubTitle = "Event";

                model.DelegateType = GetOrConvert(eventInfo.EventHandlerType, CodeDocMemberDetailLevel.Minimum);
                Contract.Assume(eventInfo.DeclaringType != null);
                model.Namespace = GetOrCreateNamespaceByName(eventInfo.DeclaringType.Namespace);
                model.Assembly = GetCodeDocAssembly(eventInfo.DeclaringType.Assembly);
                model.DeclaringType = GetOrConvert(eventInfo.DeclaringType, CodeDocMemberDetailLevel.Minimum);
                model.IsStatic = memberDataProvider.IsStatic.GetValueOrDefault();
                model.IsObsolete = memberDataProvider.IsObsolete.GetValueOrDefault();

                return model;
            }
コード例 #27
0
 /// <inheritdoc/>
 public ICodeDocMember GetMemberModel(string cRef, CodeDocRepositorySearchContext searchContext = null, CodeDocMemberDetailLevel detailLevel = CodeDocMemberDetailLevel.Full)
 {
     if (String.IsNullOrEmpty(cRef)) throw new ArgumentException("Code reference is not valid.", "cRef");
     Contract.EndContractBlock();
     return GetMemberModel(new CRefIdentifier(cRef), searchContext, detailLevel);
 }
コード例 #28
0
            private CodeDocField ConvertToModel(FieldInfo fieldInfo, CodeDocMemberDetailLevel detailLevel, ICodeDocMemberDataProvider extraMemberDataProvider = null)
            {
                Contract.Requires(fieldInfo != null);
                Contract.Ensures(Contract.Result<CodeDocField>() != null);
                Contract.Ensures(!String.IsNullOrEmpty(Contract.Result<CodeDocField>().ShortName));
                Contract.Ensures(!String.IsNullOrEmpty(Contract.Result<CodeDocField>().FullName));
                Contract.Ensures(!String.IsNullOrEmpty(Contract.Result<CodeDocField>().Title));
                Contract.Ensures(Contract.Result<CodeDocField>().Title == Contract.Result<CodeDocField>().ShortName);
                Contract.Ensures(!String.IsNullOrEmpty(Contract.Result<CodeDocField>().SubTitle));

                var appendXmlDoc = detailLevel.HasFlag(CodeDocMemberDetailLevel.Summary) || detailLevel.HasFlag(CodeDocMemberDetailLevel.AdditionalContents);
                var provideXmlDoc = detailLevel != CodeDocMemberDetailLevel.Minimum;

                var fieldCRef = GetCRefIdentifier(fieldInfo);
                var model = new CodeDocField(fieldCRef);
                model.Uri = GetUri(fieldInfo);

                var memberDataProvider = new CodeDocMemberInfoProvider<FieldInfo>(fieldInfo);

                if (provideXmlDoc) {
                    var xmlDocs = XmlDocs.GetMember(fieldCRef.FullCRef);
                    if (xmlDocs != null)
                        memberDataProvider.Add(new CodeDocMemberXmlDataProvider(xmlDocs));
                }

                if (extraMemberDataProvider != null)
                    memberDataProvider.Add(extraMemberDataProvider);

                if (appendXmlDoc) {
                    model.ValueDescriptionContents = memberDataProvider.GeValueDescriptionContents().ToArray();
                    ApplyContentXmlDocs(model, memberDataProvider);
                }

                model.ExternalVisibility = memberDataProvider.ExternalVisibility ?? ExternalVisibilityKind.Public;
                model.ShortName = RegularTypeDisplayNameOverlay.GetDisplayName(fieldInfo);
                model.FullName = FullTypeDisplayNameOverlay.GetDisplayName(fieldInfo);
                model.Title = model.ShortName;
                Contract.Assume(fieldInfo.DeclaringType != null);
                model.NamespaceName = fieldInfo.DeclaringType.Namespace;
                model.SubTitle = fieldInfo.IsLiteral ? "Constant" : "Field";

                model.ValueType = GetOrConvert(fieldInfo.FieldType, CodeDocMemberDetailLevel.Minimum);

                model.IsLiteral = fieldInfo.IsLiteral;
                model.IsInitOnly = fieldInfo.IsInitOnly;
                model.IsStatic = memberDataProvider.IsStatic.GetValueOrDefault();
                model.IsObsolete = memberDataProvider.IsObsolete.GetValueOrDefault();

                Contract.Assume(fieldInfo.DeclaringType != null);
                model.Namespace = GetOrCreateNamespaceByName(fieldInfo.DeclaringType.Namespace);
                model.Assembly = GetCodeDocAssembly(fieldInfo.DeclaringType.Assembly);
                model.DeclaringType = GetOrConvert(fieldInfo.DeclaringType, CodeDocMemberDetailLevel.Minimum);
                return model;
            }
コード例 #29
0
 /// <inheritdoc/>
 public abstract ICodeDocMember GetMemberModel(CRef.CRefIdentifier cRef, CodeDocRepositorySearchContext searchContext = null, CodeDocMemberDetailLevel detailLevel = CodeDocMemberDetailLevel.Full);
コード例 #30
0
        /// <summary>
        /// Generates a model that is extracted from MTPS data.
        /// </summary>
        /// <param name="cRef">The code reference to search for.</param>
        /// <param name="searchContext">The search context for locating related items.</param>
        /// <param name="detailLevel">The desired detail level of the generated model.</param>
        /// <returns>A code doc member model if found.</returns>
        public ICodeDocMember GetMemberModel(CRefIdentifier cRef, CodeDocRepositorySearchContext searchContext = null, CodeDocMemberDetailLevel detailLevel = CodeDocMemberDetailLevel.Full)
        {
            if(cRef == null) throw new ArgumentNullException("cRef");
            Contract.EndContractBlock();

            var stopwatch = new Stopwatch();
            stopwatch.Start();
            var tocResults = SearchToc(cRef.FullCRef);
            var bestTocResult = tocResults.FirstOrDefault();
            stopwatch.Stop();
            Debug.WriteLine("Search for {0} returned in {1}", cRef, stopwatch.Elapsed);

            if (bestTocResult == null)
                return null;

            Uri uri;
            if (!Uri.TryCreate(GetUrl(bestTocResult), UriKind.Absolute, out uri))
                uri = cRef.ToUri();

            CodeDocSimpleMember model = null;

            if (detailLevel != CodeDocMemberDetailLevel.Minimum) {
                var contentXml = GetContent(bestTocResult.ContentId);
                if (contentXml != null) {

                    bool? isSealed = null;
                    bool? isValueType = null;
                    bool? isReferenceType = null;
                    bool? isEnum = null;
                    bool? isVirtual = null;
                    bool? isAbstract = null;
                    bool? isMethod = null;
                    ExternalVisibilityKind? visibility = null;

                    var titleDiv = contentXml.GetElementsByTagName("div")
                        .OfType<XmlElement>()
                        .FirstOrDefault(x => "TITLE".Equals(x.GetAttribute("class"), StringComparison.OrdinalIgnoreCase));

                    if (titleDiv != null) {
                        var innerTitleText = titleDiv.InnerText.Trim();
                        if (innerTitleText.EndsWith("Method", StringComparison.OrdinalIgnoreCase)) {
                            isMethod = true;
                        }
                    }

                    var syntaxElement = contentXml.GetElementsByTagName("mtps:CollapsibleArea")
                        .OfType<XmlElement>()
                        .FirstOrDefault(x => "SYNTAX".Equals(x.GetAttribute("Title"), StringComparison.OrdinalIgnoreCase));
                    var codeSnippets = syntaxElement.GetElementsByTagName("mtps:CodeSnippet").OfType<XmlElement>().ToList();

                    foreach (var snippet in codeSnippets) {
                        var inputSpans = snippet.GetElementsByTagName("span")
                            .OfType<XmlElement>()
                            .Where(e => e.GetAttribute("class") == "input")
                            .ToList();
                        if (snippet.GetAttribute("Language") == "CSharp") {
                            foreach (var inputSpan in inputSpans) {
                                var innerText = inputSpan.InnerText;
                                if ("PUBLIC".Equals(innerText, StringComparison.OrdinalIgnoreCase))
                                    visibility = ExternalVisibilityKind.Public;
                                else if ("PROTECTED".Equals(innerText, StringComparison.OrdinalIgnoreCase))
                                    visibility = ExternalVisibilityKind.Protected;
                                else if ("SEALED".Equals(innerText, StringComparison.OrdinalIgnoreCase))
                                    isSealed = true;
                                else if ("CLASS".Equals(innerText, StringComparison.OrdinalIgnoreCase))
                                    isReferenceType = true;
                                else if ("STRUCT".Equals(innerText, StringComparison.OrdinalIgnoreCase))
                                    isValueType = true;
                                else if ("ENUM".Equals(innerText, StringComparison.OrdinalIgnoreCase))
                                    isEnum = true;
                                else if ("VIRTUAL".Equals(innerText, StringComparison.OrdinalIgnoreCase))
                                    isVirtual = true;
                                else if ("ABSTRACT".Equals(innerText, StringComparison.OrdinalIgnoreCase))
                                    isAbstract = true;
                            }
                        }
                    }

                    if (model == null) {
                        if (isReferenceType ?? isValueType ?? isEnum ?? false) {
                            var typeModel = new CodeDocType(cRef);
                            typeModel.IsSealed = isSealed;
                            typeModel.IsValueType = isValueType;
                            typeModel.IsEnum = isEnum;
                            model = typeModel;
                        }
                        else if (isMethod ?? false) {
                            var methodModel = new CodeDocMethod(cRef);
                            methodModel.IsSealed = isSealed;
                            methodModel.IsVirtual = isVirtual;
                            methodModel.IsAbstract = isAbstract;
                            model = methodModel;
                        }
                        else {
                            model = new CodeDocSimpleMember(cRef);
                        }
                        model.ExternalVisibility = visibility ?? ExternalVisibilityKind.Hidden;
                    }

                    XmlNode summaryElement = contentXml.GetElementsByTagName("div")
                        .OfType<XmlElement>()
                        .FirstOrDefault(x => String.Equals(x.GetAttribute("class"), "summary", StringComparison.OrdinalIgnoreCase));
                    if (summaryElement != null) {
                        if (summaryElement.ChildNodes.Count == 1 && summaryElement.ChildNodes[0].Name == "p") {
                            // unwrap the lone p tag.
                            summaryElement = summaryElement.ChildNodes[0];
                        }
                        var summaryXmlDoc = XmlDocParser.Default.Parse(summaryElement);
                        model.SummaryContents = summaryXmlDoc.Children;
                    }

                }

            }

            if (model == null)
                model = new CodeDocSimpleMember(cRef);

            if(model.ExternalVisibility == ExternalVisibilityKind.Hidden)
                model.ExternalVisibility = ExternalVisibilityKind.Public;

            model.Uri = uri;
            model.FullName = bestTocResult.GetFullName();

            int lastTitleSpaceIndex = bestTocResult.Title.LastIndexOf(' ');
            if (lastTitleSpaceIndex >= 0) {
                model.Title = bestTocResult.Title.Substring(0, lastTitleSpaceIndex);
                model.SubTitle = bestTocResult.Title.Substring(lastTitleSpaceIndex + 1);
            }
            else {
                model.Title = bestTocResult.Title;
                model.SubTitle = String.Empty;
            }
            model.ShortName = model.Title;

            if (String.IsNullOrEmpty(model.NamespaceName)) {
                MtpsNodeCore namespaceNode = bestTocResult;
                while (namespaceNode != null && !namespaceNode.IsNamespace) {
                    namespaceNode = namespaceNode.Parent;
                }
                if (namespaceNode != null) {
                    model.NamespaceName = namespaceNode.GetNamespaceName();
                    model.Namespace = GetNamespaceByName(model.NamespaceName);
                }
            }

            return model;
        }