コード例 #1
0
        private void AnalyzeClassVectors(SyntaxNodeAnalysisContext context)
        {
            ClassDeclarationSyntax @class = context.Node as ClassDeclarationSyntax;

            MethodFragmentsInClass source = new MethodFragmentsInClass(@class);
            var pre = new NodeToVector(SyntaxMasks.AllNodes);
            ISyntaxComparator <SyntaxPair <NodeWithVector>, NodeWithVector, SingleTreeInformation> comparator = (ISyntaxComparator <SyntaxPair <NodeWithVector>, NodeWithVector, SingleTreeInformation>) new VectorComparator <SyntaxPair <NodeWithVector>, NodeWithVector, SingleTreeInformation>();
            SingleTreeInformation information = new SingleTreeInformation(context.SemanticModel);

            SimilarityFinder <SyntaxPair <NodeWithVector>, NodeWithVector, SingleTreeInformation> analyzer = new SimilarityFinder <SyntaxPair <NodeWithVector>, NodeWithVector, SingleTreeInformation>(source, pre, Enumerable.Repeat(comparator, 1).ToList(), information);
            IEnumerable <SyntaxPair <NodeWithVector> > similarities = analyzer.FindAll();
        }
コード例 #2
0
        private void AnalyzeClassSuperTrees(SyntaxNodeAnalysisContext context)
        {
            ClassDeclarationSyntax @class = context.Node as ClassDeclarationSyntax;

            LeavesInClass         source      = new LeavesInClass(@class);
            NodeToNode            pre         = new NodeToNode();
            SingleTreeInformation information = new SingleTreeInformation(context.SemanticModel);
            ISyntaxComparator <SyntaxLeafPair <NodeAsRepresentation>, NodeAsRepresentation, SingleTreeInformation> comparator = new SuperTreeComparator <SyntaxLeafPair <NodeAsRepresentation>, NodeAsRepresentation, SingleTreeInformation>();

            SimilarityFinder <SyntaxLeafPair <NodeAsRepresentation>, NodeAsRepresentation, SingleTreeInformation> analyzer = new SimilarityFinder <SyntaxLeafPair <NodeAsRepresentation>, NodeAsRepresentation, SingleTreeInformation>(source, pre, Enumerable.Repeat(comparator, 1).ToList(), information);
            IEnumerable <SyntaxLeafPair <NodeAsRepresentation> > similarities = analyzer.FindAll();
        }
コード例 #3
0
        private void AnalyzeClassSubTrees(SyntaxNodeAnalysisContext context)
        {
            ClassDeclarationSyntax @class = context.Node as ClassDeclarationSyntax;

            MethodFragmentsInClass source = new MethodFragmentsInClass(@class);
            NodeToNode             pre    = new NodeToNode();
            ISyntaxComparator <SyntaxPair <NodeAsRepresentation>, NodeAsRepresentation, SingleTreeInformation> comparator = (ISyntaxComparator <SyntaxPair <NodeAsRepresentation>, NodeAsRepresentation, SingleTreeInformation>) new StructuralComparator <SyntaxPair <NodeAsRepresentation>, NodeAsRepresentation, SingleTreeInformation>();
            SingleTreeInformation information = new SingleTreeInformation(context.SemanticModel);

            SimilarityFinder <SyntaxPair <NodeAsRepresentation>, NodeAsRepresentation, SingleTreeInformation> analyzer = new SimilarityFinder <SyntaxPair <NodeAsRepresentation>, NodeAsRepresentation, SingleTreeInformation>(source, pre, Enumerable.Repeat(comparator, 1).ToList(), information);
            IEnumerable <SyntaxPair <NodeAsRepresentation> > similarities = analyzer.FindAll();

            SyntaxPair <NodeAsRepresentation> similarity = similarities.OrderByDescending(s => s.Left.Node.DescendantNodes().Count()).Take(1).Single();


            Report(context, similarity.Left.Node, similarity.Right.Node);
        }
コード例 #4
0
        private void FindDuplicates(SyntaxNodeAnalysisContext context)
        {
            var @class = context.Node as ClassDeclarationSyntax;

            var source = new MethodFragmentsInClass(@class, 20);
            var pre    = new NodeToVector();
            ISyntaxComparator <SyntaxPair <NodeWithVector>, NodeWithVector, SingleTreeInformation> vectorComparator     = new VectorComparator <SyntaxPair <NodeWithVector>, NodeWithVector, SingleTreeInformation>();
            ISyntaxComparator <SyntaxPair <NodeWithVector>, NodeWithVector, SingleTreeInformation> comparator           = new StructuralComparator <SyntaxPair <NodeWithVector>, NodeWithVector, SingleTreeInformation>();
            ISyntaxComparator <SyntaxPair <NodeWithVector>, NodeWithVector, SingleTreeInformation> dfComparator         = new DataflowComparator <SyntaxPair <NodeWithVector>, NodeWithVector, SingleTreeInformation>();
            ISyntaxComparator <SyntaxPair <NodeWithVector>, NodeWithVector, SingleTreeInformation> semanticComparator   = new CompatibleComparator <SyntaxPair <NodeWithVector>, NodeWithVector, SingleTreeInformation>();
            ISyntaxComparator <SyntaxPair <NodeWithVector>, NodeWithVector, SingleTreeInformation> member               = new RefactorableMemberAccessComparator <SyntaxPair <NodeWithVector>, NodeWithVector, SingleTreeInformation>();
            ISyntaxComparator <SyntaxPair <NodeWithVector>, NodeWithVector, SingleTreeInformation> invocationComparator = new RefactorableInvocationsComparator <SyntaxPair <NodeWithVector>, NodeWithVector, SingleTreeInformation>();
            var information = new SingleTreeInformation(context.SemanticModel);

            var analyzer = new SimilarityFinder <SyntaxPair <NodeWithVector>, NodeWithVector, SingleTreeInformation>(
                source,
                pre,
                new List <ISyntaxComparator <SyntaxPair <NodeWithVector>, NodeWithVector, SingleTreeInformation> >()
            {
                vectorComparator,
                comparator,
                dfComparator,
                semanticComparator,
                member,
                invocationComparator
            },
                information);
            var similarities = analyzer.FindAll();

            similarities = similarities.OrderByDescending(s => s.Left.Node.DescendantNodes().Count());

            var reportedSimilarities = new List <SyntaxNode>();

            foreach (var similarity in similarities)
            {
                if (!reportedSimilarities.Any(node => node.Contains(similarity.Left.Node)))
                {
                    reportedSimilarities.Add(similarity.Left.Node);
                    Report(context, similarity.Left.Node, similarity.Right.Node);
                }
            }
        }