Textual(DSL(Creaon(III.( - inf.mit.bme.hu · PDF...

41
Budapes( Műszaki és Gazdaságtudományi Egyetem Méréstechnika és Információs Rendszerek Tanszék Textual DSL Crea.on III. Xtext – Advanced capabili.es

Transcript of Textual(DSL(Creaon(III.( - inf.mit.bme.hu · PDF...

Page 1: Textual(DSL(Creaon(III.( - inf.mit.bme.hu · PDF fileBudapes()Műszaki)és)Gazdaságtudományi)Egyetem) Méréstechnika)és)Információs)RendszerekTanszék Textual(DSL(Creaon(III.(Xtext–Advanced(

Budapes(  Műszaki  és  Gazdaságtudományi  Egyetem  Méréstechnika  és  Információs  Rendszerek  Tanszék  

Textual  DSL  Crea.on  III.  

Xtext  –  Advanced  capabili.es  

Page 2: Textual(DSL(Creaon(III.( - inf.mit.bme.hu · PDF fileBudapes()Műszaki)és)Gazdaságtudományi)Egyetem) Méréstechnika)és)Információs)RendszerekTanszék Textual(DSL(Creaon(III.(Xtext–Advanced(

Previously  !  Xtext  workflow  !  Grammar  specifica.on  !  AST  inference  !  Basic  customiza.on  (in  lab)  

2  

Page 3: Textual(DSL(Creaon(III.( - inf.mit.bme.hu · PDF fileBudapes()Műszaki)és)Gazdaságtudományi)Egyetem) Méréstechnika)és)Információs)RendszerekTanszék Textual(DSL(Creaon(III.(Xtext–Advanced(

Usage  process  Define  abstract  

syntax  

Define  concrete  syntax  

Code  genera.on  

Customiza.on  

Evalua.on/Use  

Ecore  metamodel  (opcional)  

Grammar  +  metamodel  inference  

MWE  workflow  

Extensible  via  Java  

Page 4: Textual(DSL(Creaon(III.( - inf.mit.bme.hu · PDF fileBudapes()Műszaki)és)Gazdaságtudományi)Egyetem) Méréstechnika)és)Információs)RendszerekTanszék Textual(DSL(Creaon(III.(Xtext–Advanced(

Languages  and  models  

Language  

Textual  descrip.on  

Metamodel  

Instance  model  

Inference  

Parsing  

Page 5: Textual(DSL(Creaon(III.( - inf.mit.bme.hu · PDF fileBudapes()Műszaki)és)Gazdaságtudományi)Egyetem) Méréstechnika)és)Információs)RendszerekTanszék Textual(DSL(Creaon(III.(Xtext–Advanced(

Customiza(on  

5  

Page 6: Textual(DSL(Creaon(III.( - inf.mit.bme.hu · PDF fileBudapes()Műszaki)és)Gazdaságtudományi)Egyetem) Méréstechnika)és)Információs)RendszerekTanszék Textual(DSL(Creaon(III.(Xtext–Advanced(

Customiza.on  !  Re-­‐defineable  services  

o Scoping:  to  help  link  resolu(on  o FormaFng:  rule-­‐based  preIy  prin(ng  

o Valida(on:  well-­‐formedness  constraint  valida(on  o Content  Assist:  e.g.  filtering  o Labeling:  based  on  JFace  Label  Provider  API  o Outline:  Outline  view  customiza.on  o Quick  Fix:  sugges.ng  automa.c  fixes  

6  

Page 7: Textual(DSL(Creaon(III.( - inf.mit.bme.hu · PDF fileBudapes()Műszaki)és)Gazdaságtudományi)Egyetem) Méréstechnika)és)Információs)RendszerekTanszék Textual(DSL(Creaon(III.(Xtext–Advanced(

Scoping  !  Problem:  

o  Variables/objects  have  scope  defined  

o  Scoping  is  language-­‐dependant  

o  Xtext  default  •  Only  container  and  sibling  object  available  

7  

Page 8: Textual(DSL(Creaon(III.( - inf.mit.bme.hu · PDF fileBudapes()Műszaki)és)Gazdaságtudományi)Egyetem) Méréstechnika)és)Információs)RendszerekTanszék Textual(DSL(Creaon(III.(Xtext–Advanced(

Scoping  !  Problem:  

o  Variables/objects  have  scope  defined  

o  Scoping  is  language-­‐dependant  

o  Xtext  default  •  Only  container  and  sibling  object  available  

community  BME  {    community  FTSRG } person  UjhelyiZoltan  {    member  … }

8  

Page 9: Textual(DSL(Creaon(III.( - inf.mit.bme.hu · PDF fileBudapes()Műszaki)és)Gazdaságtudományi)Egyetem) Méréstechnika)és)Információs)RendszerekTanszék Textual(DSL(Creaon(III.(Xtext–Advanced(

Scoping  !  Problem:  

o  Variables/objects  have  scope  defined  

o  Scoping  is  language-­‐dependant  

o  Xtext  default  •  Only  container  and  sibling  object  available  

community  BME  {    community  FTSRG } person  UjhelyiZoltan  {    member  … }

9  

Which  communi.es  are  visible  here?  

Page 10: Textual(DSL(Creaon(III.( - inf.mit.bme.hu · PDF fileBudapes()Műszaki)és)Gazdaságtudományi)Egyetem) Méréstechnika)és)Információs)RendszerekTanszék Textual(DSL(Creaon(III.(Xtext–Advanced(

Scoping  !  Problem:  

o  Variables/objects  have  scope  defined  

o  Scoping  is  language-­‐dependant  

o  Xtext  default  •  Only  container  and  sibling  object  available  

community  BME  {    community  FTSRG } person  UjhelyiZoltan  {    member  … }

10  

Only  BME  

Which  communi.es  are  visible  here?  

Page 11: Textual(DSL(Creaon(III.( - inf.mit.bme.hu · PDF fileBudapes()Műszaki)és)Gazdaságtudományi)Egyetem) Méréstechnika)és)Információs)RendszerekTanszék Textual(DSL(Creaon(III.(Xtext–Advanced(

Scoping  service  !  Problem  

o List  all  possible  targets  for  a  selected  reference  o Ignore  name  

!  Implementa.on  o Global  scoping  •  For  references  crossing  files  •  Usually  based  on  explicit  import  declara.ons  

o Local  scoping  •  For  lis.ng  targets  from  the  current  file  •  Declara(ve,  rule-­‐based  approach  

11  

Page 12: Textual(DSL(Creaon(III.( - inf.mit.bme.hu · PDF fileBudapes()Műszaki)és)Gazdaságtudományi)Egyetem) Méréstechnika)és)Információs)RendszerekTanszék Textual(DSL(Creaon(III.(Xtext–Advanced(

Declara.ve  scoping  !  AbstractDeclara.veScopeProvider  class  

o Two  kind  of  generic  solu.ons  •  IScope  scope_<RefDeclaringEClass>_<Reference>    (ContextType>  ctx,  EReference  ref)  

•  IScope  scope_<TypeToReturn>      (<ContextType>  ctx,  EReference  ref)

o Similar  to  visitor  padern  •  But  without  all  the  required  methods  in  base  class  

–  Parent  classes  does  not  list  all  possible  scope_*  methods  –  Selected  via  (EMF)  reflec.ve  API  

12  

Page 13: Textual(DSL(Creaon(III.( - inf.mit.bme.hu · PDF fileBudapes()Műszaki)és)Gazdaságtudományi)Egyetem) Méréstechnika)és)Információs)RendszerekTanszék Textual(DSL(Creaon(III.(Xtext–Advanced(

Declara.ve  scoping  ! Methods  used  to  

o Enumerate  all  available  items  o Parameters:  •  Source  of  reference  (context,  or  declaring  item)  •  Type  of  reference  (EClass)  

13  

Page 14: Textual(DSL(Creaon(III.( - inf.mit.bme.hu · PDF fileBudapes()Műszaki)és)Gazdaságtudományi)Egyetem) Méréstechnika)és)Információs)RendszerekTanszék Textual(DSL(Creaon(III.(Xtext–Advanced(

Declara.ve  scoping:  Example  public  IScope  scope_Person_membership(final  Person  context,  EReference  reference)  {    //Naive  scoping    SocialNetwork  network  =  (SocialNetwork)  context.eContainer();    Iterable<Community>  communities  =  

Iterables.filter(network.getEntities(),Community.class);    List<Community>  communityList  =  new  ArrayList<Community>();    for  (Community  community  :  communities)  {      addChildren(communityList,  community);    }    return  Scopes.scopeFor(communityList); }

14  

Page 15: Textual(DSL(Creaon(III.( - inf.mit.bme.hu · PDF fileBudapes()Műszaki)és)Gazdaságtudományi)Egyetem) Méréstechnika)és)Információs)RendszerekTanszék Textual(DSL(Creaon(III.(Xtext–Advanced(

Google  Collec.ons  !  Google  Guava  

o hdp://code.google.com/p/guava-­‐libraries/  

!  Func.onal-­‐style  collec.on  opera.ons  o Closures  o Lazy  evalua.on  

!  Precondi.ons  

15  

Page 16: Textual(DSL(Creaon(III.( - inf.mit.bme.hu · PDF fileBudapes()Műszaki)és)Gazdaságtudományi)Egyetem) Méréstechnika)és)Információs)RendszerekTanszék Textual(DSL(Creaon(III.(Xtext–Advanced(

Valida.on  ! Well-­‐formedness  valida.on  

o Aker  parsing/resolu.on  finishes  o Approach  •  Any  EMF-­‐based  approach  might  work  (e.g.  OCL)  •  Xtext  provides  a  rule-­‐based  validator  

16  

Page 17: Textual(DSL(Creaon(III.( - inf.mit.bme.hu · PDF fileBudapes()Műszaki)és)Gazdaságtudományi)Egyetem) Méréstechnika)és)Információs)RendszerekTanszék Textual(DSL(Creaon(III.(Xtext–Advanced(

Java-­‐based  validator  !  Valida.on  rule:  a  method  

o Annotated  with  @Check  •  Parameter  selects  how  oken  it  should  be  validated  

o Single  parameter:  a  type  from  the  AST  

!  Base  class  defines  warning/error  methods  o EMF  metamodel  literals  are  used  to  locate  error  o Error  code  can  be  added  o Addi.onal  informa.on  might  be  added  •  Untyped  object  array  •  Usable  by  quick  fixes  

17  

Page 18: Textual(DSL(Creaon(III.( - inf.mit.bme.hu · PDF fileBudapes()Műszaki)és)Gazdaságtudományi)Egyetem) Méréstechnika)és)Információs)RendszerekTanszék Textual(DSL(Creaon(III.(Xtext–Advanced(

Validator  example  @Check public  void  noNameCollision(Community  entity)  {    noNameCollision(entity,  entity.eContainer().eContents(),  SocialNetworkPackage.Literals.SOCIAL_ENTITY__NAME); }

private  void  noNameCollision(EObject  eObject,  List<EObject>  siblings,  EStructuralFeature  nameFeature)  {    String  name  =  (String)  eObject.eGet(nameFeature);    for  (EObject  sibling  :  siblings)  {

if(name.equals(sibling.eGet(nameFeature))  &&  eObject  !=  sibling)  {

error("Duplicate  name",  nameFeature.getFeatureID()); }

   } }

18  

Page 19: Textual(DSL(Creaon(III.( - inf.mit.bme.hu · PDF fileBudapes()Műszaki)és)Gazdaságtudományi)Egyetem) Méréstechnika)és)Információs)RendszerekTanszék Textual(DSL(Creaon(III.(Xtext–Advanced(

Formader  !  Automa.c  code  gormamng:  

o Inserts  white  space  characters  ! When  to  execute  

o Started  by  user  o Aker  AST  edi.ng  during  serializa.on  

!  Formamng  rules  o Selec.ng  lexer  tokens  o Adds  selected  white  spaces  o Defined  in  Java  

19  

Page 20: Textual(DSL(Creaon(III.( - inf.mit.bme.hu · PDF fileBudapes()Műszaki)és)Gazdaságtudományi)Egyetem) Méréstechnika)és)Információs)RendszerekTanszék Textual(DSL(Creaon(III.(Xtext–Advanced(

Selec.on  primi.ves  !  aker(token)  !  before(token)  !  around(token)  !  between(token1,  token2)  !   bounds(token1,  token2)  !  range(token1,  token2)  

20  

Page 21: Textual(DSL(Creaon(III.( - inf.mit.bme.hu · PDF fileBudapes()Műszaki)és)Gazdaságtudományi)Egyetem) Méréstechnika)és)Információs)RendszerekTanszék Textual(DSL(Creaon(III.(Xtext–Advanced(

White  space  inser.on  !  setIndenta.onIncrement  !  setIndenta.onDecrement  !  setLinewrap  !  setSpace  !  setNoSpace  

21  

Page 22: Textual(DSL(Creaon(III.( - inf.mit.bme.hu · PDF fileBudapes()Műszaki)és)Gazdaságtudományi)Egyetem) Méréstechnika)és)Információs)RendszerekTanszék Textual(DSL(Creaon(III.(Xtext–Advanced(

Formamng  example  protected  void  configureFormaFng(FormaFngConfig  c)  {      SocialNetworkGrammarAccess  access  =  (SocialNetworkGrammarAccess)  getGrammarAccess();        SocialNetworkElements  sne  =  access.getSocialNetworkAccess();      c.setLinewrap(1,  1,  1).aker(sne.getLekCurlyBracketKeyword_2());      c.setLinewrap(1,  1,  1).before  

 (sne.getRightCurlyBracketKeyword_5());      c.setLinewrap(1,  1,  1).aker(sne.getEn..esAssignment_3());      c.setLinewrap(2,  2,  2).before  

 (sne.getAcquaintancesAcquaintanceParserRuleCall_4_0());      c.setIndenta.onIncrement().aker  

 (sne.getLekCurlyBracketKeyword_2());      c.setIndenta.onDecrement().before  

 (sne.getRightCurlyBracketKeyword_5());    

22  

Page 23: Textual(DSL(Creaon(III.( - inf.mit.bme.hu · PDF fileBudapes()Műszaki)és)Gazdaságtudományi)Egyetem) Méréstechnika)és)Információs)RendszerekTanszék Textual(DSL(Creaon(III.(Xtext–Advanced(

Service  Registra(on  in  Xtext  

23  

Page 24: Textual(DSL(Creaon(III.( - inf.mit.bme.hu · PDF fileBudapes()Műszaki)és)Gazdaságtudományi)Egyetem) Méréstechnika)és)Információs)RendszerekTanszék Textual(DSL(Creaon(III.(Xtext–Advanced(

Xtext  Service  Registra.on  

24  

Page 25: Textual(DSL(Creaon(III.( - inf.mit.bme.hu · PDF fileBudapes()Műszaki)és)Gazdaságtudományi)Egyetem) Méréstechnika)és)Információs)RendszerekTanszék Textual(DSL(Creaon(III.(Xtext–Advanced(

Xtext  Service  Registra.on  !  Based  on  dependency  injec.on  

o Google  Guice:  hdp://code.google.com/p/google-­‐guice/  

!  Uses  Genera.on  gap  padern  extensively  o Generic  and  Generated  implementa.ons  of  services  o Custom  implementa.ons  can  be  injected  

25  

Page 26: Textual(DSL(Creaon(III.( - inf.mit.bme.hu · PDF fileBudapes()Műszaki)és)Gazdaságtudományi)Egyetem) Méréstechnika)és)Információs)RendszerekTanszék Textual(DSL(Creaon(III.(Xtext–Advanced(

Xtext  Service  Registra.on  !  Based  on  dependency  injec.on  

o Google  Guice:  hdp://code.google.com/p/google-­‐guice/  

!  Uses  Genera.on  gap  padern  extensively  o Generic  and  Generated  implementa.ons  of  services  o Custom  implementa.ons  can  be  injected  

26  

Page 27: Textual(DSL(Creaon(III.( - inf.mit.bme.hu · PDF fileBudapes()Műszaki)és)Gazdaságtudományi)Egyetem) Méréstechnika)és)Információs)RendszerekTanszék Textual(DSL(Creaon(III.(Xtext–Advanced(

Dependency  Injec.on  

27  

Page 28: Textual(DSL(Creaon(III.( - inf.mit.bme.hu · PDF fileBudapes()Műszaki)és)Gazdaságtudományi)Egyetem) Méréstechnika)és)Információs)RendszerekTanszék Textual(DSL(Creaon(III.(Xtext–Advanced(

Dependency  Injec.on  !  Depedency  injec.on  design  padern  

o A  class  should  not  instan.ate  its  dependencies  o Instead  sedable  via  seders  or  constructor  parameters  

!  DI  frameworks  available  o Annota.on-­‐based  injec.on  o Management  of  injectable  services/components  

28  

Page 29: Textual(DSL(Creaon(III.( - inf.mit.bme.hu · PDF fileBudapes()Műszaki)és)Gazdaságtudományi)Egyetem) Méréstechnika)és)Információs)RendszerekTanszék Textual(DSL(Creaon(III.(Xtext–Advanced(

Dependency  Injec.on  !  Depedency  injec.on  design  padern  

o A  class  should  not  instan.ate  its  dependencies  o Instead  sedable  via  seders  or  constructor  parameters  

!  DI  frameworks  available  o Annota.on-­‐based  injec.on  o Management  of  injectable  services/components  

29  

Page 30: Textual(DSL(Creaon(III.( - inf.mit.bme.hu · PDF fileBudapes()Műszaki)és)Gazdaságtudományi)Egyetem) Méréstechnika)és)Információs)RendszerekTanszék Textual(DSL(Creaon(III.(Xtext–Advanced(

Dependency  Injec.on:  Example  public  interface  IGenerator  {

   /**      *  @param  input  -­‐  the  input  for  which  to  generate  resources      *  @param  fsa  -­‐  file  system  access  to  be  used  to  generate  files      */    public  void  doGenerate(Resource  input,  IFileSystemAccess  fsa);

}

30  

File  System  Access:  abstrac.on  of  file  opera.ons  

Page 31: Textual(DSL(Creaon(III.( - inf.mit.bme.hu · PDF fileBudapes()Műszaki)és)Gazdaságtudományi)Egyetem) Méréstechnika)és)Információs)RendszerekTanszék Textual(DSL(Creaon(III.(Xtext–Advanced(

Dependency  Injec.on  in  Xtext  –  1.  !  Injectable  services  are  configured  in  modules  

o Run.meModule  •  Core  services  • Works  in  any  Java  applica.on  

o UIModule  •  Editor,  user  interface  •  Eclipse-­‐specific  services  

o TestModule  •  Test  implementa.ons  •  Might  include  sources  

31  

Page 32: Textual(DSL(Creaon(III.( - inf.mit.bme.hu · PDF fileBudapes()Műszaki)és)Gazdaságtudományi)Egyetem) Méréstechnika)és)Információs)RendszerekTanszék Textual(DSL(Creaon(III.(Xtext–Advanced(

Registering  Services  

32  

Page 33: Textual(DSL(Creaon(III.( - inf.mit.bme.hu · PDF fileBudapes()Műszaki)és)Gazdaságtudományi)Egyetem) Méréstechnika)és)Információs)RendszerekTanszék Textual(DSL(Creaon(III.(Xtext–Advanced(

Dependency  Injec.on  in  Xtext  –  2.  !  Abstract  module  parents  generated  !  Overridable  descendant  available  

o Custom  implementa.on  registra.on  o Custom  service  registra.on  

33  

Page 34: Textual(DSL(Creaon(III.( - inf.mit.bme.hu · PDF fileBudapes()Műszaki)és)Gazdaságtudományi)Egyetem) Méréstechnika)és)Információs)RendszerekTanszék Textual(DSL(Creaon(III.(Xtext–Advanced(

Xbase  

34  

Page 35: Textual(DSL(Creaon(III.( - inf.mit.bme.hu · PDF fileBudapes()Műszaki)és)Gazdaságtudományi)Egyetem) Méréstechnika)és)Információs)RendszerekTanszék Textual(DSL(Creaon(III.(Xtext–Advanced(

Xbase  !  Expression  language  

o Embeddable  into  custom  DSL  (base  language)  

!  Code  generator  via  inferred  JVM  model  o Generated  code  always  in  Java  

!  Extra  features  o Debugger  o IDE  links  

35  

Page 36: Textual(DSL(Creaon(III.( - inf.mit.bme.hu · PDF fileBudapes()Műszaki)és)Gazdaságtudományi)Egyetem) Méréstechnika)és)Információs)RendszerekTanszék Textual(DSL(Creaon(III.(Xtext–Advanced(

Integra(on  with  EMF  technologies  

Page 37: Textual(DSL(Creaon(III.( - inf.mit.bme.hu · PDF fileBudapes()Műszaki)és)Gazdaságtudományi)Egyetem) Méréstechnika)és)Információs)RendszerekTanszék Textual(DSL(Creaon(III.(Xtext–Advanced(

Integra.on  with  EMF  technologies  

Resource   XMIResource  

Code  Generator   GMF  Editor   Other  EMF  

XMI  

37  

Page 38: Textual(DSL(Creaon(III.( - inf.mit.bme.hu · PDF fileBudapes()Műszaki)és)Gazdaságtudományi)Egyetem) Méréstechnika)és)Információs)RendszerekTanszék Textual(DSL(Creaon(III.(Xtext–Advanced(

Integra.on  !  Xtext  

o Custom  EMF  resource  implementa.on  o Registered  via  EMF  extension  point  •  org.eclipse.emf.ecore.extension_parser  

o Can  be  handled  transparently  •  Except  when  using  Xbase  "  •  In  case  of  Xbase  addi.onal  registra.on  required  

38  

Page 39: Textual(DSL(Creaon(III.( - inf.mit.bme.hu · PDF fileBudapes()Műszaki)és)Gazdaságtudományi)Egyetem) Méréstechnika)és)Információs)RendszerekTanszék Textual(DSL(Creaon(III.(Xtext–Advanced(

GMF  editor  !  Domain  model  can  be  Xtext  resource  

o Automa.c  synchroniza.on  on  save  

!  GMF  editor  must  maintain  serializability!  o GMF  does  not  know  grammar  o Luckily,  not  much  is  required  here  

39  

Page 40: Textual(DSL(Creaon(III.( - inf.mit.bme.hu · PDF fileBudapes()Műszaki)és)Gazdaságtudományi)Egyetem) Méréstechnika)és)Információs)RendszerekTanszék Textual(DSL(Creaon(III.(Xtext–Advanced(

GMF  and  Xtext  editor  

40  

Page 41: Textual(DSL(Creaon(III.( - inf.mit.bme.hu · PDF fileBudapes()Műszaki)és)Gazdaságtudományi)Egyetem) Méréstechnika)és)Információs)RendszerekTanszék Textual(DSL(Creaon(III.(Xtext–Advanced(

Summary  -­‐  Xtext  !  Easy  to  extend  implementa.on  

o Sane  defaults  o Easy  to  use  

!  Problems  o Xbase  is  highly  experimental  o Can  be  quite  complex  o Somewhat  large  dependecy  list  

41