diff options
author | Sundong Ahn <sundongahn@google.com> | 2021-04-09 02:28:51 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2021-04-09 02:28:51 +0000 |
commit | ef91229d0910ad8709e14b5f15dea5b52fbf5c44 (patch) | |
tree | 1ac831266423e11de19d81a67af1b95ec70b0a4c | |
parent | fe3b6e5ca6d4b79950992046a7d55011cca9f459 (diff) | |
parent | 6ad9f7928a5eb35529a4f65a8dc601a8b1cf1695 (diff) | |
download | xsdc-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.go | 7 | ||||
-rw-r--r-- | src/com/android/xsdc/Main.java | 11 | ||||
-rw-r--r-- | src/com/android/xsdc/cpp/CppCodeGenerator.java | 30 | ||||
-rw-r--r-- | src/com/android/xsdc/java/JavaCodeGenerator.java | 24 | ||||
-rw-r--r-- | tests/resources/simple_type/Android.bp | 3 | ||||
-rw-r--r-- | tests/resources/simple_type/api/current.txt | 6 | ||||
-rw-r--r-- | tests/resources/simple_type/simple_type.xsd | 3 |
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"> |