private JCExpression makeMetafactoryIndyCall ( TranslationContext < ? > context , int refKind , Symbol refSym , List < JCExpression > indy_args ) { JCFunctionalExpression tree = context . tree ; //determine the static bsm args MethodSymbol samSym = ( MethodSymbol ) types . findDescriptorSymbol ( tree . type . tsym ) ; List < Object > staticArgs = List . < Object > of ( typeToMethodType ( samSym . type ) , new Pool . MethodHandle ( refKind , refSym , types ) , typeToMethodType ( tree . getDescriptorType ( types ) ) ) ; //computed indy arg types ListBuffer < Type > indy_args_types = new ListBuffer <> ( ) ; for ( JCExpression arg : indy_args ) { indy_args_types . append ( arg . type ) ; } //finally, compute the type of the indy call MethodType indyType = new MethodType ( indy_args_types . toList ( ) , tree . type , List . < Type > nil ( ) , syms . methodClass ) ; Name metafactoryName = context . needsAltMetafactory ( ) ? names . altMetafactory : names . metafactory ; if ( context . needsAltMetafactory ( ) ) { ListBuffer < Object > markers = new ListBuffer <> ( ) ; for ( Type t : tree . targets . tail ) { if ( t . tsym != syms . serializableType . tsym ) { markers . append ( t . tsym ) ; } } int flags = context . isSerializable ( ) ? FLAG_SERIALIZABLE : 0 ; boolean hasMarkers = markers . nonEmpty ( ) ; boolean hasBridges = context . bridges . nonEmpty ( ) ; if ( hasMarkers ) { flags |= FLAG_MARKERS ; } if ( hasBridges ) { flags |= FLAG_BRIDGES ; } staticArgs = staticArgs . append ( flags ) ; if ( hasMarkers ) { staticArgs = staticArgs . append ( markers . length ( ) ) ; staticArgs = staticArgs . appendList ( markers . toList ( ) ) ; } if ( hasBridges ) { staticArgs = staticArgs . append ( context . bridges . length ( ) - 1 ) ; for ( Symbol s : context . bridges ) { Type s_erasure = s . erasure ( types ) ; if ( ! types . isSameType ( s_erasure , samSym . erasure ( types ) ) ) { staticArgs = staticArgs . append ( s . erasure ( types ) ) ; } } } if ( context . isSerializable ( ) ) { int prevPos = make . pos ; try { make . at ( kInfo . clazz ) ; addDeserializationCase ( refKind , refSym , tree . type , samSym , tree , staticArgs , indyType ) ; } finally { make . at ( prevPos ) ; } } } return makeIndyCall ( tree , syms . lambdaMetafactory , metafactoryName , staticArgs , indyType , indy_args , samSym . name ) ; }
Generate an indy method call to the meta factory