예제 #1
0
        /// <summary>
        /// Check arguments of custom attribute.
        /// </summary>
        /// <param name="attributeArgs">The list of custom attribute arguments (types).</param>
        private void CheckCustomAttributes(IEnumerable <CustomAttributeArgument> attributeArgs)
        {
            IMetadataScope forwardedFrom;

            foreach (CustomAttributeArgument customAttributeArgument in attributeArgs)
            {
                TypeDefinition typeDefinition = customAttributeArgument.Value is TypeReference
                    ? (customAttributeArgument.Value as TypeReference).Resolve(out forwardedFrom)
                    : customAttributeArgument.Type.Resolve(out forwardedFrom);

                _sharedData.RemoveFromCandidates(forwardedFrom);

                if (typeDefinition != null && !_sharedData.IsUsedTypeExists(typeDefinition.AssemblyQualifiedName()))
                {
                    _sharedData.RemoveFromCandidates(typeDefinition.Scope);
                    if (!_sharedData.HasCandidateReferences)
                    {
                        return;
                    }

                    _sharedData.AddToUsedTypes(typeDefinition.AssemblyQualifiedName());
                    _interfaceCheckHelper.Check(typeDefinition, _sharedData);
                }
            }
        }
        /// <summary>
        /// Performs class hierarchy checking.
        /// </summary>
        /// <param name="type">Specified type for checking.</param>
        /// <param name="sharedData">Used types and assemblies candidates.</param>
        public void Check(TypeDefinition type, CheckerSharedData sharedData)
        {
            try
            {
                if (type == null)
                {
                    return;
                }

                var baseType = type.BaseType;
                if (baseType == null || sharedData.UsedTypes.Contains(baseType.AssemblyQualifiedName()))
                {
                    sharedData.AddToUsedTypes(type.AssemblyQualifiedName());
                    return;
                }

                IMetadataScope forwardedFrom;
                var            baseTypeDef = baseType.Resolve(out forwardedFrom);
                sharedData.RemoveFromCandidates(forwardedFrom);
                if (baseTypeDef != null)
                {
                    sharedData.RemoveFromCandidates(baseTypeDef.Scope);
                }

                Check(baseTypeDef, sharedData);
                sharedData.AddToUsedTypes(type.AssemblyQualifiedName());
            }
            catch (Exception ex)
            {
                throw Error.CheckType(type.AssemblyQualifiedName(),
                                      string.Format(Resources.CleanExecutor_CheckTypeHierarchyException, type.AssemblyQualifiedName()), ex);
            }
        }
예제 #3
0
        /// <summary>
        /// Performs checking of type's interfaces.
        /// </summary>
        /// <param name="type">Specified type for checking.</param>
        /// <param name="sharedData">Used types and assemblies candidates.</param>
        public void Check(TypeDefinition type, CheckerSharedData sharedData)
        {
            try
            {
                IMetadataScope forwardedFrom;
                foreach (TypeReference interfaceRef in type.GetInterfaces())
                {
                    var interfaceDef = interfaceRef.Resolve(out forwardedFrom);
                    sharedData.RemoveFromCandidates(forwardedFrom);

                    if (interfaceDef != null)
                    {
                        if (interfaceDef.IsImport)
                        {
                            _importedCheckHelper.Check(interfaceDef, sharedData);
                        }
                        else
                        {
                            sharedData.RemoveFromCandidates(interfaceDef.Scope);
                        }
                        sharedData.AddToUsedTypes(interfaceDef.AssemblyQualifiedName());
                    }

                    if (!sharedData.HasCandidateReferences)
                    {
                        return;
                    }
                }
            }
            catch (Exception ex)
            {
                throw Error.CheckType(type.AssemblyQualifiedName(),
                                      string.Format(Resources.CleanExecutor_CheckTypeInterfacesException, type.AssemblyQualifiedName()), ex);
            }
        }
예제 #4
0
        private void ResolveTypeReference(TypeReference paramTypeRef, CheckerSharedData sharedData)
        {
            var typeRef = GetNativeTypeOfTypeReference(paramTypeRef);

            if (typeRef == null || typeRef.IsGenericParameter)
            {
                return;
            }

            IMetadataScope forwardedFrom;
            var            typeDef = typeRef.Resolve(out forwardedFrom);

            sharedData.RemoveFromCandidates(forwardedFrom);
            if (typeDef != null && !sharedData.IsUsedTypeExists(typeDef.AssemblyQualifiedName()))
            {
                sharedData.RemoveFromCandidates(typeDef.Scope);

                _classCheckHeper.Check(typeDef, sharedData);
                _interfaceCheckHelper.Check(typeDef, sharedData);
            }
            else if (typeDef == null)
            {
                sharedData.AddToUsedTypes(typeRef.AssemblyQualifiedName());
                sharedData.RemoveFromCandidates(typeRef.Scope);
            }

            // check generic parameters of the type.
            if (typeRef is GenericInstanceType && ((GenericInstanceType)typeRef).HasGenericArguments)
            {
                var genericType = ((GenericInstanceType)typeRef);
                foreach (var genericArg in genericType.GenericArguments)
                {
                    ResolveTypeReference(genericArg, sharedData);
                }
            }
        }