internal MetadataMethod(MetadataModule module, MethodDefinitionHandle handle) { Debug.Assert(module != null); Debug.Assert(!handle.IsNil); this.module = module; this.handle = handle; var metadata = module.metadata; var def = metadata.GetMethodDefinition(handle); this.attributes = def.Attributes; this.symbolKind = SymbolKind.Method; var(accessorOwner, semanticsAttribute) = module.PEFile.MethodSemanticsLookup.GetSemantics(handle); if (semanticsAttribute != 0) { this.symbolKind = SymbolKind.Accessor; this.accessorOwner = accessorOwner; } else if ((attributes & (MethodAttributes.SpecialName | MethodAttributes.RTSpecialName)) != 0) { string name = this.Name; if (name == ".cctor" || name == ".ctor") { this.symbolKind = SymbolKind.Constructor; } else if (name.StartsWith("op_", StringComparison.Ordinal)) { this.symbolKind = SymbolKind.Operator; } } this.typeParameters = MetadataTypeParameter.Create(module, this, def.GetGenericParameters()); this.IsExtensionMethod = (attributes & MethodAttributes.Static) == MethodAttributes.Static && (module.TypeSystemOptions & TypeSystemOptions.ExtensionMethods) == TypeSystemOptions.ExtensionMethods && def.GetCustomAttributes().HasKnownAttribute(metadata, KnownAttribute.Extension); }
internal MetadataMethod(MetadataModule module, MethodDefinitionHandle handle) { Debug.Assert(module != null); Debug.Assert(!handle.IsNil); this.module = module; this.handle = handle; var metadata = module.metadata; var def = metadata.GetMethodDefinition(handle); this.attributes = def.Attributes; this.symbolKind = SymbolKind.Method; var(accessorOwner, semanticsAttribute) = module.PEFile.MethodSemanticsLookup.GetSemantics(handle); const MethodAttributes finalizerAttributes = (MethodAttributes.Virtual | MethodAttributes.Family | MethodAttributes.HideBySig); this.typeParameters = MetadataTypeParameter.Create(module, this, def.GetGenericParameters()); if (semanticsAttribute != 0) { this.symbolKind = SymbolKind.Accessor; this.accessorOwner = accessorOwner; this.AccessorKind = semanticsAttribute; } else if ((attributes & (MethodAttributes.SpecialName | MethodAttributes.RTSpecialName)) != 0 && typeParameters.Length == 0) { string name = this.Name; if (name == ".cctor" || name == ".ctor") { this.symbolKind = SymbolKind.Constructor; } else if (name.StartsWith("op_", StringComparison.Ordinal) && CSharp.Syntax.OperatorDeclaration.GetOperatorType(name) != null) { this.symbolKind = SymbolKind.Operator; } } else if ((attributes & finalizerAttributes) == finalizerAttributes && typeParameters.Length == 0) { if (Name == "Finalize" && Parameters.Count == 0 && ReturnType.IsKnownType(KnownTypeCode.Void) && (DeclaringTypeDefinition as MetadataTypeDefinition)?.Kind == TypeKind.Class) { this.symbolKind = SymbolKind.Destructor; } } this.IsExtensionMethod = (attributes & MethodAttributes.Static) == MethodAttributes.Static && (module.TypeSystemOptions & TypeSystemOptions.ExtensionMethods) == TypeSystemOptions.ExtensionMethods && def.GetCustomAttributes().HasKnownAttribute(metadata, KnownAttribute.Extension); }
internal MetadataTypeDefinition(MetadataModule module, TypeDefinitionHandle handle) { Debug.Assert(module != null); Debug.Assert(!handle.IsNil); this.module = module; this.handle = handle; var metadata = module.metadata; var td = metadata.GetTypeDefinition(handle); this.attributes = td.Attributes; this.fullTypeName = td.GetFullTypeName(metadata); // Find DeclaringType + KnownTypeCode: if (fullTypeName.IsNested) { this.DeclaringTypeDefinition = module.GetDefinition(td.GetDeclaringType()); // Create type parameters: this.TypeParameters = MetadataTypeParameter.Create(module, this.DeclaringTypeDefinition, this, td.GetGenericParameters()); } else { // Create type parameters: this.TypeParameters = MetadataTypeParameter.Create(module, this, td.GetGenericParameters()); var topLevelTypeName = fullTypeName.TopLevelTypeName; for (int i = 0; i < KnownTypeReference.KnownTypeCodeCount; i++) { var ktr = KnownTypeReference.Get((KnownTypeCode)i); if (ktr != null && ktr.TypeName == topLevelTypeName) { this.KnownTypeCode = (KnownTypeCode)i; break; } } } // Find type kind: if ((attributes & TypeAttributes.ClassSemanticsMask) == TypeAttributes.Interface) { this.Kind = TypeKind.Interface; } else if (td.IsEnum(metadata, out var underlyingType)) { this.Kind = TypeKind.Enum; this.EnumUnderlyingType = module.Compilation.FindType(underlyingType.ToKnownTypeCode()); } else if (td.IsValueType(metadata)) { if (KnownTypeCode == KnownTypeCode.Void) { this.Kind = TypeKind.Void; } else { this.Kind = TypeKind.Struct; this.IsByRefLike = td.GetCustomAttributes().HasKnownAttribute(metadata, KnownAttribute.IsByRefLike); this.IsReadOnly = td.GetCustomAttributes().HasKnownAttribute(metadata, KnownAttribute.IsReadOnly); } } else if (td.IsDelegate(metadata)) { this.Kind = TypeKind.Delegate; } else { this.Kind = TypeKind.Class; this.HasExtensionMethods = this.IsStatic && (module.TypeSystemOptions & TypeSystemOptions.ExtensionMethods) == TypeSystemOptions.ExtensionMethods && td.GetCustomAttributes().HasKnownAttribute(metadata, KnownAttribute.Extension); } }