private AttributeCollection(ITypeSymbolProvider provider, ISymbol sourceSymbol)
 {
     _symbolProvider = provider;
     _symbol         = sourceSymbol;
     _attributes     = sourceSymbol.GetAttributes();
     (AttributeLocations, Attributes) = GetAttributeLocations();
 }
 public NamedTypeSource(INamedTypeSource?parent, INamedTypeSymbol symbol, ITypeSymbolProvider symbolProvider)
     : base(parent, symbol, symbolProvider)
 {
     _originalSymbol = symbol;
     TypeName        = TypeName.FromType(_originalSymbol);
     Members         = symbol.GetMembers().Select(memberSymbol => memberSymbol.CreateSource(symbolProvider, this)).ToList();
 }
示例#3
0
        public MemberComposerSource(MemberMetaInfo layoutMember, GeneratingTypeName typeName,
                                    IEnumerable <IConditionResolverProvider> conditions,
                                    IEnumerable <IMemberDataFormatterProvider> formatters,
                                    ITypeSymbolProvider symbolProvider)
        {
            if (_member.ReturnType is null)
            {
                throw new ArgumentException("Invalid layout member (No Return Type)");
            }
            _member   = layoutMember;
            _typeName = typeName;
            _symbols  = symbolProvider;
            // Watch out for order(?
            _conditions = conditions.SelectMany(x => x.GetResolvers(layoutMember, _throwCollection)).ToList();
            _format     = GetFormatResolver();

            IMemberDataFormatter GetFormatResolver()
            {
                foreach (var formatter in formatters)
                {
                    if (!formatter.ShouldFormat(layoutMember))
                    {
                        continue;
                    }
                    return(formatter.GetFormatter(layoutMember, _componentCollection, _throwCollection));
                }
                throw new ArgumentException($"The target member {layoutMember.Name} cannot be resolved by any of the provided {nameof(IMemberDataFormatterProvider)}");
            }
        }
示例#4
0
        internal TypePartialMetaInfo(NamedTypeMetaInfo source, ITypeSymbolProvider analysis, SyntaxModelPair syntaxPair, Func <ISymbol, bool>?memberPredicate, CancellationToken ct)
        {
            var attributeListing = syntaxPair.Syntax.GetAttributes(source.Symbol);

            _attributeLookup = attributeListing.Locations;

            Full       = source;
            Location   = syntaxPair.Syntax.GetLocation();
            Attributes = attributeListing.Lists;
            Members    = GetUnderlyingMembers();

            IReadOnlyList <MemberMetaInfo> GetUnderlyingMembers()
            {
                var members = new List <MemberMetaInfo>();

                foreach (var member in syntaxPair.Syntax.Members)
                {
                    var symbol = syntaxPair.Model.GetDeclaredSymbol(member, ct);
                    // Filter out null symbols and symbols that are not enlisted for interest
                    if (symbol is null || !(memberPredicate?.Invoke(symbol) ?? true))
                    {
                        continue;
                    }
                    // We don't support partial method, so we ignore symbols that are not impl.
                    // In future versions when we have use cases that can benefit from partial, then we should consider adding Attributes to the DefinitionPart
                    // Adding to the commented "DeclaringAttribute" part
                    if (symbol is IMethodSymbol method && method.PartialImplementationPart != null && method.PartialDefinitionPart is null && member.Modifiers.Any(SyntaxKind.PartialKeyword))
                    {
                        continue;
                    }
                    members.Add(new MemberMetaInfo(this, member, analysis, symbol));
                }
                return(members);
            }
        }
 public static AttributeCollection?GetAttributeLocations(ITypeSymbolProvider provider, ISymbol sourceSymbol)
 {
     if (!sourceSymbol.Locations.All(x => x.IsInSource))
     {
         return(null);
     }
     return(new AttributeCollection(provider, sourceSymbol));
 }
示例#6
0
 public static AttributeCollection?CreateCollection(ITypeSymbolProvider provider, TypeSymbolLocatorCache locatorCache, ISymbol sourceSymbol)
 {
     if (!sourceSymbol.Locations.All(x => x.IsInSource))
     {
         return(null);
     }
     return(new AttributeCollection(provider, locatorCache, sourceSymbol));
 }
示例#7
0
 public SourcebergHostBuilderBase(ITypeSymbolProvider symbolProvider,
                                  ISourceAddition sourceAddition,
                                  IDiagnosticReporter <THostBuilder> diagnosticReporter)
 {
     _source        = sourceAddition;
     _reporter      = diagnosticReporter;
     SymbolProvider = symbolProvider;
     Resolvable     = symbolProvider.Source.GetAssemblySymbol(typeof(SourcebergAnalyzerAttribute).Assembly) is not null;
 }
示例#8
0
        private AttributeCollection(ITypeSymbolProvider symbolProvider, TypeSymbolLocatorCache locatorCache, ISymbol sourceSymbol)
        {
            var compilation = (sourceSymbol.ContainingAssembly as ISourceAssemblySymbol)?.Compilation ?? symbolProvider.Source.DeclaringCompilation;

            _symbolLocator   = locatorCache.GetLocator(compilation);
            ContainingSymbol = sourceSymbol;
            _attributes      = sourceSymbol.GetAttributes();
            (AttributeLocations, Attributes) = GetAttributeLocations();
        }
