Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
107 commits
Select commit Hold shift + click to select a range
58a572e
Add -Ysemanticdb option
odersky Oct 7, 2019
493aabd
First version of traverser for SemanticDB extraction
odersky Oct 7, 2019
ffa53d0
Add dependency-free serializer for SemanticDB symbol occurrences.
Oct 7, 2019
9fbf3f0
Add ScalaSettings for sourceroot and targetroot
odersky Oct 7, 2019
6217c29
Add helper method to write SemanticDB files
Oct 7, 2019
fe02843
Write SemanticDB file
odersky Oct 7, 2019
39f244b
Integrate ExtractSsemanticDB in Compiler
odersky Oct 8, 2019
004b6c4
Extract only under -Ysemanticdb
odersky Oct 8, 2019
8caff2d
Refactor path logic and fix symbol names
odersky Oct 8, 2019
c7e13cf
Fixes to localIdx and more comments
odersky Oct 8, 2019
53e7918
Absolutize and normalize paths before writing SemanticDB.
Oct 8, 2019
6921db7
Use buiders instead of String +
odersky Oct 8, 2019
fa5009d
Refine exclusion criteria
odersky Oct 9, 2019
163f086
Polishings
odersky Oct 9, 2019
dfe4d92
Add test case
odersky Oct 9, 2019
1b397e4
Omit definitions with offset positions
odersky Oct 9, 2019
e9cf568
Fix variable references
odersky Oct 9, 2019
5c416d3
Factor out NamedDefTrees from DefTrees
odersky Oct 9, 2019
71f9451
Add test suite for SemanticDB extraction
Oct 9, 2019
e11844b
Move semanticdb-extract test file to new expect test suite
Oct 9, 2019
327f764
update docs, pretty printer and remove Main test
bishabosha Oct 11, 2019
9875f14
add more tests, skip module var in semantic db generation
bishabosha Oct 16, 2019
42e4649
fix overload order and indexing, remove references at package defs
bishabosha Oct 17, 2019
05b41b4
register usage for path parts of an import statement
bishabosha Oct 17, 2019
17bdf10
self symbol is a local symbol
bishabosha Oct 17, 2019
69274af
visit symbol annotations if not from scala.annotation.internal package
bishabosha Oct 17, 2019
36e14b3
do not semanticdb symbol occurences for wildcards
bishabosha Oct 18, 2019
df24fbc
don't emit occurrences for anonymous symbols
bishabosha Oct 18, 2019
3c0a4a7
Ignore noise in templates and children of synthetics
bishabosha Oct 21, 2019
c20f2d1
append _empty_. if empty package is owner
bishabosha Oct 21, 2019
8775d51
do not append package objects to symbols
bishabosha Oct 21, 2019
2137141
exclude default getters
bishabosha Oct 21, 2019
c2054dd
revert exclude package objects
bishabosha Oct 21, 2019
457cf2c
emit public vals without parens
bishabosha Oct 21, 2019
c86266d
eliminate traversing select qualifier of _root_.scala.Predef
bishabosha Nov 5, 2019
1540898
Add many tests
bishabosha Nov 5, 2019
9caa5c4
Add semanticdb todolist; only traverse paths if qualifier is not a pa…
bishabosha Nov 6, 2019
0b2e581
unescape unicode in names, fix overload bug
bishabosha Nov 6, 2019
5bc5a7d
all package objects are named 'package'
bishabosha Nov 6, 2019
61d0820
restore scala.Predef.classOf().
bishabosha Nov 6, 2019
f753129
update todo
bishabosha Nov 6, 2019
6c91041
avoid blacklisting scala.Predef and scala.StringContext
bishabosha Nov 6, 2019
3744e19
Suspend test after rebase
bishabosha Nov 7, 2019
b63908b
Better java symbols
bishabosha Nov 7, 2019
1f24961
add named arguments tests
bishabosha Nov 7, 2019
b114023
add remaining tests and update todo
bishabosha Nov 7, 2019
9e73299
fix special case of _root_ and _empty_
bishabosha Nov 8, 2019
1e3bc91
remove testfilter, remove compilation warnings
bishabosha Nov 8, 2019
78b48e4
Introduce semanticdb Scala object for common definitions
bishabosha Nov 12, 2019
3b78f26
move java sources to test-bootstrapped
bishabosha Nov 12, 2019
4c8aed0
only skip package symbols when printing expect output
bishabosha Nov 12, 2019
20a4ccf
restructure semanticdb package
bishabosha Nov 12, 2019
945bdf7
serialise SymbolInformation, filter out primary ctor in expect test o…
bishabosha Nov 12, 2019
d89586a
improve safety of semanticdb serialisation classes
bishabosha Nov 13, 2019
69e4121
add occurences for private within
bishabosha Nov 13, 2019
2af8a3a
Traverse all paths
bishabosha Nov 13, 2019
f62ce3f
unique package objects for top level definitions
bishabosha Nov 13, 2019
801fa97
add props and kind to all SymbolInformation
bishabosha Nov 14, 2019
637293c
change format of expect test output
bishabosha Nov 14, 2019
3bb757d
add metac.expect test
bishabosha Nov 14, 2019
f54a997
optimise some definitions
bishabosha Nov 15, 2019
cbaf51e
don't make symbols or occurrences for constructors of objects
bishabosha Nov 15, 2019
17a4e47
abstract, and var method for SymbolInformation
bishabosha Nov 15, 2019
66edfef
emit uses of setters instead of the getter
bishabosha Nov 15, 2019
b0a73ee
emit SymbolInfo for ctor params
bishabosha Nov 15, 2019
65d8eb9
support trait kind in SymbolInformation
bishabosha Nov 15, 2019
1b6d7a9
correct arrow direction in metac occurrences, include source snippet,…
bishabosha Nov 15, 2019
02747cd
test collective extension methods with more than one method
bishabosha Nov 16, 2019
7145d0a
typeref to tparam in ctor refers to class tparam instead
bishabosha Nov 16, 2019
6f7fbe6
do not taverse synthetic import in enum
bishabosha Nov 16, 2019
e8e30a6
Filter in enums and enumValues.register
bishabosha Nov 16, 2019
303dcb6
optimise some methods
bishabosha Nov 16, 2019
711ac18
dont define typarams for non primary ctors; remove refs to ctor tparams
bishabosha Nov 16, 2019
f337a6e
method params are never val/var
bishabosha Nov 16, 2019
48be9dd
add more enum tests
bishabosha Nov 16, 2019
1924ea5
remove special case for dollarvalues in enum companion
bishabosha Nov 17, 2019
ddae2a7
refactor definitions
bishabosha Nov 17, 2019
ba0f8cb
reformat metac.expect
bishabosha Nov 17, 2019
22707e3
only traverse self tpt if it has span
bishabosha Nov 18, 2019
18d003b
params of anonymous funs are emitted
bishabosha Nov 18, 2019
83ae6da
more symbols in symbol section
bishabosha Nov 18, 2019
fef188c
better properties for symbols
bishabosha Nov 18, 2019
9bcf227
adjust extension method syntax
bishabosha Nov 18, 2019
6e731a2
More definitions in Symbols section. Rename Scala to Scala3
bishabosha Nov 19, 2019
b31542b
add kind queries to Scala3.infoOps
bishabosha Nov 19, 2019
9cb1d0a
inspect inside definitions with a numbered empty name
bishabosha Nov 19, 2019
a051a03
define anon classes
bishabosha Nov 20, 2019
eb3ba6c
refactor tools
bishabosha Nov 20, 2019
6aea653
Dont make occurrences for setters, test def with explicit setter syntax
bishabosha Nov 20, 2019
d774f5a
better support paths and pattern defs
bishabosha Nov 20, 2019
69f3d60
exclude use occurrences of annotation constructors
bishabosha Nov 20, 2019
dc1e127
traverse parents if span exists
bishabosha Nov 21, 2019
298b2b4
implicit objects have correct props
bishabosha Nov 21, 2019
afff105
support pattern vals
bishabosha Nov 21, 2019
057b158
update TODO
bishabosha Nov 21, 2019
bfbe08d
Resupport Ident patterns in pattern defs
bishabosha Nov 21, 2019
0bf31a9
Support named arguments
bishabosha Nov 21, 2019
4a3071f
syntax changes and test result improvements
bishabosha Dec 10, 2019
ace6257
delete dead code
bishabosha Dec 12, 2019
196c90c
output whole file and not diff in failure case
bishabosha Dec 12, 2019
f82a8c7
remove special case for Annotated, update expect for anon class change
bishabosha Dec 13, 2019
25fdafa
refactor names and remove dead code
bishabosha Dec 13, 2019
6a47cf6
drop -scansource setting
bishabosha Dec 13, 2019
31aff29
DRY SemanticdbTests
bishabosha Dec 13, 2019
740c864
remove dependency on google diffutil
bishabosha Dec 13, 2019
f02321a
rename target setting to semanticdbTarget
bishabosha Dec 13, 2019
d594863
compile javacp files as part of expect tests
bishabosha Dec 13, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
define anon classes
  • Loading branch information
