Skip to content

Commit 87f7d84

Browse files
authored
stop using nested implicits... (#117)
... to avoid using nested implicits down the line - they have a few downsides: * they're deprecated these days * they cause problems in common IDEs * they increase code complexity includes #116 - review/merge that first (partial) fix for joernio/joern#796
1 parent d491955 commit 87f7d84

File tree

1 file changed

+28
-25
lines changed

1 file changed

+28
-25
lines changed

Diff for: codegen/src/main/scala/overflowdb/codegen/CodeGen.scala

+28-25
Original file line numberDiff line numberDiff line change
@@ -469,7 +469,7 @@ class CodeGen(schema: Schema) {
469469
}
470470

471471
s"""/** ${adjacentNode.customStepDoc.getOrElse("")}
472-
| * Traverse to ${neighbor.name} via ${adjacentNode.viaEdge.name}.
472+
| * Traverse to ${neighbor.name} via ${adjacentNode.viaEdge.name} $direction edge.
473473
| */ ${docAnnotationMaybe(adjacentNode.customStepDoc)}
474474
|def $accessorName: ${fullScalaType(neighbor, cardinality)} =
475475
| $edgeAccessorName.collectAll[${neighbor.className}]$appendix""".stripMargin
@@ -897,7 +897,7 @@ class CodeGen(schema: Schema) {
897897
case neighborNodeInfo if !neighborNodeInfo.isInherited =>
898898
val accessorNameForNode = accessorName(neighborNodeInfo)
899899
s"""/** ${neighborNodeInfo.customStepDoc.getOrElse("")}
900-
| * Traverse to ${neighborNodeInfo.neighborNode.name} via ${neighborNodeInfo.edge.name}.
900+
| * Traverse to ${neighborNodeInfo.neighborNode.name} via ${neighborNodeInfo.edge.name} $direction edge.
901901
| */ ${docAnnotationMaybe(neighborNodeInfo.customStepDoc)}
902902
|def $accessorNameForNode: ${neighborNodeInfo.returnType} = get().$accessorNameForNode""".stripMargin
903903
}.mkString("\n")
@@ -1131,7 +1131,7 @@ class CodeGen(schema: Schema) {
11311131
lazy val nodeTraversalImplicits = {
11321132
def implicitForNodeType(name: String) = {
11331133
val traversalName = s"${name}TraversalExtGen"
1134-
s"implicit def to$traversalName[NodeType <: $name](trav: Traversal[NodeType]): ${traversalName}[NodeType] = new $traversalName(trav)"
1134+
s"implicit def to$traversalName[NodeType <: $name](trav: IterableOnce[NodeType]): ${traversalName}[NodeType] = new $traversalName(trav)"
11351135
}
11361136

11371137
val implicitsForNodeTraversals =
@@ -1142,7 +1142,6 @@ class CodeGen(schema: Schema) {
11421142

11431143
s"""package $traversalsPackage
11441144
|
1145-
|import overflowdb.traversal.Traversal
11461145
|import $nodesPackage._
11471146
|
11481147
|trait NodeTraversalImplicits extends NodeBaseTypeTraversalImplicits {
@@ -1156,24 +1155,25 @@ class CodeGen(schema: Schema) {
11561155
|""".stripMargin
11571156
}
11581157

1159-
def generateCustomStepNameTraversals(nodeType: AbstractNodeType): String = {
1160-
nodeType.edges
1161-
.sortBy(_.customStepName)
1162-
.collect { case AdjacentNode(viaEdge, neighbor, cardinality, Some(customStepName), customStepDoc) =>
1163-
val mapOrFlatMap = cardinality match {
1164-
case Cardinality.One => "map"
1165-
case Cardinality.ZeroOrOne | Cardinality.List => "flatMap"
1166-
}
1167-
s"""/** ${customStepDoc.getOrElse("")}
1168-
| * Traverse to ${neighbor.name} via ${viaEdge.name} - this relationship was given a customStepName in the schema.
1169-
| */ ${docAnnotationMaybe(customStepDoc)}
1170-
|def $customStepName: Traversal[${neighbor.className}] =
1171-
| traversal.$mapOrFlatMap(_.$customStepName)
1172-
|""".stripMargin
1173-
}.mkString("\n")
1158+
def generateCustomStepNameTraversals(nodeType: AbstractNodeType): Seq[String] = {
1159+
for {
1160+
direction <- Seq(Direction.IN, Direction.OUT)
1161+
AdjacentNode(viaEdge, neighbor, cardinality, Some(customStepName), customStepDoc) <- nodeType.edges(direction).sortBy(_.customStepName)
1162+
} yield {
1163+
val mapOrFlatMap = cardinality match {
1164+
case Cardinality.One => "map"
1165+
case Cardinality.ZeroOrOne | Cardinality.List => "flatMap"
1166+
}
1167+
s"""/** ${customStepDoc.getOrElse("")}
1168+
| * Traverse to ${neighbor.name} via ${viaEdge.name} $direction edge.
1169+
| */ ${docAnnotationMaybe(customStepDoc)}
1170+
|def $customStepName: Traversal[${neighbor.className}] =
1171+
| traversal.$mapOrFlatMap(_.$customStepName)
1172+
|""".stripMargin
1173+
}
11741174
}
11751175

1176-
def generatePropertyTraversals(properties: Seq[Property[_]]): String = {
1176+
def generatePropertyTraversals(properties: Seq[Property[_]]): Seq[String] = {
11771177
import Property.Cardinality
11781178
properties.map { property =>
11791179
val nameCamelCase = camelCase(property.name)
@@ -1514,22 +1514,25 @@ class CodeGen(schema: Schema) {
15141514
|
15151515
| $filterSteps
15161516
|""".stripMargin
1517-
}.mkString("\n")
1517+
}
15181518
}
15191519

15201520
def generateNodeTraversalExt(nodeType: AbstractNodeType): String = {
1521+
val customStepNameTraversals = generateCustomStepNameTraversals(nodeType)
1522+
val propertyTraversals = generatePropertyTraversals(nodeType.properties)
15211523
val className = nodeType.className
1524+
15221525
s"""package $traversalsPackage
15231526
|
1524-
|import overflowdb.traversal.Traversal
1527+
|import overflowdb.traversal._
15251528
|import $nodesPackage._
15261529
|
15271530
|/** Traversal steps for $className */
1528-
|class ${className}TraversalExtGen[NodeType <: $className](val traversal: Traversal[NodeType]) extends AnyVal {
1531+
|class ${className}TraversalExtGen[NodeType <: $className](val traversal: IterableOnce[NodeType]) extends AnyVal {
15291532
|
1530-
|${generateCustomStepNameTraversals(nodeType)}
1533+
|${customStepNameTraversals.mkString("\n")}
15311534
|
1532-
|${generatePropertyTraversals(nodeType.properties)}
1535+
|${propertyTraversals.mkString("\n")}
15331536
|
15341537
|}""".stripMargin
15351538
}

0 commit comments

Comments
 (0)