예제 #1
0
        private void ParseMethod()
        {
            AEvaluator methodName = Pop();

            if (methodName.EvalType != EEvaluatorType.Getter)
            {
                throw new TemplateParserException(ETemplateParserError.Method_IncorrectName, PeekToken());
            }
            MethodEvaluator method = new MethodEvaluator(methodName.ToString());
            int             count  = m_Evaluators.Count;

            while (HasTokens() && PeekToken().Value[0] != TemplateConst.PARENT_CLOSE)
            {
                ParseAccess();
            }

            ConsumeToken();

            for (int x = count; x < m_Evaluators.Count; x++)
            {
                method.AddArgument(m_Evaluators[x]);
            }

            while (m_Evaluators.Count > count)
            {
                Pop();
            }
            Push(method);
        }
        FindMatchesReturnsMatchOnMethodWithoutGenericTypeConstraintsOrParameters()
        {
            var method = new TestMethodDefinition
            {
                GenericTypeParameters = Array.Empty <string>(),
                Parameters            = Array.Empty <IParameterDefinition>()
            };

            var oldItems = new List <IMethodDefinition>
            {
                method
            };
            var newItems = new List <IMethodDefinition>
            {
                method
            };

            var sut = new MethodEvaluator();

            var actual = sut.FindMatches(oldItems, newItems);

            actual.ItemsAdded.Should().BeEmpty();
            actual.ItemsRemoved.Should().BeEmpty();
            actual.MatchingItems.Should().HaveCount(1);
            actual.MatchingItems.First().OldItem.Should().BeEquivalentTo(method);
            actual.MatchingItems.First().NewItem.Should().BeEquivalentTo(method);
        }
        FindMatchesDoesNotReturnsMatchOnRenamedMethodWhenMultipleTargetOptionsAvailable()
        {
            var oldMethod = new TestMethodDefinition
            {
                GenericTypeParameters = new List <string>
                {
                    "TKey",
                    "TValue"
                },
                Parameters = new List <IParameterDefinition>
                {
                    new TestParameterDefinition
                    {
                        Type = "List<string>"
                    },
                    new TestParameterDefinition
                    {
                        Type = "Guid"
                    },
                    new TestParameterDefinition
                    {
                        Type = "CancellationToken"
                    }
                }
            };
            var newMethod = new TestMethodDefinition().Set(x =>
            {
                x.GenericTypeParameters = oldMethod.GenericTypeParameters;
                x.Parameters            = oldMethod.Parameters;
            });
            var otherNewMethod = new TestMethodDefinition().Set(x =>
            {
                x.GenericTypeParameters = oldMethod.GenericTypeParameters;
                x.Parameters            = oldMethod.Parameters;
            });

            var oldItems = new List <IMethodDefinition>
            {
                oldMethod
            };
            var newItems = new List <IMethodDefinition>
            {
                newMethod,
                otherNewMethod
            };

            var sut = new MethodEvaluator();

            var actual = sut.FindMatches(oldItems, newItems);

            actual.ItemsAdded.Should().HaveCount(2);
            actual.ItemsAdded.First().Should().BeEquivalentTo(newMethod);
            actual.ItemsAdded.Skip(1).First().Should().BeEquivalentTo(otherNewMethod);
            actual.ItemsRemoved.Should().HaveCount(1);
            actual.ItemsRemoved.First().Should().BeEquivalentTo(oldMethod);
            actual.MatchingItems.Should().BeEmpty();
        }
        FindMatchesReturnsMatchOnMethodWithGenericTypeCountChanged()
        {
            var oldMethod = new TestMethodDefinition
            {
                GenericTypeParameters = new List <string>
                {
                    "TKey"
                },
                Parameters = new List <IParameterDefinition>
                {
                    new TestParameterDefinition
                    {
                        Type = "string"
                    },
                    new TestParameterDefinition
                    {
                        Type = "Guid"
                    },
                    new TestParameterDefinition
                    {
                        Type = "CancellationToken"
                    }
                }
            };

            var newMethod = new TestMethodDefinition
            {
                RawName               = oldMethod.RawName,
                ReturnType            = oldMethod.ReturnType,
                GenericTypeParameters = new List <string>
                {
                    "TKey",
                    "TValue"
                },
                Parameters = oldMethod.Parameters
            };

            var oldItems = new List <IMethodDefinition>
            {
                oldMethod
            };
            var newItems = new List <IMethodDefinition>
            {
                newMethod
            };

            var sut = new MethodEvaluator();

            var actual = sut.FindMatches(oldItems, newItems);

            actual.ItemsAdded.Should().BeEmpty();
            actual.ItemsRemoved.Should().BeEmpty();
            actual.MatchingItems.Should().HaveCount(1);
            actual.MatchingItems.First().OldItem.Should().BeEquivalentTo(oldMethod);
            actual.MatchingItems.First().NewItem.Should().BeEquivalentTo(newMethod);
        }
        public void FindMatchesReturnsEmptyWhenNoMethodsProvided()
        {
            var oldItems = Array.Empty <IMethodDefinition>();
            var newItems = Array.Empty <IMethodDefinition>();

            var sut = new MethodEvaluator();

            var actual = sut.FindMatches(oldItems, newItems);

            actual.ItemsAdded.Should().BeEmpty();
            actual.ItemsRemoved.Should().BeEmpty();
            actual.MatchingItems.Should().BeEmpty();
        }
