Giter VIP home page Giter VIP logo

scala-sculpt's People

Contributors

adriaanm avatar dwijnand avatar hnrklssn avatar martijnhoekstra avatar scala-steward avatar sethtisue avatar szeiger avatar xuwei-k avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

scala-sculpt's Issues

use sbt-assembly to build fat JAR

A user reports:

ran the plugin against simple cases via the commands as suggested in the README file. Although, it seems that there is a difficulty to apply the same approach when utilising Sculpt with our Gradle-based projects. When providing the settings such as -Xplugin:scala-sculpt_2.11-0.1.0.jar:spray-json_2.11-1.3.2.jar, an error “Missing scalac-plugin.xml in D:\jars\scala-sculpt-0.1.0\spray-json_2.11-1.3.2.jar” occurs. That seems right, as the JAR providing spray is not a Scalac plugin itself, but only a dependency for Sculpt. According to the documentation, -Xplugin option is supposed to point at Scalac plugins only, so I am not sure why it works out of the Gradle, when calling Scalac as shown in the README file

I'm not sure either, not knowing anything about Gradle. @typesafehub/scala-team, is there any policy or history on the question of how a Scala compiler plugin's dependencies should be handled? (and does anyone have a hypothesis about why the behavior would be different in Gradle? I'm mostly just curious.)

for the moment, I'll just add sbt-assembly and ship a fat JAR. we might want to reconsider that if scala-sculpt becomes released publicly, though. as the sbt-assembly readme says, "Publishing fat JARs out to the world is discouraged because non-modular JARs cause much sadness". if compiler plugins simply don't support additional JAR dependencies, and we're forced to ship a fat JAR, we might want to consider shading. (or maybe just see if anyone actually complains...)

add it to the Scala community build

the 2.11 build is pretty much frozen at this point and I'm reluctant to add stuff, but we could add it to the 2.12 build now that 2.12 support is in

generate class layer report

augment Sculpt to generate a report showing:

  • layer 0: classes with no dependencies
  • layer 1: classes with only layer 0 dependencies
  • layer 2: classes with only layer 0 and 1 dependencies
  • ...

This is a common way to partially map the structure of a large dependency graph. An example of a tool that generates similar information is Classycle. From their doc: "The layer index of a vertex in an acyclic digraph is the number of edges of the longest possible walk starting at this vertex. All class/package vertices of a cycle have the same layer index" (link). See example output at e.g. http://classycle.sourceforge.net/ant.html (the "Layers" section).

Note that some concepts of layered architectures require that layer n accesses only layer n - 1 and not any lower layers; we are not making that assumption here.

aggregate dependencies at the class level

customer feedback seems to be that the most useful level for tracking dependencies is the class — as opposed to a higher level (by package, by source file) or a lower level (by method)

We will need to write new code to aggregate dependencies at the class level. (Version 0.1.2 produces detailed dependency information but does not aggregate it in any way.)

We should:

  • Generate a full report showing all of the aggregated dependencies
  • Make the aggregated information queryable in the REPL, so e.g. if class C is of interest, we should be able to ask for C’s incoming dependencies and outgoing dependencies

All tests fail on Windows (but not on Linux)

There seems to be an issue with the printing/string conversion, but I cannot find any spray-json related issues with that would cause this. Here is my printout of running sbt test (if you look closely there are actually differences, so it's not just newlines represented with different characters like I initially thought):

[info] Loading settings from idea.sbt ...
[info] Loading global plugins from C:\Users\Henrik\.sbt\1.0\plugins
[info] Updating ProjectRef(uri("file:/C:/Users/Henrik/.sbt/1.0/plugins/"), "global-plugins")...
[info] Done updating.
[info] Loading settings from plugins.sbt ...
[info] Loading project definition from C:\Users\Henrik\Documents\GitHub\scala-sculpt\project
[info] Updating ProjectRef(uri("file:/C:/Users/Henrik/Documents/GitHub/scala-sculpt/project/"), "scala-sculpt-build")...
[info] Done updating.
[info] Loading settings from build.sbt ...
[info] Set current project to scala-sculpt (in build file:/C:/Users/Henrik/Documents/GitHub/scala-sculpt/)
[info] TreeTests:
[info] - lone object *** FAILED ***
[info]   Expected "lone object:[

[info]   ??? O

[info]       ??? scala.AnyRef

[info]   ??? scala.AnyRef
]
[info]   ", but got "lone object:[
[info]   ??? O
[info]       ??? scala.AnyRef
[info]   ??? scala.AnyRef]
[info]   " (TreeTests.scala:22)
[info] - two subclasses *** FAILED ***
[info]   Expected "two subclasses:[

[info]   ??? C1

[info]       ??? scala.AnyRef

[info]       ??? T

[info]           ??? scala.AnyRef

[info]   ??? scala.AnyRef

[info]   ??? T

[info]       ??? scala.AnyRef

[info]   ??? C2

[info]       ??? scala.AnyRef

[info]       ??? T

[info]           ??? scala.AnyRef
]
[info]   ", but got "two subclasses:[
[info]   ??? C1
[info]       ??? scala.AnyRef
[info]       ??? T
[info]           ??? scala.AnyRef
[info]   ??? scala.AnyRef
[info]   ??? T
[info]       ??? scala.AnyRef
[info]   ??? C2
[info]       ??? scala.AnyRef
[info]       ??? T
[info]           ??? scala.AnyRef]
[info]   " (TreeTests.scala:22)
[info] - circular dependency *** FAILED ***
[info]   Expected "circular dependency:[

[info]   ??? T1

[info]       ??? scala.AnyRef

[info]   ??? scala.AnyRef

[info]   ??? T2

[info]       ??? scala.AnyRef
]
[info]   ", but got "circular dependency:[
[info]   ??? T1
[info]       ??? scala.AnyRef
[info]   ??? scala.AnyRef
[info]   ??? T2
[info]       ??? scala.AnyRef]
[info]   " (TreeTests.scala:22)
[info] - 3-cycle *** FAILED ***
[info]   Expected "3-cycle:[

[info]   ??? T1

[info]       ??? scala.AnyRef

[info]   ??? scala.AnyRef

[info]   ??? T2

[info]       ??? scala.AnyRef

[info]   ??? T3

[info]       ??? scala.AnyRef
]
[info]   ", but got "3-cycle:[
[info]   ??? T1
[info]       ??? scala.AnyRef
[info]   ??? scala.AnyRef
[info]   ??? T2
[info]       ??? scala.AnyRef
[info]   ??? T3
[info]       ??? scala.AnyRef]
[info]   " (TreeTests.scala:22)
[info] - package *** FAILED ***
[info]   Expected "package:[

[info]   ??? a.b.C1

[info]       ??? scala.AnyRef

[info]   ??? scala.AnyRef

[info]   ??? a.b.C2

[info]       ??? scala.AnyRef
]
[info]   ", but got "package:[
[info]   ??? a.b.C1
[info]       ??? scala.AnyRef
[info]   ??? scala.AnyRef
[info]   ??? a.b.C2
[info]       ??? scala.AnyRef]
[info]   " (TreeTests.scala:22)
[info] - nested class *** FAILED ***
[info]   Expected "nested class:[

[info]   ??? C

[info]       ??? scala.AnyRef

[info]   ??? scala.AnyRef

[info]   ??? C.D

[info]       ??? scala.AnyRef

[info]       ??? T

[info]           ??? scala.AnyRef

[info]   ??? T

[info]       ??? scala.AnyRef
]
[info]   ", but got "nested class:[
[info]   ??? C
[info]       ??? scala.AnyRef
[info]   ??? scala.AnyRef
[info]   ??? C.D
[info]       ??? scala.AnyRef
[info]       ??? T
[info]           ??? scala.AnyRef
[info]   ??? T
[info]       ??? scala.AnyRef]
[info]   " (TreeTests.scala:22)
[info] - uses module *** FAILED ***
[info]   Expected "uses module:[

[info]   ??? O

[info]       ??? scala.AnyRef

[info]       ??? scala

[info]       ??? scala.None

[info]   ??? scala.AnyRef
]
[info]   ", but got "uses module:[
[info]   ??? O
[info]       ??? scala.AnyRef
[info]       ??? scala
[info]       ??? scala.None
[info]   ??? scala.AnyRef]
[info]   " (TreeTests.scala:22)
[info] - pattern match *** FAILED ***
[info]   Expected "pattern match:[

[info]   ??? O

[info]       ??? scala.AnyRef

[info]       ??? O.<local O>.matchEnd3

[info]       ??? x

[info]   ??? scala.AnyRef

[info]   ??? scala.Int
]
[info]   ", but got "pattern match:[
[info]   ??? O
[info]       ??? scala.AnyRef
[info]       ??? O.<local O>.matchEnd3
[info]       ??? x
[info]   ??? scala.AnyRef
[info]   ??? scala.Int]
[info]   " (TreeTests.scala:22)
[info] - readme *** FAILED ***
[info]   Expected "readme:[

[info]   ??? Dep1

[info]       ??? scala.AnyRef

[info]   ??? scala.AnyRef

[info]   ??? scala.Int

[info]   ??? Dep2

[info]       ??? scala.AnyRef
]
[info]   ", but got "readme:[
[info]   ??? Dep1
[info]       ??? scala.AnyRef
[info]   ??? scala.AnyRef
[info]   ??? scala.Int
[info]   ??? Dep2
[info]       ??? scala.AnyRef]
[info]   " (TreeTests.scala:22)
[info] IntegrationTest:
[info] - lone object *** FAILED ***
[info]   Expected "[[

[info]     {"sym": ["o:O"], "extends": ["pkt:scala", "tp:AnyRef"]},

[info]     {"sym": ["o:O", "def:<init>"], "uses": ["o:O"]},

[info]     {"sym": ["o:O", "def:<init>"], "uses": ["pkt:java", "pkt:lang", "cl:Object", "def:<init>"]}
]
[info]   ]", but got "[[
[info]     {"sym": ["o:O"], "extends": ["pkt:scala", "tp:AnyRef"]},
[info]     {"sym": ["o:O", "def:<init>"], "uses": ["o:O"]},
[info]     {"sym": ["o:O", "def:<init>"], "uses": ["pkt:java", "pkt:lang", "cl:Object", "def:<init>"]}]
[info]   ]" (IntegrationTest.scala:52)
[info] - two subclasses *** FAILED ***
[info]   Expected "[[

[info]     {"sym": ["cl:C1"], "extends": ["pkt:scala", "tp:AnyRef"]},

[info]     {"sym": ["cl:C1"], "extends": ["tr:T"]},

[info]     {"sym": ["cl:C1", "def:<init>"], "uses": ["cl:C1"]},

[info]     {"sym": ["cl:C1", "def:<init>"], "uses": ["pkt:java", "pkt:lang", "cl:Object", "def:<init>"]},

[info]     {"sym": ["cl:C2"], "extends": ["pkt:scala", "tp:AnyRef"]},

[info]     {"sym": ["cl:C2"], "extends": ["tr:T"]},

[info]     {"sym": ["cl:C2", "def:<init>"], "uses": ["cl:C2"]},

[info]     {"sym": ["cl:C2", "def:<init>"], "uses": ["pkt:java", "pkt:lang", "cl:Object", "def:<init>"]},

