-
Bug
-
Resolution: Cannot Reproduce
-
P4
-
None
-
17
-
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
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