Skip to content

Commit 78f2079

Browse files
Create TraversalPropertyArgumentLabel.scala
1 parent 0fa033e commit 78f2079

1 file changed

Lines changed: 83 additions & 0 deletions

File tree

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
package io.shiftleft.codepropertygraph.generated.traversals
2+
3+
import io.shiftleft.codepropertygraph.generated.nodes
4+
import io.shiftleft.codepropertygraph.generated.accessors.languagebootstrap.*
5+
6+
final class TraversalPropertyArgumentLabel[NodeType <: nodes.StoredNode & nodes.StaticType[nodes.HasArgumentLabelEMT]](
7+
val traversal: Iterator[NodeType]
8+
) extends AnyVal {
9+
10+
/** Traverse to argumentLabel property */
11+
def argumentLabel: Iterator[String] =
12+
traversal.flatMap(_.argumentLabel)
13+
14+
/** Traverse to nodes where the argumentLabel matches the regular expression `value`
15+
*/
16+
def argumentLabel(pattern: String): Iterator[NodeType] = {
17+
if (!flatgraph.misc.Regex.isRegex(pattern)) {
18+
argumentLabelExact(pattern)
19+
} else {
20+
val matcher = flatgraph.misc.Regex.multilineMatcher(pattern)
21+
traversal.filter { item =>
22+
val tmp = item.argumentLabel; tmp.isDefined && matcher.reset(tmp.get).matches
23+
}
24+
}
25+
}
26+
27+
/** Traverse to nodes where the argumentLabel matches at least one of the regular expressions in `values`
28+
*/
29+
def argumentLabel(patterns: String*): Iterator[NodeType] = {
30+
val matchers = patterns.map(flatgraph.misc.Regex.multilineMatcher)
31+
traversal.filter { item =>
32+
val tmp = item.argumentLabel; tmp.isDefined && matchers.exists { _.reset(tmp.get).matches }
33+
}
34+
}
35+
36+
/** Traverse to nodes where argumentLabel matches `value` exactly.
37+
*/
38+
def argumentLabelExact(value: String): Iterator[NodeType] = traversal match {
39+
case init: flatgraph.misc.InitNodeIterator[flatgraph.GNode @unchecked] if init.isVirgin && init.hasNext =>
40+
val someNode = init.next
41+
flatgraph.Accessors
42+
.getWithInverseIndex(someNode.graph, someNode.nodeKind, 2, value)
43+
.asInstanceOf[Iterator[NodeType]]
44+
case _ =>
45+
traversal.filter { node =>
46+
val tmp = node.argumentLabel; tmp.isDefined && tmp.get == value
47+
}
48+
}
49+
50+
/** Traverse to nodes where argumentLabel matches one of the elements in `values` exactly.
51+
*/
52+
def argumentLabelExact(values: String*): Iterator[NodeType] =
53+
if (values.length == 1) argumentLabelExact(values.head)
54+
else {
55+
val valueSet = values.toSet
56+
traversal.filter { item =>
57+
val tmp = item.argumentLabel; tmp.isDefined && valueSet.contains(tmp.get)
58+
}
59+
}
60+
61+
/** Traverse to nodes where argumentLabel does not match the regular expression `value`.
62+
*/
63+
def argumentLabelNot(pattern: String): Iterator[NodeType] = {
64+
if (!flatgraph.misc.Regex.isRegex(pattern)) {
65+
traversal.filter { node => node.argumentLabel.isEmpty || node.argumentLabel.get != pattern }
66+
} else {
67+
val matcher = flatgraph.misc.Regex.multilineMatcher(pattern)
68+
traversal.filterNot { item =>
69+
val tmp = item.argumentLabel; tmp.isDefined && matcher.reset(tmp.get).matches
70+
}
71+
}
72+
}
73+
74+
/** Traverse to nodes where argumentLabel does not match any of the regular expressions in `values`.
75+
*/
76+
def argumentLabelNot(patterns: String*): Iterator[NodeType] = {
77+
val matchers = patterns.map(flatgraph.misc.Regex.multilineMatcher)
78+
traversal.filterNot { item =>
79+
val tmp = item.argumentLabel; tmp.isDefined && matchers.exists { _.reset(tmp.get).matches }
80+
}
81+
}
82+
83+
}

0 commit comments

Comments
 (0)