[info]     {"sym": ["tr:T"], "extends": ["pkt:scala", "tp:AnyRef"]}
]
[info]   ]", but got "[[
[info]     {"sym": ["cl:C1"], "extends": ["pkt:scala", "tp:AnyRef"]},
[info]     {"sym": ["cl:C1"], "extends": ["tr:T"]},
[info]     {"sym": ["cl:C1", "def:<init>"], "uses": ["cl:C1"]},
[info]     {"sym": ["cl:C1", "def:<init>"], "uses": ["pkt:java", "pkt:lang", "cl:Object", "def:<init>"]},
[info]     {"sym": ["cl:C2"], "extends": ["pkt:scala", "tp:AnyRef"]},
[info]     {"sym": ["cl:C2"], "extends": ["tr:T"]},
[info]     {"sym": ["cl:C2", "def:<init>"], "uses": ["cl:C2"]},
[info]     {"sym": ["cl:C2", "def:<init>"], "uses": ["pkt:java", "pkt:lang", "cl:Object", "def:<init>"]},
[info]     {"sym": ["tr:T"], "extends": ["pkt:scala", "tp:AnyRef"]}]
[info]   ]" (IntegrationTest.scala:52)
[info] - circular dependency *** FAILED ***
[info]   Expected "[[

[info]     {"sym": ["tr:T1"], "extends": ["pkt:scala", "tp:AnyRef"]},

[info]     {"sym": ["tr:T1", "def:x"], "uses": ["tr:T2"]},

[info]     {"sym": ["tr:T2"], "extends": ["pkt:scala", "tp:AnyRef"]},

[info]     {"sym": ["tr:T2", "def:x"], "uses": ["tr:T1"]}
]
[info]   ]", but got "[[
[info]     {"sym": ["tr:T1"], "extends": ["pkt:scala", "tp:AnyRef"]},
[info]     {"sym": ["tr:T1", "def:x"], "uses": ["tr:T2"]},
[info]     {"sym": ["tr:T2"], "extends": ["pkt:scala", "tp:AnyRef"]},
[info]     {"sym": ["tr:T2", "def:x"], "uses": ["tr:T1"]}]
[info]   ]" (IntegrationTest.scala:52)
[info] - 3-cycle *** FAILED ***
[info]   Expected "[[

[info]     {"sym": ["tr:T1"], "extends": ["pkt:scala", "tp:AnyRef"]},

[info]     {"sym": ["tr:T1", "def:t"], "uses": ["tr:T2"]},

[info]     {"sym": ["tr:T2"], "extends": ["pkt:scala", "tp:AnyRef"]},

[info]     {"sym": ["tr:T2", "def:t"], "uses": ["tr:T3"]},

[info]     {"sym": ["tr:T3"], "extends": ["pkt:scala", "tp:AnyRef"]},

[info]     {"sym": ["tr:T3", "def:t"], "uses": ["tr:T1"]}
]
[info]   ]", but got "[[
[info]     {"sym": ["tr:T1"], "extends": ["pkt:scala", "tp:AnyRef"]},
[info]     {"sym": ["tr:T1", "def:t"], "uses": ["tr:T2"]},
[info]     {"sym": ["tr:T2"], "extends": ["pkt:scala", "tp:AnyRef"]},
[info]     {"sym": ["tr:T2", "def:t"], "uses": ["tr:T3"]},
[info]     {"sym": ["tr:T3"], "extends": ["pkt:scala", "tp:AnyRef"]},
[info]     {"sym": ["tr:T3", "def:t"], "uses": ["tr:T1"]}]
[info]   ]" (IntegrationTest.scala:52)
[info] - package *** FAILED ***
[info]   Expected "[[

[info]     {"sym": [], "uses": ["pk:a"]},

[info]     {"sym": [], "uses": ["pkt:a", "pk:b"]},

[info]     {"sym": ["pkt:a", "pkt:b", "cl:C1"], "extends": ["pkt:scala", "tp:AnyRef"]},

[info]     {"sym": ["pkt:a", "pkt:b", "cl:C1", "def:<init>"], "uses": ["pkt:a", "pkt:b", "cl:C1"]},

[info]     {"sym": ["pkt:a", "pkt:b", "cl:C1", "def:<init>"], "uses": ["pkt:java", "pkt:lang", "cl:Object", "def:<init>"]},

[info]     {"sym": ["pkt:a", "pkt:b", "cl:C2"], "extends": ["pkt:scala", "tp:AnyRef"]},

[info]     {"sym": ["pkt:a", "pkt:b", "cl:C2", "def:<init>"], "uses": ["pkt:a", "pkt:b", "cl:C2"]},

[info]     {"sym": ["pkt:a", "pkt:b", "cl:C2", "def:<init>"], "uses": ["pkt:java", "pkt:lang", "cl:Object", "def:<init>"]}
]
[info]   ]", but got "[[
[info]     {"sym": [], "uses": ["pk:a"]},
[info]     {"sym": [], "uses": ["pkt:a", "pk:b"]},
[info]     {"sym": ["pkt:a", "pkt:b", "cl:C1"], "extends": ["pkt:scala", "tp:AnyRef"]},
[info]     {"sym": ["pkt:a", "pkt:b", "cl:C1", "def:<init>"], "uses": ["pkt:a", "pkt:b", "cl:C1"]},
[info]     {"sym": ["pkt:a", "pkt:b", "cl:C1", "def:<init>"], "uses": ["pkt:java", "pkt:lang", "cl:Object", "def:<init>"]},
[info]     {"sym": ["pkt:a", "pkt:b", "cl:C2"], "extends": ["pkt:scala", "tp:AnyRef"]},
[info]     {"sym": ["pkt:a", "pkt:b", "cl:C2", "def:<init>"], "uses": ["pkt:a", "pkt:b", "cl:C2"]},
[info]     {"sym": ["pkt:a", "pkt:b", "cl:C2", "def:<init>"], "uses": ["pkt:java", "pkt:lang", "cl:Object", "def:<init>"]}]
[info]   ]" (IntegrationTest.scala:52)
[info] - nested class *** FAILED ***
[info]   Expected "[[

[info]     {"sym": ["cl:C"], "extends": ["pkt:scala", "tp:AnyRef"]},

[info]     {"sym": ["cl:C", "cl:D"], "extends": ["pkt:scala", "tp:AnyRef"]},

[info]     {"sym": ["cl:C", "cl:D"], "extends": ["tr:T"]},

[info]     {"sym": ["cl:C", "cl:D", "def:<init>"], "uses": ["cl:C"]},

[info]     {"sym": ["cl:C", "cl:D", "def:<init>"], "uses": ["cl:C", "cl:D"]},

[info]     {"sym": ["cl:C", "cl:D", "def:<init>"], "uses": ["pkt:java", "pkt:lang", "cl:Object", "def:<init>"]},

[info]     {"sym": ["cl:C", "def:<init>"], "uses": ["cl:C"]},

[info]     {"sym": ["cl:C", "def:<init>"], "uses": ["pkt:java", "pkt:lang", "cl:Object", "def:<init>"]},

[info]     {"sym": ["tr:T"], "extends": ["pkt:scala", "tp:AnyRef"]}
]
[info]   ]", but got "[[
[info]     {"sym": ["cl:C"], "extends": ["pkt:scala", "tp:AnyRef"]},
[info]     {"sym": ["cl:C", "cl:D"], "extends": ["pkt:scala", "tp:AnyRef"]},
[info]     {"sym": ["cl:C", "cl:D"], "extends": ["tr:T"]},
[info]     {"sym": ["cl:C", "cl:D", "def:<init>"], "uses": ["cl:C"]},
[info]     {"sym": ["cl:C", "cl:D", "def:<init>"], "uses": ["cl:C", "cl:D"]},
[info]     {"sym": ["cl:C", "cl:D", "def:<init>"], "uses": ["pkt:java", "pkt:lang", "cl:Object", "def:<init>"]},
[info]     {"sym": ["cl:C", "def:<init>"], "uses": ["cl:C"]},
[info]     {"sym": ["cl:C", "def:<init>"], "uses": ["pkt:java", "pkt:lang", "cl:Object", "def:<init>"]},
[info]     {"sym": ["tr:T"], "extends": ["pkt:scala", "tp:AnyRef"]}]
[info]   ]" (IntegrationTest.scala:52)
[info] - uses module *** FAILED ***
[info]   Expected "[[

[info]     {"sym": ["o:O"], "extends": ["pkt:scala", "tp:AnyRef"]},

[info]     {"sym": ["o:O"], "uses": ["pk:scala"]},

[info]     {"sym": ["o:O"], "uses": ["pkt:scala", "ov:None"]},

[info]     {"sym": ["o:O", "def:<init>"], "uses": ["o:O"]},

[info]     {"sym": ["o:O", "def:<init>"], "uses": ["pkt:java", "pkt:lang", "cl:Object", "def:<init>"]}
]
[info]   ]", but got "[[
[info]     {"sym": ["o:O"], "extends": ["pkt:scala", "tp:AnyRef"]},
[info]     {"sym": ["o:O"], "uses": ["pk:scala"]},
[info]     {"sym": ["o:O"], "uses": ["pkt:scala", "ov:None"]},
[info]     {"sym": ["o:O", "def:<init>"], "uses": ["o:O"]},
[info]     {"sym": ["o:O", "def:<init>"], "uses": ["pkt:java", "pkt:lang", "cl:Object", "def:<init>"]}]
[info]   ]" (IntegrationTest.scala:52)
[info] - pattern match *** FAILED ***
[info]   Expected "[[

[info]     {"sym": ["o:O"], "extends": ["pkt:scala", "tp:AnyRef"]},

[info]     {"sym": ["o:O"], "uses": ["o:O", "t:<local O>", "def:matchEnd3"]},

[info]     {"sym": ["o:O"], "uses": ["t:x"]},

[info]     {"sym": ["o:O", "def:<init>"], "uses": ["o:O"]},

[info]     {"sym": ["o:O", "def:<init>"], "uses": ["pkt:java", "pkt:lang", "cl:Object", "def:<init>"]},

[info]     {"sym": ["o:O", "t:<local O>", "t:x1"], "uses": ["pkt:scala", "cl:Int"]}
]
[info]   ]", but got "[[
[info]     {"sym": ["o:O"], "extends": ["pkt:scala", "tp:AnyRef"]},
[info]     {"sym": ["o:O"], "uses": ["o:O", "t:<local O>", "def:matchEnd3"]},
[info]     {"sym": ["o:O"], "uses": ["t:x"]},
[info]     {"sym": ["o:O", "def:<init>"], "uses": ["o:O"]},
[info]     {"sym": ["o:O", "def:<init>"], "uses": ["pkt:java", "pkt:lang", "cl:Object", "def:<init>"]},
[info]     {"sym": ["o:O", "t:<local O>", "t:x1"], "uses": ["pkt:scala", "cl:Int"]}]
[info]   ]" (IntegrationTest.scala:52)
[info] - readme *** FAILED ***
[info]   Expected "[[

[info]     {"sym": ["o:Dep1"], "extends": ["pkt:scala", "tp:AnyRef"]},

[info]     {"sym": ["o:Dep1", "def:<init>"], "uses": ["o:Dep1"]},

[info]     {"sym": ["o:Dep1", "def:<init>"], "uses": ["pkt:java", "pkt:lang", "cl:Object", "def:<init>"]},

[info]     {"sym": ["o:Dep1", "def:x"], "uses": ["o:Dep1", "t:x"]},

[info]     {"sym": ["o:Dep1", "def:x"], "uses": ["pkt:scala", "cl:Int"]},

[info]     {"sym": ["o:Dep1", "def:y"], "uses": ["o:Dep1", "t:y"]},

[info]     {"sym": ["o:Dep1", "def:y"], "uses": ["pkt:scala", "cl:Int"]},

[info]     {"sym": ["o:Dep1", "t:x"], "uses": ["pkt:scala", "cl:Int"]},

[info]     {"sym": ["o:Dep1", "t:y"], "uses": ["o:Dep2", "def:z"]},

[info]     {"sym": ["o:Dep1", "t:y"], "uses": ["ov:Dep2"]},

[info]     {"sym": ["o:Dep1", "t:y"], "uses": ["pkt:scala", "cl:Int"]},

