From aa3527b39c79a9855e07275dbe9bb62f3fc1fb4e Mon Sep 17 00:00:00 2001 From: Jan-Willem Harmannij Date: Sun, 29 Sep 2024 20:07:21 +0200 Subject: [PATCH] Set trailing flag parameters as varargs (fixes #140) --- .../javagi/generators/CallableGenerator.java | 24 +++++++++++++++---- .../github/jwharm/javagi/gir/Parameter.java | 4 ++++ 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/buildSrc/src/main/java/io/github/jwharm/javagi/generators/CallableGenerator.java b/buildSrc/src/main/java/io/github/jwharm/javagi/generators/CallableGenerator.java index 0a5a6f88..c321b8b0 100644 --- a/buildSrc/src/main/java/io/github/jwharm/javagi/generators/CallableGenerator.java +++ b/buildSrc/src/main/java/io/github/jwharm/javagi/generators/CallableGenerator.java @@ -115,6 +115,15 @@ void generateMethodParameters(MethodSpec.Builder builder, var generator = new TypedValueGenerator(p); var type = generator.getType(setOfBitfield); + // Trailing flags parameter can be variadic + if ((!setOfBitfield) + && p.isBitfield() + && p.isLastParameter() + && (!p.isOutParameter())) { + type = ArrayTypeName.of(type); + builder.varargs(true); + } + if (generic && type.equals(ClassNames.GOBJECT)) type = ClassNames.GENERIC_T; @@ -292,14 +301,19 @@ else if ((!ctor) || namedCtor) continue; TypedValueGenerator gen = new TypedValueGenerator(p); + String paramName = gen.getName(); if (p.isBitfield()) { - if (p.isOutParameter()) - params.add(gen.getName() + " == null ? null : new $out:T($enumSet:T.of(" + gen.getName() + ".get()))"); - else - params.add("$enumSet:T.of(" + gen.getName() + ")"); + if (p.isOutParameter()) { + params.add(paramName + " == null ? null : new $out:T($enumSet:T.of(" + paramName + ".get()))"); + } else if (p.isLastParameter()) { + params.add("(" + paramName + " == null ? null : (" + paramName + ".length == 0) ? $enumSet:T.noneOf($typeName:T.class) : $enumSet:T.of(" + paramName + "[0], " + paramName + "))"); + stmt.add(null, "typeName", gen.getType(false)); + } else { + params.add("$enumSet:T.of(" + paramName + ")"); + } } else { - params.add(gen.getName()); + params.add(paramName); } } stmt.add(params.toString(), diff --git a/buildSrc/src/main/java/io/github/jwharm/javagi/gir/Parameter.java b/buildSrc/src/main/java/io/github/jwharm/javagi/gir/Parameter.java index 5230a410..4ef4e5b0 100644 --- a/buildSrc/src/main/java/io/github/jwharm/javagi/gir/Parameter.java +++ b/buildSrc/src/main/java/io/github/jwharm/javagi/gir/Parameter.java @@ -120,6 +120,10 @@ public boolean allocatesMemory() { && target instanceof Alias a && a.type().isPrimitive(); } + public boolean isLastParameter() { + return this == parent().parameters().getLast(); + } + public boolean nullable() { return "1".equals(attr("nullable")) || "1".equals(attr("allow-none"))