blob: cb0e3e9320f04a8f95bb503c32c7719d7b38702b [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2015, 2019 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.compiler.internal.qvtb2qvts;
import java.util.Map;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jdt.annotation.Nullable;
import org.eclipse.ocl.pivot.CompleteClass;
import org.eclipse.ocl.pivot.CompletePackage;
import org.eclipse.ocl.pivot.Element;
import org.eclipse.ocl.pivot.OperationCallExp;
import org.eclipse.ocl.pivot.Property;
import org.eclipse.ocl.pivot.StandardLibrary;
import org.eclipse.ocl.pivot.TypedElement;
import org.eclipse.ocl.pivot.utilities.EnvironmentFactory;
import org.eclipse.qvtd.compiler.CompilerChainException;
import org.eclipse.qvtd.compiler.CompilerProblem;
import org.eclipse.qvtd.compiler.ProblemHandler;
import org.eclipse.qvtd.compiler.internal.qvtb2qvts.trace.NameGenerator;
import org.eclipse.qvtd.compiler.internal.qvtb2qvts.trace.RuleAnalysis2TraceGroup;
import org.eclipse.qvtd.compiler.internal.qvtb2qvts.trace.TransformationAnalysis2TracePackage;
import org.eclipse.qvtd.compiler.internal.qvts2qvts.ConnectionManager;
import org.eclipse.qvtd.compiler.internal.qvts2qvts.RegionAnalysis;
import org.eclipse.qvtd.compiler.internal.qvts2qvts.partitioner.RootPartitionAnalysis;
import org.eclipse.qvtd.pivot.qvtbase.Domain;
import org.eclipse.qvtd.pivot.qvtbase.Rule;
import org.eclipse.qvtd.pivot.qvtbase.Transformation;
import org.eclipse.qvtd.pivot.qvtbase.TypedModel;
import org.eclipse.qvtd.pivot.qvtbase.utilities.QVTbaseLibraryHelper;
import org.eclipse.qvtd.pivot.qvtbase.utilities.StandardLibraryHelper;
import org.eclipse.qvtd.pivot.qvtbase.utilities.TraceHelper;
import org.eclipse.qvtd.pivot.qvtcore.analysis.RootDomainUsageAnalysis;
import org.eclipse.qvtd.pivot.qvtschedule.ClassDatum;
import org.eclipse.qvtd.pivot.qvtschedule.MappingRegion;
import org.eclipse.qvtd.pivot.qvtschedule.NavigableEdge;
import org.eclipse.qvtd.pivot.qvtschedule.NavigationEdge;
import org.eclipse.qvtd.pivot.qvtschedule.Node;
import org.eclipse.qvtd.pivot.qvtschedule.OperationRegion;
import org.eclipse.qvtd.pivot.qvtschedule.Partition;
import org.eclipse.qvtd.pivot.qvtschedule.PropertyDatum;
import org.eclipse.qvtd.pivot.qvtschedule.Region;
import org.eclipse.qvtd.pivot.qvtschedule.RuleRegion;
import org.eclipse.qvtd.pivot.qvtschedule.ScheduleModel;
import org.eclipse.qvtd.pivot.qvtschedule.RootRegion;
import org.eclipse.qvtd.pivot.qvtschedule.utilities.DomainUsage;
import org.eclipse.qvtd.pivot.qvtschedule.utilities.Graphable;
public interface ScheduleManager
{
void addMappingRegion(@NonNull MappingRegion mappingRegion);
void addPartitionError(@NonNull Partition partition, @NonNull String messageTemplate, Object... bindings);
void addPartitionWarning(@NonNull Partition partition, @NonNull String messageTemplate, Object... bindings);
void addProblem(@NonNull CompilerProblem problem);
void addRegionError(@NonNull Region region, @NonNull String messageTemplate, Object... bindings);
void addRegionWarning(@NonNull Region region, @NonNull String messageTemplate, Object... bindings);
// void addSharedAggregateRelation(@NonNull RelationAnalysis relationAnalysis);
/**
* Define an additional/only Transformation to be scheduled by the subsequent anayses and syntheses.
*/
@NonNull AbstractTransformationAnalysis addTransformation(@NonNull Transformation asTransformation);
void analyzeCompletePackage(@NonNull TypedModel typedModel, @NonNull CompletePackage completePackage);
@NonNull OperationRegion analyzeOperation(@NonNull OperationCallExp operationCallExp);
@NonNull OriginalContentsAnalysis analyzeOriginalContents();
/**
* Perform the pre-analysis that relies solely on traversal of the QVTr source model.
*/
void analyzeSourceModel();
/**
* Perform the late analysis of a synthesized trace Package.
*/
void analyzeTracePackage(@NonNull TypedModel typedModel, org.eclipse.ocl.pivot.@NonNull Package tracePackage);
/**
* Perform the interdependent global analysis of each Rule within its Transformation.
*/
@NonNull Map<@NonNull RootRegion, @NonNull Iterable<@NonNull RuleRegion>> analyzeTransformations();
@Nullable ConnectionManager basicGetConnectionManager();
@Nullable Property basicGetGlobalSuccessProperty(@NonNull Node node);
@Nullable Property basicGetLocalSuccessProperty(@NonNull Node node);
/**
* Return true if targetNode is one rather than all of the elements computed by the property navigation to targetNode.
*
* FIXME Many calls to this are lazy; cannot possibly be partial.
*/
boolean computeIsPartial(@NonNull Node targetNode, @NonNull Property property);
@NonNull ConnectionManager createConnectionManager(@NonNull ProblemHandler problemHandler, @NonNull LoadingRegionAnalysis loadingRegionAnalysis);
@NonNull ExpressionSynthesizer createExpressionSynthesizer(@NonNull RuleAnalysis ruleAnalysis);
@NonNull RuleAnalysis createRuleAnalysis(@NonNull AbstractTransformationAnalysis transformationAnalysis, @NonNull Rule asRule);
@NonNull RuleAnalysis2TraceGroup createRuleAnalysis2TraceGroup(@NonNull RuleAnalysis ruleAnalysis);
@NonNull TransformationAnalysis2TracePackage createTransformationAnalysis2TracePackage(@NonNull AbstractTransformationAnalysis transformationAnalysis);
@NonNull Iterable<@NonNull PropertyDatum> getAllPropertyDatums(@NonNull ClassDatum classDatum);
@NonNull PropertyDatum getBasePropertyDatum(@NonNull PropertyDatum propertyDatum);
@NonNull ClassDatum getBooleanClassDatum();
@NonNull ClassDatum getClassDatum(@NonNull TypedElement asTypedElement);
@NonNull ClassDatum getClassDatum(@NonNull TypedModel typedModel, org.eclipse.ocl.pivot.@NonNull Class asType);
@NonNull ClassDatum getClassDatum(@NonNull TypedModel typedModel, @NonNull CompleteClass completeClass);
@NonNull ClassDatum getClassDatum(@NonNull TypedModel typedModel, @NonNull Iterable<@NonNull CompleteClass> completeClasses);
@NonNull Iterable<@NonNull ClassDatum> getClassDatums();
@NonNull ConnectionManager getConnectionManager();
@NonNull RootDomainUsageAnalysis getDomainUsageAnalysis();
@NonNull DomainUsage getDomainUsage(@NonNull Element element);
@NonNull ClassDatum getElementalClassDatum(@NonNull ClassDatum classDatum);
@NonNull EnvironmentFactory getEnvironmentFactory();
@NonNull NameGenerator getNameGenerator();
@NonNull Iterable<@NonNull PropertyDatum> getOclContainerPropertyDatums(@NonNull ClassDatum classDatum);
@NonNull ClassDatum getOclVoidClassDatum();
/**
* Return a determinstic alphabetical ordereding of the TransformationAnalysis instances.
*/
@NonNull Iterable<@NonNull AbstractTransformationAnalysis> getOrderedTransformationAnalyses();
/**
* Return the analysis of the pre-partitioned regions consumptions and productions.
*/
@NonNull OriginalContentsAnalysis getOriginalContentsAnalysis();
@NonNull PropertyDatum getPropertyDatum(@NonNull ClassDatum classDatum, @NonNull Property property);
@NonNull PropertyDatum getPropertyDatum(@NonNull NavigationEdge edge);
@NonNull QVTbaseLibraryHelper getQVTbaseLibraryHelper();
@NonNull RegionAnalysis getRegionAnalysis(@NonNull Region region);
@NonNull RootPartitionAnalysis getRootPartitionAnalysis(@NonNull RootRegion rootRegion);
@NonNull ScheduleModel getScheduleModel();
@NonNull StandardLibrary getStandardLibrary();
@NonNull StandardLibraryHelper getStandardLibraryHelper();
@NonNull PropertyDatum getSuccessPropertyDatum(@NonNull Property successProperty);
@NonNull Iterable<@NonNull ClassDatum> getSuperClassDatums(@NonNull ClassDatum classDatum);
@NonNull TraceHelper getTraceHelper();
@NonNull TypedModel getTraceTypedModel();
@NonNull Iterable<@NonNull AbstractTransformationAnalysis> getTransformationAnalyses();
@NonNull AbstractTransformationAnalysis getTransformationAnalysis(@NonNull RootRegion rootRegion);
@NonNull AbstractTransformationAnalysis getTransformationAnalysis(@NonNull Transformation transformation);
/**
* Return true if a mapping may assign this property in an input model.
*/
boolean isDirty(@NonNull Property property);
/**
* Return true if the elemental source type of thatEdge is compatible with the source type of thisEdge.
*/
boolean isElementallyConformantSource(@NonNull NavigableEdge thatEdge, @NonNull NavigableEdge thisEdge);
/**
* Return true if domain is an input domain.
*/
boolean isInput(@NonNull Domain domain);
boolean isInput(@NonNull Node node);
boolean isInput(@NonNull TypedModel typedModel);
/**
* Return true if node is part of the middle (traced) domain.
*/
boolean isMiddle(@NonNull Node node);
boolean isNoEarlyMerge();
boolean isNoLateConsumerMerge();
/**
* Return true if domain is an output domain.
*/
boolean isOutput(@NonNull Domain domain);
boolean isOutput(@NonNull Node node);
/**
* Return true if multiple trace class prodicers should be discrimated to enabale manually designed trace classes to
* accommodate M:N usage patterns as simple M:1 usages. (This is not needed for QVTr.)
*/
boolean needsDiscrimination();
void setRootRegion(@NonNull MappingRegion mappingRegion, @Nullable RootRegion rootRegion);
void throwCompilerChainExceptionForErrors() throws CompilerChainException;
/**
* Return true to use the new QVTr ActivatorRegion support, false to retain the older, one day obsolete support.
*/
boolean useActivators();
void writeDebugGraphs(@NonNull Graphable graphable, @Nullable String context);
void writeDebugGraphs(@NonNull String context, boolean doNodesGraph, boolean doRegionGraph, boolean doCallGraph);
// void wipAddPartition(@NonNull Partition partition, @NonNull Region partitionedRegion);
// @NonNull Partition wipGetPartition(@NonNull Region partitionedRegion);
// @NonNull Region wipGetRegion(@NonNull Partition partition);
}