[info]     {"sym": ["o:Dep2"], "extends": ["pkt:scala", "tp:AnyRef"]},

[info]     {"sym": ["o:Dep2", "def:<init>"], "uses": ["o:Dep2"]},

[info]     {"sym": ["o:Dep2", "def:<init>"], "uses": ["pkt:java", "pkt:lang", "cl:Object", "def:<init>"]},

[info]     {"sym": ["o:Dep2", "def:z"], "uses": ["o:Dep2", "t:z"]},

[info]     {"sym": ["o:Dep2", "def:z"], "uses": ["pkt:scala", "cl:Int"]},

[info]     {"sym": ["o:Dep2", "t:z"], "uses": ["o:Dep1", "def:x"]},

[info]     {"sym": ["o:Dep2", "t:z"], "uses": ["ov:Dep1"]},

[info]     {"sym": ["o:Dep2", "t:z"], "uses": ["pkt:scala", "cl:Int"]}
]
[info]   ]", but got "[[
[info]     {"sym": ["o:Dep1"], "extends": ["pkt:scala", "tp:AnyRef"]},
[info]     {"sym": ["o:Dep1", "def:<init>"], "uses": ["o:Dep1"]},
[info]     {"sym": ["o:Dep1", "def:<init>"], "uses": ["pkt:java", "pkt:lang", "cl:Object", "def:<init>"]},
[info]     {"sym": ["o:Dep1", "def:x"], "uses": ["o:Dep1", "t:x"]},
[info]     {"sym": ["o:Dep1", "def:x"], "uses": ["pkt:scala", "cl:Int"]},
[info]     {"sym": ["o:Dep1", "def:y"], "uses": ["o:Dep1", "t:y"]},
[info]     {"sym": ["o:Dep1", "def:y"], "uses": ["pkt:scala", "cl:Int"]},
[info]     {"sym": ["o:Dep1", "t:x"], "uses": ["pkt:scala", "cl:Int"]},
[info]     {"sym": ["o:Dep1", "t:y"], "uses": ["o:Dep2", "def:z"]},
[info]     {"sym": ["o:Dep1", "t:y"], "uses": ["ov:Dep2"]},
[info]     {"sym": ["o:Dep1", "t:y"], "uses": ["pkt:scala", "cl:Int"]},
[info]     {"sym": ["o:Dep2"], "extends": ["pkt:scala", "tp:AnyRef"]},
[info]     {"sym": ["o:Dep2", "def:<init>"], "uses": ["o:Dep2"]},
[info]     {"sym": ["o:Dep2", "def:<init>"], "uses": ["pkt:java", "pkt:lang", "cl:Object", "def:<init>"]},
[info]     {"sym": ["o:Dep2", "def:z"], "uses": ["o:Dep2", "t:z"]},
[info]     {"sym": ["o:Dep2", "def:z"], "uses": ["pkt:scala", "cl:Int"]},
[info]     {"sym": ["o:Dep2", "t:z"], "uses": ["o:Dep1", "def:x"]},
[info]     {"sym": ["o:Dep2", "t:z"], "uses": ["ov:Dep1"]},
[info]     {"sym": ["o:Dep2", "t:z"], "uses": ["pkt:scala", "cl:Int"]}]
[info]   ]" (IntegrationTest.scala:52)
[info] CyclesTests:
[info] - lone object *** FAILED ***
[info]   Expected "[1] o:O[

[info]   [0] cl:java.lang.Object

[info]   [0] tp:scala.AnyRef
]
[info]   ", but got "[1] o:O[
[info]   [0] cl:java.lang.Object
[info]   [0] tp:scala.AnyRef]
[info]   " (CyclesTests.scala:28)
[info] - two subclasses *** FAILED ***
[info]   Expected "[2] cl:C1[

[info]   [2] cl:C2

[info]   [1] tr:T

[info]   [0] cl:java.lang.Object

[info]   [0] tp:scala.AnyRef
]
[info]   ", but got "[2] cl:C1[
[info]   [2] cl:C2
[info]   [1] tr:T
[info]   [0] cl:java.lang.Object
[info]   [0] tp:scala.AnyRef]
[info]   " (CyclesTests.scala:28)
[info] - circular dependency *** FAILED ***
[info]   Expected "[1] tr:T1 tr:T2[

[info]   [0] tp:scala.AnyRef
]
[info]   ", but got "[1] tr:T1 tr:T2[
[info]   [0] tp:scala.AnyRef]
[info]   " (CyclesTests.scala:28)
[info] - 3-cycle *** FAILED ***
[info]   Expected "...1] tr:T1 tr:T2 tr:T3[

[info]   [0] tp:scala.AnyRef
]
[info]   ", but got "...1] tr:T1 tr:T2 tr:T3[
[info]   [0] tp:scala.AnyRef]
[info]   " (CyclesTests.scala:28)
[info] - package *** FAILED ***
[info]   Expected "[1] cl:a.b.C1[

[info]   [1] cl:a.b.C2

[info]   [0] cl:java.lang.Object

[info]   [0] tp:scala.AnyRef
]
[info]   ", but got "[1] cl:a.b.C1[
[info]   [1] cl:a.b.C2
[info]   [0] cl:java.lang.Object
[info]   [0] tp:scala.AnyRef]
[info]   " (CyclesTests.scala:28)
[info] - nested class *** FAILED ***
[info]   Expected "[2] cl:C[

[info]   [1] tr:T

[info]   [0] cl:java.lang.Object

[info]   [0] tp:scala.AnyRef
]
[info]   ", but got "[2] cl:C[
[info]   [1] tr:T
[info]   [0] cl:java.lang.Object
[info]   [0] tp:scala.AnyRef]
[info]   " (CyclesTests.scala:28)
[info] - uses module *** FAILED ***
[info]   Expected "[1] o:O[

[info]   [0] cl:java.lang.Object

[info]   [0] o:scala.None

[info]   [0] tp:scala.AnyRef
]
[info]   ", but got "[1] o:O[
[info]   [0] cl:java.lang.Object
[info]   [0] o:scala.None
[info]   [0] tp:scala.AnyRef]
[info]   " (CyclesTests.scala:28)
[info] - pattern match *** FAILED ***
[info]   Expected "[1] o:O[

[info]   [0] cl:java.lang.Object

[info]   [0] cl:scala.Int

[info]   [0] tp:scala.AnyRef
]
[info]   ", but got "[1] o:O[
[info]   [0] cl:java.lang.Object
[info]   [0] cl:scala.Int
[info]   [0] tp:scala.AnyRef]
[info]   " (CyclesTests.scala:28)
[info] - readme *** FAILED ***
[info]   Expected "[1] o:Dep1 o:Dep2[

[info]   [0] cl:java.lang.Object

[info]   [0] cl:scala.Int

[info]   [0] tp:scala.AnyRef
]
[info]   ", but got "[1] o:Dep1 o:Dep2[
[info]   [0] cl:java.lang.Object
[info]   [0] cl:scala.Int
[info]   [0] tp:scala.AnyRef]
[info]   " (CyclesTests.scala:28)
[info] GraphTests:
[info] - lone object *** FAILED ***
[info]   Expected "...t': 4 nodes, 3 edges[

[info]   Nodes:

[info]     - o:O

[info]     - pkt:scala.tp:AnyRef

[info]     - o:O.def:<init>

[info]     - pkt:java.pkt:lang.cl:Object.def:<init>

[info]   Edges:

[info]     - o:O -[Extends]-> pkt:scala.tp:AnyRef

[info]     - o:O.def:<init> -[Uses]-> o:O
]
[info]     - o:O.def:<init> ...", but got "...t': 4 nodes, 3 edges[
[info]   Nodes:
[info]     - o:O
[info]     - pkt:scala.tp:AnyRef
[info]     - o:O.def:<init>
[info]     - pkt:java.pkt:lang.cl:Object.def:<init>
[info]   Edges:
[info]     - o:O -[Extends]-> pkt:scala.tp:AnyRef
[info]     - o:O.def:<init> -[Uses]-> o:O]
[info]     - o:O.def:<init> ..." (GraphTests.scala:25)
[info] - two subclasses *** FAILED ***
[info]   Expected "...s': 7 nodes, 9 edges[

[info]   Nodes:

[info]     - cl:C1

[info]     - pkt:scala.tp:AnyRef

[info]     - tr:T

[info]     - cl:C1.def:<init>

[info]     - pkt:java.pkt:lang.cl:Object.def:<init>

[info]     - cl:C2

[info]     - cl:C2.def:<init>

[info]   Edges:

[info]     - cl:C1 -[Extends]-> pkt:scala.tp:AnyRef

[info]     - cl:C1 -[Extends]-> tr:T

[info]     - cl:C1.def:<init> -[Uses]-> cl:C1

[info]     - cl:C1.def:<init> -[Uses]-> pkt:java.pkt:lang.cl:Object.def:<init>

[info]     - cl:C2 -[Extends]-> pkt:scala.tp:AnyRef

[info]     - cl:C2 -[Extends]-> tr:T

[info]     - cl:C2.def:<init> -[Uses]-> cl:C2

[info]     - cl:C2.def:<init> -[Uses]-> pkt:java.pkt:lang.cl:Object.def:<init>
]
[info]     - tr:T -[Extends]...", but got "...s': 7 nodes, 9 edges[
[info]   Nodes:
[info]     - cl:C1
[info]     - pkt:scala.tp:AnyRef
[info]     - tr:T
[info]     - cl:C1.def:<init>
[info]     - pkt:java.pkt:lang.cl:Object.def:<init>
[info]     - cl:C2
[info]     - cl:C2.def:<init>
[info]   Edges:
[info]     - cl:C1 -[Extends]-> pkt:scala.tp:AnyRef
[info]     - cl:C1 -[Extends]-> tr:T
[info]     - cl:C1.def:<init> -[Uses]-> cl:C1
[info]     - cl:C1.def:<init> -[Uses]-> pkt:java.pkt:lang.cl:Object.def:<init>
[info]     - cl:C2 -[Extends]-> pkt:scala.tp:AnyRef
[info]     - cl:C2 -[Extends]-> tr:T
[info]     - cl:C2.def:<init> -[Uses]-> cl:C2
[info]     - cl:C2.def:<init> -[Uses]-> pkt:java.pkt:lang.cl:Object.def:<init>]
[info]     - tr:T -[Extends]..." (GraphTests.scala:25)
[info] - circular dependency *** FAILED ***
[info]   Expected "...y': 5 nodes, 4 edges[

[info]   Nodes:

[info]     - tr:T1

[info]     - pkt:scala.tp:AnyRef

[info]     - tr:T1.def:x

[info]     - tr:T2

[info]     - tr:T2.def:x

[info]   Edges:

[info]     - tr:T1 -[Extends]-> pkt:scala.tp:AnyRef

[info]     - tr:T1.def:x -[Uses]-> tr:T2

