< prev index next >
src/jdk.jextract/share/classes/com/sun/tools/jextract/Utils.java
Print this page
@@ -25,19 +25,21 @@
import java.foreign.layout.Function;
import java.foreign.layout.Layout;
import java.nio.file.Files;
import java.nio.file.Path;
+import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import javax.lang.model.SourceVersion;
import jdk.internal.clang.Cursor;
import jdk.internal.clang.CursorKind;
+import jdk.internal.clang.SourceLocation;
import jdk.internal.clang.Type;
import com.sun.tools.jextract.tree.LayoutUtils;
import jdk.internal.clang.TypeKind;
/**
@@ -182,10 +184,61 @@
default:
throw new IllegalStateException("Unhandled cursor kind: " + c.kind());
}
}
+ // return builtin Record types accessible from the given Type
+ public static Stream<Cursor> getBuiltinRecordTypes(Type type) {
+ List<Cursor> recordTypes = new ArrayList<>();
+ fillBuiltinRecordTypes(type, recordTypes);
+ return recordTypes.stream().distinct();
+ }
+
+ private static void fillBuiltinRecordTypes(Type type, List<Cursor> recordTypes) {
+ type = type.canonicalType();
+ switch (type.kind()) {
+ case ConstantArray:
+ case IncompleteArray:
+ fillBuiltinRecordTypes(type.getElementType(), recordTypes);
+ break;
+
+ case FunctionProto:
+ case FunctionNoProto: {
+ final int numArgs = type.numberOfArgs();
+ for (int i = 0; i < numArgs; i++) {
+ fillBuiltinRecordTypes(type.argType(i), recordTypes);
+ }
+ fillBuiltinRecordTypes(type.resultType(), recordTypes);
+ }
+ break;
+
+ case Record: {
+ Cursor c = type.getDeclarationCursor();
+ if (c.isDefinition()) {
+ SourceLocation sloc = c.getSourceLocation();
+ if (sloc != null && sloc.getFileLocation().path() == null) {
+ recordTypes.add(c);
+ }
+ }
+ }
+ break;
+
+ case BlockPointer:
+ case Pointer:
+ fillBuiltinRecordTypes(type.getPointeeType(), recordTypes);
+ break;
+
+ case Unexposed:
+ case Elaborated:
+ case Typedef:
+ fillBuiltinRecordTypes(type, recordTypes);
+ break;
+
+ default: // nothing to do
+ }
+ }
+
// return the absolute path of the library of given name by searching
// in the given array of paths.
public static Optional<Path> findLibraryPath(Path[] paths, String libName) {
return Arrays.stream(paths).
map(p -> p.resolve(System.mapLibraryName(libName))).
< prev index next >