File tree 3 files changed +72
-0
lines changed
compiler/src/dotty/tools/dotc 3 files changed +72
-0
lines changed Original file line number Diff line number Diff line change
1
+ package dotty .tools .dotc
2
+ package core
3
+ package tasty
4
+
5
+ import Contexts ._ , Decorators ._
6
+ import Names .Name
7
+ import TastyUnpickler ._
8
+ import TastyBuffer .NameRef
9
+ import util .Positions .offsetToInt
10
+ import printing .Highlighting ._
11
+
12
+ class TastyHTMLPrinter (bytes : Array [Byte ])(implicit ctx : Context ) extends TastyPrinter (bytes) {
13
+ override protected def nameColor (str : String ): String = s " <span class='name'> $str</span> "
14
+ override protected def treeColor (str : String ): String = s " <span class='tree'> $str</span> "
15
+ override protected def lengthColor (str : String ): String = s " <span class='length'> $str</span> "
16
+ }
Original file line number Diff line number Diff line change
1
+ package dotty .tools
2
+ package dotc
3
+ package decompiler
4
+
5
+ import dotty .tools .dotc .core .Contexts ._
6
+ import dotty .tools .dotc .core ._
7
+ import dotty .tools .dotc .core .tasty .TastyHTMLPrinter
8
+ import dotty .tools .dotc .reporting ._
9
+ import dotty .tools .dotc .tastyreflect .ReflectionImpl
10
+
11
+ /**
12
+ * Decompiler to be used with IDEs
13
+ */
14
+ class IDEDecompilerDriver (val settings : List [String ]) extends dotc.Driver {
15
+
16
+ private val myInitCtx : Context = {
17
+ val rootCtx = initCtx.fresh.addMode(Mode .Interactive ).addMode(Mode .ReadPositions ).addMode(Mode .ReadComments )
18
+ rootCtx.setSetting(rootCtx.settings.YretainTrees , true )
19
+ rootCtx.setSetting(rootCtx.settings.fromTasty, true )
20
+ val ctx = setup(settings.toArray :+ " dummy.scala" , rootCtx)._2
21
+ ctx.initialize()(ctx)
22
+ ctx
23
+ }
24
+
25
+ private val decompiler = new PartialTASTYDecompiler
26
+
27
+ def run (className : String ): (String , String ) = {
28
+ val reporter = new StoreReporter (null ) with HideNonSensicalMessages
29
+
30
+ val run = decompiler.newRun(myInitCtx.fresh.setReporter(reporter))
31
+
32
+ implicit val ctx = run.runContext
33
+
34
+ run.compile(List (className))
35
+ run.printSummary()
36
+ val unit = ctx.run.units.head
37
+
38
+ val decompiled = new ReflectionImpl (ctx).showSourceCode.showTree(unit.tpdTree)
39
+ val tree = new TastyHTMLPrinter (unit.pickled.head._2).printContents()
40
+
41
+ reporter.removeBufferedMessages.foreach(message => System .err.println(message))
42
+ (tree, decompiled)
43
+ }
44
+ }
Original file line number Diff line number Diff line change
1
+ package dotty .tools .dotc .decompiler
2
+
3
+ import dotty .tools .dotc .core .Phases .Phase
4
+
5
+ /** Partial TASTYDecompiler that doesn't execute the backendPhases
6
+ * allowing to control decompiler output by manually running it
7
+ * on the CompilationUnits
8
+ */
9
+ class PartialTASTYDecompiler extends TASTYDecompiler {
10
+ override def phases : List [List [Phase ]] =
11
+ frontendPhases ::: picklerPhases ::: transformPhases
12
+ }
You can’t perform that action at this time.
0 commit comments