[info]     - tr:T2 -[Extends]-> pkt:scala.tp:AnyRef
]
[info]     - tr:T2.def:x -[U...", but got "...y': 5 nodes, 4 edges[
[info]   Nodes:
[info]     - tr:T1
[info]     - pkt:scala.tp:AnyRef
[info]     - tr:T1.def:x
[info]     - tr:T2
[info]     - tr:T2.def:x
[info]   Edges:
[info]     - tr:T1 -[Extends]-> pkt:scala.tp:AnyRef
[info]     - tr:T1.def:x -[Uses]-> tr:T2
[info]     - tr:T2 -[Extends]-> pkt:scala.tp:AnyRef]
[info]     - tr:T2.def:x -[U..." (GraphTests.scala:25)
[info] - 3-cycle *** FAILED ***
[info]   Expected "...e': 7 nodes, 6 edges[

[info]   Nodes:

[info]     - tr:T1

[info]     - pkt:scala.tp:AnyRef

[info]     - tr:T1.def:t

[info]     - tr:T2

[info]     - tr:T2.def:t

[info]     - tr:T3

[info]     - tr:T3.def:t

[info]   Edges:

[info]     - tr:T1 -[Extends]-> pkt:scala.tp:AnyRef

[info]     - tr:T1.def:t -[Uses]-> tr:T2

[info]     - tr:T2 -[Extends]-> pkt:scala.tp:AnyRef

[info]     - tr:T2.def:t -[Uses]-> tr:T3

[info]     - tr:T3 -[Extends]-> pkt:scala.tp:AnyRef
]
[info]     - tr:T3.def:t -[U...", but got "...e': 7 nodes, 6 edges[
[info]   Nodes:
[info]     - tr:T1
[info]     - pkt:scala.tp:AnyRef
[info]     - tr:T1.def:t
[info]     - tr:T2
[info]     - tr:T2.def:t
[info]     - tr:T3
[info]     - tr:T3.def:t
[info]   Edges:
[info]     - tr:T1 -[Extends]-> pkt:scala.tp:AnyRef
[info]     - tr:T1.def:t -[Uses]-> tr:T2
[info]     - tr:T2 -[Extends]-> pkt:scala.tp:AnyRef
[info]     - tr:T2.def:t -[Uses]-> tr:T3
[info]     - tr:T3 -[Extends]-> pkt:scala.tp:AnyRef]
[info]     - tr:T3.def:t -[U..." (GraphTests.scala:25)
[info] - package *** FAILED ***
[info]   Expected "...e': 9 nodes, 8 edges[

[info]   Nodes:

[info]     - 

[info]     - pk:a

[info]     - pkt:a.pk:b

[info]     - pkt:a.pkt:b.cl:C1

[info]     - pkt:scala.tp:AnyRef

[info]     - pkt:a.pkt:b.cl:C1.def:<init>

[info]     - pkt:java.pkt:lang.cl:Object.def:<init>

[info]     - pkt:a.pkt:b.cl:C2

[info]     - pkt:a.pkt:b.cl:C2.def:<init>

[info]   Edges:

[info]     -  -[Uses]-> pk:a

[info]     -  -[Uses]-> pkt:a.pk:b

[info]     - pkt:a.pkt:b.cl:C1 -[Extends]-> pkt:scala.tp:AnyRef

[info]     - pkt:a.pkt:b.cl:C1.def:<init> -[Uses]-> pkt:a.pkt:b.cl:C1

[info]     - pkt:a.pkt:b.cl:C1.def:<init> -[Uses]-> pkt:java.pkt:lang.cl:Object.def:<init>

[info]     - pkt:a.pkt:b.cl:C2 -[Extends]-> pkt:scala.tp:AnyRef

[info]     - pkt:a.pkt:b.cl:C2.def:<init> -[Uses]-> pkt:a.pkt:b.cl:C2
]
[info]     - pkt:a.pkt:b.cl:...", but got "...e': 9 nodes, 8 edges[
[info]   Nodes:
[info]     - 
[info]     - pk:a
[info]     - pkt:a.pk:b
[info]     - pkt:a.pkt:b.cl:C1
[info]     - pkt:scala.tp:AnyRef
[info]     - pkt:a.pkt:b.cl:C1.def:<init>
[info]     - pkt:java.pkt:lang.cl:Object.def:<init>
[info]     - pkt:a.pkt:b.cl:C2
[info]     - pkt:a.pkt:b.cl:C2.def:<init>
[info]   Edges:
[info]     -  -[Uses]-> pk:a
[info]     -  -[Uses]-> pkt:a.pk:b
[info]     - pkt:a.pkt:b.cl:C1 -[Extends]-> pkt:scala.tp:AnyRef
[info]     - pkt:a.pkt:b.cl:C1.def:<init> -[Uses]-> pkt:a.pkt:b.cl:C1
[info]     - pkt:a.pkt:b.cl:C1.def:<init> -[Uses]-> pkt:java.pkt:lang.cl:Object.def:<init>
[info]     - pkt:a.pkt:b.cl:C2 -[Extends]-> pkt:scala.tp:AnyRef
[info]     - pkt:a.pkt:b.cl:C2.def:<init> -[Uses]-> pkt:a.pkt:b.cl:C2]
[info]     - pkt:a.pkt:b.cl:..." (GraphTests.scala:25)
[info] - nested class *** FAILED ***
[info]   Expected "...s': 7 nodes, 9 edges[

[info]   Nodes:

[info]     - cl:C

[info]     - pkt:scala.tp:AnyRef

[info]     - cl:C.cl:D

[info]     - tr:T

[info]     - cl:C.cl:D.def:<init>

[info]     - pkt:java.pkt:lang.cl:Object.def:<init>

[info]     - cl:C.def:<init>

[info]   Edges:

[info]     - cl:C -[Extends]-> pkt:scala.tp:AnyRef

[info]     - cl:C.cl:D -[Extends]-> pkt:scala.tp:AnyRef

[info]     - cl:C.cl:D -[Extends]-> tr:T

[info]     - cl:C.cl:D.def:<init> -[Uses]-> cl:C

[info]     - cl:C.cl:D.def:<init> -[Uses]-> cl:C.cl:D

[info]     - cl:C.cl:D.def:<init> -[Uses]-> pkt:java.pkt:lang.cl:Object.def:<init>

[info]     - cl:C.def:<init> -[Uses]-> cl:C

[info]     - cl:C.def:<init> -[Uses]-> pkt:java.pkt:lang.cl:Object.def:<init>
]
[info]     - tr:T -[Extends]...", but got "...s': 7 nodes, 9 edges[
[info]   Nodes:
[info]     - cl:C
[info]     - pkt:scala.tp:AnyRef
[info]     - cl:C.cl:D
[info]     - tr:T
[info]     - cl:C.cl:D.def:<init>
[info]     - pkt:java.pkt:lang.cl:Object.def:<init>
[info]     - cl:C.def:<init>
[info]   Edges:
[info]     - cl:C -[Extends]-> pkt:scala.tp:AnyRef
[info]     - cl:C.cl:D -[Extends]-> pkt:scala.tp:AnyRef
[info]     - cl:C.cl:D -[Extends]-> tr:T
[info]     - cl:C.cl:D.def:<init> -[Uses]-> cl:C
[info]     - cl:C.cl:D.def:<init> -[Uses]-> cl:C.cl:D
[info]     - cl:C.cl:D.def:<init> -[Uses]-> pkt:java.pkt:lang.cl:Object.def:<init>
[info]     - cl:C.def:<init> -[Uses]-> cl:C
[info]     - cl:C.def:<init> -[Uses]-> pkt:java.pkt:lang.cl:Object.def:<init>]
[info]     - tr:T -[Extends]..." (GraphTests.scala:25)
[info] - uses module *** FAILED ***
[info]   Expected "...e': 6 nodes, 5 edges[

[info]   Nodes:

[info]     - o:O

[info]     - pkt:scala.tp:AnyRef

[info]     - pk:scala

[info]     - pkt:scala.ov:None

[info]     - o:O.def:<init>

[info]     - pkt:java.pkt:lang.cl:Object.def:<init>

[info]   Edges:

[info]     - o:O -[Extends]-> pkt:scala.tp:AnyRef

[info]     - o:O -[Uses]-> pk:scala

[info]     - o:O -[Uses]-> pkt:scala.ov:None

[info]     - o:O.def:<init> -[Uses]-> o:O
]
[info]     - o:O.def:<init> ...", but got "...e': 6 nodes, 5 edges[
[info]   Nodes:
[info]     - o:O
[info]     - pkt:scala.tp:AnyRef
[info]     - pk:scala
[info]     - pkt:scala.ov:None
[info]     - o:O.def:<init>
[info]     - pkt:java.pkt:lang.cl:Object.def:<init>
[info]   Edges:
[info]     - o:O -[Extends]-> pkt:scala.tp:AnyRef
[info]     - o:O -[Uses]-> pk:scala
[info]     - o:O -[Uses]-> pkt:scala.ov:None
[info]     - o:O.def:<init> -[Uses]-> o:O]
[info]     - o:O.def:<init> ..." (GraphTests.scala:25)
[info] - pattern match *** FAILED ***
[info]   Expected "...h': 8 nodes, 6 edges[

[info]   Nodes:

[info]     - o:O

[info]     - pkt:scala.tp:AnyRef

[info]     - o:O.t:<local O>.def:matchEnd3

[info]     - t:x

[info]     - o:O.def:<init>

[info]     - pkt:java.pkt:lang.cl:Object.def:<init>

[info]     - o:O.t:<local O>.t:x1

[info]     - pkt:scala.cl:Int

[info]   Edges:

[info]     - o:O -[Extends]-> pkt:scala.tp:AnyRef

[info]     - o:O -[Uses]-> o:O.t:<local O>.def:matchEnd3

[info]     - o:O -[Uses]-> t:x

[info]     - o:O.def:<init> -[Uses]-> o:O

[info]     - o:O.def:<init> -[Uses]-> pkt:java.pkt:lang.cl:Object.def:<init>
]
[info]     - o:O.t:<local O>...", but got "...h': 8 nodes, 6 edges[
[info]   Nodes:
[info]     - o:O
[info]     - pkt:scala.tp:AnyRef
[info]     - o:O.t:<local O>.def:matchEnd3
[info]     - t:x
[info]     - o:O.def:<init>
[info]     - pkt:java.pkt:lang.cl:Object.def:<init>
[info]     - o:O.t:<local O>.t:x1
[info]     - pkt:scala.cl:Int
[info]   Edges:
[info]     - o:O -[Extends]-> pkt:scala.tp:AnyRef
[info]     - o:O -[Uses]-> o:O.t:<local O>.def:matchEnd3
[info]     - o:O -[Uses]-> t:x
[info]     - o:O.def:<init> -[Uses]-> o:O
[info]     - o:O.def:<init> -[Uses]-> pkt:java.pkt:lang.cl:Object.def:<init>]
[info]     - o:O.t:<local O>..." (GraphTests.scala:25)
[info] - readme *** FAILED ***
[info]   Expected "...: 15 nodes, 19 edges[

[info]   Nodes:

[info]     - o:Dep1

[info]     - pkt:scala.tp:AnyRef

[info]     - o:Dep1.def:<init>

[info]     - pkt:java.pkt:lang.cl:Object.def:<init>

[info]     - o:Dep1.def:x

[info]     - o:Dep1.t:x

[info]     - pkt:scala.cl:Int

[info]     - o:Dep1.def:y

[info]     - o:Dep1.t:y

[info]     - o:Dep2.def:z

[info]     - ov:Dep2

[info]     - o:Dep2

[info]     - o:Dep2.def:<init>

[info]     - o:Dep2.t:z

[info]     - ov:Dep1

[info]   Edges:

[info]     - o:Dep1 -[Extends]-> pkt:scala.tp:AnyRef

[info]     - o:Dep1.def:<init> -[Uses]-> o:Dep1

[info]     - o:Dep1.def:<init> -[Uses]-> pkt:java.pkt:lang.cl:Object.def:<init>

[info]     - o:Dep1.def:x -[Uses]-> o:Dep1.t:x

[info]     - o:Dep1.def:x -[Uses]-> pkt:scala.cl:Int

[info]     - o:Dep1.def:y -[Uses]-> o:Dep1.t:y

[info]     - o:Dep1.def:y -[Uses]-> pkt:scala.cl:Int

[info]     - o:Dep1.t:x -[Uses]-> pkt:scala.cl:Int

[info]     - o:Dep1.t:y -[Uses]-> o:Dep2.def:z

[info]     - o:Dep1.t:y -[Uses]-> ov:Dep2

[info]     - o:Dep1.t:y -[Uses]-> pkt:scala.cl:Int

