コード例 #1
0
        protected void AddVerifierAttribute(ITypeDefinition typeToAnalyze, IReadOnlyCollection <Query> queries)
        {
            Contract.Requires(typeToAnalyze != null);
            Contract.Requires(queries.Any());

            var cciType = FindType(module, typeToAnalyze.Name);

            foreach (var m in cciType.Methods)
            {
                if (m.Visibility != TypeMemberVisibility.Public || queries.Any(query => query.Method.Method.Equals(m)))
                {
                    continue;
                }

                var disableVerifier = DisableVerifier();

                var tmp = m as MethodDefinition;
                Contract.Assert(tmp != null);

                if (tmp.Attributes == null)
                {
                    tmp.Attributes = new List <ICustomAttribute>();
                }
                tmp.Attributes.Add(disableVerifier);
            }
        }
コード例 #2
0
        public CciAttributeAdder(CciAssembly inputAssembly, ITypeDefinition typeToAnalyze, IReadOnlyCollection <Query> queries)
            : base(inputAssembly, typeToAnalyze, queries)
        {
            Contract.Requires(inputAssembly != null);
            Contract.Requires(typeToAnalyze != null);
            Contract.Requires(queries.Any());

            AddVerifierAttribute(typeToAnalyze, queries);
        }
コード例 #3
0
        public CciQueryAssembly(CciAssembly inputAssembly, ITypeDefinition typeToAnalyze, IReadOnlyCollection <Query> queries)
            : base(inputAssembly.Module, inputAssembly.ContractProvider)
        {
            Contract.Requires(inputAssembly != null);
            Contract.Requires(typeToAnalyze != null);
            Contract.Requires(queries.Any());

            // Clone module
            var host = CciHostEnvironment.GetInstance();

            module = new CodeAndContractDeepCopier(host).Copy(inputAssembly.Module);
            var cciQueryType = FindType(module, typeToAnalyze.Name);

            Contract.Assert(cciQueryType != null);

            // Create contract provider for the cloned module
            contractProvider = new ContractProvider(new ContractMethods(host), host.FindUnit(module.UnitIdentity));

            var cciInputType = FindType(inputAssembly.Module, typeToAnalyze.Name);

            Contract.Assert(cciInputType != null);
            var queryTypeContract = inputAssembly.ContractProvider.GetTypeContractFor(cciInputType);

            contractProvider.AssociateTypeWithContract(cciQueryType, queryTypeContract);

            // Add queries
            cciQueryType.Methods.AddRange(from a in queries select a.Method.Method);

            foreach (var query in queries)
            {
                // Find the query in the query assembly
                var method = cciQueryType.Methods.Find(m => m.GetUniqueName().Equals(query.Method.Name)) as MethodDefinition;
                Contract.Assert(method != null);

                method.ContainingTypeDefinition = cciQueryType;

                // Asociate query with its contract
                contractProvider.AssociateMethodWithContract(query.Method.Method, query.Method.Contract);
            }
        }