[wip] PartialEvaluator
diff --git a/plugins/org.eclipse.qvtd.pivot.qvtimperative/model/PartialEvaluator.ecore b/plugins/org.eclipse.qvtd.pivot.qvtimperative/model/PartialEvaluator.ecore
new file mode 100644
index 0000000..f1d1ea1
--- /dev/null
+++ b/plugins/org.eclipse.qvtd.pivot.qvtimperative/model/PartialEvaluator.ecore
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<ecore:EPackage xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

+    xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="partialevaluator" nsURI="http://www.eclipse.org/qvt/2015/PartialEvaluator"

+    nsPrefix="pe">

+  <eAnnotations source="http://www.eclipse.org/OCL/Import">

+    <details key="pivot" value="http://www.eclipse.org/ocl/2015/Library"/>

+    <details key="values" value="http://www.eclipse.org/ocl/2015/Values"/>

+  </eAnnotations>

+  <eClassifiers xsi:type="ecore:EClass" name="ClassInstance" eSuperTypes="#//ObjectInstance"/>

+  <eClassifiers xsi:type="ecore:EClass" name="CompleteResult" eSuperTypes="#//Result">

+    <eStructuralFeatures xsi:type="ecore:EReference" name="object2" lowerBound="1"

+        eType="ecore:EClass http://www.eclipse.org/ocl/2015/Values#//Value"/>

+  </eClassifiers>

+  <eClassifiers xsi:type="ecore:EClass" name="Evaluator">

+    <eOperations name="getVariable" lowerBound="1" eType="ecore:EClass http://www.eclipse.org/ocl/2015/Values#//Value">

+      <eParameters name="variable" lowerBound="1" eType="ecore:EClass http://www.eclipse.org/ocl/2015/Pivot#//VariableDeclaration"/>

+    </eOperations>

+    <eOperations name="navigateProperty" lowerBound="1" eType="ecore:EClass http://www.eclipse.org/ocl/2015/Values#//Value">

+      <eParameters name="source" lowerBound="1" eType="ecore:EClass http://www.eclipse.org/ocl/2015/Values#//ObjectValue"/>

+      <eParameters name="property" lowerBound="1" eType="ecore:EClass http://www.eclipse.org/ocl/2015/Pivot#//Property"/>

+    </eOperations>

+    <eOperations name="setVariable" lowerBound="1" eType="ecore:EClass http://www.eclipse.org/ocl/2015/Values#//Value">

+      <eParameters name="variable" lowerBound="1" eType="ecore:EClass http://www.eclipse.org/ocl/2015/Pivot#//Variable"/>

+      <eParameters name="value" lowerBound="1" eType="ecore:EClass http://www.eclipse.org/ocl/2015/Values#//Value"/>

+    </eOperations>

+  </eClassifiers>

+  <eClassifiers xsi:type="ecore:EClass" name="Instance" abstract="true"/>

+  <eClassifiers xsi:type="ecore:EClass" name="ObjectInstance" abstract="true" eSuperTypes="#//Instance">

+    <eStructuralFeatures xsi:type="ecore:EReference" name="object" lowerBound="1"

+        eType="ecore:EClass http://www.eclipse.org/ocl/2015/Values#//ObjectValue"/>

+  </eClassifiers>

+  <eClassifiers xsi:type="ecore:EClass" name="PartialEvaluator" eSuperTypes="#//Evaluator">

+    <eOperations name="evaluate" lowerBound="1" eType="ecore:EClass http://www.eclipse.org/ocl/2015/Values#//Value">

+      <eParameters name="expression" lowerBound="1" eType="ecore:EClass http://www.eclipse.org/ocl/2015/Pivot#//OCLExpression"/>

+    </eOperations>

+    <eOperations name="getUnresolved" lowerBound="1" eType="ecore:EClass http://www.eclipse.org/ocl/2015/Values#//Value"/>

+    <eOperations name="getVariable" lowerBound="1" eType="#//PartialResult">

+      <eParameters name="variable" lowerBound="1" eType="ecore:EClass http://www.eclipse.org/ocl/2015/Pivot#//VariableDeclaration"/>

+    </eOperations>

+    <eOperations name="isUnresolved" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">

+      <eParameters name="values" lowerBound="1" eType="ecore:EClass http://www.eclipse.org/ocl/2015/Values#//Value"/>

+    </eOperations>

+    <eOperations name="makeObjectInstance" lowerBound="1" eType="#//ObjectInstance">

+      <eParameters name="value" lowerBound="1" eType="ecore:EClass http://www.eclipse.org/ocl/2015/Values#//Value"/>

+    </eOperations>

+    <eOperations name="makePropertyInstance" lowerBound="1" eType="#//PropertyInstance">

+      <eParameters name="object" lowerBound="1" eType="#//ObjectInstance"/>

+      <eParameters name="property" lowerBound="1" eType="ecore:EClass http://www.eclipse.org/ocl/2015/Pivot#//Property"/>

+    </eOperations>

+    <eOperations name="setVariable" lowerBound="1" eType="#//PartialResult">

+      <eParameters name="variable" lowerBound="1" eType="ecore:EClass http://www.eclipse.org/ocl/2015/Pivot#//Variable"/>

+      <eParameters name="result" lowerBound="1" eType="#//PartialResult"/>

+    </eOperations>

+  </eClassifiers>

+  <eClassifiers xsi:type="ecore:EClass" name="PartialResult" eSuperTypes="#//Result">