[info]     - o:Dep2 -[Extends]-> pkt:scala.tp:AnyRef

[info]     - o:Dep2.def:<init> -[Uses]-> o:Dep2

[info]     - o:Dep2.def:<init> -[Uses]-> pkt:java.pkt:lang.cl:Object.def:<init>

[info]     - o:Dep2.def:z -[Uses]-> o:Dep2.t:z

[info]     - o:Dep2.def:z -[Uses]-> pkt:scala.cl:Int

[info]     - o:Dep2.t:z -[Uses]-> o:Dep1.def:x

[info]     - o:Dep2.t:z -[Uses]-> ov:Dep1
]
[info]     - o:Dep2.t:z -[Us...", but got "...: 15 nodes, 19 edges[
[info]   Nodes:
[info]     - o:Dep1
[info]     - pkt:scala.tp:AnyRef
[info]     - o:Dep1.def:<init>
[info]     - pkt:java.pkt:lang.cl:Object.def:<init>
[info]     - o:Dep1.def:x
[info]     - o:Dep1.t:x
[info]     - pkt:scala.cl:Int
[info]     - o:Dep1.def:y
[info]     - o:Dep1.t:y
[info]     - o:Dep2.def:z
[info]     - ov:Dep2
[info]     - o:Dep2
[info]     - o:Dep2.def:<init>
[info]     - o:Dep2.t:z
[info]     - ov:Dep1
[info]   Edges:
[info]     - o:Dep1 -[Extends]-> pkt:scala.tp:AnyRef
[info]     - o:Dep1.def:<init> -[Uses]-> o:Dep1
[info]     - o:Dep1.def:<init> -[Uses]-> pkt:java.pkt:lang.cl:Object.def:<init>
[info]     - o:Dep1.def:x -[Uses]-> o:Dep1.t:x
[info]     - o:Dep1.def:x -[Uses]-> pkt:scala.cl:Int
[info]     - o:Dep1.def:y -[Uses]-> o:Dep1.t:y
[info]     - o:Dep1.def:y -[Uses]-> pkt:scala.cl:Int
[info]     - o:Dep1.t:x -[Uses]-> pkt:scala.cl:Int
[info]     - o:Dep1.t:y -[Uses]-> o:Dep2.def:z
[info]     - o:Dep1.t:y -[Uses]-> ov:Dep2
[info]     - o:Dep1.t:y -[Uses]-> pkt:scala.cl:Int
[info]     - o:Dep2 -[Extends]-> pkt:scala.tp:AnyRef
[info]     - o:Dep2.def:<init> -[Uses]-> o:Dep2
[info]     - o:Dep2.def:<init> -[Uses]-> pkt:java.pkt:lang.cl:Object.def:<init>
[info]     - o:Dep2.def:z -[Uses]-> o:Dep2.t:z
[info]     - o:Dep2.def:z -[Uses]-> pkt:scala.cl:Int
[info]     - o:Dep2.t:z -[Uses]-> o:Dep1.def:x
[info]     - o:Dep2.t:z -[Uses]-> ov:Dep1]
[info]     - o:Dep2.t:z -[Us..." (GraphTests.scala:25)
[info] - readme removePaths *** FAILED ***
[info]   Expected "...e': 8 nodes, 8 edges[

[info]   Nodes:

[info]     - o:Dep1

[info]     - pkt:scala.tp:AnyRef

[info]     - o:Dep1.def:<init>

[info]     - o:Dep1.def:x

[info]     - o:Dep1.t:x

[info]     - pkt:scala.cl:Int

[info]     - o:Dep1.def:y

[info]     - o:Dep1.t:y

[info]   Edges:

[info]     - o:Dep1 -[Extends]-> pkt:scala.tp:AnyRef

[info]     - o:Dep1.def:<init> -[Uses]-> o:Dep1

[info]     - o:Dep1.def:x -[Uses]-> o:Dep1.t:x

[info]     - o:Dep1.def:x -[Uses]-> pkt:scala.cl:Int

[info]     - o:Dep1.def:y -[Uses]-> o:Dep1.t:y

[info]     - o:Dep1.def:y -[Uses]-> pkt:scala.cl:Int

[info]     - o:Dep1.t:x -[Uses]-> pkt:scala.cl:Int
]
[info]     - o:Dep1.t:y -[Us...", but got "...e': 8 nodes, 8 edges[
[info]   Nodes:
[info]     - o:Dep1
[info]     - pkt:scala.tp:AnyRef
[info]     - o:Dep1.def:<init>
[info]     - o:Dep1.def:x
[info]     - o:Dep1.t:x
[info]     - pkt:scala.cl:Int
[info]     - o:Dep1.def:y
[info]     - o:Dep1.t:y
[info]   Edges:
[info]     - o:Dep1 -[Extends]-> pkt:scala.tp:AnyRef
[info]     - o:Dep1.def:<init> -[Uses]-> o:Dep1
[info]     - o:Dep1.def:x -[Uses]-> o:Dep1.t:x
[info]     - o:Dep1.def:x -[Uses]-> pkt:scala.cl:Int
[info]     - o:Dep1.def:y -[Uses]-> o:Dep1.t:y
[info]     - o:Dep1.def:y -[Uses]-> pkt:scala.cl:Int
[info]     - o:Dep1.t:x -[Uses]-> pkt:scala.cl:Int]
[info]     - o:Dep1.t:y -[Us..." (GraphTests.scala:60)
[info] SerializationTests:
[info] - lone object: through ASTs *** FAILED ***
[info]   Expected "[[

[info]     {"sym": ["o:O"], "extends": ["pkt:scala", "tp:AnyRef"]},

[info]     {"sym": ["o:O", "def:<init>"], "uses": ["o:O"]},

[info]     {"sym": ["o:O", "def:<init>"], "uses": ["pkt:java", "pkt:lang", "cl:Object", "def:<init>"]}
]
[info]   ]", but got "[[
[info]     {"sym": ["o:O"], "extends": ["pkt:scala", "tp:AnyRef"]},
[info]     {"sym": ["o:O", "def:<init>"], "uses": ["o:O"]},
[info]     {"sym": ["o:O", "def:<init>"], "uses": ["pkt:java", "pkt:lang", "cl:Object", "def:<init>"]}]
[info]   ]" (SerializationTests.scala:13)
[info] - lone object: through model *** FAILED ***
[info]   Expected "[[

[info]     {"sym": ["o:O"], "extends": ["pkt:scala", "tp:AnyRef"]},

[info]     {"sym": ["o:O", "def:<init>"], "uses": ["o:O"]},

[info]     {"sym": ["o:O", "def:<init>"], "uses": ["pkt:java", "pkt:lang", "cl:Object", "def:<init>"]}
]
[info]   ]", but got "[[
[info]     {"sym": ["o:O"], "extends": ["pkt:scala", "tp:AnyRef"]},
[info]     {"sym": ["o:O", "def:<init>"], "uses": ["o:O"]},
[info]     {"sym": ["o:O", "def:<init>"], "uses": ["pkt:java", "pkt:lang", "cl:Object", "def:<init>"]}]
[info]   ]" (SerializationTests.scala:23)
[info] - two subclasses: through ASTs *** FAILED ***
[info]   Expected "[[

[info]     {"sym": ["cl:C1"], "extends": ["pkt:scala", "tp:AnyRef"]},

[info]     {"sym": ["cl:C1"], "extends": ["tr:T"]},

[info]     {"sym": ["cl:C1", "def:<init>"], "uses": ["cl:C1"]},

[info]     {"sym": ["cl:C1", "def:<init>"], "uses": ["pkt:java", "pkt:lang", "cl:Object", "def:<init>"]},

[info]     {"sym": ["cl:C2"], "extends": ["pkt:scala", "tp:AnyRef"]},

[info]     {"sym": ["cl:C2"], "extends": ["tr:T"]},

[info]     {"sym": ["cl:C2", "def:<init>"], "uses": ["cl:C2"]},

[info]     {"sym": ["cl:C2", "def:<init>"], "uses": ["pkt:java", "pkt:lang", "cl:Object", "def:<init>"]},

[info]     {"sym": ["tr:T"], "extends": ["pkt:scala", "tp:AnyRef"]}
]
[info]   ]", but got "[[
[info]     {"sym": ["cl:C1"], "extends": ["pkt:scala", "tp:AnyRef"]},
[info]     {"sym": ["cl:C1"], "extends": ["tr:T"]},
[info]     {"sym": ["cl:C1", "def:<init>"], "uses": ["cl:C1"]},
[info]     {"sym": ["cl:C1", "def:<init>"], "uses": ["pkt:java", "pkt:lang", "cl:Object", "def:<init>"]},
[info]     {"sym": ["cl:C2"], "extends": ["pkt:scala", "tp:AnyRef"]},
[info]     {"sym": ["cl:C2"], "extends": ["tr:T"]},
[info]     {"sym": ["cl:C2", "def:<init>"], "uses": ["cl:C2"]},
[info]     {"sym": ["cl:C2", "def:<init>"], "uses": ["pkt:java", "pkt:lang", "cl:Object", "def:<init>"]},
[info]     {"sym": ["tr:T"], "extends": ["pkt:scala", "tp:AnyRef"]}]
[info]   ]" (SerializationTests.scala:13)
[info] - two subclasses: through model *** FAILED ***
[info]   Expected "[[

[info]     {"sym": ["cl:C1"], "extends": ["pkt:scala", "tp:AnyRef"]},

[info]     {"sym": ["cl:C1"], "extends": ["tr:T"]},

[info]     {"sym": ["cl:C1", "def:<init>"], "uses": ["cl:C1"]},

[info]     {"sym": ["cl:C1", "def:<init>"], "uses": ["pkt:java", "pkt:lang", "cl:Object", "def:<init>"]},

[info]     {"sym": ["cl:C2"], "extends": ["pkt:scala", "tp:AnyRef"]},

[info]     {"sym": ["cl:C2"], "extends": ["tr:T"]},

[info]     {"sym": ["cl:C2", "def:<init>"], "uses": ["cl:C2"]},

[info]     {"sym": ["cl:C2", "def:<init>"], "uses": ["pkt:java", "pkt:lang", "cl:Object", "def:<init>"]},

[info]     {"sym": ["tr:T"], "extends": ["pkt:scala", "tp:AnyRef"]}
]
[info]   ]", but got "[[
[info]     {"sym": ["cl:C1"], "extends": ["pkt:scala", "tp:AnyRef"]},
[info]     {"sym": ["cl:C1"], "extends": ["tr:T"]},
[info]     {"sym": ["cl:C1", "def:<init>"], "uses": ["cl:C1"]},
[info]     {"sym": ["cl:C1", "def:<init>"], "uses": ["pkt:java", "pkt:lang", "cl:Object", "def:<init>"]},
[info]     {"sym": ["cl:C2"], "extends": ["pkt:scala", "tp:AnyRef"]},
[info]     {"sym": ["cl:C2"], "extends": ["tr:T"]},
[info]     {"sym": ["cl:C2", "def:<init>"], "uses": ["cl:C2"]},
[info]     {"sym": ["cl:C2", "def:<init>"], "uses": ["pkt:java", "pkt:lang", "cl:Object", "def:<init>"]},
[info]     {"sym": ["tr:T"], "extends": ["pkt:scala", "tp:AnyRef"]}]
[info]   ]" (SerializationTests.scala:23)
[info] - circular dependency: through ASTs *** FAILED ***
[info]   Expected "[[

[info]     {"sym": ["tr:T1"], "extends": ["pkt:scala", "tp:AnyRef"]},

[info]     {"sym": ["tr:T1", "def:x"], "uses": ["tr:T2"]},

[info]     {"sym": ["tr:T2"], "extends": ["pkt:scala", "tp:AnyRef"]},

