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); }
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); }
private AbstractSyntaxTreeMetric RemoveExcessLevels(AbstractSyntaxTreeMetric metric, int rightSize, ref IList <AbstractSyntaxTreeAnalysisLevel> left) { for (; rightSize < left.Count; rightSize++) { metric.Deletions += left[rightSize].Nodes.Count; } return(metric); }
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++; } } }
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; }
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); }