com.sun.tools.javac.tree.JCTree.JCFunctionalExpression Java Examples

The following examples show how to use com.sun.tools.javac.tree.JCTree.JCFunctionalExpression. You can vote up the ones you like or vote down the ones you don't like, and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example #1
Source File: TreeConverter.java    From j2objc with Apache License 2.0 6 votes vote down vote up
private TreeNode convertFunctionalExpression(
    JCFunctionalExpression node, TreePath parent, FunctionalExpression newNode) {
  List<? extends TypeMirror> targets = getTargets(node, parent);
  for (TypeMirror type : targets) {
    newNode.addTargetType(type);
  }
  Types types =
      Types.instance(((com.sun.tools.javac.api.BasicJavacTask) env.task()).getContext());
  return newNode
      .setTypeMirror(targets.iterator().next())
      .setDescriptor(
          new ExecutablePair(
              (ExecutableElement) types
                  .findDescriptorSymbol(((com.sun.tools.javac.code.Type) targets.get(0)).tsym),
              (ExecutableType) node.getDescriptorType(types)));
}
 
Example #2
Source File: TreeConverter.java    From j2objc with Apache License 2.0 5 votes vote down vote up
private List<? extends TypeMirror> getTargets(JCFunctionalExpression node, TreePath parent) {
  try {
    @SuppressWarnings("unchecked")
    com.sun.tools.javac.util.List<com.sun.tools.javac.code.Type> result =
        (com.sun.tools.javac.util.List<com.sun.tools.javac.code.Type>)
            JCFunctionalExpression.class.getField("targets").get(node);
    return result;
  } catch (ReflectiveOperationException e) {
    // continue below
  }
  // In earlier versions, the TypeMirror just contained the first type of an intersection type.
  // That's why, the field "targets" is used above. This issue is fixed in JDK 11.
  TypeMirror t = getTypeMirror(getTreePath(parent, node));
  return newUnit.getEnv().typeUtil().getUpperBounds(t);
}
 
Example #3
Source File: TreeConverter.java    From j2objc with Apache License 2.0 5 votes vote down vote up
private TreeNode convertLambda(LambdaExpressionTree node, TreePath parent) {
  TreePath path = getTreePath(parent, node);
  LambdaExpression newNode = new LambdaExpression();
  convertFunctionalExpression((JCFunctionalExpression) node, parent, newNode);
  for (VariableTree param : node.getParameters()) {
    newNode.addParameter((VariableDeclaration) convert(param, path));
  }
  return newNode.setBody(convert(node.getBody(), path));
}
 
Example #4
Source File: LambdaToMethod.java    From lua-for-android with BSD 3-Clause "New" or "Revised" License 4 votes vote down vote up
/**
 * Generate an indy method call to the meta factory
 */
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.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.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);
}
 
Example #5
Source File: CompilationUnitBuilder.java    From j2cl with Apache License 2.0 4 votes vote down vote up
private TypeDescriptor getTargetType(JCFunctionalExpression expression) {
  return environment.createTypeDescriptor(expression.type);
}