[info]     {"sym": ["tr:T2", "def:x"], "uses": ["tr:T1"]}
]
[info]   ]", but got "[[
[info]     {"sym": ["tr:T1"], "extends": ["pkt:scala", "tp:AnyRef"]},
[info]     {"sym": ["tr:T1", "def:x"], "uses": ["tr:T2"]},
[info]     {"sym": ["tr:T2"], "extends": ["pkt:scala", "tp:AnyRef"]},
[info]     {"sym": ["tr:T2", "def:x"], "uses": ["tr:T1"]}]
[info]   ]" (SerializationTests.scala:13)
[info] - circular dependency: through model *** FAILED ***
[info]   Expected "[[

[info]     {"sym": ["tr:T1"], "extends": ["pkt:scala", "tp:AnyRef"]},

[info]     {"sym": ["tr:T1", "def:x"], "uses": ["tr:T2"]},

[info]     {"sym": ["tr:T2"], "extends": ["pkt:scala", "tp:AnyRef"]},

[info]     {"sym": ["tr:T2", "def:x"], "uses": ["tr:T1"]}
]
[info]   ]", but got "[[
[info]     {"sym": ["tr:T1"], "extends": ["pkt:scala", "tp:AnyRef"]},
[info]     {"sym": ["tr:T1", "def:x"], "uses": ["tr:T2"]},
[info]     {"sym": ["tr:T2"], "extends": ["pkt:scala", "tp:AnyRef"]},
[info]     {"sym": ["tr:T2", "def:x"], "uses": ["tr:T1"]}]
[info]   ]" (SerializationTests.scala:23)
[info] - 3-cycle: through ASTs *** FAILED ***
[info]   Expected "[[

[info]     {"sym": ["tr:T1"], "extends": ["pkt:scala", "tp:AnyRef"]},

[info]     {"sym": ["tr:T1", "def:t"], "uses": ["tr:T2"]},

[info]     {"sym": ["tr:T2"], "extends": ["pkt:scala", "tp:AnyRef"]},

[info]     {"sym": ["tr:T2", "def:t"], "uses": ["tr:T3"]},

[info]     {"sym": ["tr:T3"], "extends": ["pkt:scala", "tp:AnyRef"]},

[info]     {"sym": ["tr:T3", "def:t"], "uses": ["tr:T1"]}
]
[info]   ]", but got "[[
[info]     {"sym": ["tr:T1"], "extends": ["pkt:scala", "tp:AnyRef"]},
[info]     {"sym": ["tr:T1", "def:t"], "uses": ["tr:T2"]},
[info]     {"sym": ["tr:T2"], "extends": ["pkt:scala", "tp:AnyRef"]},
[info]     {"sym": ["tr:T2", "def:t"], "uses": ["tr:T3"]},
[info]     {"sym": ["tr:T3"], "extends": ["pkt:scala", "tp:AnyRef"]},
[info]     {"sym": ["tr:T3", "def:t"], "uses": ["tr:T1"]}]
[info]   ]" (SerializationTests.scala:13)
[info] - 3-cycle: through model *** FAILED ***
[info]   Expected "[[

[info]     {"sym": ["tr:T1"], "extends": ["pkt:scala", "tp:AnyRef"]},

[info]     {"sym": ["tr:T1", "def:t"], "uses": ["tr:T2"]},

[info]     {"sym": ["tr:T2"], "extends": ["pkt:scala", "tp:AnyRef"]},

[info]     {"sym": ["tr:T2", "def:t"], "uses": ["tr:T3"]},

[info]     {"sym": ["tr:T3"], "extends": ["pkt:scala", "tp:AnyRef"]},

[info]     {"sym": ["tr:T3", "def:t"], "uses": ["tr:T1"]}
]
[info]   ]", but got "[[
[info]     {"sym": ["tr:T1"], "extends": ["pkt:scala", "tp:AnyRef"]},
[info]     {"sym": ["tr:T1", "def:t"], "uses": ["tr:T2"]},
[info]     {"sym": ["tr:T2"], "extends": ["pkt:scala", "tp:AnyRef"]},
[info]     {"sym": ["tr:T2", "def:t"], "uses": ["tr:T3"]},
[info]     {"sym": ["tr:T3"], "extends": ["pkt:scala", "tp:AnyRef"]},
[info]     {"sym": ["tr:T3", "def:t"], "uses": ["tr:T1"]}]
[info]   ]" (SerializationTests.scala:23)
[info] - package: through ASTs *** FAILED ***
[info]   Expected "[[

[info]     {"sym": [], "uses": ["pk:a"]},

[info]     {"sym": [], "uses": ["pkt:a", "pk:b"]},

[info]     {"sym": ["pkt:a", "pkt:b", "cl:C1"], "extends": ["pkt:scala", "tp:AnyRef"]},

[info]     {"sym": ["pkt:a", "pkt:b", "cl:C1", "def:<init>"], "uses": ["pkt:a", "pkt:b", "cl:C1"]},

[info]     {"sym": ["pkt:a", "pkt:b", "cl:C1", "def:<init>"], "uses": ["pkt:java", "pkt:lang", "cl:Object", "def:<init>"]},

[info]     {"sym": ["pkt:a", "pkt:b", "cl:C2"], "extends": ["pkt:scala", "tp:AnyRef"]},

[info]     {"sym": ["pkt:a", "pkt:b", "cl:C2", "def:<init>"], "uses": ["pkt:a", "pkt:b", "cl:C2"]},

[info]     {"sym": ["pkt:a", "pkt:b", "cl:C2", "def:<init>"], "uses": ["pkt:java", "pkt:lang", "cl:Object", "def:<init>"]}
]
[info]   ]", but got "[[
[info]     {"sym": [], "uses": ["pk:a"]},
[info]     {"sym": [], "uses": ["pkt:a", "pk:b"]},
[info]     {"sym": ["pkt:a", "pkt:b", "cl:C1"], "extends": ["pkt:scala", "tp:AnyRef"]},
[info]     {"sym": ["pkt:a", "pkt:b", "cl:C1", "def:<init>"], "uses": ["pkt:a", "pkt:b", "cl:C1"]},
[info]     {"sym": ["pkt:a", "pkt:b", "cl:C1", "def:<init>"], "uses": ["pkt:java", "pkt:lang", "cl:Object", "def:<init>"]},
[info]     {"sym": ["pkt:a", "pkt:b", "cl:C2"], "extends": ["pkt:scala", "tp:AnyRef"]},
[info]     {"sym": ["pkt:a", "pkt:b", "cl:C2", "def:<init>"], "uses": ["pkt:a", "pkt:b", "cl:C2"]},
[info]     {"sym": ["pkt:a", "pkt:b", "cl:C2", "def:<init>"], "uses": ["pkt:java", "pkt:lang", "cl:Object", "def:<init>"]}]
[info]   ]" (SerializationTests.scala:13)
[info] - package: through model *** FAILED ***
[info]   Expected "[[

[info]     {"sym": [], "uses": ["pk:a"]},

[info]     {"sym": [], "uses": ["pkt:a", "pk:b"]},

[info]     {"sym": ["pkt:a", "pkt:b", "cl:C1"], "extends": ["pkt:scala", "tp:AnyRef"]},

[info]     {"sym": ["pkt:a", "pkt:b", "cl:C1", "def:<init>"], "uses": ["pkt:a", "pkt:b", "cl:C1"]},

[info]     {"sym": ["pkt:a", "pkt:b", "cl:C1", "def:<init>"], "uses": ["pkt:java", "pkt:lang", "cl:Object", "def:<init>"]},

[info]     {"sym": ["pkt:a", "pkt:b", "cl:C2"], "extends": ["pkt:scala", "tp:AnyRef"]},

[info]     {"sym": ["pkt:a", "pkt:b", "cl:C2", "def:<init>"], "uses": ["pkt:a", "pkt:b", "cl:C2"]},

[info]     {"sym": ["pkt:a", "pkt:b", "cl:C2", "def:<init>"], "uses": ["pkt:java", "pkt:lang", "cl:Object", "def:<init>"]}
]
[info]   ]", but got "[[
[info]     {"sym": [], "uses": ["pk:a"]},
[info]     {"sym": [], "uses": ["pkt:a", "pk:b"]},
[info]     {"sym": ["pkt:a", "pkt:b", "cl:C1"], "extends": ["pkt:scala", "tp:AnyRef"]},
[info]     {"sym": ["pkt:a", "pkt:b", "cl:C1", "def:<init>"], "uses": ["pkt:a", "pkt:b", "cl:C1"]},
[info]     {"sym": ["pkt:a", "pkt:b", "cl:C1", "def:<init>"], "uses": ["pkt:java", "pkt:lang", "cl:Object", "def:<init>"]},
[info]     {"sym": ["pkt:a", "pkt:b", "cl:C2"], "extends": ["pkt:scala", "tp:AnyRef"]},
[info]     {"sym": ["pkt:a", "pkt:b", "cl:C2", "def:<init>"], "uses": ["pkt:a", "pkt:b", "cl:C2"]},
[info]     {"sym": ["pkt:a", "pkt:b", "cl:C2", "def:<init>"], "uses": ["pkt:java", "pkt:lang", "cl:Object", "def:<init>"]}]
[info]   ]" (SerializationTests.scala:23)
[info] - nested class: through ASTs *** FAILED ***
[info]   Expected "[[

[info]     {"sym": ["cl:C"], "extends": ["pkt:scala", "tp:AnyRef"]},

[info]     {"sym": ["cl:C", "cl:D"], "extends": ["pkt:scala", "tp:AnyRef"]},

[info]     {"sym": ["cl:C", "cl:D"], "extends": ["tr:T"]},

[info]     {"sym": ["cl:C", "cl:D", "def:<init>"], "uses": ["cl:C"]},

[info]     {"sym": ["cl:C", "cl:D", "def:<init>"], "uses": ["cl:C", "cl:D"]},

[info]     {"sym": ["cl:C", "cl:D", "def:<init>"], "uses": ["pkt:java", "pkt:lang", "cl:Object", "def:<init>"]},

[info]     {"sym": ["cl:C", "def:<init>"], "uses": ["cl:C"]},

[info]     {"sym": ["cl:C", "def:<init>"], "uses": ["pkt:java", "pkt:lang", "cl:Object", "def:<init>"]},

[info]     {"sym": ["tr:T"], "extends": ["pkt:scala", "tp:AnyRef"]}
]
[info]   ]", but got "[[
[info]     {"sym": ["cl:C"], "extends": ["pkt:scala", "tp:AnyRef"]},
[info]     {"sym": ["cl:C", "cl:D"], "extends": ["pkt:scala", "tp:AnyRef"]},
[info]     {"sym": ["cl:C", "cl:D"], "extends": ["tr:T"]},
[info]     {"sym": ["cl:C", "cl:D", "def:<init>"], "uses": ["cl:C"]},
[info]     {"sym": ["cl:C", "cl:D", "def:<init>"], "uses": ["cl:C", "cl:D"]},
[info]     {"sym": ["cl:C", "cl:D", "def:<init>"], "uses": ["pkt:java", "pkt:lang", "cl:Object", "def:<init>"]},
[info]     {"sym": ["cl:C", "def:<init>"], "uses": ["cl:C"]},
[info]     {"sym": ["cl:C", "def:<init>"], "uses": ["pkt:java", "pkt:lang", "cl:Object", "def:<init>"]},
[info]     {"sym": ["tr:T"], "extends": ["pkt:scala", "tp:AnyRef"]}]
[info]   ]" (SerializationTests.scala:13)
[info] - nested class: through model *** FAILED ***
[info]   Expected "[[

[info]     {"sym": ["cl:C"], "extends": ["pkt:scala", "tp:AnyRef"]},

[info]     {"sym": ["cl:C", "cl:D"], "extends": ["pkt:scala", "tp:AnyRef"]},