bishabosha committed Dec 13, 2019
commit a051a03e42477dc602ca467b562b3d4c4a68bd97
13 changes: 10 additions & 3 deletions compiler/src/dotty/tools/dotc/semanticdb/ExtractSemanticDB.scala
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ class ExtractSemanticDB extends Phase with
!sym.exists
|| sym.isLocalDummy
|| sym.is(Synthetic)
|| sym.isConstructor && sym.owner.is(ModuleClass)
|| sym.isConstructor && (sym.owner.is(ModuleClass) || !sym.isGlobal)
|| excludeDefStrict(sym)

private def excludeDefStrict(sym: Symbol)(given Context): Boolean =
Expand All @@ -81,7 +81,8 @@ class ExtractSemanticDB extends Phase with

private def excludeSymbolStrict(sym: Symbol)(given Context): Boolean =
sym.name.isWildcard
|| sym.isAnonymous
|| sym.isAnonymousFunction
|| sym.isAnonymousModuleVal
|| sym.name.isEmptyNumbered

private def excludeChildren(sym: Symbol)(given Context): Boolean =
Expand Down Expand Up @@ -124,7 +125,7 @@ class ExtractSemanticDB extends Phase with
return
if !excludeDef(tree.symbol)
&& tree.span.hasLength
registerDefinition(tree.symbol, tree.nameSpan, symbolKinds(tree))
registerDefinition(tree.symbol, tree.adjustedNameSpan, symbolKinds(tree))
val privateWithin = tree.symbol.privateWithin
if privateWithin.exists
registerUse(privateWithin, spanOfSymbol(privateWithin, tree.span))
Expand Down Expand Up @@ -213,6 +214,12 @@ class ExtractSemanticDB extends Phase with
case _ =>
traverseChildren(tree)

