2 using System.Collections.Generic;
\r
3 using System.ComponentModel.Composition;
\r
6 using System.Xml.Linq;
\r
8 using Paraiba.Xml.Linq;
\r
10 namespace CoverageFramework.Element.Selector.Java2
\r
12 [Export(typeof(IXElementSelector))]
\r
13 public class ConditionalTermSelector : IXElementSelector
\r
15 private static readonly string[] TargetNames = {
\r
16 "logical_or_expression",
\r
17 "logical_and_expression",
\r
20 private static readonly string[] WithoutParentNames = {
\r
21 "postfix_expression",
\r
24 public IEnumerable<XElement> Select(XElement root)
\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
33 var targets = targetParents
\r
34 .SelectMany(e => e.Elements().OddIndexElements());
\r
36 // 他の項の要素を含まない項の要素のみを抽出
\r
37 // a == b && (a == c || a == d) => a == b, a == c, a == d
\r
38 var atomicTargets = targets.Independents().ToList();
\r
41 atomicTargets.Sort((e1, e2) => e1.IsBefore(e2) ? -1 : 1);
\r
43 return atomicTargets;
\r