Skip to content

Commit d733696

Browse files
committed
Back to reality.
1 parent 2e9629c commit d733696

File tree

8 files changed

+79
-79
lines changed

8 files changed

+79
-79
lines changed

performance/src/main/scala/MyTests.scala

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import org.openjdk.jmh.annotations._
1111
import MyTests._
1212
import io.shiftleft.semanticcpg.language.types.structure.LocalReferencingIdentifiers
1313

14-
import scala.collection.{View, mutable}
14+
import scala.collection.{IndexedSeqView, View, mutable}
1515
import scala.collection.mutable.{ArrayBuffer, ListBuffer}
1616
import org.openjdk.jmh.infra.Blackhole
1717
import overflowdb.traversal.Traversal
@@ -131,8 +131,8 @@ class MyTestNew {
131131
def compileTest(state: MyState) = {
132132
val a: D2 = state.d1.toD2
133133
val b: Option[D2] = Option(state.d1).toD2
134-
val c = toSynthIter(Array(state.d1).view.slice(1,2)).toD2
135-
val d: View[D2] = c
134+
val c = toSynthOption(Array(state.d1).view.slice(1,2)).toD2
135+
val d: IndexedSeqView[D2] = c
136136
}
137137
}
138138

performance/src/main/scala/some/SomeDomain.scala

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,23 +7,19 @@ import scala.collection.IterableOnceOps
77

88

