--- old/src/jdk.jextract/share/classes/com/sun/tools/jextract/Context.java 2018-11-07 23:03:20.000000000 +0530 +++ new/src/jdk.jextract/share/classes/com/sun/tools/jextract/Context.java 2018-11-07 23:03:19.000000000 +0530 @@ -83,6 +83,8 @@ private final List libraryPaths; // The list of library paths for link checks private final List linkCheckPaths; + // Symbol patterns to be included + private final List includeSymbols; // Symbol patterns to be excluded private final List excludeSymbols; // generate static forwarder class or not? @@ -92,7 +94,8 @@ final PrintWriter err; private Predicate symChecker; - private Predicate symFilter; + private Predicate includeSymFilter; + private Predicate excludeSymFilter; private final Parser parser; @@ -108,6 +111,7 @@ this.libraryNames = new ArrayList<>(); this.libraryPaths = new ArrayList<>(); this.linkCheckPaths = new ArrayList<>(); + this.includeSymbols = new ArrayList<>(); this.excludeSymbols = new ArrayList<>(); this.parser = new Parser(out, err, Main.INCLUDE_MACROS); this.out = out; @@ -142,6 +146,10 @@ linkCheckPaths.add(path); } + void addIncludeSymbols(String pattern) { + includeSymbols.add(Pattern.compile(pattern)); + } + void addExcludeSymbols(String pattern) { excludeSymbols.add(Pattern.compile(pattern)); } @@ -218,20 +226,34 @@ return symChecker == null? true : symChecker.test(name); } - private void initSymFilter() { + private void initSymFilters() { + if (!includeSymbols.isEmpty()) { + Pattern[] pats = includeSymbols.toArray(new Pattern[0]); + includeSymFilter = name -> { + return Arrays.stream(pats).filter(pat -> pat.matcher(name).matches()). + findFirst().isPresent(); + }; + } else { + includeSymFilter = null; + } + if (!excludeSymbols.isEmpty()) { Pattern[] pats = excludeSymbols.toArray(new Pattern[0]); - symFilter = name -> { + excludeSymFilter = name -> { return Arrays.stream(pats).filter(pat -> pat.matcher(name).matches()). findFirst().isPresent(); }; } else { - symFilter = null; + excludeSymFilter = null; } } + private boolean isSymbolIncluded(String name) { + return includeSymFilter == null? true : includeSymFilter.test(name); + } + private boolean isSymbolExcluded(String name) { - return symFilter == null? false : symFilter.test(name); + return excludeSymFilter == null? false : excludeSymFilter.test(name); } /** @@ -390,7 +412,7 @@ private boolean symbolFilter(Tree tree) { String name = tree.name(); - if (isSymbolExcluded(name)) { + if (!isSymbolIncluded(name) || isSymbolExcluded(name)) { return false; } @@ -406,7 +428,7 @@ public void parse(Function fn) { initSymChecker(); - initSymFilter(); + initSymFilters(); List headers = parser.parse(sources, clangArgs); processHeaders(headers, fn);