Skip to content

Commit be16769

Browse files
authored
Merge pull request #5 from lahodaj/JDK-8224922-3
Adding tests for unnamed module/package and automatic modules.
2 parents 1f5e548 + 9ca744b commit be16769

File tree

2 files changed

+281
-4
lines changed

2 files changed

+281
-4
lines changed

src/jdk.compiler/share/classes/com/sun/tools/javac/model/JavacElements.java

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -732,17 +732,22 @@ public JavaFileObject getFileObjectOf(Element e) {
732732
Symbol sym = (Symbol) e;
733733
return switch(sym.kind) {
734734
case PCK -> {
735-
if (((PackageSymbol) sym).package_info == null) {
735+
PackageSymbol psym = (PackageSymbol) sym;
736+
if (psym.package_info == null) {
736737
yield null;
737738
}
738-
yield ((PackageSymbol) sym).package_info.classfile;
739+
yield psym.package_info.classfile;
739740
}
741+
740742
case MDL -> {
741743
ModuleSymbol msym = (ModuleSymbol) sym;
744+
if (msym.module_info == null) {
745+
yield null;
746+
}
742747
yield msym.module_info.classfile;
743748
}
744-
case TYP -> ((ClassSymbol) sym).classfile;
745-
default -> sym.enclClass().classfile;
749+
case TYP -> ((ClassSymbol) sym).outermostClass().classfile;
750+
default -> sym.outermostClass().classfile;
746751
};
747752
}
748753

test/langtools/tools/javac/processing/model/element/TestFileObjectOf.java

Lines changed: 272 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
import com.sun.source.util.TreePathScanner;
5252
import com.sun.source.util.Trees;
5353
import javax.tools.JavaFileObject;
54+
import toolbox.JarTask;
5455
import toolbox.JavacTask;
5556
import toolbox.Task;
5657
import toolbox.TestRunner;
@@ -321,4 +322,275 @@ public SourceVersion getSupportedSourceVersion() {
321322

322323
}
323324

325+
@Test
326+
public void testUnnamed(Path base) throws Exception {
327+
Path src = base.resolve("src");
328+
tb.writeJavaFiles(src,
329+
"""
330+
public class TestClass {
331+
}
332+
""");
333+
Path classes = base.resolve("classes");
334+
tb.createDirectories(classes);
335+
336+
//from source, implicit:
337+
{
338+
String testClassSource = src.resolve("TestClass.java").toUri().toString();
339+
340+
List<String> log;
341+
342+
log = new JavacTask(tb)
343+
.options("-Xpkginfo:always",
344+
"-classpath", "",
345+
"-processorpath", System.getProperty("test.classes"),
346+
"-processor", UnnamedPrintFiles.class.getName(),
347+
"-sourcepath", src.toString())
348+
.outdir(classes)
349+
.classes("java.lang.Object")
350+
.run()
351+
.writeAll()
352+
.getOutputLines(Task.OutputKind.STDOUT);
353+
354+
List<String> expected = List.of(
355+
": " + "<null>",
356+
": " + "<null>",
357+
"TestClass: " + testClassSource,
358+
"<init>: " + testClassSource
359+
);
360+
361+
if (!expected.equals(log))
362+
throw new AssertionError("expected output not found: " + log);
363+
}
364+
365+
tb.cleanDirectory(classes);
366+
367+
//from source, explicit:
368+
{
369+
String testClassSource = src.resolve("TestClass.java").toUri().toString();
370+
371+
List<String> log;
372+
373+
log = new JavacTask(tb)
374+
.options("-Xpkginfo:always",
375+
"-classpath", "",
376+
"-processorpath", System.getProperty("test.classes"),
377+
"-processor", UnnamedPrintFiles.class.getName())
378+
.outdir(classes)
379+
.files(tb.findJavaFiles(src))
380+
.run()
381+
.writeAll()
382+
.getOutputLines(Task.OutputKind.STDOUT);
383+
384+
List<String> expected = List.of(
385+
": " + "<null>",
386+
": " + "<null>",
387+
"TestClass: " + testClassSource,
388+
"<init>: " + testClassSource
389+
);
390+
391+
if (!expected.equals(log))
392+
throw new AssertionError("expected output not found: " + log);
393+
}
394+
395+
//from class:
396+
{
397+
String testClassSource = classes.resolve("TestClass.class").toUri().toString();
398+
399+
List<String> log;
400+
401+
log = new JavacTask(tb)
402+
.options("-processorpath", System.getProperty("test.classes"),
403+
"-processor", UnnamedPrintFiles.class.getName(),
404+
"-classpath", classes.toString())
405+
.outdir(classes)
406+
.classes("java.lang.Object")
407+
.run()
408+
.writeAll()
409+
.getOutputLines(Task.OutputKind.STDOUT);
410+
411+
List<String> expected = List.of(
412+
": " + "<null>",
413+
": " + "<null>",
414+
"TestClass: " + testClassSource,
415+
"<init>: " + testClassSource
416+
);
417+
418+
if (!expected.equals(log))
419+
throw new AssertionError("expected output not found: " + log);
420+
}
421+
}
422+
423+
@SupportedAnnotationTypes("*")
424+
@SupportedOptions("fromClass")
425+
public static final class UnnamedPrintFiles extends AbstractProcessor {
426+
427+
@Override
428+
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
429+
if (!roundEnv.processingOver())
430+
return false;
431+
432+
Elements elements = processingEnv.getElementUtils();
433+
Trees trees = Trees.instance(processingEnv);
434+
Queue<Element> q = new ArrayDeque<>();
435+
q.add(elements.getModuleElement(""));
436+
437+
while (!q.isEmpty()) {
438+
Element currentElement = q.remove();
439+
440+
handleDeclaration(currentElement);
441+
442+
switch (currentElement.getKind()) {
443+
case METHOD -> {
444+
ExecutableElement method = (ExecutableElement) currentElement;
445+
TreePath tp = trees.getPath(method);
446+
if (tp != null) {
447+
new TreePathScanner<>() {
448+
@Override
449+
public Object visitVariable(VariableTree node, Object p) {
450+
Element el = trees.getElement(getCurrentPath());
451+
handleDeclaration(el);
452+
return super.visitVariable(node, p);
453+
}
454+
}.scan(tp, null);
455+
}
456+
}
457+
case MODULE -> {
458+
q.add(elements.getPackageElement(""));
459+
}
460+
default ->
461+
currentElement.getEnclosedElements()
462+
.stream()
463+
.sorted((e1, e2) -> e1.getSimpleName().toString().compareTo(e2.getSimpleName().toString()))
464+
.forEach(q::add);
465+
}
466+
}
467+
468+
return false;
469+
}
470+
471+
void handleDeclaration(Element el) {
472+
Elements elements = processingEnv.getElementUtils();
473+
JavaFileObject fileObjects = elements.getFileObjectOf(el);
474+
System.out.println(el.getSimpleName() + ": " + (fileObjects != null ? fileObjects.toUri().toString() : "<null>"));
475+
}
476+
477+
@Override
478+
public SourceVersion getSupportedSourceVersion() {
479+
return SourceVersion.latestSupported();
480+
}
481+
482+
}
483+
484+
@Test
485+
public void testAutomaticModule(Path base) throws Exception {
486+
Path src = base.resolve("src");
487+
tb.writeJavaFiles(src,
488+
"""
489+
package test;
490+
public class TestClass {
491+
}
492+
""");
493+
Path classes = base.resolve("classes");
494+
tb.createDirectories(classes);
495+
496+
Path module = base.resolve("m.jar");
497+
498+
new JavacTask(tb)
499+
.options("-classpath", "")
500+
.outdir(classes)
501+
.files(tb.findJavaFiles(src))
502+
.run()
503+
.writeAll();
504+
new JarTask(tb, module)
505+
.baseDir(classes)
506+
.files(".")
507+
.run();
508+
509+
String testClassSource = "jar:file://" + module.toAbsolutePath().toString() + "!/test/TestClass.class";
510+
511+
List<String> log;
512+
513+
log = new JavacTask(tb)
514+
.options("-processorpath", System.getProperty("test.classes"),
515+
"-processor", AutomaticModulePrintFiles.class.getName(),
516+
"--module-path", module.toString(),
517+
"--add-modules", "m")
518+
.outdir(classes)
519+
.classes("java.lang.Object")
520+
.run()
521+
.writeAll()
522+
.getOutputLines(Task.OutputKind.STDOUT);
523+
524+
List<String> expected = List.of(
525+
"m: " + "<null>",
526+
"test: " + "<null>",
527+
"TestClass: " + testClassSource,
528+
"<init>: " + testClassSource
529+
);
530+
531+
if (!expected.equals(log))
532+
throw new AssertionError("expected output not found: " + log);
533+
}
534+
535+
@SupportedAnnotationTypes("*")
536+
@SupportedOptions("fromClass")
537+
public static final class AutomaticModulePrintFiles extends AbstractProcessor {
538+
539+
@Override
540+
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
541+
if (!roundEnv.processingOver())
542+
return false;
543+
544+
Elements elements = processingEnv.getElementUtils();
545+
Trees trees = Trees.instance(processingEnv);
546+
Queue<Element> q = new ArrayDeque<>();
547+
q.add(elements.getModuleElement("m"));
548+
549+
while (!q.isEmpty()) {
550+
Element currentElement = q.remove();
551+
552+
handleDeclaration(currentElement);
553+
554+
switch (currentElement.getKind()) {
555+
case METHOD -> {
556+
ExecutableElement method = (ExecutableElement) currentElement;
557+
TreePath tp = trees.getPath(method);
558+
if (tp != null) {
559+
new TreePathScanner<>() {
560+
@Override
561+
public Object visitVariable(VariableTree node, Object p) {
562+
Element el = trees.getElement(getCurrentPath());
563+
handleDeclaration(el);
564+
return super.visitVariable(node, p);
565+
}
566+
}.scan(tp, null);
567+
}
568+
}
569+
case MODULE -> {
570+
q.add(elements.getPackageElement("test"));
571+
}
572+
default ->
573+
currentElement.getEnclosedElements()
574+
.stream()
575+
.sorted((e1, e2) -> e1.getSimpleName().toString().compareTo(e2.getSimpleName().toString()))
576+
.forEach(q::add);
577+
}
578+
}
579+
580+
return false;
581+
}
582+
583+
void handleDeclaration(Element el) {
584+
Elements elements = processingEnv.getElementUtils();
585+
JavaFileObject fileObjects = elements.getFileObjectOf(el);
586+
System.out.println(el.getSimpleName() + ": " + (fileObjects != null ? fileObjects.toUri().toString() : "<null>"));
587+
}
588+
589+
@Override
590+
public SourceVersion getSupportedSourceVersion() {
591+
return SourceVersion.latestSupported();
592+
}
593+
594+
}
595+
324596
}

0 commit comments

Comments
 (0)