[433103] Fix null/invalid analysis of ShadowPart
diff --git a/examples/org.eclipse.ocl.examples.build/src/org/eclipse/ocl/examples/build/modelspecs/CGValuedElementModelSpec.java b/examples/org.eclipse.ocl.examples.build/src/org/eclipse/ocl/examples/build/modelspecs/CGValuedElementModelSpec.java
index 1d2eb38..c0be0dc 100644
--- a/examples/org.eclipse.ocl.examples.build/src/org/eclipse/ocl/examples/build/modelspecs/CGValuedElementModelSpec.java
+++ b/examples/org.eclipse.ocl.examples.build/src/org/eclipse/ocl/examples/build/modelspecs/CGValuedElementModelSpec.java
@@ -2336,7 +2336,7 @@
 			new CGValuedElementModelSpec(CGLetExp.class, "in",							Box.DELEG, null     , null     , null     , null     , Glo.FALSE, null     , null     , null    , null     , Val.DELEG, null     , null     , Ctl.LET  , null     , null     , Eq.EQUIV);
 			new CGValuedElementModelSpec(CGMapExp.class, "CGMapPart",					Box.BOX  , Ths.PARTS, null     , Nul.NEVER, Inv.PARTS, Glo.PARTS, null     , null     , null    , Con.PARTS, null     , null     , null     , Ctl.LORG , null     , null     , Eq.EQUIV);
 			new CGValuedElementModelSpec(CGMapPart.class, null,							Box.BOX  , null     , null     , Nul.NEVER, Inv.MPART, Glo.MPART, null     , null     , null    , Con.MPART, null     , null     , null     , null     , Com.FALSE, null     , Eq.EQUIV);
-			new CGValuedElementModelSpec(CGShadowPart.class, null,						Box.BOX  , null     , null     , null     , null     , Glo.FALSE, null     , null     , null    , Con.FALSE, null     , null     , null     , null     , Com.FALSE, Rew.PART , Eq.EQUIV);
+			new CGValuedElementModelSpec(CGShadowPart.class, "init",					Box.BOX  , null     , null     , null     , null     , Glo.FALSE, null     , null     , null    , Con.FALSE, Val.DELEG, null     , null     , null     , Com.FALSE, Rew.PART , Eq.DELEG);
 
 			new CGValuedElementModelSpec(CGCallable.class, null,						null     , null     , null     , null     , null     , null     , null     , null     , null    , null     , null     , null     , Ctx.TRUE , Ctl.BODY , null     , null     , Eq.UNSUP);
 			new CGValuedElementModelSpec(CGConstraint.class, null,						Box.UNBOX, null     , null     , null     , null     , null     , null     , null     , null    , null     , null     , null     , null     , null     , null     , null     , null    );
diff --git a/examples/org.eclipse.ocl.examples.codegen/emf-gen/org/eclipse/ocl/examples/codegen/cgmodel/CGCallExp.java b/examples/org.eclipse.ocl.examples.codegen/emf-gen/org/eclipse/ocl/examples/codegen/cgmodel/CGCallExp.java
index 54b6901..36ad7bb 100644
--- a/examples/org.eclipse.ocl.examples.codegen/emf-gen/org/eclipse/ocl/examples/codegen/cgmodel/CGCallExp.java
+++ b/examples/org.eclipse.ocl.examples.codegen/emf-gen/org/eclipse/ocl/examples/codegen/cgmodel/CGCallExp.java
@@ -41,7 +41,7 @@
 	 * </p>
 	 * <!-- end-user-doc -->
 	 * <!-- begin-model-doc -->
-	 * Whether this call expression may return an invalid result for non-invalid inputs.
+	 * Whether this call expression may return an invalid result for non-invalid (or invalid if also validating) inputs.
 	 * <!-- end-model-doc -->
 	 * @return the value of the '<em>Invalidating</em>' attribute.
 	 * @see #setInvalidating(boolean)