예제 #6
0
        void SearchAndEval(ProblemDescriptor p, System.Reflection.Assembly[] assemblies, ProjectReport projectReport)
        {
            if (string.IsNullOrEmpty(p.customevaluator))
            {
                // try all assemblies. Need to find a way to only evaluate on the right assembly
                foreach (var assembly in assemblies)
                {
                    try
                    {
                        var value = MethodEvaluator.Eval(assembly.Location,
                                                         p.type, "get_" + p.method, new System.Type[0] {
                        }, new object[0] {
                        });

                        if (value.ToString() == p.value)
                        {
                            projectReport.AddIssue(new ProjectIssue
                            {
                                description = p.description,
                                category    = IssueCategory.ProjectSettings,
                                descriptor  = p
                            });

                            // stop iterating assemblies
                            break;
                        }
                    }
                    catch (Exception)
                    {
                        // this is safe to ignore
                    }
                }
            }
            else
            {
                Type       helperType = m_Helpers.GetType();
                MethodInfo theMethod  = helperType.GetMethod(p.customevaluator);
                bool       isIssue    = (bool)theMethod.Invoke(m_Helpers, null);

                if (isIssue)
                {
                    projectReport.AddIssue(new ProjectIssue
                    {
                        description = p.description,
                        category    = IssueCategory.ProjectSettings,
                        descriptor  = p
                    });
                }
            }
        }
        ProjectIssue SearchAndEval(ProblemDescriptor descriptor)
        {
            if (string.IsNullOrEmpty(descriptor.customevaluator))
            {
                var paramTypes = new Type[] {};
                var args       = new object[] {};
                var found      = false;
                // do we actually need to look in all assemblies? Maybe we can find a way to only evaluate on the right assembly
                foreach (var assembly in m_Assemblies)
                {
                    try
                    {
                        var value = MethodEvaluator.Eval(assembly.Location,
                                                         descriptor.type, "get_" + descriptor.method, paramTypes, args);

                        if (value.ToString() == descriptor.value)
                        {
                            return(NewIssue(descriptor, descriptor.description));
                        }

                        // Eval did not throw exception so we can stop iterating assemblies
                        found = true;
                        break;
                    }
                    catch (Exception)
                    {
                        // this is safe to ignore
                    }
                }

                if (!found)
                {
                    Debug.Log(descriptor.method + " not found in any assembly");
                }
            }
            else
            {
                var helperType = m_Helpers.GetType();
                var theMethod  = helperType.GetMethod(descriptor.customevaluator);
                if ((bool)theMethod.Invoke(m_Helpers, null))
                {
                    return(NewIssue(descriptor, descriptor.description));
                }
            }

            return(null);
        }
        public void FindMatchesReturnsAllMethodsAsMatchesWhenNoChangesMade()
        {
            var oldItems = new List <IMethodDefinition>
            {
                new TestMethodDefinition(),
                new TestMethodDefinition(),
                new TestMethodDefinition(),
                new TestMethodDefinition()
            };
            var newItems = new List <IMethodDefinition>(oldItems);

            var sut = new MethodEvaluator();

            var actual = sut.FindMatches(oldItems, newItems);

            actual.ItemsAdded.Should().BeEmpty();
            actual.ItemsRemoved.Should().BeEmpty();
            actual.MatchingItems.Select(x => x.NewItem).Should().BeEquivalentTo(newItems);
            actual.MatchingItems.Select(x => x.OldItem).Should().BeEquivalentTo(oldItems);
        }
