Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- grammar org.example.xbase.entities.Entities with org.eclipse.xtext.xbase.Xbase
- generate entities "http://www.example.org/xbase/entities/Entities"
- Model:
- importSection=XImportSection?
- entities+=Entity*;
- Entity:
- 'entity' name=ID ('extends' superType=JvmParameterizedTypeReference)? '{'
- // 'entity' name=ID ('extends' superType=[Entity|QualifiedName])? '{'
- attributes += Attribute*
- constructors+=Constructor*
- operations += Operation*
- '}';
- Attribute:
- 'attr' (type=JvmTypeReference)? name=ID ('=' initexpression=XExpression)? ';';
- Operation:
- 'op' (type=JvmTypeReference)? name=ID
- '(' (params+=FullJvmFormalParameter (',' params+=FullJvmFormalParameter)*)? ')'
- body=XBlockExpression;
- Constructor: 'new'
- '(' (params+=FullJvmFormalParameter (',' params+=FullJvmFormalParameter)*)? ')'
- body=XBlockExpression;
- package org.example.xbase.entities.jvmmodel
- import com.google.inject.Inject
- import org.eclipse.xtext.common.types.JvmTypeReference
- import org.eclipse.xtext.naming.IQualifiedNameProvider
- import org.eclipse.xtext.xbase.jvmmodel.AbstractModelInferrer
- import org.eclipse.xtext.xbase.jvmmodel.IJvmDeclaredTypeAcceptor
- import org.eclipse.xtext.xbase.jvmmodel.JvmTypesBuilder
- import org.example.xbase.entities.entities.Entity
- class EntitiesJvmModelInferrer extends AbstractModelInferrer {
- @Inject extension JvmTypesBuilder
- @Inject extension IQualifiedNameProvider
- def dispatch void infer(Entity entity, IJvmDeclaredTypeAcceptor acceptor, boolean isPreIndexingPhase) {
- acceptor.accept(entity.toClass("entities." + entity.name)) [
- documentation = entity.documentation
- if (entity.superType !== null) {
- superTypes += entity.superType.cloneWithProxies
- //superTypes += entity.superType.jvmTypeReference.cloneWithProxies
- }
- entity.attributes.forEach [ a |
- val type = a.type ?: a.initexpression?.inferredType
- members += a.toField(a.name, type) [
- documentation = a.documentation
- if (a.initexpression != null)
- initializer = a.initexpression
- ]
- members += a.toGetter(a.name, type)
- members += a.toSetter(a.name, type)
- ]
- entity.operations.forEach [ op |
- members += op.toMethod(op.name, op.type ?: inferredType) [
- documentation = op.documentation
- for (p : op.params) {
- parameters += p.toParameter(p.name, p.parameterType)
- }
- body = op.body
- ]
- ]
- entity.constructors.forEach [ con |
- members += entity.toConstructor [
- for (p : con.params) {
- parameters += p.toParameter(p.name, p.parameterType)
- }
- body = con.body
- ]
- ]
- ]
- }
- def JvmTypeReference getJvmTypeReference(Entity e) {
- e.toClass(e.fullyQualifiedName).typeRef
- }
- }
- entity A {
- attr String y;
- new(String y) {
- this.y=y
- }
- }
- entity B extends A {
- new() {
- super("Hello World!")
- }
- }
Add Comment
Please, Sign In to add comment