docs: public TypeDeclarationDescr typeDeclaration( DeclareDescrBuilder ddb, boolean isTrait ) throws RecognitionException {
          TypeDeclarationDescrBuilder declare = null;
          try {
              declare = helper.start( ddb,
                                      TypeDeclarationDescrBuilder.class,
                                      null );
  
              declare.setTrait(isTrait);
              
              if( helper.validateIdentifierKey( DroolsSoftKeywords.TYPE ) ) {
                  // 'type'
                  match( input,
                         DRL5Lexer.ID,
                         DroolsSoftKeywords.TYPE,
                         null,
                         DroolsEditorType.KEYWORD );
                  if ( state.failed ) return null;
              }
  
              // type may be qualified when adding metadata
              String type = qualifiedIdentifier();
              if ( state.failed ) return null;
              if ( state.backtracking == 0 ) declare.name( type );
  
              if ( helper.validateIdentifierKey( DroolsSoftKeywords.EXTENDS ) ) {
                  match( input,
                         DRL5Lexer.ID,
                         DroolsSoftKeywords.EXTENDS,
                         null,
                         DroolsEditorType.KEYWORD );
                  if ( !state.failed ) {
                      // Going for type includes generics, which is a no-no (JIRA-3040)
                      String superType = qualifiedIdentifier();
                      declare.superType( superType );
  
                      while ( input.LA( 1 ) == DRL5Lexer.COMMA ) {
  
                          match( input,
                                  DRL5Lexer.COMMA,
                                  null,
                                  null,
                                  DroolsEditorType.SYMBOL );
  
                          superType = qualifiedIdentifier();
                          declare.superType( superType );
                      }
                  }
              }
  
              while ( input.LA( 1 ) == DRL5Lexer.AT ) {
                  // annotation*
                  annotation( declare );
                  if ( state.failed ) return null;
              }
  
              //boolean qualified = type.indexOf( '.' ) >= 0;
              while ( //! qualified &&
              input.LA( 1 ) == DRL5Lexer.ID && !helper.validateIdentifierKey( DroolsSoftKeywords.END ) ) {
                  // field*
                  field( declare );
                  if ( state.failed ) return null;
              }
  
              match( input,
                     DRL5Lexer.ID,
                     DroolsSoftKeywords.END,
                     null,
                     DroolsEditorType.KEYWORD );
              if ( state.failed ) return null;
  
          } catch ( RecognitionException re ) {
              reportError( re );
          } finally {
              helper.end( TypeDeclarationDescrBuilder.class,
                          declare );
          }
          return (declare != null) ? declare.getDescr() : null;
      }