Skip to content

Commit b823397

Browse files
authored
Add missing file. (#1803)
1 parent e103130 commit b823397

File tree

1 file changed

+70
-0
lines changed

1 file changed

+70
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
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 TraversalPropertyGenericSignature[
7+
NodeType <: nodes.StoredNode & nodes.StaticType[nodes.HasGenericSignatureEMT]
8+
](val traversal: Iterator[NodeType])
9+
extends AnyVal {
10+
11+
/** Traverse to genericSignature property */
12+
def genericSignature: Iterator[String] =
13+
traversal.map(_.genericSignature)
14+
15+
/** Traverse to nodes where the genericSignature matches the regular expression `value`
16+
*/
17+
def genericSignature(pattern: String): Iterator[NodeType] =
18+
if (!flatgraph.misc.Regex.isRegex(pattern)) {
19+
genericSignatureExact(pattern)
20+
} else {
21+
val matcher = flatgraph.misc.Regex.multilineMatcher(pattern)
22+
traversal.filter { item => matcher.reset(item.genericSignature).matches }
23+
}
24+
25+
/** Traverse to nodes where the genericSignature matches at least one of the regular expressions in `values`
26+
*/
27+
def genericSignature(patterns: String*): Iterator[NodeType] = {
28+
val matchers = patterns.map(flatgraph.misc.Regex.multilineMatcher)
29+
traversal.filter { item => matchers.exists { _.reset(item.genericSignature).matches } }
30+
}
31+
32+
/** Traverse to nodes where genericSignature matches `value` exactly.
33+
*/
34+
def genericSignatureExact(value: String): Iterator[NodeType] = traversal match {
35+
case init: flatgraph.misc.InitNodeIterator[flatgraph.GNode @unchecked] if init.isVirgin && init.hasNext =>
36+
val someNode = init.next
37+
flatgraph.Accessors
38+
.getWithInverseIndex(someNode.graph, someNode.nodeKind, 23, value)
39+
.asInstanceOf[Iterator[NodeType]]
40+
case _ => traversal.filter { _.genericSignature == value }
41+
}
42+
43+
/** Traverse to nodes where genericSignature matches one of the elements in `values` exactly.
44+
*/
45+
def genericSignatureExact(values: String*): Iterator[NodeType] =
46+
if (values.length == 1) genericSignatureExact(values.head)
47+
else {
48+
val valueSet = values.toSet
49+
traversal.filter { item => valueSet.contains(item.genericSignature) }
50+
}
51+
52+
/** Traverse to nodes where genericSignature does not match the regular expression `value`.
53+
*/
54+
def genericSignatureNot(pattern: String): Iterator[NodeType] = {
55+
if (!flatgraph.misc.Regex.isRegex(pattern)) {
56+
traversal.filter { node => node.genericSignature != pattern }
57+
} else {
58+
val matcher = flatgraph.misc.Regex.multilineMatcher(pattern)
59+
traversal.filterNot { item => matcher.reset(item.genericSignature).matches }
60+
}
61+
}
62+
63+
/** Traverse to nodes where genericSignature does not match any of the regular expressions in `values`.
64+
*/
65+
def genericSignatureNot(patterns: String*): Iterator[NodeType] = {
66+
val matchers = patterns.map(flatgraph.misc.Regex.multilineMatcher)
67+
traversal.filter { item => matchers.find { _.reset(item.genericSignature).matches }.isEmpty }
68+
}
69+
70+
}

0 commit comments

Comments
 (0)