コード例 #1
0
 public int IndexOf(AbstractSyntaxTreeAnalysisLevel level, AbstractSyntaxTreeAnalysisNodeWrapper node)
 {
     for (var index = 0; index < level.Nodes.Count; index++)
     {
         var astAnalysisNode = level.Nodes[index];
         if (astAnalysisNode.Used == false && astAnalysisNode.Node == node.Node)
         {
             return(index);
         }
     }
     return(-1);
 }
コード例 #2
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;
        }
コード例 #3
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);
        }
コード例 #4
0
        private int FindBestNode(int index, ref IList <AbstractSyntaxTreeAnalysisLevel> expected,
                                 AbstractSyntaxTreeAnalysisNodeWrapper compareAnalysisNode)
        {
            var bestScore      = -1;
            var bestMatchIndex = -1;

            for (var i = 0; i < expected[index].Nodes.Count; i++)
            {
                var analysisNode = expected[index].Nodes[i];

                if (!analysisNode.Used && analysisNode.Node.Value == compareAnalysisNode.Node.Value &&
                    analysisNode.Node.Height == compareAnalysisNode.Node.Height)
                {
                    var score = CompareChildren(analysisNode.Node, compareAnalysisNode.Node);

                    if (score > bestScore)
                    {
                        bestMatchIndex = i;
                        bestScore      = score;
                    }
                }
            }
            return(bestMatchIndex);
        }