6.3. Verwendung des Type-Mappings

Das Type-Mapping kann in Xpand-Templates einfach durch das Einbinden des Type-Mapping Xtend-Skriptes genutzt werden:

«REM» use the type mapping «ENDREM» 
«EXTENSION de::genesez::common::typemapping::TypeMapping»

Das Xtend-Skript stellt prinzipiell zwei verschiedene Funktionen bereit, bei denen jeweils optional noch ein Kontext-Parameter angegeben werden kann:

mapName()

bildet den als Parameter übergebenen Typ auf den Namen des Typs in der Zielsprache ab

mapType()

wertet die Typ-Modifikatoren (des Metamodellelementes) aus und gibt die entsprechenden Multi-Value-Typen zurück

Als Beispiel hier die Deklaration von Attributen in Java:

«IF isSingleValuedType() -» 
    «EXPAND _Modifier -» «type.mapName().asTypeName()» \
    «EXPAND Type::Generics» «asAttribute()» «EXPAND _DefaultValue»; 
«ELSE -» 
    «EXPAND _Modifier -» «mapType() -» \
        <«type.mapName().asTypeName()»> \
        «asAttribute()» = new «mapType("Implementation")» \
        <«type.mapName().asTypeName() -»>(); 
«ENDIF -»

Bei einem normalen, single-value Typen ( multiplicity == 1) wird lediglich der verwendete Typ auf den zu verwendenden Namen in der Zielsprache gemappt. Ist der übergebene Typ ein MClassifier oder ein MGeneric, so wird das eigentliche Type-Mapping nicht durchgeführt sondern lediglich der übergebene Typ unverändert wieder zurückgegeben. Bei MExternal und MPrimitiveType werden die Informationen aus der Type-Mapping-Datei ausgewertet und der Typ als String zurückgegeben. Der Aufruf von asTypeName() wird zur Anwendung der Naming Conventions durchgeführt.

Bei multi-value Typen ( multiplicity > 1) wird zuerst der Typ gemappt. Im obigen Beispiel wird dazu als Parameter ein MAttribute übergeben. Das Type-Mapping wertet dann die Typ-Modifikatoren unique und ordered aus und gibt den entsprechenden Multi-Value-Typ zurück. Der eigentlich verwendete Typ im Modell wird auf den Namen in der Zielsprache gemappt und als Typ-Parameter der Collection angegeben.