[info]     {"sym": ["cl:C", "cl:D"], "extends": ["tr:T"]},

[info]     {"sym": ["cl:C", "cl:D", "def:<init>"], "uses": ["cl:C"]},

[info]     {"sym": ["cl:C", "cl:D", "def:<init>"], "uses": ["cl:C", "cl:D"]},

[info]     {"sym": ["cl:C", "cl:D", "def:<init>"], "uses": ["pkt:java", "pkt:lang", "cl:Object", "def:<init>"]},

[info]     {"sym": ["cl:C", "def:<init>"], "uses": ["cl:C"]},

[info]     {"sym": ["cl:C", "def:<init>"], "uses": ["pkt:java", "pkt:lang", "cl:Object", "def:<init>"]},

[info]     {"sym": ["tr:T"], "extends": ["pkt:scala", "tp:AnyRef"]}
]
[info]   ]", but got "[[
[info]     {"sym": ["cl:C"], "extends": ["pkt:scala", "tp:AnyRef"]},
[info]     {"sym": ["cl:C", "cl:D"], "extends": ["pkt:scala", "tp:AnyRef"]},
[info]     {"sym": ["cl:C", "cl:D"], "extends": ["tr:T"]},
[info]     {"sym": ["cl:C", "cl:D", "def:<init>"], "uses": ["cl:C"]},
[info]     {"sym": ["cl:C", "cl:D", "def:<init>"], "uses": ["cl:C", "cl:D"]},
[info]     {"sym": ["cl:C", "cl:D", "def:<init>"], "uses": ["pkt:java", "pkt:lang", "cl:Object", "def:<init>"]},
[info]     {"sym": ["cl:C", "def:<init>"], "uses": ["cl:C"]},
[info]     {"sym": ["cl:C", "def:<init>"], "uses": ["pkt:java", "pkt:lang", "cl:Object", "def:<init>"]},
[info]     {"sym": ["tr:T"], "extends": ["pkt:scala", "tp:AnyRef"]}]
[info]   ]" (SerializationTests.scala:23)
[info] - uses module: through ASTs *** FAILED ***
[info]   Expected "[[

[info]     {"sym": ["o:O"], "extends": ["pkt:scala", "tp:AnyRef"]},

[info]     {"sym": ["o:O"], "uses": ["pk:scala"]},

[info]     {"sym": ["o:O"], "uses": ["pkt:scala", "ov:None"]},

[info]     {"sym": ["o:O", "def:<init>"], "uses": ["o:O"]},

[info]     {"sym": ["o:O", "def:<init>"], "uses": ["pkt:java", "pkt:lang", "cl:Object", "def:<init>"]}
]
[info]   ]", but got "[[
[info]     {"sym": ["o:O"], "extends": ["pkt:scala", "tp:AnyRef"]},
[info]     {"sym": ["o:O"], "uses": ["pk:scala"]},
[info]     {"sym": ["o:O"], "uses": ["pkt:scala", "ov:None"]},
[info]     {"sym": ["o:O", "def:<init>"], "uses": ["o:O"]},
[info]     {"sym": ["o:O", "def:<init>"], "uses": ["pkt:java", "pkt:lang", "cl:Object", "def:<init>"]}]
[info]   ]" (SerializationTests.scala:13)
[info] - uses module: through model *** FAILED ***
[info]   Expected "[[

[info]     {"sym": ["o:O"], "extends": ["pkt:scala", "tp:AnyRef"]},

[info]     {"sym": ["o:O"], "uses": ["pk:scala"]},

[info]     {"sym": ["o:O"], "uses": ["pkt:scala", "ov:None"]},

[info]     {"sym": ["o:O", "def:<init>"], "uses": ["o:O"]},

[info]     {"sym": ["o:O", "def:<init>"], "uses": ["pkt:java", "pkt:lang", "cl:Object", "def:<init>"]}
]
[info]   ]", but got "[[
[info]     {"sym": ["o:O"], "extends": ["pkt:scala", "tp:AnyRef"]},
[info]     {"sym": ["o:O"], "uses": ["pk:scala"]},
[info]     {"sym": ["o:O"], "uses": ["pkt:scala", "ov:None"]},
[info]     {"sym": ["o:O", "def:<init>"], "uses": ["o:O"]},
[info]     {"sym": ["o:O", "def:<init>"], "uses": ["pkt:java", "pkt:lang", "cl:Object", "def:<init>"]}]
[info]   ]" (SerializationTests.scala:23)
[info] - pattern match: through ASTs *** FAILED ***
[info]   Expected "[[

[info]     {"sym": ["o:O"], "extends": ["pkt:scala", "tp:AnyRef"]},

[info]     {"sym": ["o:O"], "uses": ["o:O", "t:<local O>", "def:matchEnd3"]},

[info]     {"sym": ["o:O"], "uses": ["t:x"]},

[info]     {"sym": ["o:O", "def:<init>"], "uses": ["o:O"]},

[info]     {"sym": ["o:O", "def:<init>"], "uses": ["pkt:java", "pkt:lang", "cl:Object", "def:<init>"]},

[info]     {"sym": ["o:O", "t:<local O>", "t:x1"], "uses": ["pkt:scala", "cl:Int"]}
]
[info]   ]", but got "[[
[info]     {"sym": ["o:O"], "extends": ["pkt:scala", "tp:AnyRef"]},
[info]     {"sym": ["o:O"], "uses": ["o:O", "t:<local O>", "def:matchEnd3"]},
[info]     {"sym": ["o:O"], "uses": ["t:x"]},
[info]     {"sym": ["o:O", "def:<init>"], "uses": ["o:O"]},
[info]     {"sym": ["o:O", "def:<init>"], "uses": ["pkt:java", "pkt:lang", "cl:Object", "def:<init>"]},
[info]     {"sym": ["o:O", "t:<local O>", "t:x1"], "uses": ["pkt:scala", "cl:Int"]}]
[info]   ]" (SerializationTests.scala:13)
[info] - pattern match: through model *** FAILED ***
[info]   Expected "[[

[info]     {"sym": ["o:O"], "extends": ["pkt:scala", "tp:AnyRef"]},

[info]     {"sym": ["o:O"], "uses": ["o:O", "t:<local O>", "def:matchEnd3"]},

[info]     {"sym": ["o:O"], "uses": ["t:x"]},

[info]     {"sym": ["o:O", "def:<init>"], "uses": ["o:O"]},

[info]     {"sym": ["o:O", "def:<init>"], "uses": ["pkt:java", "pkt:lang", "cl:Object", "def:<init>"]},

[info]     {"sym": ["o:O", "t:<local O>", "t:x1"], "uses": ["pkt:scala", "cl:Int"]}
]
[info]   ]", but got "[[
[info]     {"sym": ["o:O"], "extends": ["pkt:scala", "tp:AnyRef"]},
[info]     {"sym": ["o:O"], "uses": ["o:O", "t:<local O>", "def:matchEnd3"]},
[info]     {"sym": ["o:O"], "uses": ["t:x"]},
[info]     {"sym": ["o:O", "def:<init>"], "uses": ["o:O"]},
[info]     {"sym": ["o:O", "def:<init>"], "uses": ["pkt:java", "pkt:lang", "cl:Object", "def:<init>"]},
[info]     {"sym": ["o:O", "t:<local O>", "t:x1"], "uses": ["pkt:scala", "cl:Int"]}]
[info]   ]" (SerializationTests.scala:23)
[info] - readme: through ASTs *** FAILED ***
[info]   Expected "[[

[info]     {"sym": ["o:Dep1"], "extends": ["pkt:scala", "tp:AnyRef"]},

[info]     {"sym": ["o:Dep1", "def:<init>"], "uses": ["o:Dep1"]},

[info]     {"sym": ["o:Dep1", "def:<init>"], "uses": ["pkt:java", "pkt:lang", "cl:Object", "def:<init>"]},

[info]     {"sym": ["o:Dep1", "def:x"], "uses": ["o:Dep1", "t:x"]},

[info]     {"sym": ["o:Dep1", "def:x"], "uses": ["pkt:scala", "cl:Int"]},

[info]     {"sym": ["o:Dep1", "def:y"], "uses": ["o:Dep1", "t:y"]},

[info]     {"sym": ["o:Dep1", "def:y"], "uses": ["pkt:scala", "cl:Int"]},

[info]     {"sym": ["o:Dep1", "t:x"], "uses": ["pkt:scala", "cl:Int"]},

[info]     {"sym": ["o:Dep1", "t:y"], "uses": ["o:Dep2", "def:z"]},

[info]     {"sym": ["o:Dep1", "t:y"], "uses": ["ov:Dep2"]},

[info]     {"sym": ["o:Dep1", "t:y"], "uses": ["pkt:scala", "cl:Int"]},

[info]     {"sym": ["o:Dep2"], "extends": ["pkt:scala", "tp:AnyRef"]},

[info]     {"sym": ["o:Dep2", "def:<init>"], "uses": ["o:Dep2"]},

[info]     {"sym": ["o:Dep2", "def:<init>"], "uses": ["pkt:java", "pkt:lang", "cl:Object", "def:<init>"]},

[info]     {"sym": ["o:Dep2", "def:z"], "uses": ["o:Dep2", "t:z"]},

[info]     {"sym": ["o:Dep2", "def:z"], "uses": ["pkt:scala", "cl:Int"]},

[info]     {"sym": ["o:Dep2", "t:z"], "uses": ["o:Dep1", "def:x"]},

[info]     {"sym": ["o:Dep2", "t:z"], "uses": ["ov:Dep1"]},

[info]     {"sym": ["o:Dep2", "t:z"], "uses": ["pkt:scala", "cl:Int"]}
]
[info]   ]", but got "[[
[info]     {"sym": ["o:Dep1"], "extends": ["pkt:scala", "tp:AnyRef"]},
[info]     {"sym": ["o:Dep1", "def:<init>"], "uses": ["o:Dep1"]},
[info]     {"sym": ["o:Dep1", "def:<init>"], "uses": ["pkt:java", "pkt:lang", "cl:Object", "def:<init>"]},
[info]     {"sym": ["o:Dep1", "def:x"], "uses": ["o:Dep1", "t:x"]},
[info]     {"sym": ["o:Dep1", "def:x"], "uses": ["pkt:scala", "cl:Int"]},
[info]     {"sym": ["o:Dep1", "def:y"], "uses": ["o:Dep1", "t:y"]},
[info]     {"sym": ["o:Dep1", "def:y"], "uses": ["pkt:scala", "cl:Int"]},
[info]     {"sym": ["o:Dep1", "t:x"], "uses": ["pkt:scala", "cl:Int"]},
[info]     {"sym": ["o:Dep1", "t:y"], "uses": ["o:Dep2", "def:z"]},
[info]     {"sym": ["o:Dep1", "t:y"], "uses": ["ov:Dep2"]},
[info]     {"sym": ["o:Dep1", "t:y"], "uses": ["pkt:scala", "cl:Int"]},
[info]     {"sym": ["o:Dep2"], "extends": ["pkt:scala", "tp:AnyRef"]},
[info]     {"sym": ["o:Dep2", "def:<init>"], "uses": ["o:Dep2"]},
[info]     {"sym": ["o:Dep2", "def:<init>"], "uses": ["pkt:java", "pkt:lang", "cl:Object", "def:<init>"]},
[info]     {"sym": ["o:Dep2", "def:z"], "uses": ["o:Dep2", "t:z"]},
[info]     {"sym": ["o:Dep2", "def:z"], "uses": ["pkt:scala", "cl:Int"]},
[info]     {"sym": ["o:Dep2", "t:z"], "uses": ["o:Dep1", "def:x"]},
[info]     {"sym": ["o:Dep2", "t:z"], "uses": ["ov:Dep1"]},
[info]     {"sym": ["o:Dep2", "t:z"], "uses": ["pkt:scala", "cl:Int"]}]
[info]   ]" (SerializationTests.scala:13)
[info] - readme: through model *** FAILED ***
[info]   Expected "[[

