2013-05-14 12 views
25

Qualcuno può fornire un esempio minimo di utilizzo dell'attuale compilatore scala di presentazione (ad esempio scala.tools.nsc.interactive.Global), che svolge le seguenti attività?Compilatore presentazione Scala - Esempio minimo

  • compilare un singolo Virtual File sorgente (cioè non nel file system, ma ad esempio un String)
  • recuperare le informazioni risultanti per tutte le fasi del compilatore
  • propagare una modifica nel file sorgente il compilatore
  • ricevere ulteriori informazioni, eventualmente in modo asincrono

sembra che ci sia un sacco di fluttuazione in 012.e non sono riuscito a trovare piccoli esempi aggiornati. Quindi apprezzerei molto il tuo aiuto qui.

+2

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

+0

@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. –

+2

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

risposta

0

Potrebbe non essere esattamente quello che stai cercando, ma un modo per farlo potrebbe essere quello di:

  1. scrivere la sorgente da compilare in un file temporaneo,

  2. eseguire il compilazione suffisso > output.tmp (* nix) operatore al comando, che deve emettere l'output del compilatore in un file,

  3. leggere il file e caricarlo in memoria ...

  4. e ultimo si cancellano entrambi i file tmp.

Mi auguro questa non è l'unica soluzione, ma nel caso in cui è possibile, almeno questo dovrebbe funzionare niente altro ...

9

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.

Problemi correlati