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