예제 #9
0
        private void SearchAndEval(ProblemDescriptor descriptor, ProjectReport projectReport)
        {
            if (string.IsNullOrEmpty(descriptor.customevaluator))
            {
                // do we actually need to look in all assemblies? Maybe we can find a way to only evaluate on the right assembly
                foreach (var assembly in m_Assemblies)
                {
                    try
                    {
                        var value = MethodEvaluator.Eval(assembly.Location,
                                                         descriptor.type, "get_" + descriptor.method, new System.Type[0] {
                        }, new object[0] {
                        });

                        if (value.ToString() == descriptor.value)
                        {
                            AddIssue(descriptor, string.Format("{0}: {1}", descriptor.description, value), projectReport);

                            // stop iterating assemblies
                            break;
                        }
                    }
                    catch (Exception)
                    {
                        // this is safe to ignore
                    }
                }
            }
            else
            {
                Type       helperType = m_Helpers.GetType();
                MethodInfo theMethod  = helperType.GetMethod(descriptor.customevaluator);
                bool       isIssue    = (bool)theMethod.Invoke(m_Helpers, null);

                if (isIssue)
                {
                    AddIssue(descriptor, descriptor.description, projectReport);
                }
            }
        }
예제 #10
0
        public static string Eval(string macro)
        {
            var ret = MethodEvaluator.ExecuteExternalCode(macro);

            return(ret == null ? "Null" : ret.ToString());
        }
