@Override
 public VariableDeclaration clone() {
   Expression expression = initialization();
   Expression clonedExpression = null;
   if (expression != null) {
     clonedExpression = expression.clone();
   }
   return new VariableDeclaration(signature().clone(), clonedExpression);
 }
 public V variable() {
   Expression init = initialization();
   Expression initClone = (init == null ? null : init.clone());
   V result =
       (V) ((VariableDeclarator<?, V>) parent()).createVariable(signature().clone(), initClone);
   result.setUniParent(parent());
   result.setOrigin(this);
   transform(result);
   return result;
 }
 @Override
 public VerificationResult verifySelf() {
   VerificationResult result =
       checkNull(signature(), "The variable declaration has no signature", Valid.create());
   Expression initialization = initialization();
   if (initialization != null) {
     Type initType = null;
     try {
       initType = initialization.getType();
     } catch (LookupException e) {
       result =
           result.and(
               new BasicProblem(
                   this, "Cannot calculate the type of the initialization expression"));
     }
     Type variableType = null;
     try {
       variableType = variable().getType();
     } catch (LookupException e) {
       result =
           result.and(
               new BasicProblem(this, "Cannot calculate the type of the declared variable."));
     }
     if (initType != null && variableType != null) {
       try {
         if (!initType.subTypeOf(variableType)) {
           result =
               result.and(
                   new BasicProblem(
                       this,
                       "The type of the initializer ("
                           + initType.getFullyQualifiedName()
                           + ") is not a subtype of the type of the declared variable ("
                           + variableType.getFullyQualifiedName()
                           + ")."));
           initialization.getType().subTypeOf(variable().getType());
         }
       } catch (LookupException e) {
         result =
             result.and(
                 new BasicProblem(
                     this,
                     "Cannot determine the relation between the type of the initializer and the type of the declared variable."));
       }
     }
   }
   return result;
 }
 public void setInitialization(Expression expression) {
   if (expression != null) {
     _expression.connectTo(expression.parentLink());
   } else {
     _expression.connectTo(null);
   }
 }