Improve determining which C enum constants are explicitly defined (#3384)
Improve determining which C enum constants are explicitly defined
This commit is contained in:
committed by
Nikolay Igotti
parent
7daa36cc4d
commit
b7ad1d9907
+1
-1
@@ -276,7 +276,7 @@ internal class NativeIndexImpl(val library: NativeLibrary, val verbose: Boolean
|
|||||||
val name = clang_getCursorSpelling(childCursor).convertAndDispose()
|
val name = clang_getCursorSpelling(childCursor).convertAndDispose()
|
||||||
val value = clang_getEnumConstantDeclValue(childCursor)
|
val value = clang_getEnumConstantDeclValue(childCursor)
|
||||||
|
|
||||||
val constant = EnumConstant(name, value, isExplicitlyDefined = !childCursor.isLeaf())
|
val constant = EnumConstant(name, value, isExplicitlyDefined = childCursor.hasExpressionChild())
|
||||||
enumDef.constants.add(constant)
|
enumDef.constants.add(constant)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+10
-6
@@ -201,15 +201,19 @@ fun StructDef.fieldsHaveDefaultAlignment(): Boolean {
|
|||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
internal fun CValue<CXCursor>.isLeaf(): Boolean {
|
internal fun CValue<CXCursor>.hasExpressionChild(): Boolean {
|
||||||
var hasChildren = false
|
var result = false
|
||||||
|
|
||||||
visitChildren(this) { _, _ ->
|
visitChildren(this) { cursor, _ ->
|
||||||
hasChildren = true
|
if (clang_isExpression(cursor.kind) != 0) {
|
||||||
CXChildVisitResult.CXChildVisit_Break
|
result = true
|
||||||
|
CXChildVisitResult.CXChildVisit_Break
|
||||||
|
} else {
|
||||||
|
CXChildVisitResult.CXChildVisit_Continue
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return !hasChildren
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
internal fun List<String>.toNativeStringArray(scope: AutofreeScope): CArrayPointer<CPointerVar<ByteVar>> {
|
internal fun List<String>.toNativeStringArray(scope: AutofreeScope): CArrayPointer<CPointerVar<ByteVar>> {
|
||||||
|
|||||||
@@ -48,4 +48,25 @@ static int vlaSum2DBothDimensions(int rows, int columns, int array[rows][columns
|
|||||||
static int vlaSum2DForward(int size; int array[][size], int size) {
|
static int vlaSum2DForward(int size; int array[][size], int size) {
|
||||||
return vlaSum2D(size, array);
|
return vlaSum2D(size, array);
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
// "Strict" enums heuristic based on whether enum constants are defined explicitly:
|
||||||
|
enum StrictEnum1 {
|
||||||
|
StrictEnum1A,
|
||||||
|
StrictEnum1B
|
||||||
|
};
|
||||||
|
|
||||||
|
enum StrictEnum2 {
|
||||||
|
StrictEnum2A __attribute__((unused)),
|
||||||
|
StrictEnum2B __attribute__((unused))
|
||||||
|
};
|
||||||
|
|
||||||
|
enum NonStrictEnum1 {
|
||||||
|
NonStrictEnum1A = 0,
|
||||||
|
NonStrictEnum1B __attribute__((unused))
|
||||||
|
};
|
||||||
|
|
||||||
|
enum NonStrictEnum2 {
|
||||||
|
NonStrictEnum2A,
|
||||||
|
NonStrictEnum2B __attribute__((unused)) = 1
|
||||||
|
};
|
||||||
@@ -16,4 +16,9 @@ fun main() {
|
|||||||
|
|
||||||
// Not supported by clang:
|
// Not supported by clang:
|
||||||
// assertEquals(10, vlaSum2DForward(cValuesOf(1, 2, 3, 4), 2))
|
// assertEquals(10, vlaSum2DForward(cValuesOf(1, 2, 3, 4), 2))
|
||||||
|
|
||||||
|
assertEquals(0u, StrictEnum1.StrictEnum1A.value)
|
||||||
|
assertEquals(1u, StrictEnum2.StrictEnum2B.value)
|
||||||
|
assertEquals(0u, NonStrictEnum1A)
|
||||||
|
assertEquals(1u, NonStrictEnum2B)
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user