Guest User

Untitled

a guest
Oct 17th, 2018
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.26 KB | None | 0 0
  1. grammar org.example.xbase.entities.Entities with org.eclipse.xtext.xbase.Xbase
  2.  
  3. generate entities "http://www.example.org/xbase/entities/Entities"
  4.  
  5. Model:
  6. importSection=XImportSection?
  7. entities+=Entity*;
  8.  
  9. Entity:
  10. 'entity' name=ID ('extends' superType=JvmParameterizedTypeReference)? '{'
  11. // 'entity' name=ID ('extends' superType=[Entity|QualifiedName])? '{'
  12. attributes += Attribute*
  13. constructors+=Constructor*
  14. operations += Operation*
  15. '}';
  16.  
  17. Attribute:
  18. 'attr' (type=JvmTypeReference)? name=ID ('=' initexpression=XExpression)? ';';
  19.  
  20. Operation:
  21. 'op' (type=JvmTypeReference)? name=ID
  22. '(' (params+=FullJvmFormalParameter (',' params+=FullJvmFormalParameter)*)? ')'
  23. body=XBlockExpression;
  24.  
  25. Constructor: 'new'
  26. '(' (params+=FullJvmFormalParameter (',' params+=FullJvmFormalParameter)*)? ')'
  27. body=XBlockExpression;
  28.  
  29. package org.example.xbase.entities.jvmmodel
  30.  
  31. import com.google.inject.Inject
  32. import org.eclipse.xtext.common.types.JvmTypeReference
  33. import org.eclipse.xtext.naming.IQualifiedNameProvider
  34. import org.eclipse.xtext.xbase.jvmmodel.AbstractModelInferrer
  35. import org.eclipse.xtext.xbase.jvmmodel.IJvmDeclaredTypeAcceptor
  36. import org.eclipse.xtext.xbase.jvmmodel.JvmTypesBuilder
  37. import org.example.xbase.entities.entities.Entity
  38.  
  39. class EntitiesJvmModelInferrer extends AbstractModelInferrer {
  40.  
  41. @Inject extension JvmTypesBuilder
  42. @Inject extension IQualifiedNameProvider
  43.  
  44. def dispatch void infer(Entity entity, IJvmDeclaredTypeAcceptor acceptor, boolean isPreIndexingPhase) {
  45. acceptor.accept(entity.toClass("entities." + entity.name)) [
  46. documentation = entity.documentation
  47. if (entity.superType !== null) {
  48. superTypes += entity.superType.cloneWithProxies
  49. //superTypes += entity.superType.jvmTypeReference.cloneWithProxies
  50. }
  51.  
  52. entity.attributes.forEach [ a |
  53. val type = a.type ?: a.initexpression?.inferredType
  54. members += a.toField(a.name, type) [
  55. documentation = a.documentation
  56. if (a.initexpression != null)
  57. initializer = a.initexpression
  58. ]
  59. members += a.toGetter(a.name, type)
  60. members += a.toSetter(a.name, type)
  61. ]
  62. entity.operations.forEach [ op |
  63. members += op.toMethod(op.name, op.type ?: inferredType) [
  64. documentation = op.documentation
  65. for (p : op.params) {
  66. parameters += p.toParameter(p.name, p.parameterType)
  67. }
  68. body = op.body
  69. ]
  70. ]
  71. entity.constructors.forEach [ con |
  72. members += entity.toConstructor [
  73. for (p : con.params) {
  74. parameters += p.toParameter(p.name, p.parameterType)
  75. }
  76. body = con.body
  77. ]
  78. ]
  79. ]
  80. }
  81.  
  82. def JvmTypeReference getJvmTypeReference(Entity e) {
  83. e.toClass(e.fullyQualifiedName).typeRef
  84. }
  85.  
  86. }
  87.  
  88. entity A {
  89. attr String y;
  90.  
  91. new(String y) {
  92. this.y=y
  93. }
  94.  
  95. }
  96.  
  97. entity B extends A {
  98. new() {
  99. super("Hello World!")
  100. }
  101. }
Add Comment
Please, Sign In to add comment