private def (tree: NamedDefTree) adjustedNameSpan(given Context): Span =
if tree.span.exists && tree.name.isAnonymousFunctionName || tree.name.isAnonymousClassName
Span(tree.span.point)
else
tree.nameSpan

/** Add semanticdb name of the given symbol to string builder */
private def addSymName(b: StringBuilder, sym: Symbol)(given ctx: Context): Unit =

Expand Down
4 changes: 4 additions & 0 deletions compiler/src/dotty/tools/dotc/semanticdb/Scala3.scala
Original file line number Diff line number Diff line change
Expand Up @@ -202,4 +202,8 @@ object Scala3 with

end InfoOps

given RangeOps: (range: Range) with
def hasLength = range.endLine > range.startLine || range.endCharacter > range.startCharacter
end RangeOps

end Scala3
4 changes: 2 additions & 2 deletions tests/semanticdb/expect/Advanced.expect.scala
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@ class C/*<-advanced::C#*/[T/*<-advanced::C#[T]*/] {

class Structural/*<-advanced::Structural#*/ {
def s1/*<-advanced::Structural#s1().*/: { val x/*<-local0*/: Int/*->scala::Int#*/ } = ???/*->scala::Predef.`???`().*/
def s2/*<-advanced::Structural#s2().*/: { val x/*<-local1*/: Int/*->scala::Int#*/ } = new { val x/*<-local3*/: Int/*->scala::Int#*/ = ???/*->scala::Predef.`???`().*/ }
def s3/*<-advanced::Structural#s3().*/: { def m/*<-local4*/(x/*<-local5*/: Int/*->scala::Int#*/): Int/*->scala::Int#*/ } = new { def m/*<-local7*/(x/*<-local8*/: Int/*->scala::Int#*/): Int/*->scala::Int#*/ = ???/*->scala::Predef.`???`().*/ }
def s2/*<-advanced::Structural#s2().*/: { val x/*<-local1*/: Int/*->scala::Int#*/ } = /*<-local2*/new { val x/*<-local3*/: Int/*->scala::Int#*/ = ???/*->scala::Predef.`???`().*/ }
def s3/*<-advanced::Structural#s3().*/: { def m/*<-local4*/(x/*<-local5*/: Int/*->scala::Int#*/): Int/*->scala::Int#*/ } = /*<-local6*/new { def m/*<-local7*/(x/*<-local8*/: Int/*->scala::Int#*/): Int/*->scala::Int#*/ = ???/*->scala::Predef.`???`().*/ }
}

class Wildcards/*<-advanced::Wildcards#*/ {
Expand Down
2 changes: 1 addition & 1 deletion tests/semanticdb/expect/Anonymous.expect.scala
Original file line number Diff line number Diff line change
Expand Up @@ -16,5 +16,5 @@ class Anonymous/*<-example::Anonymous#*/ {
}

trait Foo/*<-example::Anonymous#Foo#*/
val foo/*<-example::Anonymous#foo.*/ = new Foo/*->example::Anonymous#Foo#*/ {}
val foo/*<-example::Anonymous#foo.*/ = /*<-local1*/new Foo/*->example::Anonymous#Foo#*/ {}
}
2 changes: 1 addition & 1 deletion tests/semanticdb/expect/Classes.expect.scala
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ class C8/*<-classes::C8#*/(private[this] val x/*<-classes::C8#x.*/: Int/*->scala
class C9/*<-classes::C9#*/(private[this] var x/*<-classes::C9#x().*/: Int/*->scala::Int#*/)

object N/*<-classes::N.*/ {
val anonClass/*<-classes::N.anonClass.*/ = new C7/*->classes::C7#*/(42) {
val anonClass/*<-classes::N.anonClass.*/ = /*<-local0*/new C7/*->classes::C7#*/(42) {
val local/*<-local1*/ = ???/*->scala::Predef.`???`().*/
}
val anonFun/*<-classes::N.anonFun.*/ = List/*->scala::package.List.*//*->scala::collection::IterableFactory#apply().*/(1).map/*->scala::collection::immutable::List#map().*/ { i/*<-local2*/ =>
Expand Down
2 changes: 1 addition & 1 deletion tests/semanticdb/expect/Traits.expect.scala
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ trait T/*<-traits::T#*/ {

sealed trait U/*<-traits::U#*/
object U/*<-traits::U.*/ {
def u/*<-traits::U.u().*/: U/*->traits::U#*/ = new U/*->traits::U#*/ {}
def u/*<-traits::U.u().*/: U/*->traits::U#*/ = /*<-local0*/new U/*->traits::U#*/ {}
}

class C/*<-traits::C#*/
Expand Down
6 changes: 3 additions & 3 deletions tests/semanticdb/expect/Types.expect.scala
Original file line number Diff line number Diff line change
Expand Up @@ -55,9 +55,9 @@ object Test/*<-types::Test.*/ {
val compoundType1/*<-types::Test.C#compoundType1.*/: { def k/*<-local0*/: Int/*->scala::Int#*/ } = ???/*->scala::Predef.`???`().*/
val compoundType2/*<-types::Test.C#compoundType2.*/: M/*->types::Test.M#*/ with N/*->types::Test.N#*/ = ???/*->scala::Predef.`???`().*/
val compoundType3/*<-types::Test.C#compoundType3.*/: M/*->types::Test.M#*/ with N/*->types::Test.N#*/ { def k/*<-local1*/: Int/*->scala::Int#*/ } = ???/*->scala::Predef.`???`().*/
val compoundType4/*<-types::Test.C#compoundType4.*/ = new { def k/*<-local3*/: Int/*->scala::Int#*/ = ???/*->scala::Predef.`???`().*/ }
val compoundType5/*<-types::Test.C#compoundType5.*/ = new M/*->types::Test.M#*/ with N/*->types::Test.N#*/
val compoundType6/*<-types::Test.C#compoundType6.*/ = new M/*->types::Test.M#*/ with N/*->types::Test.N#*/ { def k/*<-local6*/: Int/*->scala::Int#*/ = ???/*->scala::Predef.`???`().*/ }
val compoundType4/*<-types::Test.C#compoundType4.*/ = /*<-local2*/new { def k/*<-local3*/: Int/*->scala::Int#*/ = ???/*->scala::Predef.`???`().*/ }
val compoundType5/*<-types::Test.C#compoundType5.*/ = /*<-local4*/new M/*->types::Test.M#*/ with N/*->types::Test.N#*/
val compoundType6/*<-types::Test.C#compoundType6.*/ = /*<-local5*/new M/*->types::Test.M#*/ with N/*->types::Test.N#*/ { def k/*<-local6*/: Int/*->scala::Int#*/ = ???/*->scala::Predef.`???`().*/ }

val annType1/*<-types::Test.C#annType1.*/: T/*->types::T#*/ @ann(42) = ???/*->scala::Predef.`???`().*/
val annType2/*<-types::Test.C#annType2.*/: T/*->types::T#*/ @ann1 @ann2 = ???/*->scala::Predef.`???`().*/
Expand Down
50 changes: 21 additions & 29 deletions tests/semanticdb/metac.expect
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ Uri => Advanced.scala
Text => empty
Language => Scala
Symbols => 34 entries
Occurrences => 96 entries
Occurrences => 94 entries

Symbols:
advanced/C# => class C
Expand Down Expand Up @@ -78,11 +78,11 @@ advanced/Wildcards#`<init>`(). => primary ctor <init>
advanced/Wildcards#e1(). => method e1
local0 => abstract val method x
local1 => abstract val method x
local2 => primary ctor <init>
local2 => final class $anon
local3 => val method x
local4 => abstract method m
local5 => param x
local6 => primary ctor <init>
local6 => final class $anon
local7 => method m
local8 => param x
local9 => val local e3
Expand Down Expand Up @@ -115,23 +115,21 @@ Occurrences:
[13:6..13:8): s2 <- advanced/Structural#s2().
[13:16..13:17): x <- local1
[13:19..13:22): Int -> scala/Int#
[13:33..13:33): <- local2
[13:27..13:27): <- local2
[13:37..13:38): x <- local3
[13:40..13:43): Int -> scala/Int#
[13:46..13:49): ??? -> scala/Predef.`???`().
[13:51..13:51): -> local2
[14:6..14:8): s3 <- advanced/Structural#s3().
[14:16..14:17): m <- local4
[14:18..14:19): x <- local5
[14:21..14:24): Int -> scala/Int#
[14:27..14:30): Int -> scala/Int#
[14:41..14:41): <- local6
[14:35..14:35): <- local6
[14:45..14:46): m <- local7
[14:47..14:48): x <- local8
[14:50..14:53): Int -> scala/Int#
[14:56..14:59): Int -> scala/Int#
[14:62..14:65): ??? -> scala/Predef.`???`().
[14:67..14:67): -> local6
[17:6..17:15): Wildcards <- advanced/Wildcards#
[18:2..18:2): <- advanced/Wildcards#`<init>`().
[18:6..18:8): e1 <- advanced/Wildcards#e1().
Expand Down Expand Up @@ -283,7 +281,7 @@ Uri => Anonymous.scala
Text => empty
Language => Scala
Symbols => 13 entries
Occurrences => 34 entries
Occurrences => 33 entries

Symbols:
example/Anonymous# => class Anonymous
Expand All @@ -298,7 +296,7 @@ example/Anonymous#m1(). => method m1
example/Anonymous#m1().[T] => typeparam T
example/Anonymous#m2(). => method m2
local0 => val local x
local1 => primary ctor <init>
local1 => final class $anon

Occurrences:
[0:8..0:15): example <- example/
Expand Down Expand Up @@ -332,9 +330,8 @@ Occurrences:
[17:2..17:2): <- example/Anonymous#Foo#`<init>`().
[17:8..17:11): Foo <- example/Anonymous#Foo#
[18:6..18:9): foo <- example/Anonymous#foo.
[18:16..18:16): <- local1
[18:12..18:12): <- local1
[18:16..18:19): Foo -> example/Anonymous#Foo#
[18:22..18:22): -> local1

expect/Classes.scala
____________________
Expand All @@ -345,7 +342,7 @@ Uri => Classes.scala
Text => empty
Language => Scala
Symbols => 75 entries
Occurrences => 60 entries
Occurrences => 59 entries

Symbols:
classes/C1# => final class C1
Expand Down Expand Up @@ -419,7 +416,7 @@ classes/M.C5().(x) => param x
classes/N. => final object N
classes/N.anonClass. => val method anonClass
classes/N.anonFun. => val method anonFun
local0 => primary ctor <init>
local0 => final class $anon
local1 => val method local
local2 => param i
local3 => val local local
Expand Down Expand Up @@ -471,12 +468,11 @@ Occurrences:
[22:30..22:33): Int -> scala/Int#
[24:7..24:8): N <- classes/N.
[25:6..25:15): anonClass <- classes/N.anonClass.
[25:22..25:22): <- local0
[25:18..25:18): <- local0
[25:22..25:24): C7 -> classes/C7#
[25:24..25:24): -> classes/C7#`<init>`().
[26:8..26:13): local <- local1
[26:16..26:19): ??? -> scala/Predef.`???`().
[27:3..27:3): -> local0
[28:6..28:13): anonFun <- classes/N.anonFun.
[28:16..28:20): List -> scala/package.List.
[28:20..28:20): -> scala/collection/IterableFactory#apply().
Expand Down Expand Up @@ -2641,10 +2637,10 @@ Uri => Traits.scala
Text => empty
Language => Scala
Symbols => 13 entries
Occurrences => 18 entries
Occurrences => 17 entries

Symbols:
local0 => primary ctor <init>
local0 => final class $anon
local1 => selfparam self
traits/C# => class C
traits/C#`<init>`(). => primary ctor <init>
Expand All @@ -2668,9 +2664,8 @@ Occurrences:
[7:7..7:8): U <- traits/U.
[8:6..8:7): u <- traits/U.u().
[8:9..8:10): U -> traits/U#
[8:17..8:17): <- local0
[8:13..8:13): <- local0
[8:17..8:18): U -> traits/U#
[8:21..8:21): -> local0
[11:0..11:0): <- traits/C#`<init>`().
[11:6..11:7): C <- traits/C#
[12:6..12:7): V <- traits/V#
Expand All @@ -2687,15 +2682,15 @@ Uri => Types.scala
Text => empty
Language => Scala
Symbols => 125 entries
Occurrences => 249 entries
Occurrences => 246 entries

Symbols:
local0 => abstract method k
local1 => abstract method k
local2 => primary ctor <init>
local2 => final class $anon
local3 => method k
local4 => primary ctor <init>
local5 => primary ctor <init>
local4 => final class $anon
local5 => final class $anon
local6 => method k
local7 => type L
local8 => typeparam T
Expand Down Expand Up @@ -2939,26 +2934,23 @@ Occurrences:
[56:41..56:44): Int -> scala/Int#
[56:49..56:52): ??? -> scala/Predef.`???`().
[57:8..57:21): compoundType4 <- types/Test.C#compoundType4.
[57:30..57:30): <- local2
[57:24..57:24): <- local2
[57:34..57:35): k <- local3
[57:37..57:40): Int -> scala/Int#
[57:43..57:46): ??? -> scala/Predef.`???`().
[57:48..57:48): -> local2
[58:8..58:21): compoundType5 <- types/Test.C#compoundType5.
[58:28..58:28): <- local4
[58:24..58:24): <- local4
[58:28..58:29): M -> types/Test.M#
[58:29..58:29): -> types/Test.M#`<init>`().
[58:35..58:36): N -> types/Test.N#
[58:36..58:36): -> local4
[59:8..59:21): compoundType6 <- types/Test.C#compoundType6.
[59:28..59:28): <- local5
[59:24..59:24): <- local5
[59:28..59:29): M -> types/Test.M#
[59:29..59:29): -> types/Test.M#`<init>`().
[59:35..59:36): N -> types/Test.N#
[59:43..59:44): k <- local6
[59:46..59:49): Int -> scala/Int#
[59:52..59:55): ??? -> scala/Predef.`???`().
[59:57..59:57): -> local5
[61:8..61:16): annType1 <- types/Test.C#annType1.
[61:18..61:19): T -> types/T#
[61:31..61:34): ??? -> scala/Predef.`???`().
Expand Down