public static void body(SNode concept, final SNodeTextGen textGen) {
   boolean needNewLine = false;
   if ((SLinkOperations.getTarget(concept, "instanceInitializer", true) != null)) {
     TextGenManager.instance()
         .appendNodeText(
             textGen.getContext(),
             textGen.getBuffer(),
             SLinkOperations.getTarget(concept, "instanceInitializer", true),
             textGen.getSNode());
     needNewLine = true;
   }
   if (ListSequence.fromList(SLinkOperations.getTargets(concept, "staticField", true))
       .isNotEmpty()) {
     BaseClassConceptTextGen.collection(
         SLinkOperations.getTargets(concept, "staticField", true), textGen);
     needNewLine = true;
   }
   if (ListSequence.fromList(SLinkOperations.getTargets(concept, "field", true)).isNotEmpty()) {
     BaseClassConceptTextGen.collection(
         SLinkOperations.getTargets(concept, "field", true), textGen);
     needNewLine = true;
   }
   if (ListSequence.fromList(SLinkOperations.getTargets(concept, "constructor", true))
       .isNotEmpty()) {
     for (SNode constructor : SLinkOperations.getTargets(concept, "constructor", true)) {
       TextGenManager.instance()
           .appendNodeText(
               textGen.getContext(), textGen.getBuffer(), constructor, textGen.getSNode());
       textGen.appendNewLine();
     }
     needNewLine = true;
   }
   if (ListSequence.fromList(SLinkOperations.getTargets(concept, "method", true)).isNotEmpty()) {
     if (ListSequence.fromList(SLinkOperations.getTargets(concept, "method", true)).isNotEmpty()) {
       for (SNode item : SLinkOperations.getTargets(concept, "method", true)) {
         TextGenManager.instance()
             .appendNodeText(textGen.getContext(), textGen.getBuffer(), item, textGen.getSNode());
       }
     }
     needNewLine = true;
   }
   if (ListSequence.fromList(SLinkOperations.getTargets(concept, "staticMethod", true))
       .isNotEmpty()) {
     if (ListSequence.fromList(SLinkOperations.getTargets(concept, "staticMethod", true))
         .isNotEmpty()) {
       for (SNode item : SLinkOperations.getTargets(concept, "staticMethod", true)) {
         TextGenManager.instance()
             .appendNodeText(textGen.getContext(), textGen.getBuffer(), item, textGen.getSNode());
       }
     }
     needNewLine = true;
   }
   if (ListSequence.fromList(SLinkOperations.getTargets(concept, "staticInnerClassifiers", true))
       .isNotEmpty()) {
     textGen.appendNewLine();
     BaseClassConceptTextGen.innerClassifiers(concept, textGen);
     needNewLine = true;
   }
   if ((SLinkOperations.getTarget(concept, "staticInitializer", true) != null)) {
     BaseLanguageTextGen.newLine(needNewLine, textGen);
     textGen.appendWithIndent("static {");
     textGen.increaseDepth();
     TextGenManager.instance()
         .appendNodeText(
             textGen.getContext(),
             textGen.getBuffer(),
             SLinkOperations.getTarget(concept, "staticInitializer", true),
             textGen.getSNode());
     textGen.appendNewLine();
     textGen.decreaseDepth();
     textGen.appendWithIndent("}");
     textGen.appendNewLine();
     needNewLine = true;
   }
   if ((SLinkOperations.getTarget(concept, "classInitializer", true) != null)) {
     BaseLanguageTextGen.newLine(needNewLine, textGen);
     textGen.appendWithIndent("static {");
     textGen.increaseDepth();
     TextGenManager.instance()
         .appendNodeText(
             textGen.getContext(),
             textGen.getBuffer(),
             SLinkOperations.getTarget(
                 SLinkOperations.getTarget(concept, "classInitializer", true),
                 "statementList",
                 true),
             textGen.getSNode());
     textGen.appendNewLine();
     textGen.decreaseDepth();
     textGen.appendWithIndent("}");
     textGen.appendNewLine();
   }
 }
 public void doGenerateText(SNode node) {
   if (getBuffer().hasPositionsSupport()) {
     TraceInfoGenerationUtil.createUnitInfo(this, node);
   }
   if ((AttributeOperations.getAttribute(
           node,
           new IAttributeDescriptor.NodeAttribute(
               "jetbrains.mps.baseLanguage.javadoc.structure.ClassifierDocComment"))
       != null)) {
     appendNode(
         AttributeOperations.getAttribute(
             node,
             new IAttributeDescriptor.NodeAttribute(
                 "jetbrains.mps.baseLanguage.javadoc.structure.ClassifierDocComment")));
   }
   BaseLanguageTextGen.fileHeader(node, this);
   BaseLanguageTextGen.annotations(node, this);
   BaseLanguageTextGen.visibilityWithIndent(
       SLinkOperations.getTarget(node, "visibility", true), this);
   if (Classifier_Behavior.call_isInner_521412098689998677(node)
       && BehaviorReflection.invokeVirtual(
           Boolean.TYPE, node, "virtual_isStatic_7405920559687241224", new Object[] {})) {
     this.append("static ");
   }
   if (SPropertyOperations.getBoolean(node, "abstractClass")) {
     this.append("abstract ");
   }
   if (SPropertyOperations.getBoolean(node, "isFinal")) {
     this.append("final ");
   }
   this.append("class ");
   this.append(SPropertyOperations.getString(node, "name"));
   GenericDeclarationTextGen2.typeDeclarations(node, this);
   if ((SLinkOperations.getTarget(node, "superclass", true) != null)) {
     this.append(" extends ");
     appendNode(SLinkOperations.getTarget(node, "superclass", true));
   }
   if (ListSequence.fromList(SLinkOperations.getTargets(node, "implementedInterface", true))
       .isNotEmpty()) {
     this.append(" implements ");
     {
       Iterable<SNode> collection = SLinkOperations.getTargets(node, "implementedInterface", true);
       final SNode lastItem = Sequence.fromIterable(collection).last();
       for (SNode item : collection) {
         appendNode(item);
         if (item != lastItem) {
           append(", ");
         }
       }
     }
   }
   this.append(" ");
   BaseClassConceptTextGen.membersWithBrackets(node, true, this);
   this.appendNewLine();
   if (getBuffer().hasPositionsSupport()) {
     {
       String unitName = null;
       try {
         unitName =
             BehaviorReflection.invokeVirtual(
                 String.class,
                 SNodeOperations.cast(node, "jetbrains.mps.lang.traceable.structure.UnitConcept"),
                 "virtual_getUnitName_5067982036267369911",
                 new Object[] {});
       } catch (Throwable t) {
         if (LOG.isEnabledFor(Level.ERROR)) {
           LOG.error("Can't calculate unit name for a node " + node + ".", t);
         }
       }
       TraceInfoGenerationUtil.fillUnitInfo(this, node, unitName);
     }
   }
 }