docs: public final EObject ruleXFunctionSuperTypeRef() throws RecognitionException {
          EObject current = null;
  
          Token lv_instanceContext_0_0=null;
          Token otherlv_2=null;
          Token otherlv_4=null;
          Token otherlv_5=null;
          EObject lv_paramTypes_1_0 = null;
  
          EObject lv_paramTypes_3_0 = null;
  
          EObject lv_returnType_6_0 = null;
  
  
  
          	enterRule();
  
          try {
              // InternalSARL.g:9094:2: ( ( ( ( (lv_instanceContext_0_0= '(' ) ) ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')' )? otherlv_5= '=>' ( (lv_returnType_6_0= ruleJvmTypeReference ) ) ) )
              // InternalSARL.g:9095:2: ( ( ( (lv_instanceContext_0_0= '(' ) ) ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')' )? otherlv_5= '=>' ( (lv_returnType_6_0= ruleJvmTypeReference ) ) )
              {
              // InternalSARL.g:9095:2: ( ( ( (lv_instanceContext_0_0= '(' ) ) ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')' )? otherlv_5= '=>' ( (lv_returnType_6_0= ruleJvmTypeReference ) ) )
              // InternalSARL.g:9096:3: ( ( (lv_instanceContext_0_0= '(' ) ) ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')' )? otherlv_5= '=>' ( (lv_returnType_6_0= ruleJvmTypeReference ) )
              {
              // InternalSARL.g:9096:3: ( ( (lv_instanceContext_0_0= '(' ) ) ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')' )?
              int alt242=2;
              int LA242_0 = input.LA(1);
  
              if ( (LA242_0==49) ) {
                  alt242=1;
              }
              switch (alt242) {
                  case 1 :
                      // InternalSARL.g:9097:4: ( (lv_instanceContext_0_0= '(' ) ) ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')'
                      {
                      // InternalSARL.g:9097:4: ( (lv_instanceContext_0_0= '(' ) )
                      // InternalSARL.g:9098:5: (lv_instanceContext_0_0= '(' )
                      {
                      // InternalSARL.g:9098:5: (lv_instanceContext_0_0= '(' )
                      // InternalSARL.g:9099:6: lv_instanceContext_0_0= '('
                      {
                      lv_instanceContext_0_0=(Token)match(input,49,FOLLOW_87); if (state.failed) return current;
                      if ( state.backtracking==0 ) {
  
                        						newLeafNode(lv_instanceContext_0_0, grammarAccess.getXFunctionSuperTypeRefAccess().getInstanceContextLeftParenthesisKeyword_0_0_0());
                        					
                      }
                      if ( state.backtracking==0 ) {
  
                        						if (current==null) {
                        							current = createModelElement(grammarAccess.getXFunctionSuperTypeRefRule());
                        						}
                        						setWithLastConsumed(current, "instanceContext", true, "(");
                        					
                      }
  
                      }
  
  
                      }
  
                      // InternalSARL.g:9111:4: ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )?
                      int alt241=2;
                      int LA241_0 = input.LA(1);
  
                      if ( (LA241_0==RULE_ID||LA241_0==44||LA241_0==49||LA241_0==76||(LA241_0>=92 && LA241_0<=95)) ) {
                          alt241=1;
                      }
                      switch (alt241) {
                          case 1 :
                              // InternalSARL.g:9112:5: ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )*
                              {
                              // InternalSARL.g:9112:5: ( (lv_paramTypes_1_0= ruleJvmTypeReference ) )
                              // InternalSARL.g:9113:6: (lv_paramTypes_1_0= ruleJvmTypeReference )
                              {
                              // InternalSARL.g:9113:6: (lv_paramTypes_1_0= ruleJvmTypeReference )
                              // InternalSARL.g:9114:7: lv_paramTypes_1_0= ruleJvmTypeReference
                              {
                              if ( state.backtracking==0 ) {
  
                                							newCompositeNode(grammarAccess.getXFunctionSuperTypeRefAccess().getParamTypesJvmTypeReferenceParserRuleCall_0_1_0_0());
                                						
                              }
                              pushFollow(FOLLOW_51);
                              lv_paramTypes_1_0=ruleJvmTypeReference();
  
                              state._fsp--;
                              if (state.failed) return current;
                              if ( state.backtracking==0 ) {
  
                                							if (current==null) {
                                								current = createModelElementForParent(grammarAccess.getXFunctionSuperTypeRefRule());
                                							}
                                							add(
                                								current,
                                								"paramTypes",
                                								lv_paramTypes_1_0,
                                								"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
                                							afterParserOrEnumRuleCall();
                                						
                              }
  
                              }
  
  
                              }
  
                              // InternalSARL.g:9131:5: (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )*
                              loop240:
                              do {
                                  int alt240=2;
                                  int LA240_0 = input.LA(1);
  
                                  if ( (LA240_0==32) ) {
                                      alt240=1;
                                  }
  
  
                                  switch (alt240) {
                              	case 1 :
                              	    // InternalSARL.g:9132:6: otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) )
                              	    {
                              	    otherlv_2=(Token)match(input,32,FOLLOW_41); if (state.failed) return current;
                              	    if ( state.backtracking==0 ) {
  
                              	      						newLeafNode(otherlv_2, grammarAccess.getXFunctionSuperTypeRefAccess().getCommaKeyword_0_1_1_0());
                              	      					
                              	    }
                              	    // InternalSARL.g:9136:6: ( (lv_paramTypes_3_0= ruleJvmTypeReference ) )
                              	    // InternalSARL.g:9137:7: (lv_paramTypes_3_0= ruleJvmTypeReference )
                              	    {
                              	    // InternalSARL.g:9137:7: (lv_paramTypes_3_0= ruleJvmTypeReference )
                              	    // InternalSARL.g:9138:8: lv_paramTypes_3_0= ruleJvmTypeReference
                              	    {
                              	    if ( state.backtracking==0 ) {
  
                              	      								newCompositeNode(grammarAccess.getXFunctionSuperTypeRefAccess().getParamTypesJvmTypeReferenceParserRuleCall_0_1_1_1_0());
                              	      							
                              	    }
                              	    pushFollow(FOLLOW_51);
                              	    lv_paramTypes_3_0=ruleJvmTypeReference();
  
                              	    state._fsp--;
                              	    if (state.failed) return current;
                              	    if ( state.backtracking==0 ) {
  
                              	      								if (current==null) {
                              	      									current = createModelElementForParent(grammarAccess.getXFunctionSuperTypeRefRule());
                              	      								}
                              	      								add(
                              	      									current,
                              	      									"paramTypes",
                              	      									lv_paramTypes_3_0,
                              	      									"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
                              	      								afterParserOrEnumRuleCall();
                              	      							
                              	    }
  
                              	    }
  
  
                              	    }
  
  
                              	    }
                              	    break;
  
                              	default :
                              	    break loop240;
                                  }
                              } while (true);
  
  
                              }
                              break;
  
                      }
  
                      otherlv_4=(Token)match(input,50,FOLLOW_88); if (state.failed) return current;
                      if ( state.backtracking==0 ) {
  
                        				newLeafNode(otherlv_4, grammarAccess.getXFunctionSuperTypeRefAccess().getRightParenthesisKeyword_0_2());
                        			
                      }
  
                      }
                      break;
  
              }
  
              otherlv_5=(Token)match(input,76,FOLLOW_41); if (state.failed) return current;
              if ( state.backtracking==0 ) {
  
                			newLeafNode(otherlv_5, grammarAccess.getXFunctionSuperTypeRefAccess().getEqualsSignGreaterThanSignKeyword_1());
                		
              }
              // InternalSARL.g:9166:3: ( (lv_returnType_6_0= ruleJvmTypeReference ) )
              // InternalSARL.g:9167:4: (lv_returnType_6_0= ruleJvmTypeReference )
              {
              // InternalSARL.g:9167:4: (lv_returnType_6_0= ruleJvmTypeReference )
              // InternalSARL.g:9168:5: lv_returnType_6_0= ruleJvmTypeReference
              {
              if ( state.backtracking==0 ) {
  
                					newCompositeNode(grammarAccess.getXFunctionSuperTypeRefAccess().getReturnTypeJvmTypeReferenceParserRuleCall_2_0());
                				
              }
              pushFollow(FOLLOW_2);
              lv_returnType_6_0=ruleJvmTypeReference();
  
              state._fsp--;
              if (state.failed) return current;
              if ( state.backtracking==0 ) {
  
                					if (current==null) {
                						current = createModelElementForParent(grammarAccess.getXFunctionSuperTypeRefRule());
                					}
                					set(
                						current,
                						"returnType",
                						lv_returnType_6_0,
                						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
                					afterParserOrEnumRuleCall();
                				
              }
  
              }
  
  
              }
  
  
              }
  
  
              }
  
              if ( state.backtracking==0 ) {
  
                	leaveRule();
  
              }
          }
  
              catch (RecognitionException re) {
                  recover(input,re);
                  appendSkippedTokens();
              }
          finally {
          }
          return current;
      }