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(); }
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(); }
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); }
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); } } }