diff --git a/examples/org.eclipse.ocl.examples.codegen/emf-gen/org/eclipse/ocl/examples/codegen/cgmodel/impl/CGShadowPartImpl.java b/examples/org.eclipse.ocl.examples.codegen/emf-gen/org/eclipse/ocl/examples/codegen/cgmodel/impl/CGShadowPartImpl.java
index 20dc6ad..5d12094 100644
--- a/examples/org.eclipse.ocl.examples.codegen/emf-gen/org/eclipse/ocl/examples/codegen/cgmodel/impl/CGShadowPartImpl.java
+++ b/examples/org.eclipse.ocl.examples.codegen/emf-gen/org/eclipse/ocl/examples/codegen/cgmodel/impl/CGShadowPartImpl.java
@@ -4,7 +4,7 @@
  * 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(CEA LIST) - Initial API and implementation
  *******************************************************************************/
@@ -17,13 +17,12 @@
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
-import org.eclipse.ocl.examples.codegen.cgmodel.CGShadowExp;
-import org.eclipse.ocl.examples.codegen.cgmodel.CGShadowPart;
 import org.eclipse.ocl.examples.codegen.cgmodel.CGExecutorShadowPart;
 import org.eclipse.ocl.examples.codegen.cgmodel.CGModelPackage;
+import org.eclipse.ocl.examples.codegen.cgmodel.CGShadowExp;
+import org.eclipse.ocl.examples.codegen.cgmodel.CGShadowPart;
 import org.eclipse.ocl.examples.codegen.cgmodel.CGValuedElement;
 import org.eclipse.ocl.examples.codegen.cgmodel.util.CGModelVisitor;
-import org.eclipse.ocl.examples.codegen.utilities.EquivalenceUtil;
 
 /**
  * <!-- begin-user-doc -->
@@ -300,6 +299,51 @@
 	 * @generated
 	 */
 	@Override
+	public @NonNull CGValuedElement getNamedValue() {
+		return init != null ? init.getNamedValue() : this;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * @generated
+	 */
+	@Override
+	public @NonNull CGValuedElement getReferredValue() {
+		return init != null ? init : this;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * @generated
+	 */
+	@Override
+	public @NonNull CGValuedElement getSourceValue() {
+		return init != null ? init.getSourceValue() : this;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * @generated
+	 */
+	@Override
+	public @NonNull CGValuedElement getTypedValue() {
+		return init != null ? init.getTypedValue() : this;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * @generated
+	 */
+	@Override
+	public @Nullable String getValueName() {
+		return init != null ? init.getValueName() : null;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * @generated
+	 */
+	@Override
 	public boolean isBoxed() {
 		return true;
 	}
@@ -336,8 +380,17 @@
 	 * @generated
 	 */
 	@Override
+	public @Nullable Boolean isEquivalentTo(@NonNull CGValuedElement thatValue) {
+		return init != null ? thatValue.isEquivalentTo(init) : super.isEquivalentTo(thatValue);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * @generated
+	 */
+	@Override
 	public @Nullable Boolean isEquivalentToInternal(@NonNull CGValuedElement thatValue) {
-		return (getClass() == thatValue.getClass()) ? EquivalenceUtil.isEquivalent(this, (CGShadowPart)thatValue) : null;
+		return init != null ? thatValue.isEquivalentToInternal(init) : null;
 	}
 
 	/**
diff --git a/examples/org.eclipse.ocl.examples.codegen/model/cgmodel.ecore b/examples/org.eclipse.ocl.examples.codegen/model/cgmodel.ecore
index 638f911..2bff90a 100644
--- a/examples/org.eclipse.ocl.examples.codegen/model/cgmodel.ecore
+++ b/examples/org.eclipse.ocl.examples.codegen/model/cgmodel.ecore
@@ -74,7 +74,7 @@
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="invalidating" lowerBound="1"
         eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean" defaultValueLiteral="false">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether this call expression may return an invalid result for non-invalid inputs."/>
+        <details key="documentation" value="Whether this call expression may return an invalid result for non-invalid (or invalid if also validating) inputs."/>
       </eAnnotations>
     </eStructuralFeatures>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="validating" lowerBound="1"