Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8312632

parsers.newParser("test0.Tests.aMethod(a -> {});", false, false, false).parseStatement() reports error

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Cannot Reproduce
    • Icon: P4 P4
    • None
    • 17
    • tools
    • generic
    • generic

      ADDITIONAL SYSTEM INFORMATION :
      Windows 11 22H2 x64. / Oracle OpenJDK version 17.0.2 / Eclipse Temurin version 17.0.7
      Build with gradle depending on com.google.auto.service:auto-service:1.0.1 and com.github.Anuken.Arc:arc-core:v145.1


      A DESCRIPTION OF THE PROBLEM :
      我使用com.sun.tools.javac里的工具[ com.sun.tools.javac.parser.ParserFactory#newParser(java.lang.CharSequence, boolean, boolean, boolean) ]解析Lambda(有参数)时有问题

      REGRESSION : Last worked in version 17.0.7

      STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
      使用了@AutoService({Processor.class}),然后像这样parsers.newParser("test0.Tests.aMethod(a -> {});", false, false, false).parseStatement()解析,就会报错

      EXPECTED VERSUS ACTUAL BEHAVIOR :
      EXPECTED -
      成功解析lambda,没有报错
      ACTUAL -
      一旦有lambda的解析,就会报错

      ---------- BEGIN SOURCE ----------
      // ----------------TestProcessor-------------
      package modtools.annotations;

      import com.google.auto.service.AutoService;
      import com.sun.source.util.Trees;
      import com.sun.tools.javac.api.JavacTrees;
      import com.sun.tools.javac.parser.*;
      import com.sun.tools.javac.processing.JavacProcessingEnvironment;
      import com.sun.tools.javac.tree.JCTree;
      import com.sun.tools.javac.tree.JCTree.*;
      import com.sun.tools.javac.util.Context;
      import modtools.annotations.all.TestAnn;

      import javax.annotation.processing.*;
      import javax.lang.model.SourceVersion;
      import javax.lang.model.element.*;
      import java.util.Set;
      import java.util.function.Predicate;

      @AutoService({Processor.class})
      public class TestProcessor extends AbstractProcessor {
      public void dealElement(Element element) {
      JCClassDecl classDecl = (JCClassDecl) trees.getTree(element);
      JCMethodDecl methodDecl = findChild(classDecl, Tag.METHODDEF,
      m -> m.name.toString().equals("m2"));
      methodDecl.body.stats = methodDecl.body.stats.append(
      parsers.newParser("Tools.aMethod(a -> {});",
      false, false, false).parseStatement());
      }
      public Set<String> getSupportedAnnotationTypes() {
      return Set.of(TestAnn.class.getCanonicalName());
      }
      public Trees trees;
      public ParserFactory parsers;
      private boolean finished;
      public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
      if (finished) return true;
      finished = true;
      for (TypeElement annotation : annotations) {
      for (Element element : roundEnv.getElementsAnnotatedWith(annotation)) {
      dealElement(element);
      }
      }
      return true;
      }
      public synchronized void init(ProcessingEnvironment env) {
      super.init(env);

      Context context = ((JavacProcessingEnvironment) processingEnv).getContext();
      trees = JavacTrees.instance(context);
      parsers = ParserFactory.instance(context);
      }
      public <T> T findChild(JCClassDecl parent, Tag tag, Predicate<T> predicate) {
      for (JCTree def : parent.defs) {
      if (def.getTag() == tag && predicate.test((T) def)) {
      return (T) def;
      }
      }
      return null;
      }

      public final SourceVersion getSupportedSourceVersion() {
      return SourceVersion.latestSupported();
      }
      }

      // -----------Tests-----------------
      package test0;

      import modtools.annotations.all.TestAnn;

      @TestAnn
      public class Tests {
      public static void aMethod(AInterface aInterface) {}
      public static void m2() {};
      public interface AInterface {
      void get(Object o);
      }
      }

      ---------- END SOURCE ----------

      CUSTOMER SUBMITTED WORKAROUND :
      I don't have one.

      FREQUENCY : occasionally


            adev Anupam Dev
            webbuggrp Webbug Group
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

              Created:
              Updated:
              Resolved: