960 staticArgs = staticArgs.append(LoadableConstant.Int(bridges.length() - 1));
961 for (Symbol s : bridges) {
962 Type s_erasure = s.erasure(types);
963 if (!types.isSameType(s_erasure, samSym.erasure(types))) {
964 staticArgs = staticArgs.append(((MethodType)s.erasure(types)));
965 }
966 }
967 }
968 if (isSerializable) {
969 int prevPos = make.pos;
970 try {
971 make.at(kInfo.clazz);
972 addDeserializationCase(refSym, tree.type, samSym, samType,
973 tree, staticArgs, indyType);
974 } finally {
975 make.at(prevPos);
976 }
977 }
978 }
979
980 return makeIndyCall(tree, syms.lambdaMetafactory, metafactoryName, staticArgs, indyType, indy_args, samSym.name);
981 }
982
983 /**
984 * Generate an indy method call with given name, type and static bootstrap
985 * arguments types
986 */
987 private JCExpression makeIndyCall(DiagnosticPosition pos, Type site, Name bsmName,
988 List<LoadableConstant> staticArgs, MethodType indyType, List<JCExpression> indyArgs,
989 Name methName) {
990 int prevPos = make.pos;
991 try {
992 make.at(pos);
993 List<Type> bsm_staticArgs = List.of(syms.methodHandleLookupType,
994 syms.stringType,
995 syms.methodTypeType).appendList(staticArgs.map(types::constantType));
996
997 MethodSymbol bsm = rs.resolveInternalMethod(pos, attrEnv, site,
998 bsmName, bsm_staticArgs, List.nil());
999
1000 DynamicMethodSymbol dynSym =
|
960 staticArgs = staticArgs.append(LoadableConstant.Int(bridges.length() - 1));
961 for (Symbol s : bridges) {
962 Type s_erasure = s.erasure(types);
963 if (!types.isSameType(s_erasure, samSym.erasure(types))) {
964 staticArgs = staticArgs.append(((MethodType)s.erasure(types)));
965 }
966 }
967 }
968 if (isSerializable) {
969 int prevPos = make.pos;
970 try {
971 make.at(kInfo.clazz);
972 addDeserializationCase(refSym, tree.type, samSym, samType,
973 tree, staticArgs, indyType);
974 } finally {
975 make.at(prevPos);
976 }
977 }
978 }
979
980 Name lambdaName = samSym.name;
981 if (tree.codeReflectionInfo != null) {
982 lambdaName = lambdaName
983 .append(names.fromString("="))
984 .append(tree.codeReflectionInfo.codeModel().name);
985 }
986 Type lambdaMetafactory = tree.codeReflectionInfo != null ?
987 tree.codeReflectionInfo.reflectableLambdaMetafactory() : syms.lambdaMetafactory;
988 return makeIndyCall(tree, lambdaMetafactory, metafactoryName, staticArgs, indyType, indy_args, lambdaName);
989 }
990
991 /**
992 * Generate an indy method call with given name, type and static bootstrap
993 * arguments types
994 */
995 private JCExpression makeIndyCall(DiagnosticPosition pos, Type site, Name bsmName,
996 List<LoadableConstant> staticArgs, MethodType indyType, List<JCExpression> indyArgs,
997 Name methName) {
998 int prevPos = make.pos;
999 try {
1000 make.at(pos);
1001 List<Type> bsm_staticArgs = List.of(syms.methodHandleLookupType,
1002 syms.stringType,
1003 syms.methodTypeType).appendList(staticArgs.map(types::constantType));
1004
1005 MethodSymbol bsm = rs.resolveInternalMethod(pos, attrEnv, site,
1006 bsmName, bsm_staticArgs, List.nil());
1007
1008 DynamicMethodSymbol dynSym =
|