Permalink
Switch branches/tags
Nothing to show
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
112 lines (95 sloc) 3.52 KB
/*
* generated by Xtext 2.10.0
*/
package org.ovirt.api.model.generator
import org.eclipse.emf.ecore.resource.Resource
import org.eclipse.xtext.generator.AbstractGenerator
import org.eclipse.xtext.generator.IFileSystemAccess2
import org.eclipse.xtext.generator.IGeneratorContext
import org.ovirt.api.model.spec.Service
import org.ovirt.api.model.spec.DecType
import org.ovirt.api.model.spec.Property
import org.ovirt.api.model.spec.Doc
import org.ovirt.api.model.spec.FullDoc
import org.ovirt.api.model.spec.ShortDoc
import org.ovirt.api.model.spec.Action
import org.ovirt.api.model.spec.Argument
import org.ovirt.api.model.spec.ArgumentType
import org.eclipse.emf.common.util.EList
import org.ovirt.api.model.spec.Area
/**
* Generates code from your model files on save.
*
* See https://www.eclipse.org/Xtext/documentation/303_runtime_concepts.html#code-generation
*/
class SpecGenerator extends AbstractGenerator {
override void doGenerate(Resource resource, IFileSystemAccess2 fsa, IGeneratorContext context) {
for (type : resource.allContents.toIterable.filter(DecType)) {
fsa.generateFile("types/" + type.name + ".java", type.compile)
}
for (service : resource.allContents.toIterable.filter(Service)) {
fsa.generateFile("services/" + service.name + ".java", service.compile)
}
}
def compile(DecType type) '''
package types;
import java.util.*;
import org.ovirt.api.metamodel.annotations.*;
@Type
public interface «type.name» «IF type.superType!=null»extends «type.superType.name»«ENDIF»{
«FOR property:type.properties»«property.compile»«ENDFOR»
}
'''
def compile(Property property) '''
«IF property.doc!=null»«property.doc.compile»«ENDIF»
«IF property.link»@Link «ENDIF»«IF property.dtype!=null»«property.dtype.name»«ELSE»«property.ptype.toString»«ENDIF»«IF property.multiple»[]«ENDIF» «property.name»();
'''
def compile(Doc doc) '''
«IF doc instanceof FullDoc»
/**
* «doc.summary»
«IF !doc.description.nullOrEmpty»
«doc.description.replaceAll("(?m)^", "* ")»
«ENDIF»
*
* @author «doc.author»
* @date «doc.date»
* @status «doc.status»
*/
«ELSEIF doc instanceof ShortDoc»
/**
* «doc.summary»
*/
«ENDIF»
'''
def compile(Service service) '''
package services;
import annotations.*;
import types.*;
@Service
«IF !service.areas.nullOrEmpty»«service.areas.compile»«ENDIF»
public interface «service.name» «IF service.superService!=null»extends «service.superService.name»«ENDIF»{
«FOR action:service.actions»«action.compile»«ENDFOR»
}
'''
def compile(EList<Area> areas) '''
@Area(«IF areas.size==1»"«areas.iterator.next.toString»"«ELSE»«FOR area: areas SEPARATOR ','»"«area.toString»"«ENDFOR»«ENDIF»)
'''
def compile(Action action) '''
«IF action.doc!=null»«action.doc.compile»«ENDIF»
interface «action.name» {
«FOR arg:action.arguments»«arg.compile»«ENDFOR»
}
'''
def compile(Argument arg) '''
«IF arg.doc!=null»«arg.doc.compile»«ENDIF»
«arg.type.compile» «IF arg.dtype!=null»«arg.dtype.name»«ELSE»«arg.ptype.toString»«ENDIF» «arg.name»();
'''
def compile(ArgumentType argType) {
switch(argType) {
case IN: '@In'
case OUT: '@Out'
default: ''
}
}
}