docs: public final EObject ruleJvmTypeReference() throws RecognitionException {
          EObject current = null;
  
          EObject this_JvmParameterizedTypeReference_0 = null;
  
          EObject this_XFunctionTypeRef_3 = null;
  
  
  
          	enterRule();
  
          try {
              // InternalSARL.g:15881:2: ( ( (this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )* ) | this_XFunctionTypeRef_3= ruleXFunctionTypeRef ) )
              // InternalSARL.g:15882:2: ( (this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )* ) | this_XFunctionTypeRef_3= ruleXFunctionTypeRef )
              {
              // InternalSARL.g:15882:2: ( (this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )* ) | this_XFunctionTypeRef_3= ruleXFunctionTypeRef )
              int alt366=2;
              int LA366_0 = input.LA(1);
  
              if ( (LA366_0==RULE_ID||LA366_0==44||(LA366_0>=92 && LA366_0<=95)) ) {
                  alt366=1;
              }
              else if ( (LA366_0==49||LA366_0==76) ) {
                  alt366=2;
              }
              else {
                  if (state.backtracking>0) {state.failed=true; return current;}
                  NoViableAltException nvae =
                      new NoViableAltException("", 366, 0, input);
  
                  throw nvae;
              }
              switch (alt366) {
                  case 1 :
                      // InternalSARL.g:15883:3: (this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )* )
                      {
                      // InternalSARL.g:15883:3: (this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )* )
                      // InternalSARL.g:15884:4: this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )*
                      {
                      if ( state.backtracking==0 ) {
  
                        				newCompositeNode(grammarAccess.getJvmTypeReferenceAccess().getJvmParameterizedTypeReferenceParserRuleCall_0_0());
                        			
                      }
                      pushFollow(FOLLOW_89);
                      this_JvmParameterizedTypeReference_0=ruleJvmParameterizedTypeReference();
  
                      state._fsp--;
                      if (state.failed) return current;
                      if ( state.backtracking==0 ) {
  
                        				current = this_JvmParameterizedTypeReference_0;
                        				afterParserOrEnumRuleCall();
                        			
                      }
                      // InternalSARL.g:15892:4: ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )*
                      loop365:
                      do {
                          int alt365=2;
                          int LA365_0 = input.LA(1);
  
                          if ( (LA365_0==55) ) {
                              int LA365_2 = input.LA(2);
  
                              if ( (LA365_2==56) ) {
                                  int LA365_3 = input.LA(3);
  
                                  if ( (synpred61_InternalSARL()) ) {
                                      alt365=1;
                                  }
  
  
                              }
  
  
                          }
  
  
                          switch (alt365) {
                      	case 1 :
                      	    // InternalSARL.g:15893:5: ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets )
                      	    {
                      	    // InternalSARL.g:15899:5: ( () ruleArrayBrackets )
                      	    // InternalSARL.g:15900:6: () ruleArrayBrackets
                      	    {
                      	    // InternalSARL.g:15900:6: ()
                      	    // InternalSARL.g:15901:7: 
                      	    {
                      	    if ( state.backtracking==0 ) {
  
                      	      							current = forceCreateModelElementAndSet(
                      	      								grammarAccess.getJvmTypeReferenceAccess().getJvmGenericArrayTypeReferenceComponentTypeAction_0_1_0_0(),
                      	      								current);
                      	      						
                      	    }
  
                      	    }
  
                      	    if ( state.backtracking==0 ) {
  
                      	      						newCompositeNode(grammarAccess.getJvmTypeReferenceAccess().getArrayBracketsParserRuleCall_0_1_0_1());
                      	      					
                      	    }
                      	    pushFollow(FOLLOW_89);
                      	    ruleArrayBrackets();
  
                      	    state._fsp--;
                      	    if (state.failed) return current;
                      	    if ( state.backtracking==0 ) {
  
                      	      						afterParserOrEnumRuleCall();
                      	      					
                      	    }
  
                      	    }
  
  
                      	    }
                      	    break;
  
                      	default :
                      	    break loop365;
                          }
                      } while (true);
  
  
                      }
  
  
                      }
                      break;
                  case 2 :
                      // InternalSARL.g:15918:3: this_XFunctionTypeRef_3= ruleXFunctionTypeRef
                      {
                      if ( state.backtracking==0 ) {
  
                        			newCompositeNode(grammarAccess.getJvmTypeReferenceAccess().getXFunctionTypeRefParserRuleCall_1());
                        		
                      }
                      pushFollow(FOLLOW_2);
                      this_XFunctionTypeRef_3=ruleXFunctionTypeRef();
  
                      state._fsp--;
                      if (state.failed) return current;
                      if ( state.backtracking==0 ) {
  
                        			current = this_XFunctionTypeRef_3;
                        			afterParserOrEnumRuleCall();
                        		
                      }
  
                      }
                      break;
  
              }
  
  
              }
  
              if ( state.backtracking==0 ) {
  
                	leaveRule();
  
              }
          }
  
              catch (RecognitionException re) {
                  recover(input,re);
                  appendSkippedTokens();
              }
          finally {
          }
          return current;
      }