99
object SomeDomain {
10-
implicit def toSynthSingle[I <: D1](p: I): SynthExt[I, Single, Nothing] = {
10+
implicit def toSynthSingle[I <: D1](p: I): SynthExt[I, Single] = {
1111
new SynthExt(p: Single[I])
1212
}
1313

14-
implicit def toSynthOption[I <: D1](trav: Option[I]): SynthExt[I, Option, Nothing] = {
14+
implicit def toSynthOption[I <: D1, IT[_]](trav: IT[I]): SynthExt[I, IT] = {
1515
new SynthExt(trav)
1616
}
1717

18-
implicit def toSynthIter[I <: D1, CC[_], C](trav: IterableOnceOps[I, CC, C]): SynthExt[I, ({type X[A] = IterableOnceOps[A, CC, C]})#X, IterTypes[CC, C]] = {
19-
new SynthExt[I, ({type X[A] = IterableOnceOps[A, CC, C]})#X, IterTypes[CC, C]](trav)
20-
}
21-
22-
class SynthExt[I <: D1, IT[_], Marker](val trav: IT[I]) extends AnyVal {
23-
def toD2(implicit ops: TravOps[IT, Marker]) = {
18+
class SynthExt[I <: D1, IT[_]](val trav: IT[I]) extends AnyVal {
19+
def toD2(implicit ops: TravOps[IT]) = {
2420
trav.map(_.x)
2521
}
26-
def toD2Multi(implicit ops: TravOps[IT, Marker]) = {
22+
def toD2Multi(implicit ops: TravOps[IT]) = {
2723
trav.flatMap(Iterator.single)
2824
}
2925
}

semanticcpg/src/main/scala/io/shiftleft/semanticcpg/langv2/AnyTraversal.scala

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,52 +5,49 @@ import overflowdb.traversal.RepeatStepIterator
55
import scala.collection.IterableOnceOps
66

77
trait AnyTraversalImplicits {
8-
implicit def toAnyTraversalIterOnceOps[I, CC[_], C](trav: IterableOnceOps[I, CC, C]) = {
9-
new AnyTraversal[I, ({type X[A] = IterableOnceOps[A, CC, C]})#X, IterTypes[CC, C]](trav)
10-
}
11-
implicit def toAnyTraversalInternal[I, IT[_], Marker](trav: IT[I]) = {
12-
new AnyTraversal[I, IT, Marker](trav)
8+
implicit def toAnyTraversalInternal[I, IT[_]](trav: IT[I]) = {
9+
new AnyTraversal[I, IT](trav)
1310
}
1411
}
1512

16-
class AnyTraversal[I, IT[_], Marker](val trav: IT[I]) extends AnyVal {
13+
class AnyTraversal[I, IT[_]](val trav: IT[I]) extends AnyVal {
1714

18-
def cast[A](implicit ops: TravOps[IT, Marker]): ops.CCOneToOne[A] = {
15+
def cast[A](implicit ops: TravOps[IT]): ops.CCOneToOne[A] = {
1916
trav.asInstanceOf[ops.CCOneToOne[A]]
2017
}
2118

22-
def map[O](f: I => O)(implicit ops: TravOps[IT, Marker]): ops.CCOneToOne[O] = {
19+
def map[O](f: I => O)(implicit ops: TravOps[IT]): ops.CCOneToOne[O] = {
2320
ops.oneToOne(trav)(f)
2421
}
2522

26-
def filter(f: I => Boolean)(implicit ops: TravOps[IT, Marker]): ops.CCOneToBoolean[I] = {
23+
def filter(f: I => Boolean)(implicit ops: TravOps[IT]): ops.CCOneToBoolean[I] = {
2724
ops.oneToBoolean(trav)(f)
2825
}
2926

30-
def flatMap[O](f: I => Iterator[O])(implicit ops: TravOps[IT, Marker]): ops.CCOneToMany[O] = {
27+
def flatMap[O](f: I => Iterator[O])(implicit ops: TravOps[IT]): ops.CCOneToMany[O] = {
3128
ops.oneToMany(trav)(f)
3229
}
3330

3431
// We dont use ClassTag and instead use our own IsInstanceOfOps for performance reasons.
35-
def collectAll[T](implicit ops: TravOps[IT, Marker], isInstanceOfOps: IsInstanceOfOps[T]): ops.CCOneToBoolean[T] = {
32+
def collectAll[T](implicit ops: TravOps[IT], isInstanceOfOps: IsInstanceOfOps[T]): ops.CCOneToBoolean[T] = {
3633
ops.oneToBoolean(trav)(isInstanceOfOps).asInstanceOf[ops.CCOneToBoolean[T]]
3734
}
3835

3936
def rMap[O <: I](f: I => O, g: RepeatBehaviourBuilder[I] => RepeatBehaviourBuilder[I] = identity)(
40-
implicit ops: TravOps[IT, Marker]): ops.CCOneToMany[I] = {
37+
implicit ops: TravOps[IT]): ops.CCOneToMany[I] = {
4138
val behaviour = g(new RepeatBehaviourBuilder()).build
4239
ops.oneToMany(trav)(i => new RepeatStepIterator(i, f.andThen(Iterator.single), behaviour))
4340
}
4441

4542
def rFlatMap[O <: I](f: I => Iterator[O], g: RepeatBehaviourBuilder[I] => RepeatBehaviourBuilder[I] = identity)(
46-
implicit ops: TravOps[IT, Marker]): ops.CCOneToMany[I] = {
43+
implicit ops: TravOps[IT]): ops.CCOneToMany[I] = {
4744
val behaviour = g(new RepeatBehaviourBuilder()).build
4845
ops.oneToMany(trav)(i => new RepeatStepIterator(i, f, behaviour))
4946
}
5047

5148
@deprecated("Use rFlatMap instead")
5249
def repeat[O <: I](f: I => Iterator[O], g: RepeatBehaviourBuilder[I] => RepeatBehaviourBuilder[I] = identity)(
53-
implicit ops: TravOps[IT, Marker]): ops.CCOneToMany[I] = {
50+
implicit ops: TravOps[IT]): ops.CCOneToMany[I] = {
5451
rFlatMap(f, g)
5552
}
5653

semanticcpg/src/main/scala/io/shiftleft/semanticcpg/langv2/TravOps.scala

Lines changed: 43 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import scala.collection.IterableOnceOps
1010
* @tparam FlatMapTraversal Flat map operation output traversal type.
1111
* Abbreviated in other generics as FT.
1212
*/
13-
trait TravOps[_Collection[_], ExtraTypes] {
13+
trait TravOps[_Collection[_]] {
1414
type Collection[T] = _Collection[T]
1515
type CCOneToOne[_]
1616
type CCOneToOption[_]
@@ -23,52 +23,52 @@ trait TravOps[_Collection[_], ExtraTypes] {
2323
def oneToMany[I, O](trav: Collection[I])(f: I => Iterator[O]): CCOneToMany[O]
2424
}
2525

26-
object SingleOps extends TravOps[Single, Nothing] {
26+
object SingleOps extends TravOps[Single] {
2727
override type CCOneToOne[T] = T
2828
override type CCOneToOption[T] = Option[T]
2929
override type CCOneToBoolean[T] = Option[T]
3030
override type CCOneToMany[T] = Seq[T]
3131

32-
override def oneToOne[I, O](trav: this.Collection[I])(f: I => O): CCOneToOne[O] = {
32+
override def oneToOne[I, O](trav: Collection[I])(f: I => O): CCOneToOne[O] = {
3333
f(trav)
3434
}
3535

36-
override def oneToOption[I, O](trav: this.Collection[I])(f: I => Option[O]): CCOneToOption[O] = {
36+
override def oneToOption[I, O](trav: Collection[I])(f: I => Option[O]): CCOneToOption[O] = {
3737
f(trav)
3838
}
3939

40-
override def oneToBoolean[I](trav: this.Collection[I])(f: I => Boolean): CCOneToBoolean[I] = {
40+
override def oneToBoolean[I](trav: Collection[I])(f: I => Boolean): CCOneToBoolean[I] = {
4141
if (f(trav)) {
4242
Some(trav)
4343
} else {
4444
None
4545
}
4646
}
4747

48-
override def oneToMany[I, O](trav: this.Collection[I])(f: I => Iterator[O]): CCOneToMany[O] = {
48+
override def oneToMany[I, O](trav: Collection[I])(f: I => Iterator[O]): CCOneToMany[O] = {
4949
Seq.from(f(trav))
5050
}
5151
}
5252

53-
object OptionOps extends TravOps[Option, Nothing] {
53+
object OptionOps extends TravOps[Option] {
5454
override type CCOneToOne[T] = Option[T]
5555
override type CCOneToOption[T] = Option[T]
5656
override type CCOneToBoolean[T] = Option[T]
5757
override type CCOneToMany[T] = Seq[T]
5858

59-
override def oneToOne[I, O](trav: this.Collection[I])(f: I => O): CCOneToOne[O] = {
59+
override def oneToOne[I, O](trav: Collection[I])(f: I => O): CCOneToOne[O] = {
6060
trav.map(f)
6161
}
6262

63-
override def oneToOption[I, O](trav: this.Collection[I])(f: I => Option[O]): CCOneToOption[O] = {
63+
override def oneToOption[I, O](trav: Collection[I])(f: I => Option[O]): CCOneToOption[O] = {
6464
trav.flatMap(f)
6565
}
6666

67-
override def oneToBoolean[I](trav: this.Collection[I])(f: I => Boolean): CCOneToBoolean[I] = {
67+
override def oneToBoolean[I](trav: Collection[I])(f: I => Boolean): CCOneToBoolean[I] = {
6868
trav.filter(f)
6969
}
7070

71-
override def oneToMany[I, O](trav: this.Collection[I])(f: I => Iterator[O]): CCOneToMany[O] = {
71+
override def oneToMany[I, O](trav: Collection[I])(f: I => Iterator[O]): CCOneToMany[O] = {
7272
trav match {
7373
case Some(t) =>
7474
Seq.from(f(t))
@@ -78,30 +78,48 @@ object OptionOps extends TravOps[Option, Nothing] {
7878
}
7979
}
8080

81-
class IterTypes[_CC[_], _C] {
82-
type CC[T] = _CC[T]
83-
type C = _C
84-
}
85-
86-
class IterableOnceOpsOps[CC[_], C] extends TravOps[({type X[A] = IterableOnceOps[A, CC, C]})#X, IterTypes[CC, C]] {
87-
override type CCOneToOne[T] = CC[T]
88-
override type CCOneToOption[T] = CC[T]
89-
override type CCOneToBoolean[T] = C
90-
override type CCOneToMany[T] = CC[T]
81+
object IteratorOps extends TravOps[Iterator] {
82+
override type CCOneToOne[T] = Iterator[T]
83+
override type CCOneToOption[T] = Iterator[T]
84+
override type CCOneToBoolean[T] = Iterator[T]
85+
override type CCOneToMany[T] = Iterator[T]
9186

92-
override def oneToOne[I, O](trav: this.Collection[I])(f: I => O): CCOneToOne[O] = {
87+
override def oneToOne[I, O](trav: Collection[I])(f: I => O): CCOneToOne[O] = {
9388
trav.map(f)
9489
}
9590

96-
override def oneToOption[I, O](trav: this.Collection[I])(f: I => Option[O]): CCOneToOption[O] = {
91+
override def oneToOption[I, O](trav: Collection[I])(f: I => Option[O]): CCOneToOption[O] = {
9792
trav.flatMap(f)
9893
}
9994

100-
override def oneToBoolean[I](trav: this.Collection[I])(f: I => Boolean): CCOneToBoolean[I] = {
95+
override def oneToBoolean[I](trav: Collection[I])(f: I => Boolean): CCOneToBoolean[I] = {
10196
trav.filter(f)
10297
}
10398

104-
override def oneToMany[I, O](trav: this.Collection[I])(f: I => Iterator[O]): CCOneToMany[O] = {
99+
override def oneToMany[I, O](trav: Collection[I])(f: I => Iterator[O]): CCOneToMany[O] = {
105100
trav.flatMap(f)
106101
}
107102
}
103+
104+
class IterableOps[IT[T] <: Iterable[T]] extends TravOps[IT] {
105+
override type CCOneToOne[T] = IT[T]
106+
override type CCOneToOption[T] = IT[T]
107+
override type CCOneToBoolean[T] = IT[T]
108+
override type CCOneToMany[T] = IT[T]
109+
110+
override def oneToOne[I, O](trav: Collection[I])(f: I => O): CCOneToOne[O] = {
111+
trav.map(f).asInstanceOf[IT[O]]
112+
}
113+
114+
override def oneToOption[I, O](trav: Collection[I])(f: I => Option[O]): CCOneToOption[O] = {
115+
trav.flatMap(f).asInstanceOf[IT[O]]
116+
}
117+
118+
override def oneToBoolean[I](trav: Collection[I])(f: I => Boolean): CCOneToBoolean[I] = {
119+
trav.filter(f).asInstanceOf[IT[I]]
120+
}
121+
122+
override def oneToMany[I, O](trav: Collection[I])(f: I => Iterator[O]): CCOneToMany[O] = {
123+
trav.flatMap(f).asInstanceOf[IT[O]]
124+
}
125+
}

semanticcpg/src/main/scala/io/shiftleft/semanticcpg/langv2/package.scala

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ package object langv2 extends ExtensionClassImplicits with AnyTraversalImplicits
55

66
implicit val singleOps = SingleOps
77
implicit val optionOps = OptionOps
8-
private val it2Ops = new IterableOnceOpsOps()
9-
implicit def toIt2Ops[CC[_], C] = it2Ops.asInstanceOf[IterableOnceOpsOps[CC, C]]
8+
implicit val iteratorOps = IteratorOps
9+
private val it2Ops = new IterableOps()
10+
implicit def toIt2Ops[IT[T] <: Iterable[T]] = it2Ops.asInstanceOf[IterableOps[IT]]
1011

1112
}

semanticcpg/src/main/scala/io/shiftleft/semanticcpg/langv2/types/expressions/generalizations/AstNodeTraversal.scala

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,33 +9,29 @@ import scala.jdk.CollectionConverters._
99

1010

1111
trait AstNodeTraversalImplicits {
12-
implicit def toAstNodeTraversalSingle[I <: AstNode](trav: I): AstNodeTraversal[I, Single, Nothing] = {
12+
implicit def toAstNodeTraversalSingle[I <: AstNode](trav: I): AstNodeTraversal[I, Single] = {
1313
new AstNodeTraversal(trav: Single[I])
1414
}
15-
implicit def toAstNodeTraversalGeneric[I <: AstNode](trav: Option[I]): AstNodeTraversal[I, Option, Nothing] = {
15+
implicit def toAstNodeTraversalGeneric[I <: AstNode, IT[_]](trav: IT[I]): AstNodeTraversal[I, IT] = {
1616
new AstNodeTraversal(trav)
1717
}
18-
implicit def toAstNodeTraversalIterOnceOps[I <: AstNode, CC[_], C](trav: IterableOnceOps[I, CC, C])
19-
: AstNodeTraversal[I, ({type X[A] = IterableOnceOps[A, CC, C]})#X, IterTypes[CC, C]] = {
20-
new AstNodeTraversal[I, ({type X[A] = IterableOnceOps[A, CC, C]})#X, IterTypes[CC, C]](trav)
21-
}
2218

2319
}
2420

25-
class AstNodeTraversal[I <: AstNode, IT[_], Marker](val trav: IT[I])
21+
class AstNodeTraversal[I <: AstNode, IT[_]](val trav: IT[I])
2622
extends AnyVal {
2723

2824
/**
2925
* Nodes of the AST rooted in this node, including the node itself.
3026
* */
3127
@Doc("All nodes of the abstract syntax tree")
32-
def ast(implicit ops1: TravOps[IT, Marker]) =
28+
def ast(implicit ops1: TravOps[IT]) =
3329
trav.rFlatMap(_._astOut.asScala.asInstanceOf[Iterator[I]], _.emit)
3430

3531
/**
3632
* Traverse only to AST nodes that are expressions
3733
* */
38-
def isExpression(implicit ops1: TravOps[IT, Marker]) =
34+
def isExpression(implicit ops1: TravOps[IT]) =
3935
trav.collectAll[Expression]
4036

4137
}

semanticcpg/src/main/scala/io/shiftleft/semanticcpg/langv2/types/structure/LocalTraversal.scala

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,20 +8,16 @@ import scala.collection.IterableOnceOps
88
import scala.jdk.CollectionConverters._
99

1010
trait LocalTraversalImplicits {
11-
implicit def toLocalTraversalSingle[I <: nodes.Local](trav: I): LocalTraversal[I, Single, Nothing] = {
11+
implicit def toLocalTraversalSingle[I <: nodes.Local](trav: I): LocalTraversal[I, Single] = {
1212
new LocalTraversal(trav: Single[I])
1313
}
14-
implicit def toLocalTraversalGeneric[I <: nodes.Local](trav: Option[I]): LocalTraversal[I, Option, Nothing] = {
14+
implicit def toLocalTraversalGeneric[I <: nodes.Local, IT[_]](trav: IT[I]): LocalTraversal[I, IT] = {
1515
new LocalTraversal(trav)
1616
}
17-
implicit def toLocalTraversalIterOnceOps[I <: nodes.Local, CC[_], C](trav: IterableOnceOps[I, CC, C])
18-
: LocalTraversal[I, ({type X[A] = IterableOnceOps[A, CC, C]})#X, IterTypes[CC, C]] = {
19-
new LocalTraversal[I, ({type X[A] = IterableOnceOps[A, CC, C]})#X, IterTypes[CC, C]](trav)
20-
}
2117
}
2218

23-
class LocalTraversal[I <: nodes.Local, IT[_], Marker](val trav: IT[I]) extends AnyVal {
24-
def referencingIdentifiers(implicit ops1: TravOps[IT, Marker]): ops1.CCOneToMany[Identifier] = {
19+
class LocalTraversal[I <: nodes.Local, IT[_]](val trav: IT[I]) extends AnyVal {
20+
def referencingIdentifiers(implicit ops1: TravOps[IT]): ops1.CCOneToMany[Identifier] = {
2521
trav.flatMap(_._refIn.asScala.filter(_.label == NodeTypes.IDENTIFIER)
2622
.cast[Identifier])
2723
}

semanticcpg/src/main/scala/io/shiftleft/semanticcpg/langv2/types/structure/MethodTraversal.scala

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,37 +9,33 @@ import scala.collection.IterableOnceOps
99
import scala.jdk.CollectionConverters._
1010

1111
trait MethodTraversalImplicits {
12-
implicit def toMethodTraversalSingle[I <: nodes.Method](trav: I): MethodTraversal[I, Single, Nothing] = {
12+
implicit def toMethodTraversalSingle[I <: nodes.Method](trav: I): MethodTraversal[I, Single] = {
1313
new MethodTraversal(trav: Single[I])
1414
}
15-
implicit def toMethodTraversalGeneric[I <: nodes.Method](trav: Option[I]): MethodTraversal[I, Option, Nothing] = {
15+
implicit def toMethodTraversalGeneric[I <: nodes.Method, IT[_]](trav: IT[I]): MethodTraversal[I, IT] = {
1616
new MethodTraversal(trav)
1717
}
18-
implicit def toMethodTraversalIterOnceOps[I <: nodes.Method, CC[_], C](trav: IterableOnceOps[I, CC, C])
19-
: MethodTraversal[I, ({type X[A] = IterableOnceOps[A, CC, C]})#X, IterTypes[CC, C]] = {
20-
new MethodTraversal[I, ({type X[A] = IterableOnceOps[A, CC, C]})#X, IterTypes[CC, C]](trav)
21-
}
2218
}
2319

2420
/**
2521
* A method, function, or procedure
2622
* */
2723
@help.Traversal(elementType = classOf[nodes.Method])
28-
class MethodTraversal[I <: nodes.Method, IT[_], Marker](val trav: IT[I]) extends AnyVal {
24+
class MethodTraversal[I <: nodes.Method, IT[_]](val trav: IT[I]) extends AnyVal {
2925

3026
/**
3127
* Traverse to parameters of the method
3228
* */
3329
@Doc("All parameters")
34-
def parameter(implicit ops1: TravOps[IT, Marker]) = {
30+
def parameter(implicit ops1: TravOps[IT]) = {
3531
ops1.oneToMany(trav)(_._astOut.asScala.collect { case par: nodes.MethodParameterIn => par })
3632
}
3733

3834
/**
3935
* Traverse to formal return parameter
4036
* */
4137
@Doc("All formal return parameters")
42-
def methodReturn(implicit ops1: TravOps[IT, Marker]) = {
38+
def methodReturn(implicit ops1: TravOps[IT]) = {
4339
ops1.oneToOne(trav)(_._astOut.asScala.collectFirst { case ret: nodes.MethodReturn => ret }.get)
4440
}
4541

0 commit comments

Comments
 (0)