< prev index next >

src/jdk.jextract/share/classes/com/sun/tools/jextract/Context.java

Print this page

        

@@ -50,12 +50,13 @@
 import java.util.logging.Logger;
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 import java.util.zip.ZipEntry;
 import com.sun.tools.jextract.parser.Parser;
-import com.sun.tools.jextract.tree.Tree;
+import com.sun.tools.jextract.tree.FunctionTree;
 import com.sun.tools.jextract.tree.HeaderTree;
+import com.sun.tools.jextract.tree.Tree;
 
 import static java.nio.file.StandardOpenOption.CREATE;
 import static java.nio.file.StandardOpenOption.TRUNCATE_EXISTING;
 import static java.nio.file.StandardOpenOption.WRITE;
 

@@ -339,39 +340,38 @@
 
     public void parse() {
         parse(header -> new AsmCodeFactory(this, header));
     }
 
-    private boolean filterCursor(Cursor c) {
-        if (c.isDeclaration()) {
-            Type type = c.type();
-            if (type.kind() == TypeKind.FunctionProto ||
-                type.kind() == TypeKind.FunctionNoProto) {
-                String name = c.spelling();
-
+    private boolean symbolFilter(Tree tree) {
+         String name = tree.name();
                 if (isSymbolExcluded(name)) {
                     return false;
                 }
 
-                if (!isSymbolFound(name)) {
+         // check for function symbols in libraries & warn missing symbols
+         if (tree instanceof FunctionTree && !isSymbolFound(name)) {
                     err.println(Main.format("warn.symbol.not.found", name));
                 }
-            }
-        }
+
         return true;
     }
 
     public void parse(Function<HeaderFile, AsmCodeFactory> fn) {
         initSymChecker();
         initSymFilter();
 
-        List<HeaderTree> headers = parser.parse(sources, clangArgs, this::filterCursor);
+        List<HeaderTree> headers = parser.parse(sources, clangArgs);
         processHeaders(headers, fn);
     }
 
     private void processHeaders(List<HeaderTree> headers, Function<HeaderFile, AsmCodeFactory> fn) {
-        headers.forEach(header -> {
+        headers.stream().
+                map((new TreeFilter(this::symbolFilter))::transform).
+                map((new TypedefHandler())::transform).
+                map((new EmptyNameHandler())::transform).
+                forEach(header -> {
             HeaderFile hf = headerMap.computeIfAbsent(header.path(), p -> getHeaderFile(p, null));
             hf.useLibraries(libraryNames, libraryPaths);
             hf.useCodeFactory(fn.apply(hf));
             logger.info(() -> "Processing header file " + header.path());
 
< prev index next >