docs: @SuppressWarnings("checkstyle:all")
  	protected StringConcatenationClient generateMembers(boolean forInterface, boolean forAppender) {
  		final TypeReference adapter = getCodeElementExtractor().getInnerBlockDocumentationAdapter();
  		return new StringConcatenationClient() {
  			@Override
  			protected void appendTo(TargetStringConcatenation it) {
  				if (!forInterface && !forAppender) {
  					it.append("\t@"); //$NON-NLS-1$
  					it.append(Inject.class);
  					it.newLine();
  					it.append("\tprivate "); //$NON-NLS-1$
  					it.append(ITaskTagProvider.class);
  					it.append(" taskTagProvider;"); //$NON-NLS-1$
  					it.newLineIfNotEmpty();
  					it.newLine();
  					it.append("\t@"); //$NON-NLS-1$
  					it.append(Inject.class);
  					it.newLine();
  					it.append("\tprivate "); //$NON-NLS-1$
  					it.append(Provider.class);
  					it.append("<"); //$NON-NLS-1$
  					it.append(getExpressionBuilderInterface());
  					it.append("> expressionProvider;"); //$NON-NLS-1$
  					it.newLine();
  					it.append("\tprivate "); //$NON-NLS-1$
  					it.append(XBlockExpression.class);
  					it.append(" block;"); //$NON-NLS-1$
  					it.newLineIfNotEmpty();
  					it.newLine();
  					it.append("\t/** Replies the provider of task tags."); //$NON-NLS-1$
  					it.newLine();
  					it.append("\t *"); //$NON-NLS-1$
  					it.newLine();
  					it.append("\t * @return the provider."); //$NON-NLS-1$
  					it.newLine();
  					it.append("\t */"); //$NON-NLS-1$
  					it.newLine();
  					it.append("\tprotected "); //$NON-NLS-1$
  					it.append(ITaskTagProvider.class);
  					it.append(" getTaskTagProvider() {"); //$NON-NLS-1$
  					it.newLine();
  					it.append("\t\treturn this.taskTagProvider;"); //$NON-NLS-1$
  					it.newLine();
  					it.append("\t}"); //$NON-NLS-1$
  					it.newLineIfNotEmpty();
  					it.newLine();
  				} else {
  					it.append("\t/** Find the reference to the type with the given name."); //$NON-NLS-1$
  					it.newLine();
  					it.append("\t * @param typeName the fully qualified name of the type"); //$NON-NLS-1$
  					it.newLine();
  					it.append("\t * @return the type reference."); //$NON-NLS-1$
  					it.newLine();
  					it.append("\t */"); //$NON-NLS-1$
  					it.newLine();
  					it.append("\t"); //$NON-NLS-1$
  					if (!forInterface) {
  						it.append("public "); //$NON-NLS-1$
  					}
  					it.append(JvmParameterizedTypeReference.class);
  					it.append(" newTypeRef(String typeName)"); //$NON-NLS-1$
  					if (forInterface) {
  						it.append(";"); //$NON-NLS-1$
  					} else {
  						it.append(" {"); //$NON-NLS-1$
  						it.newLine();
  						it.append("\t\treturn this.builder.newTypeRef(typeName);"); //$NON-NLS-1$
  						it.newLine();
  						it.append("\t}"); //$NON-NLS-1$
  					}
  					it.newLineIfNotEmpty();
  					it.newLine();
  					it.append("\t/** Find the reference to the type with the given name."); //$NON-NLS-1$
  					it.newLine();
  					it.append("\t * @param context the context for the type reference use"); //$NON-NLS-1$
  					it.newLine();
  					it.append("\t * @param typeName the fully qualified name of the type"); //$NON-NLS-1$
  					it.newLine();
  					it.append("\t * @return the type reference."); //$NON-NLS-1$
  					it.newLine();
  					it.append("\t */"); //$NON-NLS-1$
  					it.newLine();
  					it.append("\t"); //$NON-NLS-1$
  					if (!forInterface) {
  						it.append("public "); //$NON-NLS-1$
  					}
  					it.append(JvmParameterizedTypeReference.class);
  					it.append(" newTypeRef("); //$NON-NLS-1$
  					it.append(Notifier.class);
  					it.append(" context, String typeName)"); //$NON-NLS-1$
  					if (forInterface) {
  						it.append(";"); //$NON-NLS-1$
  					} else {
  						it.append(" {"); //$NON-NLS-1$
  						it.newLine();
  						it.append("\t\treturn this.builder.newTypeRef(context, typeName);"); //$NON-NLS-1$
  						it.newLine();
  						it.append("\t}"); //$NON-NLS-1$
  					}
  					it.newLineIfNotEmpty();
  					it.newLine();
  				}
  				if (forInterface) {
  					it.append("\t/** Replies the context for type resolution."); //$NON-NLS-1$
  					it.newLine();
  					it.append("\t * @return the context or <code>null</code> if the Ecore object is the context."); //$NON-NLS-1$
  					it.newLine();
  					it.append("\t */"); //$NON-NLS-1$
  					it.newLine();
  					it.append("\t"); //$NON-NLS-1$
  					it.append(IJvmTypeProvider.class);
  					it.append(" getTypeResolutionContext();"); //$NON-NLS-1$
  					it.newLineIfNotEmpty();
  					it.newLine();
  				} else if (forAppender) {
  					it.append("\tpublic "); //$NON-NLS-1$
  					it.append(IJvmTypeProvider.class);
  					it.append(" getTypeResolutionContext() {"); //$NON-NLS-1$
  					it.newLine();
  					it.append("\t\treturn this.builder.getTypeResolutionContext();"); //$NON-NLS-1$
  					it.newLine();
  					it.append("\t}"); //$NON-NLS-1$
  					it.newLineIfNotEmpty();
  					it.newLine();
  				}
  				it.append("\t/** Create the XBlockExpression."); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t */"); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t"); //$NON-NLS-1$
  				if (!forInterface) {
  					it.append("public "); //$NON-NLS-1$
  				}
  				it.append("void eInit("); //$NON-NLS-1$
  				it.append(IJvmTypeProvider.class);
  				it.append(" context)"); //$NON-NLS-1$
  				if (forInterface) {
  					it.append(";"); //$NON-NLS-1$
  				} else {
  					it.append(" {"); //$NON-NLS-1$
  					it.newLine();
  					if (forAppender) {
  						it.append("\t\tthis.builder.eInit(context);"); //$NON-NLS-1$
  					} else {
  						it.append("\t\tsetTypeResolutionContext(context);"); //$NON-NLS-1$
  						it.newLine();
  						it.append("\t\tif (this.block == null) {"); //$NON-NLS-1$
  						it.newLine();
  						it.append("\t\t\tthis.block = "); //$NON-NLS-1$
  						it.append(XbaseFactory.class);
  						it.append(".eINSTANCE.createXBlockExpression();"); //$NON-NLS-1$
  						it.newLine();
  						it.append("\t\t}"); //$NON-NLS-1$
  					}
  					it.newLine();
  					it.append("\t}"); //$NON-NLS-1$
  				}
  				it.newLineIfNotEmpty();
  				it.newLine();
  				it.append("\t/** Replies the string for \"auto-generated\" comments."); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t * @return the comment text."); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t */"); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t@"); //$NON-NLS-1$
  				it.append(Pure.class);
  				it.newLine();
  				it.append("\t"); //$NON-NLS-1$
  				if (!forInterface) {
  					it.append("public "); //$NON-NLS-1$
  				}
  				it.append("String getAutoGeneratedActionString()"); //$NON-NLS-1$
  				if (forInterface) {
  					it.append(";"); //$NON-NLS-1$
  				} else {
  					it.append(" {"); //$NON-NLS-1$
  					it.newLine();
  					if (forAppender) {
  						it.append("\t\treturn this.builder.getAutoGeneratedActionString();"); //$NON-NLS-1$
  					} else {
  						it.append("\t\treturn getAutoGeneratedActionString(getXBlockExpression().eResource());"); //$NON-NLS-1$
  					}
  					it.newLine();
  					it.append("\t}"); //$NON-NLS-1$
  				}
  				it.newLineIfNotEmpty();
  				it.newLine();
  				it.append("\t/** Replies the string for \"auto-generated\" comments."); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t * @param resource the resource for which the comment must be determined."); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t * @return the comment text."); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t */"); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t@"); //$NON-NLS-1$
  				it.append(Pure.class);
  				it.newLine();
  				it.append("\t"); //$NON-NLS-1$
  				if (!forInterface) {
  					it.append("public "); //$NON-NLS-1$
  				}
  				it.append("String getAutoGeneratedActionString("); //$NON-NLS-1$
  				it.append(Resource.class);
  				it.append(" resource)"); //$NON-NLS-1$
  				if (forInterface) {
  					it.append(";"); //$NON-NLS-1$
  				} else {
  					it.append(" {"); //$NON-NLS-1$
  					it.newLine();
  					if (forAppender) {
  						it.append("\t\treturn this.builder.getAutoGeneratedActionString(resource);"); //$NON-NLS-1$
  					} else {
  						it.append("\t\t"); //$NON-NLS-1$
  						it.append(TaskTags.class);
  						it.append(" tags = getTaskTagProvider().getTaskTags(resource);"); //$NON-NLS-1$
  						it.newLine();
  						it.append("\t\tString taskTag;"); //$NON-NLS-1$
  						it.newLine();
  						it.append("\t\tif (tags != null && tags.getTaskTags() != null && !tags.getTaskTags().isEmpty()) {"); //$NON-NLS-1$
  						it.newLine();
  						it.append("\t\t\ttaskTag = tags.getTaskTags().get(0).getName();"); //$NON-NLS-1$
  						it.newLine();
  						it.append("\t\t} else {"); //$NON-NLS-1$
  						it.newLine();
  						it.append("\t\t\ttaskTag = \"TODO\";"); //$NON-NLS-1$
  						it.newLine();
  						it.append("\t\t}"); //$NON-NLS-1$
  						it.newLine();
  						it.append("\t\treturn taskTag + \" "); //$NON-NLS-1$
  						it.append(Strings.convertToJavaString(getCodeBuilderConfig().getAutoGeneratedComment()));
  						it.append("\";"); //$NON-NLS-1$
  					}
  					it.newLine();
  					it.append("\t}"); //$NON-NLS-1$
  				}
  				it.newLineIfNotEmpty();
  				it.newLine();
  				it.append("\t/** An empty block expression."); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t * @return the block expression."); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t */"); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t@"); //$NON-NLS-1$
  				it.append(Pure.class);
  				it.newLine();
  				it.append("\t"); //$NON-NLS-1$
  				if (!forInterface) {
  					it.append("public "); //$NON-NLS-1$
  				}
  				it.append(XBlockExpression.class);
  				it.append(" getXBlockExpression()"); //$NON-NLS-1$
  				if (forInterface) {
  					it.append(";"); //$NON-NLS-1$
  				} else {
  					it.append(" {"); //$NON-NLS-1$
  					it.newLine();
  					if (forAppender) {
  						it.append("\t\treturn this.builder.getXBlockExpression();"); //$NON-NLS-1$
  					} else {
  						it.append("\t\treturn this.block;"); //$NON-NLS-1$
  					}
  					it.newLine();
  					it.append("\t}"); //$NON-NLS-1$
  				}
  				it.newLineIfNotEmpty();
  				it.newLine();
  				it.append("\t/** Replies the resource to which the XBlockExpression is attached."); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t */"); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t@"); //$NON-NLS-1$
  				it.append(Pure.class);
  				it.newLine();
  				it.append("\t"); //$NON-NLS-1$
  				if (!forInterface) {
  					it.append("public "); //$NON-NLS-1$
  				}
  				it.append(Resource.class);
  				it.append(" eResource()"); //$NON-NLS-1$
  				if (forInterface) {
  					it.append(";"); //$NON-NLS-1$
  				} else {
  					it.append(" {"); //$NON-NLS-1$
  					it.newLine();
  					it.append("\t\treturn getXBlockExpression().eResource();"); //$NON-NLS-1$
  					it.newLine();
  					it.append("\t}"); //$NON-NLS-1$
  				}
  				it.newLineIfNotEmpty();
  				it.newLine();
  				it.append(generateCommentFunction(forInterface, false, "getXBlockExpression()", //$NON-NLS-1$
  						"setInnerDocumentation", //$NON-NLS-1$
  						"getXBlockExpression()", //$NON-NLS-1$
  						adapter));
  				it.append("\t/** Add an expression inside the block."); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t * @return the expression builder."); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t */"); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t"); //$NON-NLS-1$
  				if (!forInterface) {
  					it.append("public "); //$NON-NLS-1$
  				}
  				it.append(getExpressionBuilderInterface());
  				it.append(" addExpression()"); //$NON-NLS-1$
  				if (forInterface) {
  					it.append(";"); //$NON-NLS-1$
  				} else {
  					it.append(" {"); //$NON-NLS-1$
  					it.newLine();
  					if (forAppender) {
  						it.append("\t\treturn this.builder.addExpression();"); //$NON-NLS-1$
  					} else {
  						it.append("\t\tfinal "); //$NON-NLS-1$
  						it.append(getExpressionBuilderInterface());
  						it.append(" builder = this.expressionProvider.get();"); //$NON-NLS-1$
  						it.newLine();
  						it.append("\t\tbuilder.eInit(getXBlockExpression(), new "); //$NON-NLS-1$
  						it.append(Procedures.class);
  						it.append(".Procedure1<"); //$NON-NLS-1$
  						it.append(XExpression.class);
  						it.append(">() {"); //$NON-NLS-1$
  						it.newLine();
  						it.append("\t\t\t\t\tprivate int index = -1;"); //$NON-NLS-1$
  						it.newLine();
  						it.append("\t\t\t\t\tpublic void apply("); //$NON-NLS-1$
  						it.append(XExpression.class);
  						it.append(" it) {"); //$NON-NLS-1$
  						it.newLine();
  						it.append("\t\t\t\t\t\tif (this.index >= 0) {"); //$NON-NLS-1$
  						it.newLine();
  						it.append("\t\t\t\t\t\t\tgetXBlockExpression().getExpressions().set(index, it);"); //$NON-NLS-1$
  						it.newLine();
  						it.append("\t\t\t\t\t\t} else {"); //$NON-NLS-1$
  						it.newLine();
  						it.append("\t\t\t\t\t\t\tgetXBlockExpression().getExpressions().add(it);"); //$NON-NLS-1$
  						it.newLine();
  						it.append("\t\t\t\t\t\t\tthis.index = getXBlockExpression().getExpressions().size() - 1;"); //$NON-NLS-1$
  						it.newLine();
  						it.append("\t\t\t\t\t\t}"); //$NON-NLS-1$
  						it.newLine();
  						it.append("\t\t\t\t\t}"); //$NON-NLS-1$
  						it.newLine();
  						it.append("\t\t\t\t}, getTypeResolutionContext());"); //$NON-NLS-1$
  						it.newLine();
  						it.append("\t\treturn builder;"); //$NON-NLS-1$
  					}
  					it.newLine();
  					it.append("\t}"); //$NON-NLS-1$
  				}
  				it.newLineIfNotEmpty();
  				it.newLine();
  				it.append("\t/** Fill the block with the standard \"auto-generated\" content."); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t * <p>Any previously added content is removed."); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t * @param type the expected type of the block (the last instruction), or"); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t    <code>null</code> for no type."); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t */"); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t"); //$NON-NLS-1$
  				if (!forInterface) {
  					it.append("public "); //$NON-NLS-1$
  				}
  				it.append("void setDefaultAutoGeneratedContent(String type)"); //$NON-NLS-1$
  				if (forInterface) {
  					it.append(";"); //$NON-NLS-1$
  				} else {
  					it.append(" {"); //$NON-NLS-1$
  					it.newLine();
  					if (forAppender) {
  						it.append("\t\tthis.builder.setDefaultAutoGeneratedContent(type);"); //$NON-NLS-1$
  					} else {
  						it.append("\t\tgetXBlockExpression().getExpressions().clear();"); //$NON-NLS-1$
  						it.newLine();
  						it.append("\t\tif ("); //$NON-NLS-1$
  						it.append(Strings.class);
  						it.append(".isEmpty(type)) {"); //$NON-NLS-1$
  						it.newLine();
  						it.append("\t\t\tsetInnerDocumentation(getAutoGeneratedActionString());"); //$NON-NLS-1$
  						it.newLine();
  						it.append("\t\t} else {"); //$NON-NLS-1$
  						it.newLine();
  						it.append("\t\t\t"); //$NON-NLS-1$
  						it.append(getExpressionBuilderInterface());
  						it.append(" expr = addExpression();"); //$NON-NLS-1$
  						it.newLine();
  						it.append("\t\t\tString defaultValue = expr.getDefaultValueForType(type);"); //$NON-NLS-1$
  						it.newLine();
  						it.append("\t\t\tif ("); //$NON-NLS-1$
  						it.append(Strings.class);
  						it.append(".isEmpty(defaultValue)) {"); //$NON-NLS-1$
  						it.newLine();
  						it.append("\t\t\t\tsetInnerDocumentation(getAutoGeneratedActionString());"); //$NON-NLS-1$
  						it.newLine();
  						it.append("\t\t\t} else {"); //$NON-NLS-1$
  						it.newLine();
  						it.append("\t\t\t\texpr.setExpression(defaultValue);"); //$NON-NLS-1$
  						it.newLine();
  						it.append("\t\t\t\texpr.setDocumentation(getAutoGeneratedActionString());"); //$NON-NLS-1$
  						it.newLine();
  						it.append("\t\t\t}"); //$NON-NLS-1$
  						it.newLine();
  						it.append("\t\t}"); //$NON-NLS-1$
  					}
  					it.newLine();
  					it.append("\t}"); //$NON-NLS-1$
  				}
  				it.newLineIfNotEmpty();
  				it.newLine();
  				if (!forInterface) {
  					it.append("\t@"); //$NON-NLS-1$
  					it.append(Override.class);
  					it.newLine();
  					it.append("\t@"); //$NON-NLS-1$
  					it.append(Pure.class);
  					it.newLine();
  					it.append("\tpublic "); //$NON-NLS-1$
  					it.append(String.class);
  					it.append(" toString() {"); //$NON-NLS-1$
  					it.newLine();
  					it.append("\t\treturn "); //$NON-NLS-1$
  					if (forAppender) {
  						it.append("this.builder.toString();"); //$NON-NLS-1$
  					} else {
  						it.append(EmfFormatter.class);
  						it.append(".objToStr(getXBlockExpression());"); //$NON-NLS-1$
  					}
  					it.newLine();
  					it.append("\t}"); //$NON-NLS-1$
  					it.newLineIfNotEmpty();
  					it.newLine();
  				}
  				if (forInterface) {
  					it.append("\t/** Dispose the resource."); //$NON-NLS-1$
  					it.newLine();
  					it.append("\t */"); //$NON-NLS-1$
  					it.newLine();
  					it.append("\tvoid dispose();"); //$NON-NLS-1$
  					it.newLineIfNotEmpty();
  					it.newLine();
  				} else if (forAppender) {
  					it.append("\t/** Dispose the resource."); //$NON-NLS-1$
  					it.newLine();
  					it.append("\t */"); //$NON-NLS-1$
  					it.newLine();
  					it.append("\tpublic void dispose() {"); //$NON-NLS-1$
  					it.newLine();
  					it.append("\t\tthis.builder.dispose();"); //$NON-NLS-1$
  					it.newLine();
  					it.append("\t}"); //$NON-NLS-1$
  					it.newLineIfNotEmpty();
  					it.newLine();
  				}
  			}
  		};
  	}