示例#9
0
 public MemberComposerFactory(IEnumerable <IConditionResolverProvider> conditions,
                              IEnumerable <IMemberDataFormatterProvider> formatters,
                              ISourceAddition sourceAddition,
                              ITypeSymbolProvider symbolProvider)
 {
     _conditions     = conditions;
     _formatters     = formatters;
     _sourceAddition = sourceAddition;
     _symbolProvider = symbolProvider;
 }
示例#10
0
        public static ReturnTypeMetaInfo?FromMember(ITypeSymbolProvider analysis, ISymbol memberSymbol)
        {
            var returnType = (memberSymbol as IFieldSymbol)?.Type ?? (memberSymbol as IMethodSymbol)?.ReturnType ?? (memberSymbol as IPropertySymbol)?.Type ?? (memberSymbol as IEventSymbol)?.Type;

            if (returnType is null)
            {
                return(null);
            }
            return(new ReturnTypeMetaInfo(analysis, returnType));
        }
 public MemberComposerSourceProto(MemberMetaInfo layoutMember, GeneratingTypeName typeName, IEnumerable <IMemberComposingFeature> features, ITypeSymbolProvider symbolProvider)
 {
     if (_member.ReturnType is null)
     {
         throw new ArgumentException("Invalid layout member (No Return Type)");
     }
     _member   = layoutMember;
     _typeName = typeName;
     _symbols  = symbolProvider;
     _features = features.Where(x => x.ShouldFormat(layoutMember)).Select(x => x.GetComposingMethods(layoutMember, _componentCollection, _throwCollection)).ToList();
 }
        internal NamedTypeMetaInfo(ITypeSymbolProvider analysis, INamedTypeSymbol symbol, IEnumerable <SyntaxModelPair> syntax, Func <ISymbol, bool>?memberPredicate, CancellationToken ct)
        {
            _analysis = analysis;

            Symbol        = symbol;
            IsPartial     = syntax.Any(x => x.Syntax.Modifiers.Any(SyntaxKind.PartialKeyword));
            FirstLocation = syntax.First().Syntax.GetLocation();
            Attributes    = Declarations.SelectMany(x => x.Attributes).ToList();

            Declarations = syntax.Select(x => new TypePartialMetaInfo(this, analysis, x, memberPredicate, ct)).ToList();
            Members      = Declarations.SelectMany(x => x.Members).ToList();
        }
        private NamedTypeMetaInfo(NamedTypeMetaInfo source, INamedTypeSymbol newSymbol)
        {
            _analysis = source._analysis;

            Symbol        = newSymbol;
            IsPartial     = source.IsPartial;
            FirstLocation = source.FirstLocation;
            Attributes    = source.Attributes;

            Declarations = source.Declarations.Select(x => new TypePartialMetaInfo(this, x, newSymbol)).ToList();
            Members      = Declarations.SelectMany(x => x.Members).ToList();

            GenericDefinition = source;
        }
 public SourcebergGeneratorHostBuilder(ITypeSymbolProvider symbolProvider,
                                       ISourceAddition sourceAddition,
                                       IDiagnosticReporter <SourcebergGeneratorHostBuilder> diagnosticReporter)
     : base(symbolProvider, sourceAddition, diagnosticReporter)
 {
 }
示例#15
0
 public BinaryTypeCompositeBuilder(NamedTypeMetaInfo type, ISourceAddition sourceAddition, ITypeSymbolProvider symbolProvider)
 {
 }
 public SourceCodeAnalysis(ITypeSymbolProvider provider, ICompilationInfo compilationInfo, ICompilationLifetime lifetime)
 {
     _provider        = provider;
     _compilationInfo = compilationInfo;
     _lifetime        = lifetime;
 }
 public TypeComposerBuilder(MemberComposerFactory memberFactory, ISourceAddition sourceAddition, ITypeSymbolProvider symbolProvider)
 {
     _memberFactory  = memberFactory;
     _sourceAddition = sourceAddition;
     _symbolSource   = symbolProvider;
 }
 public static ITypeMemberSource CreateSource(this ISymbol symbol, ITypeSymbolProvider symbolProvider, INamedTypeSource?parent) => symbol switch
 {
示例#19
0
 public ReturnTypeMetaInfo(ITypeSymbolProvider analysis, ITypeSymbol symbol)
 {
     _provider = analysis;
     Symbol    = symbol;
 }
示例#20
0
 public AttributeLayoutProvider(ITypeSymbolProvider symbolProvider, TypeSymbolLocatorCache locatorCache)
 {
     _symbolProvider = symbolProvider;
     _locatorCache   = locatorCache;
 }
 public TypeMemberSource(INamedTypeSource?containingType, ISymbol memberSymbol, ITypeSymbolProvider symbolProvider)
 {
     ContainingType = containingType;
     OriginalSymbol = memberSymbol;
     ReturnValue    = ReturnValueInfo.FromMember(memberSymbol);
     Attributes     = AttributeCollection.GetAttributeLocations(symbolProvider, memberSymbol);
 }