blob: 4dd530d1ccb6c8e60e34ca12bbee409d45a76473 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2016 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.qvtd.compiler.internal.qvtp2qvts;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.qvtd.compiler.internal.qvtp2qvts.impl.VariableNodeImpl;
public abstract class AbstractVisitor<R> implements Visitor<R>
{
public <@NonNull T extends R> T create(@NonNull Class<T> returnClass, @NonNull Visitable visitable) {
R result = visitable.accept(this);
if (result == null) {
throw new NullPointerException("null return from SplitterVisitor for " + visitable.getClass().getSimpleName());
}
if (!returnClass.isAssignableFrom(result.getClass())) {
throw new ClassCastException("bad return from SplitterVisitor for " + visitable.getClass().getSimpleName());
}
@SuppressWarnings("unchecked") T castVisitable = (T) result;
return castVisitable;
}
@Override
public R visiting(@NonNull Visitable visitable) {
throw new UnsupportedOperationException(getClass().getSimpleName() + ": " + visitable.getClass().getSimpleName());
}
@Override
public R visitBasicEdgeConnection(@NonNull BasicEdgeConnection basicEdgeConnection) {
return visiting(basicEdgeConnection);
}
@Override
public R visitBasicNodeConnection(@NonNull BasicNodeConnection basicNodeConnection) {
return visiting(basicNodeConnection);
}
@Override
public R visitCyclicScheduledRegion(@NonNull CyclicScheduledRegion cyclicScheduledRegion) {
return visitRegion(cyclicScheduledRegion);
}
@Override
public R visitEdge(@NonNull Edge edge) {
return visiting(edge);
}
@Override
public R visitMappingRegion(@NonNull MappingRegion mappingRegion) {
return visitRegion(mappingRegion);
}
@Override
public R visitNavigableEdge(@NonNull NavigableEdge navigationEdge) {
return visitEdge(navigationEdge);
}
@Override
public R visitNode(@NonNull Node node) {
return visiting(node);
}
@Override
public R visitOperationRegion(@NonNull OperationRegion operationRegion) {
return visitRegion(operationRegion);
}
@Override
public R visitRegion(@NonNull Region region) {
return visiting(region);
}
@Override
public R visitRootCompositionRegion(@NonNull RootCompositionRegion rootCompositionRegion) {
return visitRegion(rootCompositionRegion);
}
@Override
public R visitRootScheduledRegion(@NonNull RootScheduledRegion rootScheduledRegion) {
return visitRegion(rootScheduledRegion);
}
@Override
public R visitVariableNode(@NonNull VariableNodeImpl variableNode) {
return visitNode(variableNode);
}
}