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(); } }
/// <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) ) ); }