diff --git a/compiler/src/dotty/tools/dotc/core/Symbols.scala b/compiler/src/dotty/tools/dotc/core/Symbols.scala index 090dbaed0bf3..90114bdcb744 100644 --- a/compiler/src/dotty/tools/dotc/core/Symbols.scala +++ b/compiler/src/dotty/tools/dotc/core/Symbols.scala @@ -743,6 +743,8 @@ object Symbols { def keysIterator: Iterator[Symbol] = value.keySet().asScala.iterator def toMap: Map[Symbol, T] = value.asScala.toMap + + override def toString: String = value.asScala.toString() } @inline def newMutableSymbolMap[T]: MutableSymbolMap[T] = diff --git a/compiler/src/dotty/tools/dotc/transform/localopt/Devalify.scala b/compiler/src/dotty/tools/dotc/transform/localopt/Devalify.scala index bf12c8296372..43cb0feeda4f 100644 --- a/compiler/src/dotty/tools/dotc/transform/localopt/Devalify.scala +++ b/compiler/src/dotty/tools/dotc/transform/localopt/Devalify.scala @@ -159,6 +159,12 @@ class Devalify extends Optimisation { if (replacements.contains(t.symbol)) deepReplacer.transform(replacements(t.symbol)).ensureConforms(t.tpe.widen) else t + case t: DefDef if !t.symbol.owner.isClass => + if (timesUsed.getOrElse(t.symbol, 0) + timesUsedAsType.getOrElse(t.symbol, 0) != 0) t + else { + simplify.println(s"Dropping definition of ${t.symbol.showFullName} as not used") + EmptyTree + } case tree => tree } diff --git a/compiler/test/dotty/tools/dotc/SimplifyTests.scala b/compiler/test/dotty/tools/dotc/SimplifyTests.scala index 8e5c03226b04..2c9550d8c78d 100644 --- a/compiler/test/dotty/tools/dotc/SimplifyTests.scala +++ b/compiler/test/dotty/tools/dotc/SimplifyTests.scala @@ -164,6 +164,35 @@ abstract class SimplifyTests(val optimise: Boolean) extends DottyBytecodeTest { |print(8) """) + @Test def localDefinitionElimination = + check( + """ + |lazy val foo = 1 + |def bar = 2 + |val baz = 3 + """, + """ + """) + + @Test def localDefinitionNoElimination = + check( + """ + |val j = 0 // dummy + |class Foo { + | lazy val foo = 1 + | def bar = 2 + | val baz = 3 + |} + """, + """ + |class Foo { + | lazy val foo = 1 + | def bar = 2 + | val baz = 3 + |} + """) + + // @Test def listPatmapExample = // check( // """