--- old/src/jdk.internal.clang/share/classes/jdk/internal/clang/Cursor.java 2018-09-12 18:47:31.000000000 +0530 +++ new/src/jdk.internal.clang/share/classes/jdk/internal/clang/Cursor.java 2018-09-12 18:47:30.000000000 +0530 @@ -62,15 +62,6 @@ public native boolean isAnonymousStruct(); public native boolean isMacroFunctionLike(); - public boolean isAnonymousEnum() { - // libclang::clang_Cursor_isAnonymous only applies to struct, not enum - return (type().kind() == TypeKind.Enum && spelling().isEmpty()); - } - - public boolean isAnonymous() { - return isAnonymousStruct() || isAnonymousEnum(); - } - public native String spelling(); public native String USR(); @@ -78,8 +69,6 @@ public native int visitChildren(Visitor visitor, Object data); - public native boolean equalCursor(Cursor other); - public native Type type(); public native Type getEnumDeclIntegerType(); @@ -112,10 +101,6 @@ return CursorKind.valueOf(v); } - public boolean equals(Cursor other) { - return getData().equals(other.getData()); - } - public Stream children() { ArrayList ar = new ArrayList<>(); visitChildren((c, p, d) -> { @@ -127,7 +112,25 @@ return ar.stream(); } - public Stream stream() { + public Stream allChildren() { return children().flatMap(c -> Stream.concat(Stream.of(c), c.children())); } + + public native boolean equalCursor(Cursor other); + + @Override + public boolean equals(Object other) { + if (this == other) { + return true; + } + if (!(other instanceof Cursor)) { + return false; + } + return equalCursor((Cursor)other); + } + + @Override + public int hashCode() { + return spelling().hashCode(); + } } --- old/src/jdk.internal.clang/share/classes/jdk/internal/clang/SourceLocation.java 2018-09-12 18:47:33.000000000 +0530 +++ new/src/jdk.internal.clang/share/classes/jdk/internal/clang/SourceLocation.java 2018-09-12 18:47:32.000000000 +0530 @@ -112,5 +112,10 @@ public int hashCode() { return Objects.hashCode(path) ^ line ^ column ^ offset; } + + @Override + public String toString() { + return Objects.toString(path) + ":" + line + ":" + column + ":" + offset; + } } } --- old/src/jdk.internal.clang/share/classes/jdk/internal/clang/Type.java 2018-09-12 18:47:34.000000000 +0530 +++ new/src/jdk.internal.clang/share/classes/jdk/internal/clang/Type.java 2018-09-12 18:47:34.000000000 +0530 @@ -68,4 +68,22 @@ } public native Cursor getDeclarationCursor(); + + public native boolean equalType(Type other); + + @Override + public boolean equals(Object other) { + if (this == other) { + return true; + } + if (!(other instanceof Type)) { + return false; + } + return equalType((Type)other); + } + + @Override + public int hashCode() { + return spelling().hashCode(); + } } --- old/src/jdk.internal.clang/share/native/libjclang/jdk_internal_clang.cpp 2018-09-12 18:47:36.000000000 +0530 +++ new/src/jdk.internal.clang/share/native/libjclang/jdk_internal_clang.cpp 2018-09-12 18:47:35.000000000 +0530 @@ -408,13 +408,6 @@ return clang_visitChildren(*ptr, visitorFunc, &ctx); } -JNIEXPORT jboolean JNICALL Java_jdk_internal_clang_Cursor_equalCursor - (JNIEnv *env, jobject cursor, jobject other) { - CXCursor *ptr = (CXCursor*) J2P(env, cursor); - CXCursor *ptrOther = (CXCursor*) J2P(env, other); - return clang_equalCursors(*ptr, *ptrOther); -} - JNIEXPORT jobject JNICALL Java_jdk_internal_clang_Cursor_type (JNIEnv *env, jobject cursor) { CXCursor *ptr = (CXCursor*) J2P(env, cursor); @@ -517,6 +510,13 @@ return CX2JString(env, mangled); } +JNIEXPORT jboolean JNICALL Java_jdk_internal_clang_Cursor_equalCursor + (JNIEnv *env, jobject cursor, jobject other) { + CXCursor *ptr = (CXCursor*) J2P(env, cursor); + CXCursor *ptrOther = (CXCursor*) J2P(env, other); + return clang_equalCursors(*ptr, *ptrOther); +} + /************************************* * Type <-> CXType related functions *************************************/ @@ -613,6 +613,13 @@ return offset; } +JNIEXPORT jboolean JNICALL Java_jdk_internal_clang_Type_equalType + (JNIEnv *env, jobject type, jobject other) { + CXType *ptr = (CXType*) J2P(env, type); + CXType *ptrOther = (CXType*) J2P(env, other); + return clang_equalTypes(*ptr, *ptrOther); +} + JNIEXPORT jobject JNICALL Java_jdk_internal_clang_Type_getDeclarationCursor (JNIEnv *env, jobject type) { CXType *ptr = (CXType*) J2P(env, type); --- old/src/jdk.jextract/share/classes/com/sun/tools/jextract/AsmCodeFactory.java 2018-09-12 18:47:37.000000000 +0530 +++ new/src/jdk.jextract/share/classes/com/sun/tools/jextract/AsmCodeFactory.java 2018-09-12 18:47:37.000000000 +0530 @@ -294,7 +294,7 @@ // define enum constants in global_cw enumTree.constants().forEach(constant -> addConstant(global_cw, constant)); - if (enumTree.isAnonymous()) { + if (enumTree.name().isEmpty()) { // We are done with anonymous enum return null; } --- old/src/jdk.jextract/share/classes/com/sun/tools/jextract/tree/EnumTree.java 2018-09-12 18:47:39.000000000 +0530 +++ new/src/jdk.jextract/share/classes/com/sun/tools/jextract/tree/EnumTree.java 2018-09-12 18:47:38.000000000 +0530 @@ -42,8 +42,4 @@ public R accept(TreeVisitor visitor, D data) { return visitor.visitEnum(this, data); } - - public boolean isAnonymous() { - return cursor().isAnonymousEnum(); - } } --- old/src/jdk.jextract/share/classes/com/sun/tools/jextract/tree/LayoutUtils.java 2018-09-12 18:47:40.000000000 +0530 +++ new/src/jdk.jextract/share/classes/com/sun/tools/jextract/tree/LayoutUtils.java 2018-09-12 18:47:40.000000000 +0530 @@ -234,7 +234,7 @@ replaceBitfields(fieldLayouts, pendingBitfieldStart); pendingBitfieldStart = -1; } - Layout fieldLayout = (c.isAnonymous()) ? + Layout fieldLayout = (c.isAnonymousStruct()) ? getRecordLayoutInternal(offset, parent, c.type(), fieldMapper) : fieldLayout(isUnion, c, fieldMapper); fieldLayouts.add(fieldLayout); --- old/src/jdk.jextract/share/classes/com/sun/tools/jextract/tree/Tree.java 2018-09-12 18:47:42.000000000 +0530 +++ new/src/jdk.jextract/share/classes/com/sun/tools/jextract/tree/Tree.java 2018-09-12 18:47:41.000000000 +0530 @@ -87,7 +87,7 @@ return false; } - return c.equalCursor(((Tree)obj).cursor()); + return c.equals(((Tree)obj).cursor()); } @Override --- old/src/jdk.jextract/share/classes/com/sun/tools/jextract/tree/TreePrinter.java 2018-09-12 18:47:43.000000000 +0530 +++ new/src/jdk.jextract/share/classes/com/sun/tools/jextract/tree/TreePrinter.java 2018-09-12 18:47:43.000000000 +0530 @@ -86,7 +86,8 @@ @Override public Void visitStruct(StructTree s, Void v) { defaultAction(s, v); - System.out.printf("%s layout = %s\n\n", s.name(), s.layout((ft, l) -> l)); + System.out.printf("name = '%s', isAnonymous? = %b, layout = %s\n\n", + s.name(), s.isAnonymous(), s.layout((ft, l) -> l)); List fields = s.fields(); if (! fields.isEmpty()) { System.out.println("--> fields"); --- old/test/jdk/com/sun/tools/jextract/jclang-ffi/TestJextractFFI.java 2018-09-12 18:47:45.000000000 +0530 +++ new/test/jdk/com/sun/tools/jextract/jclang-ffi/TestJextractFFI.java 2018-09-12 18:47:44.000000000 +0530 @@ -110,6 +110,7 @@ "-I", clang_header_path.toString(), "-t", "clang", "-d", CLANG_FFI_PATH, + "-J-Djextract.debug=true", "-J-Dlibclang.debug=true", "-J-Djava.library.path=" + clang_lib_path.toString(), "-J--module-path", "-J" + CLANG_JAR, --- old/test/jdk/com/sun/tools/jextract/jclang-ffi/src/jdk/internal/clang/Cursor.java 2018-09-12 18:47:46.000000000 +0530 +++ new/test/jdk/com/sun/tools/jextract/jclang-ffi/src/jdk/internal/clang/Cursor.java 2018-09-12 18:47:46.000000000 +0530 @@ -59,15 +59,6 @@ public boolean isAnonymousStruct() { return LibClang.lib.clang_Cursor_isAnonymous(cursor) != 0; } - public boolean isAnonymousEnum() { - // libclang::clang_Cursor_isAnonymous only applies to struct, not enum - return (type().kind() == TypeKind.Enum && spelling().isEmpty()); - } - - public boolean isAnonymous() { - return isAnonymousStruct() || isAnonymousEnum(); - } - public boolean isMacroFunctionLike() { return LibClang.lib.clang_Cursor_isMacroFunctionLike(cursor) != 0; }