< prev index next >

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

Print this page




  27 import java.foreign.memory.FloatComplex;
  28 import java.foreign.memory.LongDoubleComplex;
  29 import java.math.BigInteger;
  30 import java.nio.file.Path;
  31 import java.util.Optional;
  32 import java.util.function.Function;
  33 import java.util.HashMap;
  34 import java.util.Map;
  35 import java.util.logging.Logger;
  36 import java.util.stream.Stream;
  37 
  38 import jdk.internal.clang.Type;
  39 import jdk.internal.clang.TypeKind;
  40 
  41 /**
  42  * A dictionary that find Java type for a given native type.
  43  * Each instance of TypeDictionary presents types for a given java package.
  44  */
  45 final class TypeDictionary {
  46     private final Logger logger = Logger.getLogger(getClass().getPackage().getName());
  47     private Context ctx;
  48     private final HeaderFile headerFile;
  49     private final Map<String, JType> functionalTypes;
  50     private int serialNo;
  51 
  52     TypeDictionary(Context ctx, HeaderFile headerFile) {
  53         this.ctx = ctx;
  54         this.headerFile = headerFile;
  55         functionalTypes = new HashMap<>();
  56     }
  57     
  58     private int serialNo() {
  59         return ++serialNo;
  60     }
  61 
  62     private String recordOwnerClass(Type t) {
  63         try {
  64             //try resolve globally
  65             Path p = t.getDeclarationCursor().getSourceLocation().getFileLocation().path();
  66             HeaderFile hf = ctx.headerFor(p);
  67             return Utils.toInternalName(hf.pkgName, hf.clsName);
  68         } catch (Throwable ex) {
  69             //fallback: resolve locally. This can happen for two reasons: (i) the symbol to be resolved is a builtin
  70             //symbol (e.g. no header file has its definition), or (ii) when the declaration cursor points to an header file
  71             //not previously seen by Context.
  72                 return headerClass();
  73         }
  74     }
  75     
  76     private String headerClass() {
  77         return Utils.toInternalName(headerFile.pkgName, headerFile.clsName);
  78     }
  79 
  80     public Stream<JType> functionalInterfaces() {
  81         return functionalTypes.entrySet().stream()
  82                 .map(Map.Entry::getValue);
  83     }
  84 
  85     /**
  86      * @param t




  27 import java.foreign.memory.FloatComplex;
  28 import java.foreign.memory.LongDoubleComplex;
  29 import java.math.BigInteger;
  30 import java.nio.file.Path;
  31 import java.util.Optional;
  32 import java.util.function.Function;
  33 import java.util.HashMap;
  34 import java.util.Map;
  35 import java.util.logging.Logger;
  36 import java.util.stream.Stream;
  37 
  38 import jdk.internal.clang.Type;
  39 import jdk.internal.clang.TypeKind;
  40 
  41 /**
  42  * A dictionary that find Java type for a given native type.
  43  * Each instance of TypeDictionary presents types for a given java package.
  44  */
  45 final class TypeDictionary {
  46     private final Logger logger = Logger.getLogger(getClass().getPackage().getName());
  47     private HeaderResolver resolver;
  48     private final HeaderFile headerFile;
  49     private final Map<String, JType> functionalTypes;
  50     private int serialNo;
  51 
  52     TypeDictionary(HeaderResolver resolver, HeaderFile headerFile) {
  53         this.resolver = resolver;
  54         this.headerFile = headerFile;
  55         functionalTypes = new HashMap<>();
  56     }
  57     
  58     private int serialNo() {
  59         return ++serialNo;
  60     }
  61 
  62     private String recordOwnerClass(Type t) {
  63         try {
  64             //try resolve globally
  65             Path p = t.getDeclarationCursor().getSourceLocation().getFileLocation().path();
  66             HeaderFile hf = resolver.headerFor(p);
  67             return Utils.toInternalName(hf.pkgName, hf.clsName);
  68         } catch (Throwable ex) {
  69             //fallback: resolve locally. This can happen for two reasons: (i) the symbol to be resolved is a builtin
  70             //symbol (e.g. no header file has its definition), or (ii) when the declaration cursor points to an header file
  71             //not previously seen by Context.
  72                 return headerClass();
  73         }
  74     }
  75     
  76     private String headerClass() {
  77         return Utils.toInternalName(headerFile.pkgName, headerFile.clsName);
  78     }
  79 
  80     public Stream<JType> functionalInterfaces() {
  81         return functionalTypes.entrySet().stream()
  82                 .map(Map.Entry::getValue);
  83     }
  84 
  85     /**
  86      * @param t


< prev index next >