docs: @SuppressWarnings("checkstyle:all")
  	protected StringConcatenationClient generateMembers(boolean forInterface, boolean forAppender) {
  		final CodeElementExtractor.ElementDescription parameter = getCodeElementExtractor().getFormalParameter();
  		final FormalParameterDescription exparameter = new FormalParameterDescription(parameter,
  				findAssignmentFromFeatureName(parameter.getGrammarComponent(),
  						getCodeBuilderConfig().getParameterDefaultValueGrammarName()));
  		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(Provider.class);
  					it.append("<"); //$NON-NLS-1$
  					it.append(getExpressionBuilderInterface());
  					it.append("> expressionProvider;"); //$NON-NLS-1$
  					it.newLineIfNotEmpty();
  					it.newLine();
  					it.append("\tprivate "); //$NON-NLS-1$
  					it.append(getCodeElementExtractor().getFormalParameterContainerType());
  					it.append(" context;"); //$NON-NLS-1$
  					it.newLineIfNotEmpty();
  					it.newLine();
  					it.append("\tprivate "); //$NON-NLS-1$
  					it.append(parameter.getElementType());
  					it.append(" parameter;"); //$NON-NLS-1$
  					it.newLineIfNotEmpty();
  					it.newLine();
  					it.append("\tprivate "); //$NON-NLS-1$
  					it.append(getExpressionBuilderInterface());
  					it.append(" defaultValue;"); //$NON-NLS-1$
  					it.newLineIfNotEmpty();
  					it.newLine();
  					it.append("\t@"); //$NON-NLS-1$
  					it.append(Inject.class);
  					it.newLine();
  					it.append("\t\tprivate "); //$NON-NLS-1$
  					it.append(TypesFactory.class);
  					it.append(" jvmTypesFactory;"); //$NON-NLS-1$
  					it.newLineIfNotEmpty();
  					it.newLine();
  					it.append("\t@"); //$NON-NLS-1$
  					it.append(Inject.class);
  					it.newLine();
  					it.append(" private "); //$NON-NLS-1$
  					it.append(IFragmentProvider.class);
  					it.append(" fragmentProvider;"); //$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/** Initialize the formal parameter."); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t * @param context the context of the formal parameter."); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t * @param name the name of the formal parameter."); //$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(getCodeElementExtractor().getFormalParameterContainerType());
  				it.append(" context, String name, "); //$NON-NLS-1$
  				it.append(IJvmTypeProvider.class);
  				it.append(" typeContext)"); //$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, name, typeContext);"); //$NON-NLS-1$
  					} else {
  						it.append("\t\tsetTypeResolutionContext(typeContext);"); //$NON-NLS-1$
  						it.newLine();
  						it.append("\t\tthis.context = context;"); //$NON-NLS-1$
  						it.newLine();
  						it.append("\t\t\tthis.parameter = "); //$NON-NLS-1$
  						it.append(getXFactoryFor(parameter.getElementType()));
  						it.append(".eINSTANCE.create"); //$NON-NLS-1$
  						it.append(Strings.toFirstUpper(parameter.getElementType().getSimpleName()));
  						it.append("();"); //$NON-NLS-1$
  						it.newLine();
  						it.append("\t\t\tthis.parameter.set"); //$NON-NLS-1$
  						it.append(Strings.toFirstUpper(getCodeBuilderConfig().getParameterNameGrammarName()));
  						it.append("(name);"); //$NON-NLS-1$
  						it.newLine();
  						it.append("\t\t\tthis.parameter.set"); //$NON-NLS-1$
  						it.append(Strings.toFirstUpper(getCodeBuilderConfig().getParameterTypeGrammarName()));
  						it.append("(newTypeRef(this.context, Object.class.getName()));"); //$NON-NLS-1$
  						it.newLine();
  						it.append("\t\t\tthis.context.get"); //$NON-NLS-1$
  						it.append(Strings.toFirstUpper(getCodeBuilderConfig().getParameterListGrammarName()));
  						it.append("().add(this.parameter);"); //$NON-NLS-1$
  					}
  					it.newLine();
  					it.append("\t}"); //$NON-NLS-1$
  				}
  				it.newLineIfNotEmpty();
  				it.newLine();
  				it.append("\t/** Replies the created parameter."); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t *"); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t * @return the parameter."); //$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(parameter.getElementType());
  				it.append(" get"); //$NON-NLS-1$
  				it.append(Strings.toFirstUpper(parameter.getElementType().getSimpleName()));
  				it.append("()"); //$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.get"); //$NON-NLS-1$
  						it.append(Strings.toFirstUpper(parameter.getElementType().getSimpleName()));
  						it.append("();"); //$NON-NLS-1$
  					} else {
  						it.append("\t\treturn this.parameter;"); //$NON-NLS-1$
  					}
  					it.newLine();
  					it.append("\t}"); //$NON-NLS-1$
  				}
  				it.newLineIfNotEmpty();
  				it.newLine();
  				it.append("\t/** Replies the JvmIdentifiable that corresponds to the formal parameter."); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t *"); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t * @param container the feature call that is supposed to contains the replied identifiable element."); //$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 setReferenceInto("); //$NON-NLS-1$
  				it.append(XFeatureCall.class);
  				it.append(" container) "); //$NON-NLS-1$
  				if (forInterface) {
  					it.append(";"); //$NON-NLS-1$
  				} else {
  					it.append("{"); //$NON-NLS-1$
  					it.newLine();
  					it.append("\t\t"); //$NON-NLS-1$
  					if (forAppender) {
  						it.append("this.builder.setReferenceInto(container);"); //$NON-NLS-1$
  					} else {
  						it.append(JvmVoid.class);
  						it.append(" jvmVoid = this.jvmTypesFactory.createJvmVoid();"); //$NON-NLS-1$
  						it.newLine();
  						it.append("\t\tif (jvmVoid instanceof "); //$NON-NLS-1$
  						it.append(InternalEObject.class);
  						it.append(") {"); //$NON-NLS-1$
  						it.newLine();
  						it.append("\t\t\tfinal "); //$NON-NLS-1$
  						it.append(InternalEObject.class);
  						it.append("\t\t\tjvmVoidProxy = ("); //$NON-NLS-1$
  						it.append(InternalEObject.class);
  						it.append(") jvmVoid;"); //$NON-NLS-1$
  						it.newLine();
  						it.append("\t\t\tfinal "); //$NON-NLS-1$
  						it.append(EObject.class);
  						it.append(" param = getSarlFormalParameter();"); //$NON-NLS-1$
  						it.newLine();
  						it.append("\t\t\tfinal "); //$NON-NLS-1$
  						it.append(Resource.class);
  						it.append(" resource = param.eResource();"); //$NON-NLS-1$
  						it.newLine();
  						it.append("\t\t\t// Get the derived object"); //$NON-NLS-1$
  						it.newLine();
  						it.append("\t\t\tfinal "); //$NON-NLS-1$
  						it.append(parameter.getElementType());
  						it.append(" jvmParam = getAssociatedElement("); //$NON-NLS-1$
  						it.append(parameter.getElementType());
  						it.append(".class, param, resource);"); //$NON-NLS-1$
  						it.newLine();
  						it.append("\t\t\t// Set the proxy URI"); //$NON-NLS-1$
  						it.newLine();
  						it.append("\t\t\tfinal "); //$NON-NLS-1$
  						it.append(URI.class);
  						it.append(" uri = "); //$NON-NLS-1$
  						it.append(EcoreUtil2.class);
  						it.append(".getNormalizedURI(jvmParam);"); //$NON-NLS-1$
  						it.newLine();
  						it.append("\t\t\tjvmVoidProxy.eSetProxyURI(uri);"); //$NON-NLS-1$
  						it.newLine();
  						it.append("\t\t}"); //$NON-NLS-1$
  						it.newLine();
  						it.append("\t\tcontainer.setFeature(jvmVoid);"); //$NON-NLS-1$
  					}
  					it.newLine();
  					it.append("\t}"); //$NON-NLS-1$
  				}
  				it.newLineIfNotEmpty();
  				it.newLine();
  				it.append("\t/** Replies the resource to which the formal parameter 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 get"); //$NON-NLS-1$
  					it.append(Strings.toFirstUpper(parameter.getElementType().getSimpleName()));
  					it.append("().eResource();"); //$NON-NLS-1$
  					it.newLine();
  					it.append("\t}"); //$NON-NLS-1$
  				}
  				it.newLineIfNotEmpty();
  				it.newLine();
  				it.append("\t/** Change the type."); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t *"); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t * @param type the formal parameter 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 set"); //$NON-NLS-1$
  				it.append(Strings.toFirstUpper(getCodeBuilderConfig().getParameterTypeGrammarName()));
  				it.append("(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.set"); //$NON-NLS-1$
  						it.append(Strings.toFirstUpper(getCodeBuilderConfig().getParameterTypeGrammarName()));
  						it.append("(type);"); //$NON-NLS-1$
  					} else {
  						it.append("\t\tString typeName;"); //$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\ttypeName = Object.class.getName();"); //$NON-NLS-1$
  						it.newLine();
  						it.append("\t\t} else {"); //$NON-NLS-1$
  						it.newLine();
  						it.append("\t\t\ttypeName = type;"); //$NON-NLS-1$
  						it.newLine();
  						it.append("\t\t}"); //$NON-NLS-1$
  						it.newLine();
  						it.append("\t\tthis.parameter.set"); //$NON-NLS-1$
  						it.append(Strings.toFirstUpper(getCodeBuilderConfig().getParameterTypeGrammarName()));
  						it.append("(newTypeRef(this.context, typeName));"); //$NON-NLS-1$
  					}
  					it.newLine();
  					it.append("\t}"); //$NON-NLS-1$
  				}
  				it.newLineIfNotEmpty();
  				it.newLine();
  				if (!Strings.isEmpty(getCodeBuilderConfig().getParameterVarArgGrammarName())) {
  					it.append("\t/** Change the variadic property of the parameter."); //$NON-NLS-1$
  					it.newLine();
  					it.append("\t *"); //$NON-NLS-1$
  					it.newLine();
  					it.append("\t * @param isVariadic indicates if the parameter is variadic."); //$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 set"); //$NON-NLS-1$
  					it.append(Strings.toFirstUpper(getCodeBuilderConfig().getParameterVarArgGrammarName()));
  					it.append("(boolean isVariadic)"); //$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.set"); //$NON-NLS-1$
  						} else {
  							it.append("\t\tthis.parameter.set"); //$NON-NLS-1$
  						}
  						it.append(Strings.toFirstUpper(getCodeBuilderConfig().getParameterVarArgGrammarName()));
  						it.append("(isVariadic);"); //$NON-NLS-1$
  						it.newLine();
  						it.append("\t}"); //$NON-NLS-1$
  					}
  					it.newLineIfNotEmpty();
  					it.newLine();
  				}
  				if (exparameter.getDefaultValueAssignment() != null) {
  					it.append("\t/** Replies the default value of the parameter."); //$NON-NLS-1$
  					it.newLine();
  					it.append("\t * @return the default value builder."); //$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(getExpressionBuilderInterface());
  					final String accessor = "get" //$NON-NLS-1$
  							+ Strings.toFirstUpper(getCodeBuilderConfig().getParameterDefaultValueGrammarName())
  							+ "()"; //$NON-NLS-1$
  					it.append(" "); //$NON-NLS-1$
  					it.append(accessor);
  					if (forInterface) {
  						it.append(";"); //$NON-NLS-1$
  					} else {
  						it.append(" {"); //$NON-NLS-1$
  						it.newLine();
  						if (forAppender) {
  							it.append("\t\treturn this.builder.get"); //$NON-NLS-1$
  							it.append(Strings.toFirstUpper(getCodeBuilderConfig().getParameterDefaultValueGrammarName()));
  							it.append("();"); //$NON-NLS-1$
  						} else {
  							it.append("\t\tif (this.defaultValue == null) {"); //$NON-NLS-1$
  							it.newLine();
  							it.append("\t\t\tthis.defaultValue = this.expressionProvider.get();"); //$NON-NLS-1$
  							it.newLine();
  							it.append("\t\t\tthis.defaultValue.eInit(this.parameter, 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\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\tget"); //$NON-NLS-1$
  							it.append(Strings.toFirstUpper(parameter.getElementType().getSimpleName()));
  							it.append("().set"); //$NON-NLS-1$
  							it.append(Strings.toFirstUpper(getCodeBuilderConfig().getParameterDefaultValueGrammarName()));
  							it.append("(it);"); //$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\t}"); //$NON-NLS-1$
  							it.newLine();
  							it.append("\t\treturn this.defaultValue;"); //$NON-NLS-1$
  						}
  						it.newLine();
  						it.append("\t}"); //$NON-NLS-1$
  					}
  					it.newLineIfNotEmpty();
  					it.newLine();
  					if (!forAppender && !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("); //$NON-NLS-1$
  							it.append(accessor);
  							it.append(");"); //$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();
  				}
  			}
  		};
  	}