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 |