コード例 #1
0
        private AbstractSyntaxTreeMetric RotateNodes(AbstractSyntaxTreeMetric metric, int index,
                                                     int nodeIndex, ref IList <AbstractSyntaxTreeAnalysisLevel> level,
                                                     AbstractSyntaxTreeNode node)
        {
            var compareNode = level[index].Nodes[nodeIndex].Node;

            for (var i = 0; i < node.Children.Count; i++)
            {
                var rotatingNode = -1;
                for (var j = i; j < compareNode.Children.Count && rotatingNode == -1; j++)
                {
                    if (compareNode.Children[j] == node.Children[i])
                    {
                        rotatingNode = j;
                    }
                }

                if (i == rotatingNode)
                {
                    continue;
                }

                if (rotatingNode != -1)
                {
                    compareNode.RemoveAt(rotatingNode);
                }

                compareNode.InsertAt(i, node.Children[i]);
                metric.Rotations++;
            }
            return(metric);
        }
コード例 #2
0
        private void CompareLevels(ref AbstractSyntaxTreeMetric metric, int index,
                                   ref IList <AbstractSyntaxTreeAnalysisLevel> expectedLevels,
                                   ref IList <AbstractSyntaxTreeAnalysisLevel> actualLevels)
        {
            if (expectedLevels.Count == index)
            {
                expectedLevels.Add(new AbstractSyntaxTreeAnalysisLevel()
                {
                    Height = index
                });
            }

            foreach (var analysisNode in actualLevels[index].Nodes)
            {
                var indexOfNode = IndexOf(expectedLevels[index], analysisNode);

                if (indexOfNode == -1)
                {
                    AdjustLevel(ref metric, index, ref expectedLevels, analysisNode);
                }
                else
                {
                    expectedLevels[index].Nodes[indexOfNode].Used = true;
                }
            }
            RemoveExcessAtLevel(ref metric, index, ref expectedLevels);
        }
コード例 #3
0
 private AbstractSyntaxTreeMetric RemoveExcessLevels(AbstractSyntaxTreeMetric metric, int rightSize, ref IList <AbstractSyntaxTreeAnalysisLevel> left)
 {
     for (; rightSize < left.Count; rightSize++)
     {
         metric.Deletions += left[rightSize].Nodes.Count;
     }
     return(metric);
 }
コード例 #4
0
        private void RemoveExcessAtLevel(ref AbstractSyntaxTreeMetric metric, int index,
                                         ref IList <AbstractSyntaxTreeAnalysisLevel> expected)
        {
            int levelIndex = 0;

            while (levelIndex < expected[index].Nodes.Count)
            {
                if (expected[index].Nodes[levelIndex].Used)
                {
                    levelIndex++;
                }
                else
                {
                    expected[index].Nodes.RemoveAt(levelIndex);
                    metric.Deletions++;
                }
            }
        }
コード例 #5
0
        private void AdjustLevel(ref AbstractSyntaxTreeMetric metric, int index,
                                 ref IList <AbstractSyntaxTreeAnalysisLevel> expectedLevel,
                                 AbstractSyntaxTreeAnalysisNodeWrapper node)
        {
            var bestNodeIndex = FindBestNode(index, ref expectedLevel, node);

            if (bestNodeIndex == -1)
            {
                expectedLevel[index].Nodes.Add(
                    new AbstractSyntaxTreeAnalysisNodeWrapper()
                {
                    Used = false,
                    Node = node.Node.Copy()
                });
                metric.Insertations++;
                bestNodeIndex = expectedLevel[index].Nodes.Count - 1;
            }

            metric = RotateNodes(metric, index, bestNodeIndex, ref expectedLevel, node.Node);
            expectedLevel[index].Nodes[bestNodeIndex].Used = true;
        }
コード例 #6
0
        public AbstractSyntaxTreeMetric InitialLevel(ref IList <AbstractSyntaxTreeAnalysisLevel> expectedLevels,
                                                     ref IList <AbstractSyntaxTreeAnalysisLevel> actualLevels)
        {
            var metric = new AbstractSyntaxTreeMetric();

            if (actualLevels.Count == 0)
            {
                return(metric);
            }

            if (expectedLevels.Count == 0)
            {
                expectedLevels.Add(new AbstractSyntaxTreeAnalysisLevel()
                {
                    Height = 1,
                });
            }

            foreach (var analysisNodeWrapper in actualLevels[0].Nodes)
            {
                var indexOfNode = IndexOf(expectedLevels[0], analysisNodeWrapper);

                if (indexOfNode == -1)
                {
                    var node = new AbstractSyntaxTreeAnalysisNodeWrapper()
                    {
                        Used = true,
                        Node = analysisNodeWrapper.Node.Copy()
                    };
                    expectedLevels[0].Nodes.Add(node);
                    metric.Insertations++;
                }
                else
                {
                    expectedLevels[0].Nodes[indexOfNode].Used = true;
                }
            }
            RemoveExcessAtLevel(ref metric, 0, ref expectedLevels);
            return(metric);
        }