blob: 7ec1e1eb2dfc18735fe6a8a5b01b44184d6616bb [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2013, 2020 Willink Transformations 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 - Initial API and implementation
*******************************************************************************/
package org.eclipse.qvtd.codegen.qvti.java;
import java.util.Map;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jdt.annotation.Nullable;
import org.eclipse.ocl.examples.codegen.analyzer.NameResolution;
import org.eclipse.ocl.examples.codegen.cgmodel.CGElementId;
import org.eclipse.ocl.examples.codegen.java.CG2JavaPreVisitor;
import org.eclipse.ocl.examples.codegen.java.JavaLocalContext;
import org.eclipse.ocl.pivot.Property;
import org.eclipse.qvtd.codegen.qvticgmodel.CGConnectionAssignment;
import org.eclipse.qvtd.codegen.qvticgmodel.CGConnectionVariable;
import org.eclipse.qvtd.codegen.qvticgmodel.CGEcoreContainerAssignment;
import org.eclipse.qvtd.codegen.qvticgmodel.CGEcorePropertyAssignment;
import org.eclipse.qvtd.codegen.qvticgmodel.CGEcoreRealizedVariable;
import org.eclipse.qvtd.codegen.qvticgmodel.CGFunction;
import org.eclipse.qvtd.codegen.qvticgmodel.CGFunctionCallExp;
import org.eclipse.qvtd.codegen.qvticgmodel.CGFunctionParameter;
import org.eclipse.qvtd.codegen.qvticgmodel.CGGuardVariable;
import org.eclipse.qvtd.codegen.qvticgmodel.CGMapping;
import org.eclipse.qvtd.codegen.qvticgmodel.CGMappingCall;
import org.eclipse.qvtd.codegen.qvticgmodel.CGMappingCallBinding;
import org.eclipse.qvtd.codegen.qvticgmodel.CGMappingExp;
import org.eclipse.qvtd.codegen.qvticgmodel.CGMappingLoop;
import org.eclipse.qvtd.codegen.qvticgmodel.CGMiddlePropertyAssignment;
import org.eclipse.qvtd.codegen.qvticgmodel.CGMiddlePropertyCallExp;
import org.eclipse.qvtd.codegen.qvticgmodel.CGPropertyAssignment;
import org.eclipse.qvtd.codegen.qvticgmodel.CGRealizedVariable;
import org.eclipse.qvtd.codegen.qvticgmodel.CGRealizedVariablePart;
import org.eclipse.qvtd.codegen.qvticgmodel.CGSequence;
import org.eclipse.qvtd.codegen.qvticgmodel.CGSpeculateExp;
import org.eclipse.qvtd.codegen.qvticgmodel.CGSpeculatePart;
import org.eclipse.qvtd.codegen.qvticgmodel.CGTransformation;
import org.eclipse.qvtd.codegen.qvticgmodel.CGTypedModel;
import org.eclipse.qvtd.codegen.qvticgmodel.util.QVTiCGModelVisitor;
import org.eclipse.qvtd.codegen.utilities.QVTiCGUtil;
import org.eclipse.qvtd.pivot.qvtimperative.ImperativeTransformation;
import org.eclipse.qvtd.pivot.qvtimperative.evaluation.EntryPointsAnalysis;
public class QVTiCG2JavaPreVisitor extends CG2JavaPreVisitor implements QVTiCGModelVisitor<@Nullable Object>
{
public QVTiCG2JavaPreVisitor(@NonNull QVTiGlobalContext javaContext) {
super(javaContext);
}
@Override
public @NonNull QVTiCodeGenerator getCodeGenerator() {
return (@NonNull QVTiCodeGenerator) super.getCodeGenerator();
}
@Override
public Object visitCGConnectionAssignment(@NonNull CGConnectionAssignment cgConnectionAssignment) {
NameResolution iteratorNameResolution = getNameManager().declareStandardName(cgConnectionAssignment);
iteratorNameResolution.addNameVariant(codeGenerator.getITER_NameVariant());
return visitCGValuedElement(cgConnectionAssignment);
}
@Override
public Object visitCGConnectionVariable(@NonNull CGConnectionVariable object) {
return visitCGGuardVariable(object);
}
@Override
public Object visitCGEcoreContainerAssignment(@NonNull CGEcoreContainerAssignment object) {
return visitCGPropertyAssignment(object);
}
@Override
public Object visitCGEcorePropertyAssignment(@NonNull CGEcorePropertyAssignment object) {
return visitCGPropertyAssignment(object);
}
@Override
public Object visitCGEcoreRealizedVariable(@NonNull CGEcoreRealizedVariable object) {
return visitCGRealizedVariable(object);
}
@Override
public Object visitCGFunction(@NonNull CGFunction cgFunction) {
JavaLocalContext<?> savedLocalContext = pushLocalContext(cgFunction);
try {
NameResolution nameResolution = getNameManager().declareStandardName(cgFunction);
nameResolution.addNameVariant(getCodeGenerator().getCACHED_RESULT_NameVariant());
nameResolution.addNameVariant(getCodeGenerator().getTHIS_TRANSFORMER_NameVariant());
visitCGOperation(cgFunction);
return null;
}
finally {
popLocalContext(savedLocalContext);
}
}
@Override
public Object visitCGFunctionCallExp(@NonNull CGFunctionCallExp object) {
return visitCGOperationCallExp(object);
}
@Override
public Object visitCGFunctionParameter(@NonNull CGFunctionParameter object) {
return visitCGParameter(object);
}
@Override
public Object visitCGGuardVariable(@NonNull CGGuardVariable object) {
return visitCGParameter(object);
}
@Override
public @Nullable Object visitCGMapping(@NonNull CGMapping cgMapping) {
JavaLocalContext<?> savedLocalContext = pushLocalContext(cgMapping);
try {
return visitCGNamedElement(cgMapping);
}
finally {
popLocalContext(savedLocalContext);
}
}
@Override
public Object visitCGMappingCall(@NonNull CGMappingCall object) {
return visitCGValuedElement(object);
}
@Override
public Object visitCGMappingCallBinding(@NonNull CGMappingCallBinding object) {
return visitCGValuedElement(object);
}
@Override
public Object visitCGMappingExp(@NonNull CGMappingExp cgMappingExp) {
return visitCGValuedElement(cgMappingExp);
}
@Override
public Object visitCGMappingLoop(@NonNull CGMappingLoop object) {
return visitCGIterationCallExp(object);
}
@Override
public Object visitCGMiddlePropertyAssignment(@NonNull CGMiddlePropertyAssignment object) {
return visitCGPropertyAssignment(object);
}
@Override
public Object visitCGMiddlePropertyCallExp(@NonNull CGMiddlePropertyCallExp object) {
return visitCGOppositePropertyCallExp(object);
}
@Override
public Object visitCGPropertyAssignment(@NonNull CGPropertyAssignment cgPropertyAssignment) {
return visitCGValuedElement(cgPropertyAssignment);
}
@Override
public Object visitCGRealizedVariable(@NonNull CGRealizedVariable cgRealizedVariable) {
return visitCGVariable(cgRealizedVariable);
}
@Override
public @Nullable Object visitCGRealizedVariablePart(@NonNull CGRealizedVariablePart cgRealizedVariablePart) {
return visitCGValuedElement(cgRealizedVariablePart);
}
@Override
public Object visitCGSequence(@NonNull CGSequence object) {
return visitCGValuedElement(object);
}
@Override
public Object visitCGSpeculateExp(@NonNull CGSpeculateExp object) {
return visitCGValuedElement(object);
}
@Override
public Object visitCGSpeculatePart(@NonNull CGSpeculatePart object) {
return visitCGValuedElement(object);
}
@Override
public Object visitCGTransformation(@NonNull CGTransformation cgTransformation) {
ImperativeTransformation transformation = QVTiCGUtil.getAST(cgTransformation);
EntryPointsAnalysis entryPointsAnalysis = getCodeGenerator().getEntryPointsAnalysis(transformation);
Map<@NonNull Property, @NonNull Integer> opposites = entryPointsAnalysis.getCaches();
for (@NonNull Property property : opposites.keySet()) {
CGElementId cgPropertyId = analyzer.getElementId(property.getPropertyId());
cgPropertyId.accept(this);
}
return visitCGClass(cgTransformation);
}
@Override
public Object visitCGTypedModel(@NonNull CGTypedModel object) {
return visitCGNamedElement(object);
}
}