docs: @SuppressWarnings("checkstyle:all")
  	protected void generateEcoreDocumentationSyntacticSequencer() {
  		final TypeReference sequencer = getSyntacticSequencer();
  		final TypeReference customSequencer = getEcoreDocumentationSyntacticSequencer();
  		final TypeReference innerBlockComment = getCodeElementExtractor().getInnerBlockDocumentationAdapter();
  		final TypeReference keywordAccessor = getCodeElementExtractor().getLanguageKeywordAccessor();
  		StringConcatenationClient content = new StringConcatenationClient() {
  			@Override
  			protected void appendTo(TargetStringConcatenation it) {
  				it.append("/** Syntactic sequencer which supports documentations of Ecore elements."); //$NON-NLS-1$
  				it.newLine();
  				it.append(" */"); //$NON-NLS-1$
  				it.newLine();
  				it.append("public class "); //$NON-NLS-1$
  				it.append(customSequencer.getSimpleName());
  				it.append(" extends "); //$NON-NLS-1$
  				it.append(sequencer);
  				it.append(" {"); //$NON-NLS-1$
  				it.newLineIfNotEmpty();
  				it.newLine();
  				it.append("\tprivate final "); //$NON-NLS-1$
  				it.append(Set.class);
  				it.append("<"); //$NON-NLS-1$
  				it.append(EObject.class);
  				it.append("> documentedSemanticObjects = new "); //$NON-NLS-1$
  				it.append(HashSet.class);
  				it.append("<>();"); //$NON-NLS-1$
  				it.newLineIfNotEmpty();
  				it.newLine();
  				it.append("\tprivate final "); //$NON-NLS-1$
  				it.append(Set.class);
  				it.append("<"); //$NON-NLS-1$
  				it.append(EObject.class);
  				it.append("> indocumentedSemanticObjects = new "); //$NON-NLS-1$
  				it.append(HashSet.class);
  				it.append("<>();"); //$NON-NLS-1$
  				it.newLineIfNotEmpty();
  				it.newLine();
  				it.append("\tprivate "); //$NON-NLS-1$
  				it.append(innerBlockComment);
  				it.append(" lastInnerBlock;"); //$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(getIEcoreDocumentationBuilder());
  				it.append(" documentationBuilder;"); //$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(keywordAccessor);
  				it.append(" keywords;"); //$NON-NLS-1$
  				it.newLineIfNotEmpty();
  				it.newLine();
  				it.append("\tprivate "); //$NON-NLS-1$
  				it.append(ISequenceAcceptor.class);
  				it.append(" trailingSequenceAcceptor;"); //$NON-NLS-1$
  				it.newLineIfNotEmpty();
  				it.newLine();
  				it.append("\tpublic void init("); //$NON-NLS-1$
  				it.append(ISerializationContext.class);
  				it.append(" context, "); //$NON-NLS-1$
  				it.append(EObject.class);
  				it.append(" semanticObject,"); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t\t\t\t"); //$NON-NLS-1$
  				it.append(ISyntacticSequenceAcceptor.class);
  				it.append(" sequenceAcceptor, "); //$NON-NLS-1$
  				it.append(Acceptor.class);
  				it.append(" errorAcceptor) {"); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t\tsuper.init(context, semanticObject, sequenceAcceptor, errorAcceptor);"); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t\tif (sequenceAcceptor instanceof "); //$NON-NLS-1$
  				it.append(ISequenceAcceptor.class);
  				it.append(") {"); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t\t\tthis.trailingSequenceAcceptor = ("); //$NON-NLS-1$
  				it.append(ISequenceAcceptor.class);
  				it.append(") sequenceAcceptor;"); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t\t}"); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t\tthis.documentedSemanticObjects.clear();"); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t\tthis.indocumentedSemanticObjects.clear();"); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t\tthis.lastInnerBlock = null;"); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t}"); //$NON-NLS-1$
  				it.newLineIfNotEmpty();
  				it.newLine();
  				it.append("\tprotected "); //$NON-NLS-1$
  				it.append(ISequenceAcceptor.class);
  				it.append(" getTrailingSequenceAcceptor() {"); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t\tif (this.trailingSequenceAcceptor == null) {"); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t\t\ttry {"); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t\t\t\t"); //$NON-NLS-1$
  				it.append(Field.class);
  				it.append(" delegateField = "); //$NON-NLS-1$
  				it.append(HiddenTokenSequencer.class);
  				it.append(".class.getDeclaredField(\"delegate\");"); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t\t\t\tdelegateField.setAccessible(true);"); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t\t\t\tthis.trailingSequenceAcceptor = ("); //$NON-NLS-1$
  				it.append(ISequenceAcceptor.class);
  				it.append(") delegateField.get(this.delegate);"); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t\t\t} catch (Throwable exception) {"); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t\t\t\tthrow new RuntimeException(exception);"); //$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\treturn this.trailingSequenceAcceptor;"); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t}"); //$NON-NLS-1$
  				it.newLineIfNotEmpty();
  				it.newLine();
  				it.append("\tprotected void emitDocumentation(Class<?> semanticObjectType, String comment) {"); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t\tfinal String fmtcomment = this.documentationBuilder.build(comment, semanticObjectType);"); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t\tif (!"); //$NON-NLS-1$
  				it.append(Strings.class);
  				it.append(".isEmpty(fmtcomment)) {"); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t\t\tfinal "); //$NON-NLS-1$
  				it.append(AbstractRule.class);
  				it.append(" rule = this.documentationBuilder.isMultilineCommentFor(semanticObjectType) ? this.documentationBuilder.getMLCommentRule() : this.documentationBuilder.getSLCommentRule();"); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t\t\tgetTrailingSequenceAcceptor().acceptComment(rule, fmtcomment, null);"); //$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("\tprotected void emitDocumentation("); //$NON-NLS-1$
  				it.append(EObject.class);
  				it.append(" semanticObject) {"); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t\tif (this.documentedSemanticObjects.add(semanticObject)) {"); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t\t\t"); //$NON-NLS-1$
  				it.append(DocumentationAdapter.class);
  				it.append(" documentationAdapter = ("); //$NON-NLS-1$
  				it.append(DocumentationAdapter.class);
  				it.append(") "); //$NON-NLS-1$
  				it.append(EcoreUtil.class);
  				it.append(".getAdapter(semanticObject.eAdapters(), "); //$NON-NLS-1$
  				it.append(DocumentationAdapter.class);
  				it.append(".class);"); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t\t\tif (documentationAdapter != null) {"); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t\t\t\temitDocumentation(semanticObject.getClass(), documentationAdapter.getDocumentation());"); //$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();
  				it.append("\tprotected void emitInnerDocumentation("); //$NON-NLS-1$
  				it.append(EObject.class);
  				it.append(" semanticObject) {"); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t\tif (this.indocumentedSemanticObjects.add(semanticObject)) {"); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t\t\t"); //$NON-NLS-1$
  				it.append(innerBlockComment);
  				it.append(" documentationAdapter = ("); //$NON-NLS-1$
  				it.append(innerBlockComment);
  				it.append(") "); //$NON-NLS-1$
  				it.append(EcoreUtil.class);
  				it.append(".getAdapter(semanticObject.eAdapters(), "); //$NON-NLS-1$
  				it.append(innerBlockComment);
  				it.append(".class);"); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t\t\tif (documentationAdapter != null) {"); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t\t\t\temitDocumentation(semanticObject.getClass(), documentationAdapter.getDocumentation());"); //$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();
  				it.append("\tprivate "); //$NON-NLS-1$
  				it.append(innerBlockComment);
  				it.append(" getInnerDocumentation(EObject semanticObject) {"); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t\tif (this.indocumentedSemanticObjects.add(semanticObject)) {"); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t\t\treturn ("); //$NON-NLS-1$
  				it.append(innerBlockComment);
  				it.append(") EcoreUtil.getAdapter(semanticObject.eAdapters(), "); //$NON-NLS-1$
  				it.append(innerBlockComment);
  				it.append(".class);"); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t\t}"); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t\treturn null;"); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t}"); //$NON-NLS-1$
  				it.newLineIfNotEmpty();
  				it.newLine();
  				it.append("\tprotected void emitUnassignedTokens("); //$NON-NLS-1$
  				it.append(EObject.class);
  				it.append(" semanticObject, "); //$NON-NLS-1$
  				it.append(ISynTransition.class);
  				it.append(" transition,"); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t\t\t\t"); //$NON-NLS-1$
  				it.append(INode.class);
  				it.append(" fromNode, "); //$NON-NLS-1$
  				it.append(INode.class);
  				it.append(" toNode) {"); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t\tsuper.emitUnassignedTokens(semanticObject, transition, fromNode, toNode);"); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t\temitDocumentation(semanticObject);"); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t\tif (semanticObject instanceof "); //$NON-NLS-1$
  				it.append(XBlockExpression.class);
  				it.append(") {"); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t\t\tthis.lastInnerBlock = getInnerDocumentation(semanticObject);"); //$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("\tprotected void accept("); //$NON-NLS-1$
  				it.append(ISynState.class);
  				it.append(" emitter, "); //$NON-NLS-1$
  				it.append(INode.class);
  				it.append(" node, "); //$NON-NLS-1$
  				it.append(RuleCallStack.class);
  				it.append(" stack) {"); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t\tsuper.accept(emitter, node, stack);"); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t\tfinal "); //$NON-NLS-1$
  				it.append(innerBlockComment);
  				it.append(" documentation = this.lastInnerBlock;"); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t\tif (documentation != null && emitter.getType() == "); //$NON-NLS-1$
  				it.append(SynStateType.class);
  				it.append(".UNASSIGEND_KEYWORD) {"); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t\t\t"); //$NON-NLS-1$
  				it.append(Keyword.class);
  				it.append(" keyword = ("); //$NON-NLS-1$
  				it.append(Keyword.class);
  				it.append(") emitter.getGrammarElement();"); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t\t\tString token = node != null ? node.getText() : keyword.getValue();"); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t\t\tif ("); //$NON-NLS-1$
  				it.append(Strings.class);
  				it.append(".equal(token, this.keywords.getLeftCurlyBracketKeyword())) {"); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t\t\t\tthis.lastInnerBlock = null;"); //$NON-NLS-1$
  				it.newLine();
  				it.append("\t\t\t\temitDocumentation(documentation.getTarget().getClass(), documentation.getDocumentation());"); //$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();
  				it.append("}"); //$NON-NLS-1$
  				it.newLineIfNotEmpty();
  				it.newLine();
  			}
  
  		};
  		JavaFileAccess createJavaFile = getFileAccessFactory().createJavaFile(customSequencer, content);
  		createJavaFile.writeTo(getSrcGen());
  	}