Ok, una settimana di 100 bontà e ancora nessuna risposta così Lo proverò da solo ... Le modifiche sono molto gradite!
La classe chiave per il compilatore presentazione è scala.tools.nsc.interactive.Global
. Quindi, per iniziare, dobbiamo creare un'istanza del compilatore.
import scala.tools.nsc.interactive.Global
class PresentationCompiler {
// we want the compiler output to be virtual
val target = new VirtualDirectory("", None)
// need to be adjusted in order to work with
// sbt. See this question .
val settings = new Settings()
// output to virtual target
settings.outputDirs.setSingleOutput(target)
// can be replaced by a custom instance
// of AbstractReporter to gain control.
val reporter = new ConsoleReporter(settings)
val compiler = new Global(settings, reporter)
...
}
Per le impostazioni the link provided by Abhishek è molto prezioso.
Ma ora per la parte interessante:
1. Compilare un singolo file sorgente virtuale
Per compilare una stringa v'è la possibilità di creare un BatchSourceFile
con un sottostante VirtualFile
. L'api è contrassegnato come sperimentale qui e sembra irregolare.
def compile(code: String) {
val source = new BatchSourceFile("<virtual>", code)
val response = new Response[Unit]
compiler.askReload(List(source), response)
response.get.left.foreach { _ =>
// success
}
}
2.recuperare le informazioni risultanti per tutte le fasi dal compilatore
Questa è la parte difficile. A causa della natura multi-thread del compilatore e del fatto che i flag vengono riutilizzati con significati diversi in fasi differenti, è impossibile ottenere tutto in una volta. Fondamentalmente dovrete ricorrere al tipo di metodi askSomething
che sono documentati nello API. Per esempio:
val tcompletion = new Response[List[global.Member]]
val pos = compiler.ask(() => new OffsetPosition(source, p))
global.askTypeCompletion(pos, tcompletion)
tcompletion.get(5000).get match {
case Left(members) => // do something with members
case Right(e) =>
e.printStackTrace
}
3. propagare una modifica nel file di origine per il compilatore
Questa è la parte interessante, volevo scoprire con questa domanda. Davvero non capisco, perché BatchSourceFile
è descritto come un file il cui contenuto non cambia nel tempo. Quindi una implementazione personalizzata di SourceFile
dovrebbe essere fornita ?? Perché non dovrebbe essere nel pacchetto interactive
. Sono sicuro di non aver catturato qualcosa.
Quindi la mia soluzione adesso è chiamare di nuovo il metodo di compilazione.
Ciao questo link al plugin eclipse potrebbe aiutare https://github.com/scala-ide/scala-ide/blob/master/org.scala-ide.sdt.core/src/scala/tools/eclipse /ScalaPresentationCompiler.scala – Iraklis
@Iraklis Questo è davvero un collegamento utile. L'ho guardato prima, ma ci sono così tante funzionalità specifiche di eclissi integrate, che non riesco a capirlo ... Mi piacerebbe usare il compilatore di presentazione da solo. C'è anche quel [post di un blog su ENSIME] (http://ensime.blogspot.de/2010/08/building-ide-with-scala-presentation.html) ma è davvero obsoleto. –
Si potrebbe anche voler controllare il test sul compilatore interattivo https://github.com/scala/scala/tree/b380f9ecbe1be8ffaf0f32001e95566747017294/src/interactive/scala/tools/nsc/interactive/tests – Iraklis