+    <eStructuralFeatures xsi:type="ecore:EReference" name="result" lowerBound="1"

+        eType="ecore:EClass http://www.eclipse.org/ocl/2015/Values#//Value"/>

+    <eStructuralFeatures xsi:type="ecore:EReference" name="dependencies" ordered="false"

+        upperBound="-1" eType="#//Instance"/>

+  </eClassifiers>

+  <eClassifiers xsi:type="ecore:EClass" name="PropertyInstance" eSuperTypes="#//Instance">

+    <eStructuralFeatures xsi:type="ecore:EReference" name="object" lowerBound="1"

+        eType="#//ObjectInstance"/>

+    <eStructuralFeatures xsi:type="ecore:EReference" name="property" lowerBound="1"

+        eType="ecore:EClass http://www.eclipse.org/ocl/2015/Pivot#//Property"/>

+  </eClassifiers>

+  <eClassifiers xsi:type="ecore:EClass" name="Result" abstract="true"/>

+</ecore:EPackage>

diff --git a/plugins/org.eclipse.qvtd.pivot.qvtimperative/model/PartialEvaluator.ocl b/plugins/org.eclipse.qvtd.pivot.qvtimperative/model/PartialEvaluator.ocl
new file mode 100644
index 0000000..7ad69db
--- /dev/null
+++ b/plugins/org.eclipse.qvtd.pivot.qvtimperative/model/PartialEvaluator.ocl
@@ -0,0 +1,80 @@
+import pe : 'PartialEvaluator.ecore#/'
+import pivot : 'http://www.eclipse.org/ocl/2015/Pivot'
+import v : 'http://www.eclipse.org/ocl/2015/Values'
+
+package ocl
+
+context BooleanLiteralExp
+def: eval(evaluator : pe::Evaluator) : v::Value = self.booleanSymbol
+
+context IfExp
+def: eval(evaluator : pe::Evaluator) : v::Value =
+	let condition : Boolean = self.ownedCondition.eval(evaluator) in
+	if condition.oclIsUndefined() then condition
+	else if condition then self.ownedThen.eval(evaluator)
+		 else self.ownedElse.eval(evaluator)
+		 endif
+	endif
+def: partialEval(evaluator : pe::PartialEvaluator) : pe::PartialResult =
+	let conditionResult : pe::PartialResult = evaluator.evaluate(self.ownedCondition) in
+	let condition : v::Value = conditionResult.result in
+	if evaluator.isUnresolved(condition) or condition.oclIsUndefined() then conditionResult
+	else 
+		let ifResult : pe::PartialResult = evaluator.evaluate(if condition then self.ownedThen else self.ownedElse endif) in
+		pe::PartialResult {
+			result = ifResult.result,
+			dependencies = conditionResult.dependencies->union(ifResult.dependencies)
+		}
+	endif
+
+context IntegerLiteralExp
+def: eval(evaluator : pe::Evaluator) : v::Value = self.integerSymbol
+
+context LetExp
+def: eval(evaluator : pe::Evaluator) : v::Value =
+	let value : v::Value = self.ownedIn.eval(evaluator) in
+	evaluator.setVariable(self.ownedVariable, value)
+def: partialEval(evaluator : pe::PartialEvaluator) : pe::PartialResult =
+	let inResult : pe::PartialResult = evaluator.evaluate(self.ownedIn) in
+	evaluator.setVariable(self.ownedVariable, inResult)
+
+context LiteralExp
+def: partialEval(evaluator : pe::PartialEvaluator) : pe::PartialResult =
+	pe::PartialResult {
+		result = eval(evaluator),
+		dependencies = Set{}
+	}
+
+context OCLExpression
+def: eval(evaluator : pe::Evaluator) : v::Value = invalid
+def: partialEval(evaluator : pe::PartialEvaluator) : pe::PartialResult = invalid
+
+context PropertyCallExp
+def: eval(evaluator : pe::Evaluator) : v::Value =
+	evaluator.navigateProperty(self.ownedSource.eval(evaluator).oclAsType(v::ObjectValue), self.referredProperty)
+def: partialEval(evaluator : pe::PartialEvaluator) : pe::PartialResult =
+	let sourceResult : pe::PartialResult = evaluator.evaluate(self.ownedSource) in
+	let sourceInstance : pe::ObjectInstance = evaluator.makeObjectInstance(sourceResult.result) in
+	let propertyInstance : pe::PropertyInstance = evaluator.makePropertyInstance(sourceInstance, self.referredProperty) in
+	let sourceDependencies : pe::PropertyInstance = sourceResult.dependencies in
+	pe::PartialResult {
+		result = if propertyInstance <> null then sourceResult.result else evaluator.getUnresolved() endif,
+		dependencies = if propertyInstance <> null then sourceDependencies->including(propertyInstance) else sourceDependencies endif
+	}
+
+context RealLiteralExp
+def: eval(evaluator : pe::Evaluator) : v::Value = self.realSymbol
+
+context StringLiteralExp
+def: eval(evaluator : pe::Evaluator) : v::Value = self.stringSymbol
+
+context UnlimitedNaturalLiteralExp
+def: eval(evaluator : pe::Evaluator) : v::Value = self.unlimitedNaturalSymbol
+
+context VariableExp
+def: eval(evaluator : pe::Evaluator) : v::Value =
+	evaluator.getVariable(self.referredVariable)
+def: partialEval(evaluator : pe::PartialEvaluator) : pe::PartialResult =
+	evaluator.getVariable(self.referredVariable)
+
+endpackage