[498400] Preserve Class/DataType distinction for PredicatedInternalNode
diff --git a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtp2qvts/ExpressionAnalyzer.java b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtp2qvts/ExpressionAnalyzer.java
index 69ebd41..464ade8 100644
--- a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtp2qvts/ExpressionAnalyzer.java
+++ b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtp2qvts/ExpressionAnalyzer.java
@@ -353,8 +353,8 @@
 		return Nodes.createPredicatedInternalClassNode(parentNode, navigationAssignment);
 	}
 
-	protected @NonNull Node createPredicatedClassNode(@NonNull String name, @NonNull ClassDatumAnalysis classDatumAnalysis) {
-		return Nodes.createPredicatedInternalClassNode(context, name, classDatumAnalysis);
+	protected @NonNull Node createPredicatedInternalNode(@NonNull String name, @NonNull ClassDatumAnalysis classDatumAnalysis) {
+		return Nodes.createPredicatedInternalNode(context, name, classDatumAnalysis);
 	}
 
 	protected @NonNull Node createRealizedDataTypeNode(@NonNull Node sourceNode, @NonNull Property source2targetProperty) {
@@ -541,7 +541,7 @@
 				Node extraTargetNode = extraEdge.getTarget();
 				String name = extraTargetNode.getName();
 				ClassDatumAnalysis classDatumAnalysis = extraTargetNode.getClassDatumAnalysis();
-				Node instantiatedTargetNode = createPredicatedClassNode(name, classDatumAnalysis);
+				Node instantiatedTargetNode = createPredicatedInternalNode(name, classDatumAnalysis);
 				createNavigationEdge(instantiatedNode, extraEdge.getProperty(), instantiatedTargetNode);
 				instantiate(instantiatedTargetNode, extraTargetNode);
 			}
diff --git a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtp2qvts/Nodes.java b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtp2qvts/Nodes.java
index be8554d..272d8ef 100644
--- a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtp2qvts/Nodes.java
+++ b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtp2qvts/Nodes.java
@@ -627,12 +627,21 @@
 	}
 
 	// FIXME Can this be merged into PatternNodeRole ??
-	private static final class PredicatedInternalNodeRole extends AbstractSimpleNodeRole
+	private static final class PredicatedInternalNodeRole extends AbstractTypedNodeRole
 	{
-		public static final @NonNull PredicatedInternalNodeRole PREDICATED_INTERNAL_CLASS = new PredicatedInternalNodeRole();
+		private static final @NonNull PredicatedInternalNodeRole PREDICATED_INTERNAL_CLASS = new PredicatedInternalNodeRole(ClassableEnum.CLASS);
+		private static final @NonNull PredicatedInternalNodeRole PREDICATED_INTERNAL_DATATYPE = new PredicatedInternalNodeRole(ClassableEnum.DATATYPE);
 
-		private PredicatedInternalNodeRole() {
-			super(Role.Phase.PREDICATED);
+		public static @NonNull PredicatedInternalNodeRole getPredicatedInternalNodeRole(@NonNull ClassableEnum classable) {
+			switch (classable) {
+				case CLASS: return PREDICATED_INTERNAL_CLASS;
+				case DATATYPE: return PREDICATED_INTERNAL_DATATYPE;
+			}
+			throw new UnsupportedOperationException();
+		}
+
+		private PredicatedInternalNodeRole(@NonNull ClassableEnum classable) {
+			super(Role.Phase.PREDICATED, classable);
 		}
 
 		@Override
@@ -831,8 +840,10 @@
 		return PredicatedInternalNodeRole.PREDICATED_INTERNAL_CLASS.createNode(parentNode.getRegion(), name, classDatumAnalysis);
 	}
 
-	public static @NonNull Node createPredicatedInternalClassNode(@NonNull Region region, @NonNull String name, @NonNull ClassDatumAnalysis classDatumAnalysis) {
-		return PredicatedInternalNodeRole.PREDICATED_INTERNAL_CLASS.createNode(region, name, classDatumAnalysis);
+	public static @NonNull Node createPredicatedInternalNode(@NonNull Region region, @NonNull String name, @NonNull ClassDatumAnalysis classDatumAnalysis) {
+		ClassableEnum classable = asClassable(classDatumAnalysis.getClassDatum().getType());
+		PredicatedInternalNodeRole predicatedInternalNodeRole = PredicatedInternalNodeRole.getPredicatedInternalNodeRole(classable);
+		return predicatedInternalNodeRole.createNode(region, name, classDatumAnalysis);
 	}
 
 	public static @NonNull TypedNode createRealizedDataTypeNode(@NonNull Node sourceNode, @NonNull Property source2targetProperty) {