/*******************************************************************************
* Copyright (c) 2011, 2015 Willink Transformations and others.
* 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:
* E.D.Willink - Initial API and implementation
*******************************************************************************/
package org.eclipse.ocl.xtext.essentialocl.as2cs;
import org.apache.log4j.Logger;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jdt.annotation.Nullable;
import org.eclipse.ocl.pivot.AnyType;
import org.eclipse.ocl.pivot.CollectionType;
import org.eclipse.ocl.pivot.InvalidType;
import org.eclipse.ocl.pivot.MapType;
import org.eclipse.ocl.pivot.Namespace;
import org.eclipse.ocl.pivot.PrimitiveType;
import org.eclipse.ocl.pivot.TupleType;
import org.eclipse.ocl.pivot.Type;
import org.eclipse.ocl.pivot.VoidType;
import org.eclipse.ocl.xtext.base.as2cs.AS2CSConversion;
import org.eclipse.ocl.xtext.base.as2cs.BaseReferenceVisitor;
import org.eclipse.ocl.xtext.basecs.BaseCSFactory;
import org.eclipse.ocl.xtext.basecs.ElementCS;
import org.eclipse.ocl.xtext.basecs.PathNameCS;
import org.eclipse.ocl.xtext.basecs.PrimitiveTypeRefCS;
import org.eclipse.ocl.xtext.basecs.TupleTypeCS;
import org.eclipse.ocl.xtext.basecs.TypedRefCS;
import org.eclipse.ocl.xtext.essentialoclcs.CollectionTypeCS;
import org.eclipse.ocl.xtext.essentialoclcs.EssentialOCLCSFactory;
import org.eclipse.ocl.xtext.essentialoclcs.MapTypeCS;
import org.eclipse.ocl.xtext.essentialoclcs.TypeNameExpCS;
public class EssentialOCLReferenceVisitor extends BaseReferenceVisitor
{
public static final Logger logger = Logger.getLogger(BaseReferenceVisitor.class);
protected final @Nullable Namespace scope;
public EssentialOCLReferenceVisitor(@NonNull AS2CSConversion context, @Nullable Namespace scope) {
super(context); // NB this class is stateless since separate instances exist per CS package
this.scope = scope;
}
@Override
public ElementCS visitAnyType(@NonNull AnyType object) {
PrimitiveTypeRefCS csRef = BaseCSFactory.eINSTANCE.createPrimitiveTypeRefCS();
csRef.setPivot(object);
csRef.setName(object.getName());
return csRef;
}
@Override
public ElementCS visitClass(org.eclipse.ocl.pivot.@NonNull Class object) {
return visitType(object);
}
@Override
public ElementCS visitCollectionType(@NonNull CollectionType object) {
CollectionTypeCS csRef = EssentialOCLCSFactory.eINSTANCE.createCollectionTypeCS();
csRef.setPivot(object);
csRef.setName(object.getName());
Type elementType = object.getElementType();
if (elementType != null) {
csRef.setOwnedType((TypedRefCS) elementType.accept(this));
if (elementType instanceof org.eclipse.ocl.pivot.Class) {
org.eclipse.ocl.pivot.Package typePackage = ((org.eclipse.ocl.pivot.Class)elementType).getOwningPackage();
if (typePackage != null) {
context.importNamespace(typePackage, null);
}
}
}
return csRef;
}
@Override
public ElementCS visitInvalidType(@NonNull InvalidType object) {
PrimitiveTypeRefCS csRef = BaseCSFactory.eINSTANCE.createPrimitiveTypeRefCS();
csRef.setPivot(object);
csRef.setName(object.getName());
return csRef;
}
@Override
public ElementCS visitMapType(@NonNull MapType object) {
MapTypeCS csRef = EssentialOCLCSFactory.eINSTANCE.createMapTypeCS();
csRef.setPivot(object);
csRef.setName(object.getName());
Type keyType = object.getKeyType();
Type valueType = object.getValueType();
if ((keyType != null) && (valueType != null)) {
csRef.setOwnedKeyType((TypedRefCS) keyType.accept(this));
csRef.setOwnedValueType((TypedRefCS) valueType.accept(this));
if (keyType instanceof org.eclipse.ocl.pivot.Class) {
org.eclipse.ocl.pivot.Package typePackage = ((org.eclipse.ocl.pivot.Class)keyType).getOwningPackage();
if (typePackage != null) {
context.importNamespace(typePackage, null);
}
}
if (valueType instanceof org.eclipse.ocl.pivot.Class) {
org.eclipse.ocl.pivot.Package typePackage = ((org.eclipse.ocl.pivot.Class)valueType).getOwningPackage();
if (typePackage != null) {
context.importNamespace(typePackage, null);
}
}
}
return csRef;
}
@Override
public ElementCS visitPrimitiveType(@NonNull PrimitiveType object) {
PrimitiveTypeRefCS csRef = BaseCSFactory.eINSTANCE.createPrimitiveTypeRefCS();
csRef.setPivot(object);
csRef.setName(object.getName());
return csRef;
}
@Override
public ElementCS visitTupleType(@NonNull TupleType object) {
TupleTypeCS csRef = BaseCSFactory.eINSTANCE.createTupleTypeCS();
csRef.setPivot(object);
// csRef.setType(object.getElementType()); // FIXME parts
return csRef;
}
@Override
public ElementCS visitType(@NonNull Type object) {
TypeNameExpCS csRef = EssentialOCLCSFactory.eINSTANCE.createTypeNameExpCS();
csRef.setPivot(object);
// csRef.setElement(object);
PathNameCS csPathName = csRef.getOwnedPathName();
if (csPathName == null) {
csPathName = BaseCSFactory.eINSTANCE.createPathNameCS();
assert csPathName != null;
csRef.setOwnedPathName(csPathName);
}
context.refreshPathName(csPathName, object, scope);
if (object instanceof org.eclipse.ocl.pivot.Class) {
org.eclipse.ocl.pivot.Package typePackage = ((org.eclipse.ocl.pivot.Class)object).getOwningPackage();
if (typePackage != null) {
context.importNamespace(typePackage, null);
}
}
return csRef;
}
@Override
public ElementCS visitVoidType(@NonNull VoidType object) {
PrimitiveTypeRefCS csRef = BaseCSFactory.eINSTANCE.createPrimitiveTypeRefCS();
csRef.setPivot(object);
csRef.setName(object.getName());
return csRef;
}
}