Пример #1
0
        public static void Check(ITypeInfo type, string assemblyName)
        {
            if (type.DeclaringAssembly is null)
            {
                throw new NotSupportedException();
            }

            //
            // Tomb es mutato tipusnal az elem tipusat kell vizsgaljuk
            //

            if (type.ElementType is not null)
            {
                Check(type.ElementType, assemblyName);
                return;
            }

            var collector = new ReferenceCollector(includeRuntimeReferences: false);

            collector.AddType(type);

            //
            // Korbedolgozas arra az esetre ha a "type" GeneratorExecutionContext-bol jon es nem
            // teljes ujraforditas van
            //

            if (collector.References.Any(@ref => @ref.Location is null))
            {
                return;
            }

            //
            // Mivel az "internal" es "protected" kulcsszavak nem leteznek IL szinten ezert reflexioval
            // nem tudnank megallapitani h a tipus lathato e a kodunk szamara szoval a forditotol kerjuk
            // el.
            //

            CSharpCompilation comp = CSharpCompilation.Create
                                     (
                null,
                references: collector
                .References
                .Select(@ref => MetadataReference.CreateFromFile(@ref.Location !))
                                     );

            switch (type.ToSymbol(comp).DeclaredAccessibility)
            {
            case Accessibility.Private:
                throw new MemberAccessException(string.Format(Resources.Culture, Resources.TYPE_NOT_VISIBLE, type));

            case Accessibility.Internal when !type.DeclaringAssembly.IsFriend(assemblyName):
                throw new MemberAccessException(string.Format(Resources.Culture, Resources.IVT_REQUIRED, type, assemblyName));

            case Accessibility.NotApplicable:
                throw new InvalidOperationException();
            }
        }
Пример #2
0
        /// <summary>
        /// Namespace.ParentType[T].NestedType[TT] -> NestedType[TT] <br/>
        /// Namespace.ParentType[T] -> global::Namespace.ParentType[T]
        /// </summary>
        private NameSyntax GetQualifiedName(ITypeInfo type)
        {
            ReferenceCollector?.AddType(type);

            string[] parts = type.Name.Split(Type.Delimiter);

            NameSyntax[] names = new NameSyntax[parts.Length];

            if (type.IsNested)
            {
                names[0] = CreateTypeName(parts.Single() !);
            }
            else
            {
                for (int i = 0; i < parts.Length - 1; i++)
                {
                    names[i] = IdentifierName(parts[i]);
                }

                names[names.Length - 1] = CreateTypeName(parts[parts.Length - 1]);

                //
                // Ez jol kezeli azt az esetet is ha a tipus nincs nevter alatt
                //

                if (!type.IsVoid && !type.IsGenericParameter)
                {
                    names[0] = AliasQualifiedName
                               (
                        IdentifierName(Token(SyntaxKind.GlobalKeyword)),
                        (SimpleNameSyntax)names[0]
                               );
                }
            }

            return(names.Qualify());

            NameSyntax CreateTypeName(string name) => type is not IGenericTypeInfo genericType?IdentifierName(name) : GenericName(name).WithTypeArgumentList
                (
                    typeArgumentList: TypeArgumentList
                    (
                        arguments: genericType.GenericArguments.ToSyntaxList(ResolveType)
                    )
                );
        }