Пример #1
0
        public TypeCollectorForCompilation(Compilation compilation, bool disallowInternal, Action <string> logger)
        {
            this.logger           = logger;
            this.typeReferences   = new ReferenceSymbols(compilation, logger);
            this.disallowInternal = disallowInternal;

            targetTypes = RoslynExtensions.GetNamedTypeSymbols(compilation)
                          .Where(x =>
            {
                if (x.DeclaredAccessibility == Accessibility.Public)
                {
                    return(true);
                }

                if (!disallowInternal)
                {
                    return(x.DeclaredAccessibility == Accessibility.Friend);
                }

                return(false);
            })
                          .Where(x => true)
                          .ToArray();
        }
Пример #2
0
 public static INamedTypeSymbol FindBaseTargetType(this ITypeSymbol symbol, string typeName)
 {
     return(RoslynExtensions.EnumerateBaseType(symbol)
            .Where(x => x.OriginalDefinition?.ToDisplayString() == typeName)
            .FirstOrDefault());
 }
Пример #3
0
        private ObjectSerializationInfo GetObjectInfo(INamedTypeSymbol type)
        {
            var isClass = !type.IsValueType;
            var members = new List <MemberSerializationInfo>();
            // Only KeyAttribute members
            var searchFirst  = true;
            var hiddenIntKey = 0;

            foreach (IPropertySymbol item in RoslynExtensions.GetAllMembers(type).OfType <IPropertySymbol>())
            {
                if (item.IsIndexer)
                {
                    continue; // .tt files don't generate good code for this yet: https://github.com/neuecc/MessagePack-CSharp/issues/390
                }

                var member = new MemberSerializationInfo
                {
                    IsReadable    = (item.GetMethod != null) && item.GetMethod.DeclaredAccessibility == Accessibility.Public && !item.IsStatic,
                    IsWritable    = (item.SetMethod != null) && item.SetMethod.DeclaredAccessibility == Accessibility.Public && !item.IsStatic,
                    IsProperty    = true,
                    IsField       = false,
                    Name          = item.Name,
                    Type          = item.Type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat),
                    ShortTypeName = item.Type.ToDisplayString(BinaryWriteFormat),
                    Attributes    = NeutralAttributeData.FromAttributeDataArray(item.Type.GetAttributes())
                };
                if (!member.IsReadable && !member.IsWritable)
                {
                    continue;
                }

                if (searchFirst)
                {
                    searchFirst = false;
                }

                members.Add(member);
                this.CollectCore(item.Type); // recursive collect
            }

            foreach (IFieldSymbol item in RoslynExtensions.GetAllMembers(type).OfType <IFieldSymbol>())
            {
                if (item.IsImplicitlyDeclared)
                {
                    continue;
                }

                var member = new MemberSerializationInfo
                {
                    IsReadable    = item.DeclaredAccessibility == Accessibility.Public && !item.IsStatic,
                    IsWritable    = item.DeclaredAccessibility == Accessibility.Public && !item.IsReadOnly && !item.IsStatic,
                    IsProperty    = true,
                    IsField       = false,
                    Name          = item.Name,
                    Type          = item.Type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat),
                    ShortTypeName = item.Type.ToDisplayString(BinaryWriteFormat),
                };
                if (!member.IsReadable && !member.IsWritable)
                {
                    continue;
                }

                if (searchFirst)
                {
                    searchFirst = false;
                }

                members.Add(member);
                this.CollectCore(item.Type); // recursive collect
            }

            var info = new ObjectSerializationInfo
            {
                IsClass = isClass,
                ConstructorParameters = null,
                Members    = members.ToArray(),
                Name       = GetMinimallyQualifiedClassName(type),
                FullName   = type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat),
                Namespace  = type.ContainingNamespace.IsGlobalNamespace ? null : type.ContainingNamespace.ToDisplayString(),
                Attributes = NeutralAttributeData.FromAttributeDataArray(type.GetAttributes())
            };

            return(info);
        }