OSDN Git Service

.
[codecoverage/main.git] / CoverageFramework / Element / Selector / Java2 / ConditionalTermSelector.cs
1 using System;\r
2 using System.Collections.Generic;\r
3 using System.ComponentModel.Composition;\r
4 using System.Linq;\r
5 using System.Text;\r
6 using System.Xml.Linq;\r
7 using Paraiba.Linq;\r
8 using Paraiba.Xml.Linq;\r
9 \r
10 namespace CoverageFramework.Element.Selector.Java2\r
11 {\r
12         [Export(typeof(IXElementSelector))]\r
13         public class ConditionalTermSelector : IXElementSelector\r
14         {\r
15                 private static readonly string[] TargetNames = {\r
16                         "logical_or_expression",\r
17                         "logical_and_expression",\r
18                 };\r
19 \r
20                 private static readonly string[] WithoutParentNames = {\r
21                         "postfix_expression",\r
22                 };\r
23 \r
24                 public IEnumerable<XElement> Select(XElement root)\r
25                 {\r
26                         var targetParents = root.Descendants()\r
27                                 .Where(e => TargetNames.Any(e.Name.LocalName.EndsWith))\r
28                                 .Where(e => e.Elements().Count() >= 3)\r
29                                 .Where(e => e.ParentsWhile(root)\r
30                                         .Where(e2 => WithoutParentNames.Contains(e2.Name.LocalName))\r
31                                         .All(e2 => e2.Elements().Count() == 1)\r
32                                 );\r
33                         var targets = targetParents\r
34                                 .SelectMany(e => e.Elements().OddIndexElements());\r
35 \r
36                         // 他の項の要素を含まない項の要素のみを抽出\r
37                         // a == b && (a == c || a == d) => a == b, a == c, a == d\r
38                         var atomicTargets = targets.Independents().ToList();\r
39 \r
40                         // XML要素の位置でソーティング\r
41                         atomicTargets.Sort((e1, e2) => e1.IsBefore(e2) ? -1 : 1);\r
42 \r
43                         return atomicTargets;\r
44                 }\r
45         }\r
46 }\r