< prev index next >
src/jdk.jextract/share/classes/com/sun/tools/jextract/EmptyNameHandler.java
Print this page
*** 74,115 ****
collect(Collectors.toList());
return treeMaker.createHeader(ht.cursor(), ht.path(), decls);
}
@Override
! public Tree visitStruct(StructTree s, Void v) {
! // Common simple case. No nested names and no anonymous field names.
! // We just need to check struct name itself is empty or not.
! if (s.nestedTypes().isEmpty() && !hasAnonymousFields(s)) {
! /*
! * Examples:
! *
! * struct { int i } x; // global variable of anon. struct type
! * void func(struct { int x; } p); // param of anon. struct type
! */
! if (s.name().isEmpty()) {
! return s.withName(generateName(s));
! } else {
! // all fine with this struct
! return s;
! }
! } else {
! // handle all nested types
! return renameRecursively(s);
! }
! }
!
! // does the given struct has any anonymous (bit) field?
! private boolean hasAnonymousFields(StructTree s) {
! return s.fields().stream().map(f -> f.name().isEmpty()).findFirst().isPresent();
! }
!
! private StructTree renameRecursively(StructTree s) {
! List<Tree> newDecls = s.declarations().stream().map(decl -> {
! if (decl instanceof StructTree) {
! return renameRecursively((StructTree)decl);
! } else if (decl instanceof FieldTree && decl.name().isEmpty()) {
/*
* Skip anonymous fields. This happens in the following case:
*
* struct {
* int :23; // anonymous bit field
--- 74,85 ----
collect(Collectors.toList());
return treeMaker.createHeader(ht.cursor(), ht.path(), decls);
}
@Override
! public Tree visitField(FieldTree t, Void aVoid) {
! if (t.name().isEmpty()) {
/*
* Skip anonymous fields. This happens in the following case:
*
* struct {
* int :23; // anonymous bit field
*** 117,129 ****
* }
*/
return null;
} else {
! return decl;
}
! }).filter(d -> d != null).collect(Collectors.toList());
return s.withNameAndDecls(generateName(s), newDecls);
}
// test main to manually check this visitor
--- 87,106 ----
* }
*/
return null;
} else {
! return t;
}
! }
!
! @Override
! public Tree visitStruct(StructTree s, Void v) {
! List<Tree> newDecls = s.declarations().stream()
! .map(decl -> decl.accept(this, null))
! .filter(d -> d != null)
! .collect(Collectors.toList());
return s.withNameAndDecls(generateName(s), newDecls);
}
// test main to manually check this visitor
*** 131,141 ****
if (args.length == 0) {
System.err.println("Expected a header file");
return;
}
! Parser p = new Parser(true);
List<Path> paths = Arrays.stream(args).map(Paths::get).collect(Collectors.toList());
Path builtinInc = Paths.get(System.getProperty("java.home"), "conf", "jextract");
List<String> clangArgs = List.of("-I" + builtinInc);
List<HeaderTree> headers = p.parse(paths, clangArgs);
TreePrinter printer = new TreePrinter();
--- 108,119 ----
if (args.length == 0) {
System.err.println("Expected a header file");
return;
}
! Context context = new Context();
! Parser p = new Parser(context,true);
List<Path> paths = Arrays.stream(args).map(Paths::get).collect(Collectors.toList());
Path builtinInc = Paths.get(System.getProperty("java.home"), "conf", "jextract");
List<String> clangArgs = List.of("-I" + builtinInc);
List<HeaderTree> headers = p.parse(paths, clangArgs);
TreePrinter printer = new TreePrinter();
< prev index next >