blob: 5800b8849c62b1489a9e111adbd0f221cd8b320f [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2016 CEA LIST
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr - initial API and implementation
*******************************************************************************/
package org.eclipse.efm.formalml.concretesyntax.m2t.factory;
import org.eclipse.efm.formalml.concretesyntax.m2t.util.PrettyPrintWriter;
import org.eclipse.uml2.uml.Class;
import org.eclipse.uml2.uml.DataType;
import org.eclipse.uml2.uml.Element;
import org.eclipse.uml2.uml.Enumeration;
import org.eclipse.uml2.uml.EnumerationLiteral;
import org.eclipse.uml2.uml.MultiplicityElement;
import org.eclipse.uml2.uml.PrimitiveType;
import org.eclipse.uml2.uml.Property;
import org.eclipse.uml2.uml.TypedElement;
import org.eclipse.uml2.uml.ValueSpecification;
public class DataTypeCodeGenerator extends AbstractCodeGenerator {
/**
* Constructor
*/
public DataTypeCodeGenerator(MainCodeGenerator supervisor) {
super(supervisor);
}
/**
* performTransform dispatcher for any element to a writer
* @param element
* @param writer
*/
public void performTransformImpl(Element element, PrettyPrintWriter writer) {
if( element instanceof Enumeration ) {
transformEnumeration((Enumeration)element, writer);
}
else if( element instanceof EnumerationLiteral ) {
transformEnumerationLiteral((EnumerationLiteral)element, writer);
}
else if( element instanceof DataType ) {
transformDataType((DataType)element, writer);
}
else {
performTransformError(this, element);
}
}
/**
* performTransform an Enumeration element to a writer
* @param element
* @param writer
*/
public void transformEnumeration(
Enumeration element, PrettyPrintWriter writer) {
writer.appendTab(element.getVisibility().toString())
.append(" type ")
.append(element.getName())
.appendEol(" enum {");
boolean firstElt = true;
for( EnumerationLiteral literal : ((Enumeration)element).getOwnedLiterals() ) {
if( firstElt ) {
writer.appendTab2(literal.getName());
firstElt = false;
}
else {
writer.appendEol(",")
.appendTab2(literal.getName());
}
}
writer.appendEolTab_Eol("}");
}
/**
* performTransform an Enumeration Literal element to a writer
* @param element
* @param writer
*/
public void transformEnumerationLiteral(
EnumerationLiteral element, PrettyPrintWriter writer) {
writer.appendTab(element.getVisibility().toString())
.append(' ')
.append(element.getName());
ValueSpecification value = element.getSpecification();
if( value != null ) {
writer.append(" = ");
fSupervisor.transformValueSpecification(value, writer);
}
writer.appendEol();
}
/**
* performTransform a DataType as StructuredType element to a writer
* @param element
* @param writer
*/
public void transformStructuredType(
DataType element, PrettyPrintWriter writer) {
writer.appendTab(element.getVisibility().toString())
.append(" type ")
.append(element.getName())
.appendEol(" struct {");
// A writer indenting with TAB + iTAB -> TAB2
PrettyPrintWriter writer2 = writer.itab2();
for( Property itProperty : element.getOwnedAttributes() ) {
fSupervisor.transformProperty(itProperty, writer2);
}
writer.appendTabEol("}");
}
/**
* performTransform a DataType element to a writer
* @param element
* @param writer
*/
public void transformDataType(
DataType element, PrettyPrintWriter writer) {
if( element instanceof Enumeration ) {
transformEnumeration((Enumeration)element, writer);
}
else if( element.getOwnedAttributes().size() >= 1 ) {
transformStructuredType(element, writer);
}
else {
writer.appendTab("dataType");
if( element.getName() != null ) {
writer.append(' ')
.append(element.getName());
}
writer.appendEol(" { /* TODO */ }");
}
}
/**
* performTransform type name of a TypedElement element to a string
* @param element
* @return
*/
public String typeName(TypedElement element) {
String typeString;
if( element.getType() == null ) {
typeString = "null<type>";
}
else {
typeString = element.getType().getName();
if( element.getType() instanceof PrimitiveType ) {
typeString = typeString.toLowerCase();
}
else if( element.getType() instanceof Class ){
typeString = "machine" + "/*< " + typeString + " >*/";
}
if( element instanceof MultiplicityElement ) {
MultiplicityElement multElem = (MultiplicityElement)element;
if( ( multElem.getLower() == 1 ) &&
( multElem.getUpper() == 1 ) ) {
// Cas basique
//
// rien à faire
}
else if( ( multElem.getLower() == multElem.getUpper() ) &&
( multElem.getLower() != 0 ) &&
( multElem.getLower() != -1 ) ) {
// Cas tableau
//
typeString = typeString + "[" + multElem.getLower() + "]";
}
else if( //( element.getLower() == 0 ) &&
( multElem.getUpper() == -1 ) ) {
// Cas vector
//
typeString = "vector< " + typeString + " >";
}
else {
typeString = "??? " + typeString;
}
}
}
return typeString;
}
}