[info]     {"sym": ["o:Dep1"], "extends": ["pkt:scala", "tp:AnyRef"]},

[info]     {"sym": ["o:Dep1", "def:<init>"], "uses": ["o:Dep1"]},

[info]     {"sym": ["o:Dep1", "def:<init>"], "uses": ["pkt:java", "pkt:lang", "cl:Object", "def:<init>"]},

[info]     {"sym": ["o:Dep1", "def:x"], "uses": ["o:Dep1", "t:x"]},

[info]     {"sym": ["o:Dep1", "def:x"], "uses": ["pkt:scala", "cl:Int"]},

[info]     {"sym": ["o:Dep1", "def:y"], "uses": ["o:Dep1", "t:y"]},

[info]     {"sym": ["o:Dep1", "def:y"], "uses": ["pkt:scala", "cl:Int"]},

[info]     {"sym": ["o:Dep1", "t:x"], "uses": ["pkt:scala", "cl:Int"]},

[info]     {"sym": ["o:Dep1", "t:y"], "uses": ["o:Dep2", "def:z"]},

[info]     {"sym": ["o:Dep1", "t:y"], "uses": ["ov:Dep2"]},

[info]     {"sym": ["o:Dep1", "t:y"], "uses": ["pkt:scala", "cl:Int"]},

[info]     {"sym": ["o:Dep2"], "extends": ["pkt:scala", "tp:AnyRef"]},

[info]     {"sym": ["o:Dep2", "def:<init>"], "uses": ["o:Dep2"]},

[info]     {"sym": ["o:Dep2", "def:<init>"], "uses": ["pkt:java", "pkt:lang", "cl:Object", "def:<init>"]},

[info]     {"sym": ["o:Dep2", "def:z"], "uses": ["o:Dep2", "t:z"]},

[info]     {"sym": ["o:Dep2", "def:z"], "uses": ["pkt:scala", "cl:Int"]},

[info]     {"sym": ["o:Dep2", "t:z"], "uses": ["o:Dep1", "def:x"]},

[info]     {"sym": ["o:Dep2", "t:z"], "uses": ["ov:Dep1"]},

[info]     {"sym": ["o:Dep2", "t:z"], "uses": ["pkt:scala", "cl:Int"]}
]
[info]   ]", but got "[[
[info]     {"sym": ["o:Dep1"], "extends": ["pkt:scala", "tp:AnyRef"]},
[info]     {"sym": ["o:Dep1", "def:<init>"], "uses": ["o:Dep1"]},
[info]     {"sym": ["o:Dep1", "def:<init>"], "uses": ["pkt:java", "pkt:lang", "cl:Object", "def:<init>"]},
[info]     {"sym": ["o:Dep1", "def:x"], "uses": ["o:Dep1", "t:x"]},
[info]     {"sym": ["o:Dep1", "def:x"], "uses": ["pkt:scala", "cl:Int"]},
[info]     {"sym": ["o:Dep1", "def:y"], "uses": ["o:Dep1", "t:y"]},
[info]     {"sym": ["o:Dep1", "def:y"], "uses": ["pkt:scala", "cl:Int"]},
[info]     {"sym": ["o:Dep1", "t:x"], "uses": ["pkt:scala", "cl:Int"]},
[info]     {"sym": ["o:Dep1", "t:y"], "uses": ["o:Dep2", "def:z"]},
[info]     {"sym": ["o:Dep1", "t:y"], "uses": ["ov:Dep2"]},
[info]     {"sym": ["o:Dep1", "t:y"], "uses": ["pkt:scala", "cl:Int"]},
[info]     {"sym": ["o:Dep2"], "extends": ["pkt:scala", "tp:AnyRef"]},
[info]     {"sym": ["o:Dep2", "def:<init>"], "uses": ["o:Dep2"]},
[info]     {"sym": ["o:Dep2", "def:<init>"], "uses": ["pkt:java", "pkt:lang", "cl:Object", "def:<init>"]},
[info]     {"sym": ["o:Dep2", "def:z"], "uses": ["o:Dep2", "t:z"]},
[info]     {"sym": ["o:Dep2", "def:z"], "uses": ["pkt:scala", "cl:Int"]},
[info]     {"sym": ["o:Dep2", "t:z"], "uses": ["o:Dep1", "def:x"]},
[info]     {"sym": ["o:Dep2", "t:z"], "uses": ["ov:Dep1"]},
[info]     {"sym": ["o:Dep2", "t:z"], "uses": ["pkt:scala", "cl:Int"]}]
[info]   ]" (SerializationTests.scala:23)
[info] Run completed in 6 seconds, 842 milliseconds.
[info] Total number of tests run: 55
[info] Suites: completed 5, aborted 0
[info] Tests: succeeded 0, failed 55, canceled 0, ignored 0, pending 0
[info] *** 55 TESTS FAILED ***
[error] Failed tests:
[error] 	com.lightbend.tools.sculpt.TreeTests
[error] 	com.lightbend.tools.sculpt.IntegrationTest
[error] 	com.lightbend.tools.sculpt.CyclesTests
[error] 	com.lightbend.tools.sculpt.GraphTests
[error] 	com.lightbend.tools.sculpt.SerializationTests
[error] (Test / test) sbt.TestsFailedException: Tests unsuccessful
[error] Total time: 8 s, completed 2018-feb-19 20:42:24

feature: source-level aggregation, package-level aggregation

I think this is the number-one feature that would make Sculpt more usable

and adding it wouldn't be a huge or tricky project. the existing code that starts with the method-level data and does class-level aggregation already works fine and could be used as a basis for the new aggregation types.

feature: adding an edge for file to symbol

Sculpt could be exactly what I need to break large scala targets into minimal dags for bazel to build.

The only thing missing is a mapping of which file each symbol is defined in, since bazel’s finest units (currently) are files.

How hard would it be to add this mapping? Something like [{ “file”: “Foo.scala”} , “produces”, {“sym”: [...

If you can coach me through this, I’m happy to send a PR if you thing this would be easy ish for someone unfamiliar with the compiler/plug-in.

use k-means clustering to identify clusters

suggested in a January status meeting with the customer
#23 will find cycles, but if the input codebase turns out to be highly connected enough, we might well find that there is a giant cycle encompassing most of the code. if that's the case, we'll need some heuristics for identifying clusters that are candidates for separation/modularization

generate class cycle report

augment Sculpt to generate a report showing what cyclic dependencies exist between classes.

An example of a tool that generates similar information is Classycle. From their doc: "Classycle detects cycles with the help of Tarjan's algorithm for condensation of a digraph into an acyclic digraph of its so-called strong components" (link). See example output at e.g. http://classycle.sourceforge.net/ant.html (the "Cycles" section).

feature: render output using DOT

some WIP on this is at #51 if someone wants to finish it up.

@jrudolph concluded "doesn't seem particularly useful on reasonably sized code bases, takes dot ages to generate a graph and the result is hardly usable"

but if we had source-file-level and/or package-level aggregation (#56), the graphs for that would probably be usable

code is out of date with current Zinc

as @jvican observes,

this is quite old (2 years ago) and some changes have happened in Zinc regarding type dependencies that may be need to be duplicated here (i haven't dug into the code yet). In that case I can do that.

development notes

some stuff I wrote down back when I was working on this. not sure if it's useful, but I feel like there should be a record of it...

skeletonization of sources

  // unskeletonized
  protected def readResolve(): AnyRef = thisenum.getClass.getField(MODULE_INSTANCE_NAME).get(null)

  // skeletonized: package level
  def readResolve() =>
     java.lang
     java.lang.reflect
     scala.                     2

  // skeletonized: class level
  def readResolve(): AnyRef =
    Class.getClass => Class
    Class.getField => Field
    abc.MODULE_INSTANCE_NAME => String
    Field.get => AnyRef

feature: measure the thickness of a dependency

(this came up when I gave my Sculpt talk in Chicago. can't remember who suggested it)

it would be really nice if when you aggregate at the class level or the package level, the output had some measure of the "thickness" of a dependency. probably just a count of how many individual entries were aggregated into the single entry.

this would help identify dependencies that would be especially easy to cut.

Can I experiment with this repository?

This repository is useful for analysing code at large scale. I'd like to experiment with it to find the best way to split a big project in small repositories that are faster to build. This is the first step to have a nice automatic process that migrates monolitic codebases to smaller pieces that can be efficiently compiled by Bazel.

I'd like to do this for fun, on my free time, and for that I'd like this company to be open-source to ensure that I can share my findings. It goes without saying that the BSD 3-way license will not be violated.

change license from BSD to Apache

I think at the time we put BSD on it, there was no more motivation than "do like Scala". but since then it's been made much more clear to us that Apache 2 is definitely Lightbend's preferred license

investigate pattern match regression once Scala 2.13.0-RC1 is released

in the 2.13 community build at e.g. https://scala-ci.typesafe.com/job/scala-2.13.x-integrate-community-build/1765/ I'm seeing

[scala-sculpt] [info] IntegrationTest:
[scala-sculpt] [info] - lone object
[scala-sculpt] [info] - two subclasses
[scala-sculpt] [info] - circular dependency
[scala-sculpt] [info] - 3-cycle
[scala-sculpt] [info] - package
[scala-sculpt] [info] - nested class
[scala-sculpt] [info] - uses module
[scala-sculpt] [info] - pattern match *** FAILED ***
[scala-sculpt] [info]   Expected "...]},
[scala-sculpt] [info]     {"sym": ["o:O"[], "uses": ["o:O", "t:<local O>", "def:matchEnd3"]},
[scala-sculpt] [info]     {"sym": ["o:O"], "uses": ["t:x"]},
[scala-sculpt] [info]     {"sym": ["o:O", "def:<init>"], "uses": ["o:O"]},
[scala-sculpt] [info]     {"sym": ["o:O", "def:<init>"], "uses": ["pkt:java", "pkt:lang", "cl:Object", "def:<init>"]},
[scala-sculpt] [info]     {"sym": ["o:O", "t:<local O>", "t:x1"], "uses": ["pkt:scala", "cl:Int]"]}
[scala-sculpt] [info]   ]", but got "...]},
[scala-sculpt] [info]     {"sym": ["o:O"[, "def:<init>"], "uses": ["o:O"]},
[scala-sculpt] [info]     {"sym": ["o:O", "def:<init>"], "uses": ["pkt:java", "pkt:lang", "cl:Object", "def:<init>]"]}
[scala-sculpt] [info]   ]" (IntegrationTest.scala:57)

rather than investigate right now, I'm going to gamble that it can wait until RC1 is out the door and we drop M5 from the cross-build

pick a JSON library

none of us knows a whole lot about this

we looked at Manuel Bernhardt's blog post (not as complete or informative as it could be, but it's the best available comparison — there doesn't seem to be anything more comprehensive out there)

jawn has a good reputation just for parsing, but we don't need AST independence, and a want a more end-to-end solution

all else being equal we lean towards stuff with a Typesafe pedigree, so that suggests using spray-json or play-json

we ended up somewhat arbitrarily picking spray-json since we already use it in Scabot, but we could revisit the choice later.

pattern matches result in weird dependencies on naked terms

I’m finding that any (I think any?) code that contains a pattern match results in a weird dependency on x being emitted even though x doesn't appear in the code, so e.g. compiling:

class C { def a(): Unit = 0 match { case _ => () } }

emits

{"sym": ["cl:C", "def:a"], "uses": ["t:x"]}

at the moment, I'll just ignore these when aggregating at the class level, but we might want to go back and fix the problem at the source (either in this repo, or farther upstream)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.