Chiamare un'espressione del modello da un altro in Xtend
-
12-12-2019 - |
Domanda
Ho una domanda su come chiamare i metodi di espressione del modello da un'altra espressione del modello.
L'esempio seguente non ha funzionato, cioè.Non espande e "stampa" il codice sul punto in cui è stato chiamato.Come posso modificare questo codice per stampare il risultato del ResourceGenerator().generate(resource)
sul punto in cui viene chiamato?Nota che ResourceGenerator().generate(resource)
è di per sé un'espressione del modello.
class ServerGenerator extends RESTServiceGenerator {
def generate(Server it) '''
package nl.sytematic.projects.RESTServiceServlet;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
@Path("«it.baseURI»")
public class «it.name» {
«it.resources.forEach[ resource |new ResourceGenerator().generate(resource)]»
}
'''
}
.
Spero di essere chiaro nella mia domanda.Un esempio sarebbe fantastico!(Ancora: risorsaGenerator (). Generare restituisce un a pagamento).
Soluzione
Foreach restituisce sempre nullo e si tratta solo di fare effetti collaterali.Quello che vuoi è una mappa e un join.
it.resources.map(resource |new ResourceGenerator().generate(resource)).join
.
Ma c'è un modo ancora migliore:
«FOR resource : resources»
«new ResourceGenerator().generate(resource)»
«ENDFOR»
.
Suggerisco di contenere e riutilizzare una singola istanza di risorsaGenerator come campo (usi l'iniezione di dipendenza?) o Make ResourceGenerator :: Genera Static.