/// <summary> /// Check imported interfaces. /// </summary> /// <param name="checkerData">Used types and assemblies candidates.</param> /// <param name="evaluator">The project evaluator.</param> private void CheckImportedInterfaces(CheckerSharedData checkerData, IProjectEvaluator evaluator) { IEnumerable <TypeReference> typeReferences = evaluator.ProjectImportedTypesDefinitions .SelectMany(item => item.GetInterfaces()); IMetadataScope forwardedFrom; foreach (TypeReference typeRef in typeReferences) { try { TypeDefinition typeDef = typeRef.Resolve(out forwardedFrom); checkerData.RemoveFromCandidates(forwardedFrom); if (typeDef != null) { _helper.Check(typeDef, checkerData); } if (!checkerData.HasCandidateReferences) { break; } } catch (Exception ex) { throw Error.CheckType(typeRef.AssemblyQualifiedName(), string.Format(Resources.CleanExecutor_CheckInteropTypeException, typeRef.AssemblyQualifiedName()), ex); } } }
/// <summary> /// Performs assembly's types checking. /// </summary> /// <param name="sharedData">Used types and assemblies candidates.</param> /// <param name="evaluator">The project evaluator.</param> public void Check(CheckerSharedData sharedData, IProjectEvaluator evaluator) { var query = (from reference in sharedData.CandidateReferences join assemblyRef in evaluator.ManifestAssemblies on reference.FullName.ToUpper() equals assemblyRef.FullName.ToUpper() select reference).ToList(); foreach (var reference in query) { sharedData.RemoveFromCandidates(reference); } }
/// <summary> /// Check assembly types. /// </summary> /// <param name="assemblyDefinition">The assembly.</param> private void CheckAssemblyTypes(AssemblyDefinition assemblyDefinition, CheckerSharedData checkerData, IProjectEvaluator evaluator) { var referencedAssemblyTypes = evaluator.ProjectTypesReferences .Select(projectTypeRef => projectTypeRef) .Join(assemblyDefinition.Modules.GetTypesDefinitions().Where(moduleType => moduleType.BaseType != null), projectTypeRef => projectTypeRef.FullName.ToLower(), moduleType => moduleType.FullName.ToLower(), (projectTypeRef, moduleType) => projectTypeRef); foreach (TypeDefinition referencedType in referencedAssemblyTypes) { if (checkerData.UsedTypes.Contains(referencedType.AssemblyQualifiedName())) { _memberRefsCheckHelper.Check(referencedType, checkerData, evaluator); if (!checkerData.HasCandidateReferences) { break; } } else { checkerData.RemoveFromCandidates(referencedType.Scope); if (!checkerData.HasCandidateReferences) { break; } _classCheckHeper.Check(referencedType, checkerData); if (!checkerData.HasCandidateReferences) { break; } _interfaceCheckHelper.Check(referencedType, checkerData); if (!checkerData.HasCandidateReferences) { break; } _memberRefsCheckHelper.Check(referencedType, checkerData, evaluator); if (!checkerData.HasCandidateReferences) { break; } } } }
/// <summary> /// Checking assembly's types which are used in BAML. /// </summary> /// <param name="sharedData">Used types and assemblies candidates.</param> /// <param name="evaluator">The project evaluator.</param> /// <param name="declaredTypes">Declared in BAML types.</param> private void CheckXamlDeclaredTypes(CheckerSharedData sharedData, IProjectEvaluator evaluator, IEnumerable <XamlTypeDeclaration> declaredTypes) { var xamlTypeResolver = new XamlTypeResolver(evaluator); foreach (var type in declaredTypes) { var typeDef = xamlTypeResolver.Resolve(type); if (typeDef != null && !sharedData.IsUsedTypeExists(typeDef.AssemblyQualifiedName())) { _classChecher.Check(typeDef, sharedData); _interfaceChecker.Check(typeDef, sharedData); sharedData.RemoveFromCandidates(typeDef.Scope); if (!sharedData.HasCandidateReferences) { return; } } } }