aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSundong Ahn <sundongahn@google.com>2021-04-09 02:28:51 +0000
committerAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>2021-04-09 02:28:51 +0000
commitef91229d0910ad8709e14b5f15dea5b52fbf5c44 (patch)
tree1ac831266423e11de19d81a67af1b95ec70b0a4c
parentfe3b6e5ca6d4b79950992046a7d55011cca9f459 (diff)
parent6ad9f7928a5eb35529a4f65a8dc601a8b1cf1695 (diff)
downloadxsdc-ef91229d0910ad8709e14b5f15dea5b52fbf5c44.tar.gz
Add Boolean_getter property am: 6ad9f7928a
Original change: https://android-review.googlesource.com/c/platform/system/tools/xsdc/+/1665343 Change-Id: I451a5c8abc26d534fa74f2f539f22de88808476f
-rw-r--r--build/xsdc.go7
-rw-r--r--src/com/android/xsdc/Main.java11
-rw-r--r--src/com/android/xsdc/cpp/CppCodeGenerator.java30
-rw-r--r--src/com/android/xsdc/java/JavaCodeGenerator.java24
-rw-r--r--tests/resources/simple_type/Android.bp3
-rw-r--r--tests/resources/simple_type/api/current.txt6
-rw-r--r--tests/resources/simple_type/simple_type.xsd3
7 files changed, 67 insertions, 17 deletions
diff --git a/build/xsdc.go b/build/xsdc.go
index 492d68e..3a09d71 100644
--- a/build/xsdc.go
+++ b/build/xsdc.go
@@ -77,6 +77,9 @@ type xsdConfigProperties struct {
// Only generate complementary code for XML parser. Applies to C++ only.
// The code being generated depends on the enum converters module.
Parser_only *bool
+ // Whether getter name of boolean element or attribute is getX or isX.
+ // Default value is false. If the property is true, getter name is isX.
+ Boolean_getter *bool
}
type xsdConfig struct {
@@ -194,6 +197,10 @@ func (module *xsdConfig) GenerateAndroidBuildActions(ctx android.ModuleContext)
args = args + " -x "
}
+ if proptools.Bool(module.properties.Boolean_getter) {
+ args = args + " -b "
+ }
+
module.genOutputs_j = android.PathForModuleGen(ctx, "java", filenameStem+"_xsdcgen.srcjar")
ctx.Build(pctx, android.BuildParams{
diff --git a/src/com/android/xsdc/Main.java b/src/com/android/xsdc/Main.java
index caac98b..0358f08 100644
--- a/src/com/android/xsdc/Main.java
+++ b/src/com/android/xsdc/Main.java
@@ -77,6 +77,11 @@ public class Main {
.hasArgs(0)
.withDescription("Generate public hasX() method")
.create("g"));
+ options.addOption(OptionBuilder
+ .withLongOpt("booleanGetter")
+ .hasArgs(0)
+ .withDescription("Generate isX() for boolean element or attribute.")
+ .create("b"));
Option genEnumsOnly = OptionBuilder
.withLongOpt("genEnumsOnly")
.hasArgs(0)
@@ -115,6 +120,7 @@ public class Main {
boolean genHas = cmd.hasOption('g');
boolean enumsOnly = cmd.hasOption('e');
boolean parserOnly = cmd.hasOption('x');
+ boolean booleanGetter = cmd.hasOption('b');
if (xsdFile.length != 1 || packageName == null) {
System.err.println("Error: no xsd files or package name");
@@ -132,7 +138,8 @@ public class Main {
packageDir.mkdirs();
FileSystem fs = new FileSystem(packageDir);
JavaCodeGenerator javaCodeGenerator =
- new JavaCodeGenerator(xmlSchema, packageName, writer, nullability, genHas);
+ new JavaCodeGenerator(xmlSchema, packageName, writer, nullability, genHas,
+ booleanGetter);
javaCodeGenerator.print(fs);
} else if (cmd.hasOption('c')) {
File includeDir = new File(Paths.get(outDir, "include").toString());
@@ -142,7 +149,7 @@ public class Main {
(parserOnly ? CppCodeGenerator.GENERATE_PARSER :
CppCodeGenerator.GENERATE_ENUMS | CppCodeGenerator.GENERATE_PARSER);
CppCodeGenerator cppCodeGenerator =
- new CppCodeGenerator(xmlSchema, packageName, writer, generators);
+ new CppCodeGenerator(xmlSchema, packageName, writer, generators, booleanGetter);
cppCodeGenerator.print(fs);
}
}
diff --git a/src/com/android/xsdc/cpp/CppCodeGenerator.java b/src/com/android/xsdc/cpp/CppCodeGenerator.java
index 432d510..3f4b844 100644
--- a/src/com/android/xsdc/cpp/CppCodeGenerator.java
+++ b/src/com/android/xsdc/cpp/CppCodeGenerator.java
@@ -47,15 +47,17 @@ public class CppCodeGenerator {
private boolean hasAttr;
private boolean writer;
private int generators;
+ private boolean booleanGetter;
private static final String UNKNOWN_ENUM = "UNKNOWN";
- public CppCodeGenerator(XmlSchema xmlSchema, String pkgName, boolean writer, int generators)
- throws CppCodeGeneratorException {
+ public CppCodeGenerator(XmlSchema xmlSchema, String pkgName, boolean writer, int generators,
+ boolean booleanGetter) throws CppCodeGeneratorException {
this.xmlSchema = xmlSchema;
this.pkgName = pkgName;
this.writer = writer;
this.generators = generators;
+ this.booleanGetter = booleanGetter;
// class naming validation
{
@@ -563,8 +565,9 @@ public class CppCodeGenerator {
String variableName = Utils.toVariableName(attribute.getName());
parserCppFile.printf("if (has%s()) {\n", Utils.capitalize(variableName));
parserCppFile.printf("out << \" %s=\\\"\";\n", attribute.getName());
- parserCppFile.print(type.getWritingExpression(String.format("get%s()",
- Utils.capitalize(variableName)), attribute.getName()));
+ parserCppFile.print(type.getWritingExpression(String.format("%s%s()",
+ getterName(type.getName()), Utils.capitalize(variableName)),
+ attribute.getName()));
parserCppFile.printf("out << \"\\\"\";\n}\n");
}
parserCppFile.print("out << \">\" << std::endl;\n");
@@ -598,8 +601,9 @@ public class CppCodeGenerator {
parserCppFile.printf("out << printIndent() << \"<%s>\";\n",
elementValue.getName());
}
- parserCppFile.print(type.getWritingExpression(String.format("get%s()",
- Utils.capitalize(variableName)), elementValue.getName()));
+ parserCppFile.print(type.getWritingExpression(String.format("%s%s()",
+ getterName(type.getName()), Utils.capitalize(variableName)),
+ elementValue.getName()));
if (type instanceof CppSimpleType) {
parserCppFile.printf("out << \"</%s>\" << std::endl;\n",
elementValue.getName());
@@ -618,13 +622,14 @@ public class CppCodeGenerator {
String typeName = isMultiple ? String.format("std::vector<%s>",
type.getName()) : type.getName();
- parserHeaderFile.printf("const %s& get%s() const;\n", typeName,
+ parserHeaderFile.printf("const %s& %s%s() const;\n", typeName, getterName(typeName),
Utils.capitalize(variableName));
parserCppFile.println();
- parserCppFile.printf("const %s& %s::get%s() const {\n"
+ parserCppFile.printf("const %s& %s::%s%s() const {\n"
+ "return %s;\n}\n\n",
- typeName, name, Utils.capitalize(variableName), isMultiple || isRequired ?
+ typeName, name, getterName(typeName), Utils.capitalize(variableName),
+ isMultiple || isRequired ?
variableName + "_" : String.format("%s_.value()", variableName));
parserHeaderFile.printf("bool has%s() const;\n", Utils.capitalize(variableName));
@@ -860,6 +865,13 @@ public class CppCodeGenerator {
return element.getName();
}
+ private String getterName(String type) {
+ if (type.equals("bool") && booleanGetter) {
+ return "is";
+ }
+ return "get";
+ }
+
private void stackComponents(XsdComplexType complexType, List<XsdElement> elements,
List<XsdAttribute> attributes) throws CppCodeGeneratorException {
if (complexType.getBase() != null) {
diff --git a/src/com/android/xsdc/java/JavaCodeGenerator.java b/src/com/android/xsdc/java/JavaCodeGenerator.java
index d55c230..7ab90e0 100644
--- a/src/com/android/xsdc/java/JavaCodeGenerator.java
+++ b/src/com/android/xsdc/java/JavaCodeGenerator.java
@@ -40,14 +40,17 @@ public class JavaCodeGenerator {
private boolean showNullability;
private boolean generateHasMethod;
private boolean useHexBinary;
+ private boolean booleanGetter;
public JavaCodeGenerator(XmlSchema xmlSchema, String packageName, boolean writer,
- boolean showNullability, boolean generateHasMethod) throws JavaCodeGeneratorException {
+ boolean showNullability, boolean generateHasMethod, boolean booleanGetter)
+ throws JavaCodeGeneratorException {
this.xmlSchema = xmlSchema;
this.packageName = packageName;
this.writer = writer;
this.showNullability = showNullability;
this.generateHasMethod = generateHasMethod;
+ this.booleanGetter = booleanGetter;
useHexBinary = false;
// class naming validation
@@ -401,7 +404,7 @@ public class JavaCodeGenerator {
String variableName = Utils.toVariableName(attribute.getName());
out.printf("if (has%s()) {\n", Utils.capitalize(variableName));
out.printf("out.printf(\" %s=\\\"\");\n", attribute.getName());
- out.print(type.getWritingExpression(String.format("get%s()",
+ out.print(type.getWritingExpression(String.format("%s%s()", getterName(type.getName()),
Utils.capitalize(variableName)), attribute.getName()));
out.printf("out.printf(\"\\\"\");\n}\n");
}
@@ -432,8 +435,9 @@ public class JavaCodeGenerator {
if (type instanceof JavaSimpleType) {
out.printf("out.printf(\"<%s>\");\n", elementValue.getName());
}
- out.print(type.getWritingExpression(String.format("get%s()",
- Utils.capitalize(variableName)), elementValue.getName()));
+ out.print(type.getWritingExpression(String.format("%s%s()",
+ getterName(type.getName()), Utils.capitalize(variableName)),
+ elementValue.getName()));
if (type instanceof JavaSimpleType) {
out.printf("out.printf(\"</%s>\\n\");\n", elementValue.getName());
}
@@ -458,8 +462,9 @@ public class JavaCodeGenerator {
if (deprecated) {
out.printf("@java.lang.Deprecated\n");
}
- out.printf("public%s %s%s get%s() {\n", getFinalString(finalValue),
- getNullabilityString(nullability), typeName, Utils.capitalize(variableName));
+ out.printf("public%s %s%s %s%s() {\n", getFinalString(finalValue),
+ getNullabilityString(nullability), typeName, getterName(typeName),
+ Utils.capitalize(variableName));
if ((type instanceof JavaSimpleType && ((JavaSimpleType)type).isList()) || isMultiple) {
out.printf("if (%s == null) {\n"
+ "%s = new java.util.ArrayList<>();\n"
@@ -689,6 +694,13 @@ public class JavaCodeGenerator {
return "";
}
+ private String getterName(String type) {
+ if (type.equals("boolean") && booleanGetter) {
+ return "is";
+ }
+ return "get";
+ }
+
private void stackComponents(XsdComplexType complexType, List<XsdElement> elements,
List<XsdAttribute> attributes) throws JavaCodeGeneratorException {
if (complexType.getBase() != null) {
diff --git a/tests/resources/simple_type/Android.bp b/tests/resources/simple_type/Android.bp
index b6a681d..b4be8d4 100644
--- a/tests/resources/simple_type/Android.bp
+++ b/tests/resources/simple_type/Android.bp
@@ -8,6 +8,7 @@ xsd_config {
srcs: ["simple_type.xsd"],
package_name: "simple.type",
gen_writer: true,
+ boolean_getter: true,
}
xsd_config {
@@ -16,6 +17,7 @@ xsd_config {
package_name: "simple.type",
enums_only: true,
gen_writer: true,
+ boolean_getter: true,
}
xsd_config {
@@ -24,4 +26,5 @@ xsd_config {
package_name: "simple.type",
parser_only: true,
gen_writer: true,
+ boolean_getter: true,
}
diff --git a/tests/resources/simple_type/api/current.txt b/tests/resources/simple_type/api/current.txt
index 426a90d..0b163a5 100644
--- a/tests/resources/simple_type/api/current.txt
+++ b/tests/resources/simple_type/api/current.txt
@@ -20,6 +20,12 @@ package simple.type {
method public java.util.List<java.lang.Integer> getListInt();
method public java.util.List<java.lang.String> getUnionTest();
method public java.util.List<simple.type.EnumType> getYesOrNo();
+ method public boolean isExample1();
+ method public boolean isExample2();
+ method public boolean isExample3();
+ method public void setExample1(boolean);
+ method public void setExample2(boolean);
+ method public void setExample3(boolean);
method public void setListInt(java.util.List<java.lang.Integer>);
method public void setUnionTest(java.util.List<java.lang.String>);
}
diff --git a/tests/resources/simple_type/simple_type.xsd b/tests/resources/simple_type/simple_type.xsd
index 23a46b4..481c476 100644
--- a/tests/resources/simple_type/simple_type.xsd
+++ b/tests/resources/simple_type/simple_type.xsd
@@ -31,7 +31,10 @@
<xs:element name="listInt" type="restrictedInts"/>
<xs:element name="union-test" type="unionOfListAndInteger"/>
<xs:element name="yesOrNo" type="enumType" maxOccurs="2"/>
+ <xs:element name="example1" type="xs:boolean"/>
+ <xs:element name="example2" type="xs:boolean"/>
</xs:sequence>
+ <xs:attribute name="example3" type="xs:boolean"/>
</xs:complexType>
</xs:element>
<xs:element name="multi-choice">