blob: 684e52e2b40fc273e73f30c1648a289bb6bfb536 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2012, 2019 CEA LIST and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v20.html
*
* Contributors:
* E.D.Willink(CEA LIST) - Initial API and implementation
*******************************************************************************/
package org.eclipse.ocl.examples.codegen.java;
import org.eclipse.emf.codegen.ecore.genmodel.GenPackage;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jdt.annotation.Nullable;
import org.eclipse.ocl.pivot.ids.BindingsId;
import org.eclipse.ocl.pivot.ids.ClassId;
import org.eclipse.ocl.pivot.ids.CollectionTypeId;
import org.eclipse.ocl.pivot.ids.DataTypeId;
import org.eclipse.ocl.pivot.ids.ElementId;
import org.eclipse.ocl.pivot.ids.EnumerationId;
import org.eclipse.ocl.pivot.ids.EnumerationLiteralId;
import org.eclipse.ocl.pivot.ids.IdManager;
import org.eclipse.ocl.pivot.ids.IdVisitor;
import org.eclipse.ocl.pivot.ids.LambdaTypeId;
import org.eclipse.ocl.pivot.ids.MapTypeId;
import org.eclipse.ocl.pivot.ids.NestedPackageId;
import org.eclipse.ocl.pivot.ids.NsURIPackageId;
import org.eclipse.ocl.pivot.ids.OclInvalidTypeId;
import org.eclipse.ocl.pivot.ids.OclVoidTypeId;
import org.eclipse.ocl.pivot.ids.OperationId;
import org.eclipse.ocl.pivot.ids.PrimitiveTypeId;
import org.eclipse.ocl.pivot.ids.PropertyId;
import org.eclipse.ocl.pivot.ids.RootPackageId;
import org.eclipse.ocl.pivot.ids.SpecializedId;
import org.eclipse.ocl.pivot.ids.TemplateBinding;
import org.eclipse.ocl.pivot.ids.TemplateParameterId;
import org.eclipse.ocl.pivot.ids.TemplateableTypeId;
import org.eclipse.ocl.pivot.ids.TuplePartId;
import org.eclipse.ocl.pivot.ids.TupleTypeId;
import org.eclipse.ocl.pivot.ids.TypeId;
import org.eclipse.ocl.pivot.ids.UnspecifiedId;
import org.eclipse.ocl.pivot.internal.manager.PivotMetamodelManager;
import org.eclipse.ocl.pivot.utilities.ClassUtil;
/**
* An Id2JavaExpressionVisitor appends the expression body of an Id declaration.
*/
public class Id2JavaExpressionVisitor implements IdVisitor<@Nullable Object>
{
protected final @NonNull JavaStream js;
protected final @NonNull PivotMetamodelManager metamodelManager;
public Id2JavaExpressionVisitor(@NonNull JavaStream js) {
this.js = js;
this.metamodelManager = js.getCodeGenerator().getEnvironmentFactory().getMetamodelManager();
}
@Override
public @Nullable Object visitClassId(@NonNull ClassId id) {
js.appendIdReference(id.getParent());
js.append(".getClassId(");
js.appendString(id.getName());
js.append(", " + id.getTemplateParameters() + ")");
return null;
}
@Override
public @Nullable Object visitCollectionTypeId(@NonNull CollectionTypeId id) {
js.appendClassReference(null, TypeId.class);
CollectionTypeId generalizedId = id.getGeneralizedId();
String idName = generalizedId.getLiteralName();
if (idName == null) {
idName = "COLLECTION";
}
js.append("." + idName);
if (id instanceof SpecializedId) {
js.append(".getSpecializedId(");
BindingsId templateBindings = ((SpecializedId)id).getTemplateBindings();
for (int i = 0; i < templateBindings.size(); i++) {
if (i > 0) {
js.append(", ");
}
ElementId elementId = ClassUtil.nonNullModel(templateBindings.get(i));
js.appendIdReference(elementId);
}
js.append(")");
}
return null;
}
@Override
public @Nullable Object visitDataTypeId(@NonNull DataTypeId id) {
js.appendIdReference(id.getParent());
js.append(".getDataTypeId(");
js.appendString(id.getName());
js.append(", " + id.getTemplateParameters() + ")");
return null;
}
@Override
public @Nullable Object visitEnumerationId(@NonNull EnumerationId id) {
js.appendIdReference(id.getParent());
js.append(".getEnumerationId(");
js.appendString(id.getName());
js.append(")");
return null;
}
@Override
public @Nullable Object visitEnumerationLiteralId(@NonNull EnumerationLiteralId id) {
js.appendIdReference(id.getParentId());
js.append(".getEnumerationLiteralId(");
js.appendString(id.getName());
js.append(")");
return null;
}
@Override
public @Nullable Object visitInvalidId(@NonNull OclInvalidTypeId id) {
js.appendClassReference(null, TypeId.class);
js.append(".");
js.append(id.getLiteralName());
return null;
}
@Override
public @Nullable Object visitLambdaTypeId(@NonNull LambdaTypeId id) {
// TODO Auto-generated method stub
return visiting(id);
}
@Override
public @Nullable Object visitMapTypeId(@NonNull MapTypeId id) {
js.appendClassReference(null, TypeId.class);
MapTypeId generalizedId = id.getGeneralizedId();
String idName = generalizedId.getLiteralName();
if (idName == null) {
idName = "MAP";
}
js.append("." + idName);
if (id instanceof SpecializedId) {
js.append(".getSpecializedId(");
BindingsId templateBindings = ((SpecializedId)id).getTemplateBindings();
for (int i = 0; i < templateBindings.size(); i++) {
if (i > 0) {
js.append(", ");
}
ElementId elementId = ClassUtil.nonNullModel(templateBindings.get(i));
js.appendIdReference(elementId);
}
js.append(")");
}
return null;
}
@Override
public @Nullable Object visitNestedPackageId(@NonNull NestedPackageId id) {
js.appendIdReference(id.getParent());
js.append(".getNestedPackageId(");
js.appendString(id.getName());
js.append(")");
return null;
}
@Override
public @Nullable Object visitNsURIPackageId(@NonNull NsURIPackageId id) {
String nsURI = id.getNsURI();
String nsPrefix = id.getNsPrefix();
GenPackage genPackage = metamodelManager.getGenPackage(nsURI);
js.appendClassReference(null, IdManager.class);
js.append(".getNsURIPackageId(");
js.appendString(nsURI);
js.append(", ");
if (nsPrefix != null) {
js.appendString(nsPrefix);
}
else {
js.append("null");
}
js.append(", ");
if (genPackage != null) {
js.appendClassReference(null, genPackage.getQualifiedPackageInterfaceName());
js.append(".eINSTANCE");
}
else {
js.append("null");
}
js.append(")");
return null;
}
@Override
public @Nullable Object visitNullId(@NonNull OclVoidTypeId id) {
js.appendClassReference(null, TypeId.class);
js.append(".");
js.append(id.getLiteralName());
return null;
}
@Override
public @Nullable Object visitOperationId(@NonNull OperationId id) {
js.appendIdReference(id.getParent());
js.append(".getOperationId(" + id.getTemplateParameters() + ", ");
js.appendString(id.getName());
js.append(", ");
js.appendClassReference(null, IdManager.class);
js.append(".getParametersId(");
boolean isFirst = true;
for (@NonNull TypeId parameterId : id.getParametersId()) {
if (!isFirst) {
js.append(", ");
}
js.appendIdReference(parameterId);
isFirst = false;
}
js.append("))");
return null;
}
@Override
public @Nullable Object visitPrimitiveTypeId(@NonNull PrimitiveTypeId id) {
js.appendClassReference(null, TypeId.class);
js.append(".");
js.append(id.getLiteralName());
return null;
}
@Override
public @Nullable Object visitPropertyId(@NonNull PropertyId id) {
js.appendIdReference(id.getParent());
js.append(".getPropertyId(");
js.appendString(id.getName());
js.append(")");
return null;
}
@Override
public @Nullable Object visitRootPackageId(@NonNull RootPackageId id) {
js.appendClassReference(null, IdManager.class);
js.append(".getRootPackageId(");
js.appendString(id.getName());
js.append(")");
return null;
}
@Override
public @Nullable Object visitTemplateBinding(@NonNull TemplateBinding id) {
// TODO Auto-generated method stub
return visiting(id);
}
@Override
public @Nullable Object visitTemplateParameterId(@NonNull TemplateParameterId id) {
js.appendClassReference(null, IdManager.class);
js.append(".getTemplateParameterId(" + id.getIndex() + ")");
return null;
}
@Override
public @Nullable Object visitTemplateableTypeId(@NonNull TemplateableTypeId id) {
// TODO Auto-generated method stub
return visiting(id);
}
@Override
public @Nullable Object visitTuplePartId(@NonNull TuplePartId id) {
js.appendClassReference(null, IdManager.class);
js.append(".getTuplePartId(" + id.getIndex() + ", ");
js.appendString(id.getName());
js.append(", ");
js.appendIdReference(id.getTypeId());
js.append(")");
return null;
}
@Override
public @Nullable Object visitTupleTypeId(@NonNull TupleTypeId id) {
js.appendClassReference(null, IdManager.class);
js.append(".getTupleTypeId(");
js.appendString(id.getName());
for (TuplePartId partId : id.getPartIds()) {
js.append(", ");
js.appendIdReference(partId);
}
js.append(")");
return null;
}
@Override
public @Nullable Object visitUnspecifiedId(@NonNull UnspecifiedId id) {
// TODO Auto-generated method stub
return visiting(id);
}
public @Nullable Object visiting(@NonNull ElementId id) {
throw new UnsupportedOperationException(getClass().getSimpleName() + ": " + id.getClass().getName());
}
}