< prev index next >

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

Print this page




  21  *  questions.
  22  */
  23 
  24 package com.sun.tools.jextract;
  25 
  26 import java.nio.file.Files;
  27 import java.nio.file.Path;
  28 import java.util.ArrayList;
  29 import java.util.LinkedHashMap;
  30 import java.util.List;
  31 import java.util.Map;
  32 import java.util.logging.Level;
  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 
  42     public HeaderResolver(Context ctx) {
  43         this.log = ctx.log;
  44         usePackageForFolder(Context.getBuiltinHeadersDir(), "clang_support");

  45         ctx.sources.stream()
  46                 .map(Path::getParent)
  47                 .forEach(p -> usePackageForFolder(p, ctx.options.targetPackage));
  48         ctx.options.pkgMappings.forEach(this::usePackageForFolder);
  49     }
  50 
  51     public String headerInterfaceName(String filename) {
  52         int ext = filename.lastIndexOf('.');
  53         String name = ext != -1 ? filename.substring(0, ext) : filename;
  54         return Utils.toClassName(name);
  55     }
  56 
  57     public String staticForwarderName(String filename) {
  58         return headerInterfaceName(filename) + "_h";
  59     }
  60 
  61     private void usePackageForFolder(Path folder, String pkg) {
  62         folder = folder.normalize().toAbsolutePath();
  63         String existing = pkgMap.putIfAbsent(folder, pkg);
  64         final String finalFolder = (null == folder) ? "all folders not configured" : folder.toString();


 127                 parts.add(Utils.toJavaIdentifier(p.toString()));
 128             }
 129             pkg = String.join(".", parts);
 130             usePackageForFolder(origin, pkg);
 131         }
 132 
 133         return new HeaderPath(pkg, headerInterfaceName(filename), staticForwarderName(filename));
 134     }
 135 
 136     private HeaderFile getHeaderFile(Path header) {
 137         if (!Files.isRegularFile(header)) {
 138             log.print(Level.WARNING, () -> "Not a regular file: " + header.toString());
 139             throw new IllegalArgumentException(header.toString());
 140         }
 141 
 142         final HeaderPath hp = resolveHeaderPath(header);
 143         return new HeaderFile(this, header, hp.pkg, hp.headerCls, hp.forwarderCls);
 144     }
 145 
 146     public HeaderFile headerFor(Path path) {




 147         return headerMap.computeIfAbsent(path.normalize().toAbsolutePath(), this::getHeaderFile);
 148     }
 149 }


  21  *  questions.
  22  */
  23 
  24 package com.sun.tools.jextract;
  25 
  26 import java.nio.file.Files;
  27 import java.nio.file.Path;
  28 import java.util.ArrayList;
  29 import java.util.LinkedHashMap;
  30 import java.util.List;
  31 import java.util.Map;
  32 import java.util.logging.Level;
  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();


 129                 parts.add(Utils.toJavaIdentifier(p.toString()));
 130             }
 131             pkg = String.join(".", parts);
 132             usePackageForFolder(origin, pkg);
 133         }
 134 
 135         return new HeaderPath(pkg, headerInterfaceName(filename), staticForwarderName(filename));
 136     }
 137 
 138     private HeaderFile getHeaderFile(Path header) {
 139         if (!Files.isRegularFile(header)) {
 140             log.print(Level.WARNING, () -> "Not a regular file: " + header.toString());
 141             throw new IllegalArgumentException(header.toString());
 142         }
 143 
 144         final HeaderPath hp = resolveHeaderPath(header);
 145         return new HeaderFile(this, header, hp.pkg, hp.headerCls, hp.forwarderCls);
 146     }
 147 
 148     public HeaderFile headerFor(Path path) {
 149         if (path == null) {
 150             path = builtinHeader;
 151         }
 152 
 153         return headerMap.computeIfAbsent(path.normalize().toAbsolutePath(), this::getHeaderFile);
 154     }
 155 }
< prev index next >