예제 #11
0
        public static IChangeCalculator BuildCalculator(ILogger?logger)
        {
            var attributeComparer  = new AttributeComparer();
            var attributeMatcher   = new AttributeEvaluator();
            var attributeProcessor = new AttributeMatchProcessor(attributeMatcher, attributeComparer, logger);

            var accessModifierChangeTable  = new AccessModifiersChangeTable();
            var accessModifiersComparer    = new AccessModifiersComparer(accessModifierChangeTable);
            var memberModifiersChangeTable = new PropertyModifiersChangeTable();
            var memberModifiersComparer    = new PropertyModifiersComparer(memberModifiersChangeTable);

            var genericTypeElementComparer = new GenericTypeElementComparer();

            var fieldModifiersChangeTable = new FieldModifiersChangeTable();
            var fieldModifiersComparer    = new FieldModifiersComparer(fieldModifiersChangeTable);
            var fieldComparer             = new FieldComparer(accessModifiersComparer, fieldModifiersComparer, attributeProcessor);
            var fieldMatcher   = new FieldEvaluator();
            var fieldProcessor = new FieldMatchProcessor(fieldMatcher, fieldComparer, logger);

            var propertyAccessorAccessModifiersChangeTable = new PropertyAccessorAccessModifiersChangeTable();
            var propertyAccessorAccessModifiersComparer    = new PropertyAccessorAccessModifiersComparer(propertyAccessorAccessModifiersChangeTable);
            var propertyAccessorComparer  = new PropertyAccessorComparer(propertyAccessorAccessModifiersComparer, attributeProcessor);
            var propertyAccessorEvaluator = new PropertyAccessorEvaluator();
            var propertyAccessorProcessor =
                new PropertyAccessorMatchProcessor(propertyAccessorEvaluator, propertyAccessorComparer, logger);
            var propertyComparer  = new PropertyComparer(accessModifiersComparer, memberModifiersComparer, propertyAccessorProcessor, attributeProcessor);
            var propertyMatcher   = new PropertyEvaluator();
            var propertyProcessor = new PropertyMatchProcessor(propertyMatcher, propertyComparer, logger);

            var methodEvaluator               = new MethodEvaluator();
            var methodModifiersChangeTable    = new MethodModifiersChangeTable();
            var methodModifiersComparer       = new MethodModifiersComparer(methodModifiersChangeTable);
            var parameterModifiersChangeTable = new ParameterModifiersChangeTable();
            var parameterModifiersComparer    = new ParameterModifiersComparer(parameterModifiersChangeTable);
            var parameterComparer             = new ParameterComparer(parameterModifiersComparer, attributeProcessor);
            var methodComparer  = new MethodComparer(accessModifiersComparer, methodModifiersComparer, genericTypeElementComparer, parameterComparer, attributeProcessor);
            var methodProcessor = new MethodMatchProcessor(methodEvaluator, methodComparer, logger);

            var classModifiersChangeTable = new ClassModifiersChangeTable();
            var classModifiersComparer    = new ClassModifiersComparer(classModifiersChangeTable);
            var classComparer             = new ClassComparer(
                accessModifiersComparer,
                classModifiersComparer,
                genericTypeElementComparer,
                fieldProcessor,
                propertyProcessor,
                methodProcessor, attributeProcessor);

            var interfaceComparer = new InterfaceComparer(
                accessModifiersComparer,
                genericTypeElementComparer,
                propertyProcessor,
                methodProcessor,
                attributeProcessor);

            var structModifiersChangeTable = new StructModifiersChangeTable();
            var structModifiersComparer    = new StructModifiersComparer(structModifiersChangeTable);
            var structComparer             = new StructComparer(
                accessModifiersComparer,
                structModifiersComparer,
                genericTypeElementComparer,
                fieldProcessor,
                propertyProcessor,
                methodProcessor,
                attributeProcessor);

            var aggregateTypeComparer = new AggregateTypeComparer(classComparer, interfaceComparer, structComparer);

            var typeEvaluator = new TypeEvaluator();
            var typeProcessor = new TypeMatchProcessor(typeEvaluator, aggregateTypeComparer, logger);

            return(new ChangeCalculator(typeProcessor, logger));
        }
        FindMatchesReturnsOverloadMethodAsMatchesWhenParametersMatchWithOtherOverloadRemoved()
        {
            var matchingOverload = new TestMethodDefinition
            {
                Parameters = new List <IParameterDefinition>
                {
                    new TestParameterDefinition
                    {
                        Type = "List<string>"
                    },
                    new TestParameterDefinition
                    {
                        Type = "Guid"
                    },
                    new TestParameterDefinition
                    {
                        Type = "CancellationToken"
                    }
                }
            };
            var otherOverload = new TestMethodDefinition
            {
                RawName    = matchingOverload.RawName,
                Parameters = new List <IParameterDefinition>
                {
                    new TestParameterDefinition
                    {
                        Type = "string"
                    },
                    new TestParameterDefinition
                    {
                        Type = "Guid"
                    },
                    new TestParameterDefinition
                    {
                        Type = "CancellationToken"
                    }
                }
            };

            var oldItems = new List <IMethodDefinition>
            {
                otherOverload,
                matchingOverload
            };
            var newItems = new List <IMethodDefinition>
            {
                matchingOverload
            };

            var sut = new MethodEvaluator();

            var actual = sut.FindMatches(oldItems, newItems);

            actual.ItemsAdded.Should().BeEmpty();
            actual.ItemsRemoved.Should().HaveCount(1);
            actual.ItemsRemoved.First().Should().BeEquivalentTo(otherOverload);
            actual.MatchingItems.Should().HaveCount(1);
            actual.MatchingItems.First().OldItem.Should().BeEquivalentTo(matchingOverload);
            actual.MatchingItems.First().NewItem.Should().BeEquivalentTo(matchingOverload);
        }