Allow @defs with multiple values Review at http://gwt-code-reviews.appspot.com/1557803 Review by: rjrjr@google.com git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@10667 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/src/com/google/gwt/resources/rg/CssResourceGenerator.java b/user/src/com/google/gwt/resources/rg/CssResourceGenerator.java index 87e4e52..6baee52 100644 --- a/user/src/com/google/gwt/resources/rg/CssResourceGenerator.java +++ b/user/src/com/google/gwt/resources/rg/CssResourceGenerator.java
@@ -70,6 +70,7 @@ import com.google.gwt.resources.ext.ResourceContext; import com.google.gwt.resources.ext.ResourceGeneratorUtil; import com.google.gwt.resources.ext.SupportsGeneratorResultCaching; +import com.google.gwt.thirdparty.guava.common.base.Joiner; import com.google.gwt.user.rebind.SourceWriter; import com.google.gwt.user.rebind.StringSourceWriter; @@ -896,6 +897,11 @@ operableTypes); } + private boolean isReturnTypeString(JClassType classReturnType) { + return (classReturnType != null + && String.class.getName().equals(classReturnType.getQualifiedSourceName())); + } + /** * Check for the presence of the NotStrict annotation on the method. This will * also perform some limited sanity-checking for the now-deprecated Strict @@ -1079,21 +1085,21 @@ throw new UnableToCompleteException(); } - // TODO: Allow returning an array of values - if (def.getValues().size() != 1) { + JClassType classReturnType = toImplement.getReturnType().isClass(); + + if (def.getValues().size() != 1 && !isReturnTypeString(classReturnType)) { logger.log(TreeLogger.ERROR, "@def rule " + name - + " must define exactly one value"); + + " must define exactly one value or return type must be String"); throw new UnableToCompleteException(); } - NumberValue numberValue = def.getValues().get(0).isNumberValue(); - String returnExpr = ""; - JClassType classReturnType = toImplement.getReturnType().isClass(); - if (classReturnType != null - && "java.lang.String".equals(classReturnType.getQualifiedSourceName())) { - returnExpr = "\"" + Generator.escape(def.getValues().get(0).toString()) - + "\""; + if (isReturnTypeString(classReturnType)) { + List<String> returnValues = new ArrayList<String>(); + for (Value val : def.getValues()) { + returnValues.add(Generator.escape(val.toString())); + } + returnExpr = "\"" + Joiner.on(" ").join(returnValues) + "\""; } else { JPrimitiveType returnType = toImplement.getReturnType().isPrimitive(); if (returnType == null) { @@ -1102,6 +1108,7 @@ + "@def accessors"); throw new UnableToCompleteException(); } + NumberValue numberValue = def.getValues().get(0).isNumberValue(); if (returnType == JPrimitiveType.INT || returnType == JPrimitiveType.LONG) { returnExpr = "" + Math.round(numberValue.getValue()); } else if (returnType == JPrimitiveType.FLOAT) {
diff --git a/user/test/com/google/gwt/resources/client/CSSResourceTest.java b/user/test/com/google/gwt/resources/client/CSSResourceTest.java index 6b7e316..a5a9758 100644 --- a/user/test/com/google/gwt/resources/client/CSSResourceTest.java +++ b/user/test/com/google/gwt/resources/client/CSSResourceTest.java
@@ -60,6 +60,8 @@ float rawFloat(); int rawInt(); + + String multiValueBorderDef(); } /** @@ -362,6 +364,8 @@ assertNotNull(defines.overrideIntClass()); assertFalse("10px".equals(defines.overrideIntClass())); assertFalse("10".equals(defines.overrideIntClass())); + + assertEquals("1px solid rgba(0,0,0,0.2)", defines.multiValueBorderDef()); } public void testEnsureInjected() {
diff --git a/user/test/com/google/gwt/resources/client/deftest.css b/user/test/com/google/gwt/resources/client/deftest.css index f168b53..65a845e 100644 --- a/user/test/com/google/gwt/resources/client/deftest.css +++ b/user/test/com/google/gwt/resources/client/deftest.css
@@ -27,6 +27,8 @@ @def lengthString 100px; @def colorString #f00; + @def multiValueBorderDef 1px solid rgba(0,0,0,0.2); + /* Uncomment this, and you should get an error about a @def shadowing a name */ /* .colorString { @@ -41,5 +43,3 @@ .overrideInt { width: 10px; } - - \ No newline at end of file