33 34 public class HeaderResolver { 35 36 // The folder path mapping to package name 37 private final Map<Path, String> pkgMap = new LinkedHashMap<>(); 38 // The header file parsed 39 private final Map<Path, HeaderFile> headerMap = new LinkedHashMap<>(); 40 private final Log log; 41 private final Path builtinHeader; 42 43 public HeaderResolver(Context ctx) { 44 this.log = ctx.log; 45 usePackageForFolder(Context.getBuiltinHeadersDir(), "clang_support"); 46 this.builtinHeader = Context.getBuiltinHeaderFile(); 47 ctx.sources.stream() 48 .map(Path::getParent) 49 .forEach(p -> usePackageForFolder(p, ctx.options.targetPackage)); 50 ctx.options.pkgMappings.forEach(this::usePackageForFolder); 51 } 52 53 public String headerInterfaceName(String filename) { 54 int ext = filename.lastIndexOf('.'); 55 String name = ext != -1 ? filename.substring(0, ext) : filename; 56 return Utils.toClassName(name); 57 } 58 59 public String staticForwarderName(String filename) { 60 return headerInterfaceName(filename) + "_h"; 61 } 62 63 private void usePackageForFolder(Path folder, String pkg) { 64 folder = folder.normalize().toAbsolutePath(); 65 String existing = pkgMap.putIfAbsent(folder, pkg); 66 final String finalFolder = (null == folder) ? "all folders not configured" : folder.toString(); 67 if (existing == null) { 68 log.print(Level.CONFIG, () -> "Package " + pkg + " is selected for " + finalFolder); 69 } else { 70 String pkgName = pkg.isEmpty() ? "<default-package>" : pkg; 71 log.print(Level.WARNING, () -> "Package " + existing + " had been selected for " + finalFolder + ", request to use " + pkgName + " is ignored."); 72 } 73 } 74 75 // start of header file resolution logic 76 77 static class HeaderPath { 78 final String pkg; 79 final String headerCls; 80 final String forwarderCls; | 33 34 public class HeaderResolver { 35 36 // The folder path mapping to package name 37 private final Map<Path, String> pkgMap = new LinkedHashMap<>(); 38 // The header file parsed 39 private final Map<Path, HeaderFile> headerMap = new LinkedHashMap<>(); 40 private final Log log; 41 private final Path builtinHeader; 42 43 public HeaderResolver(Context ctx) { 44 this.log = ctx.log; 45 usePackageForFolder(Context.getBuiltinHeadersDir(), "clang_support"); 46 this.builtinHeader = Context.getBuiltinHeaderFile(); 47 ctx.sources.stream() 48 .map(Path::getParent) 49 .forEach(p -> usePackageForFolder(p, ctx.options.targetPackage)); 50 ctx.options.pkgMappings.forEach(this::usePackageForFolder); 51 } 52 53 private static String safeFileName(String filename) { 54 int ext = filename.lastIndexOf('.'); 55 String name = ext != -1 ? filename.substring(0, ext) : filename; 56 return Utils.toClassName(name); 57 } 58 59 public static String headerInterfaceName(String filename) { 60 return safeFileName(filename) + "_h"; 61 } 62 63 public static String staticForwarderName(String filename) { 64 return safeFileName(filename) + "_lib"; 65 } 66 67 private void usePackageForFolder(Path folder, String pkg) { 68 folder = folder.normalize().toAbsolutePath(); 69 String existing = pkgMap.putIfAbsent(folder, pkg); 70 final String finalFolder = (null == folder) ? "all folders not configured" : folder.toString(); 71 if (existing == null) { 72 log.print(Level.CONFIG, () -> "Package " + pkg + " is selected for " + finalFolder); 73 } else { 74 String pkgName = pkg.isEmpty() ? "<default-package>" : pkg; 75 log.print(Level.WARNING, () -> "Package " + existing + " had been selected for " + finalFolder + ", request to use " + pkgName + " is ignored."); 76 } 77 } 78 79 // start of header file resolution logic 80 81 static class HeaderPath { 82 final String pkg; 83 final String headerCls; 84 final String forwarderCls; |