docs: public final EObject ruleJvmTypeParameter() throws RecognitionException {
          EObject current = null;
  
          AntlrDatatypeRuleToken lv_name_0_0 = null;
  
          EObject lv_constraints_1_0 = null;
  
          EObject lv_constraints_2_0 = null;
  
  
  
          	enterRule();
  
          try {
              // InternalSARL.g:16575:2: ( ( ( (lv_name_0_0= ruleValidID ) ) ( ( (lv_constraints_1_0= ruleJvmUpperBound ) ) ( (lv_constraints_2_0= ruleJvmUpperBoundAnded ) )* )? ) )
              // InternalSARL.g:16576:2: ( ( (lv_name_0_0= ruleValidID ) ) ( ( (lv_constraints_1_0= ruleJvmUpperBound ) ) ( (lv_constraints_2_0= ruleJvmUpperBoundAnded ) )* )? )
              {
              // InternalSARL.g:16576:2: ( ( (lv_name_0_0= ruleValidID ) ) ( ( (lv_constraints_1_0= ruleJvmUpperBound ) ) ( (lv_constraints_2_0= ruleJvmUpperBoundAnded ) )* )? )
              // InternalSARL.g:16577:3: ( (lv_name_0_0= ruleValidID ) ) ( ( (lv_constraints_1_0= ruleJvmUpperBound ) ) ( (lv_constraints_2_0= ruleJvmUpperBoundAnded ) )* )?
              {
              // InternalSARL.g:16577:3: ( (lv_name_0_0= ruleValidID ) )
              // InternalSARL.g:16578:4: (lv_name_0_0= ruleValidID )
              {
              // InternalSARL.g:16578:4: (lv_name_0_0= ruleValidID )
              // InternalSARL.g:16579:5: lv_name_0_0= ruleValidID
              {
              if ( state.backtracking==0 ) {
  
                					newCompositeNode(grammarAccess.getJvmTypeParameterAccess().getNameValidIDParserRuleCall_0_0());
                				
              }
              pushFollow(FOLLOW_155);
              lv_name_0_0=ruleValidID();
  
              state._fsp--;
              if (state.failed) return current;
              if ( state.backtracking==0 ) {
  
                					if (current==null) {
                						current = createModelElementForParent(grammarAccess.getJvmTypeParameterRule());
                					}
                					set(
                						current,
                						"name",
                						lv_name_0_0,
                						"org.eclipse.xtend.core.Xtend.ValidID");
                					afterParserOrEnumRuleCall();
                				
              }
  
              }
  
  
              }
  
              // InternalSARL.g:16596:3: ( ( (lv_constraints_1_0= ruleJvmUpperBound ) ) ( (lv_constraints_2_0= ruleJvmUpperBoundAnded ) )* )?
              int alt380=2;
              int LA380_0 = input.LA(1);
  
              if ( (LA380_0==28) ) {
                  alt380=1;
              }
              switch (alt380) {
                  case 1 :
                      // InternalSARL.g:16597:4: ( (lv_constraints_1_0= ruleJvmUpperBound ) ) ( (lv_constraints_2_0= ruleJvmUpperBoundAnded ) )*
                      {
                      // InternalSARL.g:16597:4: ( (lv_constraints_1_0= ruleJvmUpperBound ) )
                      // InternalSARL.g:16598:5: (lv_constraints_1_0= ruleJvmUpperBound )
                      {
                      // InternalSARL.g:16598:5: (lv_constraints_1_0= ruleJvmUpperBound )
                      // InternalSARL.g:16599:6: lv_constraints_1_0= ruleJvmUpperBound
                      {
                      if ( state.backtracking==0 ) {
  
                        						newCompositeNode(grammarAccess.getJvmTypeParameterAccess().getConstraintsJvmUpperBoundParserRuleCall_1_0_0());
                        					
                      }
                      pushFollow(FOLLOW_154);
                      lv_constraints_1_0=ruleJvmUpperBound();
  
                      state._fsp--;
                      if (state.failed) return current;
                      if ( state.backtracking==0 ) {
  
                        						if (current==null) {
                        							current = createModelElementForParent(grammarAccess.getJvmTypeParameterRule());
                        						}
                        						add(
                        							current,
                        							"constraints",
                        							lv_constraints_1_0,
                        							"org.eclipse.xtext.xbase.Xtype.JvmUpperBound");
                        						afterParserOrEnumRuleCall();
                        					
                      }
  
                      }
  
  
                      }
  
                      // InternalSARL.g:16616:4: ( (lv_constraints_2_0= ruleJvmUpperBoundAnded ) )*
                      loop379:
                      do {
                          int alt379=2;
                          int LA379_0 = input.LA(1);
  
                          if ( (LA379_0==144) ) {
                              alt379=1;
                          }
  
  
                          switch (alt379) {
                      	case 1 :
                      	    // InternalSARL.g:16617:5: (lv_constraints_2_0= ruleJvmUpperBoundAnded )
                      	    {
                      	    // InternalSARL.g:16617:5: (lv_constraints_2_0= ruleJvmUpperBoundAnded )
                      	    // InternalSARL.g:16618:6: lv_constraints_2_0= ruleJvmUpperBoundAnded
                      	    {
                      	    if ( state.backtracking==0 ) {
  
                      	      						newCompositeNode(grammarAccess.getJvmTypeParameterAccess().getConstraintsJvmUpperBoundAndedParserRuleCall_1_1_0());
                      	      					
                      	    }
                      	    pushFollow(FOLLOW_154);
                      	    lv_constraints_2_0=ruleJvmUpperBoundAnded();
  
                      	    state._fsp--;
                      	    if (state.failed) return current;
                      	    if ( state.backtracking==0 ) {
  
                      	      						if (current==null) {
                      	      							current = createModelElementForParent(grammarAccess.getJvmTypeParameterRule());
                      	      						}
                      	      						add(
                      	      							current,
                      	      							"constraints",
                      	      							lv_constraints_2_0,
                      	      							"org.eclipse.xtext.xbase.Xtype.JvmUpperBoundAnded");
                      	      						afterParserOrEnumRuleCall();
                      	      					
                      	    }
  
                      	    }
  
  
                      	    }
                      	    break;
  
                      	default :
                      	    break loop379;
                          }
                      } while (true);
  
  
                      }
                      break;
  
              }
  
  
              }
  
  
              }
  
              if ( state.backtracking==0 ) {
  
                	leaveRule();
  
              }
          }
  
              catch (RecognitionException re) {
                  recover(input,re);
                  appendSkippedTokens();
              }
          finally {
          }
          return current;
      }