@Override
 public Boolean caseRichStringLiteral(RichStringLiteral object) {
   String value = object.getValue();
   List<TextLine> lines = TextLines.splitString(value);
   if (lines.isEmpty()) {
     Literal literal = factory.createLiteral();
     literal.setLength(0);
     literal.setOffset(0);
     literal.setLiteral(object);
     addToCurrentLine(literal);
   } else {
     for (TextLine textLine : lines) {
       Literal literal = factory.createLiteral();
       literal.setLength(textLine.length());
       literal.setOffset(textLine.getRelativeOffset());
       literal.setLiteral(object);
       addToCurrentLine(literal);
       if (textLine.hasTrailingLineBreak()) {
         LineBreak lineBreak = factory.createLineBreak();
         lineBreak.setLength(textLine.getDelimiterLength());
         lineBreak.setOffset(textLine.getRelativeOffset() + textLine.length());
         lineBreak.setLiteral(object);
         addToCurrentLine(lineBreak);
         currentLine = null;
       }
     }
   }
   return Boolean.TRUE;
 }
 @Override
 public Boolean caseRichStringForLoop(RichStringForLoop object) {
   ForLoopStart start = factory.createForLoopStart();
   start.setLoop(object);
   addToCurrentLine(start);
   doSwitch(object.getEachExpression());
   ForLoopEnd end = factory.createForLoopEnd();
   end.setStart(start);
   addToCurrentLine(end);
   return Boolean.TRUE;
 }
 protected void addToCurrentLine(LinePart part) {
   if (currentLine == null) {
     currentLine = factory.createLine();
     if (!(part instanceof Literal) && !result.getLines().isEmpty()) {
       Line prevLine = result.getLines().get(result.getLines().size() - 1);
       LineBreak lineBreak = (LineBreak) prevLine.getParts().get(prevLine.getParts().size() - 1);
       Literal literal = factory.createLiteral();
       literal.setLength(0);
       literal.setOffset(lineBreak.getLiteral().getValue().length());
       literal.setLiteral(lineBreak.getLiteral());
       currentLine.getParts().add(literal);
     }
     result.getLines().add(currentLine);
   }
   if (part != null) currentLine.getParts().add(part);
 }
 @Override
 public Boolean defaultCase(EObject object) {
   if (object instanceof XExpression) {
     // caseXExpression does not work since object.ePackage != Xtend2Switch.modelPackage
     PrintedExpression printedExpression = factory.createPrintedExpression();
     printedExpression.setExpression((XExpression) object);
     addToCurrentLine(printedExpression);
   }
   return Boolean.TRUE;
 }
 @Override
 public Boolean caseRichStringIf(RichStringIf object) {
   IfConditionStart start = factory.createIfConditionStart();
   start.setRichStringIf(object);
   addToCurrentLine(start);
   doSwitch(object.getThen());
   for (RichStringElseIf elseIf : object.getElseIfs()) {
     ElseIfCondition elseIfStart = factory.createElseIfCondition();
     elseIfStart.setIfConditionStart(start);
     elseIfStart.setRichStringElseIf(elseIf);
     addToCurrentLine(elseIfStart);
     doSwitch(elseIf.getThen());
   }
   if (object.getElse() != null) {
     ElseStart elseStart = factory.createElseStart();
     elseStart.setIfConditionStart(start);
     addToCurrentLine(elseStart);
     doSwitch(object.getElse());
   }
   EndIf end = factory.createEndIf();
   end.setIfConditionStart(start);
   addToCurrentLine(end);
   return Boolean.TRUE;
 }
 @Override
 public Boolean caseRichString(RichString object) {
   if (result == null) {
     result = factory.createProcessedRichString();
     result.setRichString(object);
   }
   List<XExpression> elements = object.getExpressions();
   for (XExpression element : elements) {
     doSwitch(element);
   }
   if (currentLine == null && !result.getLines().isEmpty()) {
     // add next line with empty text since the previous ends with a line break
     addToCurrentLine(null);
   }
   return Boolean.TRUE;
 }