Revision: 7442
Author: [email protected]
Date: Fri Jan 22 06:04:56 2010
Log: Merge tr...@7441 to add support to CssResource for unknown at-rules.

http://code.google.com/p/google-web-toolkit/source/detail?r=7442

Added:
/releases/2.0/user/src/com/google/gwt/resources/css/ast/CssUnknownAtRule.java
 /releases/2.0/user/test/com/google/gwt/resources/css/UnknownAtRuleTest.java
 /releases/2.0/user/test/com/google/gwt/resources/css/unknownAtRule.css
Modified:
 /releases/2.0/branch-info.txt
/releases/2.0/user/src/com/google/gwt/resources/css/CssGenerationVisitor.java
 /releases/2.0/user/src/com/google/gwt/resources/css/GenerateCssAst.java
 /releases/2.0/user/src/com/google/gwt/resources/css/ast/CssNodeCloner.java
 /releases/2.0/user/src/com/google/gwt/resources/css/ast/CssVisitor.java
 /releases/2.0/user/test/com/google/gwt/resources/ResourcesSuite.java
 /releases/2.0/user/test/com/google/gwt/resources/client/test.css

=======================================
--- /dev/null
+++ /releases/2.0/user/src/com/google/gwt/resources/css/ast/CssUnknownAtRule.java Fri Jan 22 06:04:56 2010
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.google.gwt.resources.css.ast;
+
+/**
+ * Represents a CSS at-rule that CssResource is unable to process.
+ */
+public class CssUnknownAtRule extends CssNode {
+
+  private final String rule;
+
+  public CssUnknownAtRule(String rule) {
+    this.rule = rule;
+  }
+
+  /**
+   * Returns the entire unprocessed at-rule declaration.
+   */
+  public String getRule() {
+    return rule;
+  }
+
+  public void traverse(CssVisitor visitor, Context context) {
+    if (visitor.visit(this, context)) {
+      // Do nothing
+    }
+    visitor.endVisit(this, context);
+  }
+}
=======================================
--- /dev/null
+++ /releases/2.0/user/test/com/google/gwt/resources/css/UnknownAtRuleTest.java Fri Jan 22 06:04:56 2010
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.google.gwt.resources.css;
+
+import com.google.gwt.core.ext.TreeLogger;
+import com.google.gwt.core.ext.UnableToCompleteException;
+import com.google.gwt.dev.util.DefaultTextOutput;
+import com.google.gwt.dev.util.TextOutput;
+import com.google.gwt.resources.css.ast.CssNode;
+import com.google.gwt.resources.css.ast.CssStylesheet;
+import com.google.gwt.resources.css.ast.CssUnknownAtRule;
+
+import junit.framework.TestCase;
+
+import java.util.List;
+
+/**
+ * Tests how CssResource handles stylesheets with unknown at-rules.
+ */
+public class UnknownAtRuleTest extends TestCase {
+ private static final String COMPLEX = "@complex {\n with: arbitrary;\n stuff: inside;\n}";
+  private static final String EXTENDED = "@-extended-ident {\n  \n}";
+  private static final String SIMPLE = "@simple;";
+
+  public void test() throws UnableToCompleteException {
+    CssStylesheet sheet = GenerateCssAst.exec(TreeLogger.NULL,
+        getClass().getClassLoader().getResource(
+            "com/google/gwt/resources/css/unknownAtRule.css"));
+
+    List<CssNode> nodes = sheet.getNodes();
+    assertEquals(3, nodes.size());
+    assertEquals(SIMPLE, ((CssUnknownAtRule) nodes.get(0)).getRule());
+    assertEquals(COMPLEX, ((CssUnknownAtRule) nodes.get(1)).getRule());
+    assertEquals(EXTENDED, ((CssUnknownAtRule) nodes.get(2)).getRule());
+
+    TextOutput out = new DefaultTextOutput(true);
+    CssGenerationVisitor v = new CssGenerationVisitor(out);
+    v.accept(sheet);
+
+    assertEquals(SIMPLE + COMPLEX + EXTENDED, out.toString());
+  }
+}
=======================================
--- /dev/null
+++ /releases/2.0/user/test/com/google/gwt/resources/css/unknownAtRule.css Fri Jan 22 06:04:56 2010
@@ -0,0 +1,8 @@
+...@simple;
+...@complex {
+  with: arbitrary;
+  stuff: inside;
+}
+...@-extended-ident {
+  /* This should be dropped */
+}
=======================================
--- /releases/2.0/branch-info.txt       Tue Jan 19 13:57:56 2010
+++ /releases/2.0/branch-info.txt       Fri Jan 22 06:04:56 2010
@@ -1274,3 +1274,8 @@
 tr...@7432 was merged into this branch
   IntPairAttributeParser now actually parses
svn merge --ignore-ancestry -c 7432 http://google-web-toolkit.googlecode.com/svn/trunk .
+
+tr...@7441 was merged into this branch with a minor conflict
+  Add support to CssResource for unknown at-rules.
+ svn merge -c 7441 --ignore-ancestry https://google-web-toolkit.googlecode.com/svn/trunk
+
=======================================
--- /releases/2.0/user/src/com/google/gwt/resources/css/CssGenerationVisitor.java Tue Nov 10 10:32:15 2009 +++ /releases/2.0/user/src/com/google/gwt/resources/css/CssGenerationVisitor.java Fri Jan 22 06:04:56 2010
@@ -29,6 +29,7 @@
 import com.google.gwt.resources.css.ast.CssRule;
 import com.google.gwt.resources.css.ast.CssSelector;
 import com.google.gwt.resources.css.ast.CssSprite;
+import com.google.gwt.resources.css.ast.CssUnknownAtRule;
 import com.google.gwt.resources.css.ast.CssUrl;
 import com.google.gwt.resources.css.ast.CssVisitor;

@@ -108,6 +109,12 @@
       closeBrace();
     }
   }
+
+  @Override
+  public void endVisit(CssUnknownAtRule x, Context ctx) {
+    out.printOpt("/* Unknown at-rule */\n");
+    out.print(x.getRule());
+  }

   public SortedMap<Integer, List<CssNode>> getSubstitutionPositions() {
     return substitutionPositions;
=======================================
--- /releases/2.0/user/src/com/google/gwt/resources/css/GenerateCssAst.java Tue Jan 19 06:59:10 2010 +++ /releases/2.0/user/src/com/google/gwt/resources/css/GenerateCssAst.java Fri Jan 22 06:04:56 2010
@@ -30,6 +30,7 @@
 import com.google.gwt.resources.css.ast.CssSelector;
 import com.google.gwt.resources.css.ast.CssSprite;
 import com.google.gwt.resources.css.ast.CssStylesheet;
+import com.google.gwt.resources.css.ast.CssUnknownAtRule;
 import com.google.gwt.resources.css.ast.CssUrl;
 import com.google.gwt.resources.css.ast.HasNodes;
 import com.google.gwt.resources.css.ast.HasProperties;
@@ -236,15 +237,22 @@
      * Reflectively invoke a method named parseRule on this instance.
      */
     public void ignorableAtRule(String atRule) throws CSSException {
-      String ruleName = atRule.substring(1, atRule.indexOf(" "));
+      int idx = atRule.indexOf(" ");
+      if (idx == -1) {
+        // Empty rule like @foo;
+        addNode(new CssUnknownAtRule(atRule));
+        return;
+      }
+      String ruleName = atRule.substring(1, idx);
String methodName = "parse" + (Character.toUpperCase(ruleName.charAt(0)))
-          + ruleName.substring(1);
+          + ruleName.substring(1).toLowerCase();
       try {
         Method parseMethod = getClass().getDeclaredMethod(methodName,
             String.class);
         parseMethod.invoke(this, atRule);
       } catch (NoSuchMethodException e) {
-        errors.log(TreeLogger.WARN, "Ignoring @" + ruleName);
+        // A rule like @-webkit-keyframe {...} that we can't process
+        addNode(new CssUnknownAtRule(atRule));
       } catch (IllegalAccessException e) {
         errors.log(TreeLogger.ERROR, "Unable to invoke parse method ", e);
       } catch (InvocationTargetException e) {
=======================================
--- /releases/2.0/user/src/com/google/gwt/resources/css/ast/CssNodeCloner.java Tue Jan 19 06:47:00 2010 +++ /releases/2.0/user/src/com/google/gwt/resources/css/ast/CssNodeCloner.java Fri Jan 22 06:04:56 2010
@@ -246,6 +246,13 @@
     addToNodes(newUrl);
     return true;
   }
+
+  @Override
+  public boolean visit(CssUnknownAtRule x, Context ctx) {
+    CssUnknownAtRule newRule = new CssUnknownAtRule(x.getRule());
+    addToNodes(newRule);
+    return true;
+  }

   /**
    * Add a cloned node instance to the output.
=======================================
--- /releases/2.0/user/src/com/google/gwt/resources/css/ast/CssVisitor.java Wed Nov 4 06:59:39 2009 +++ /releases/2.0/user/src/com/google/gwt/resources/css/ast/CssVisitor.java Fri Jan 22 06:04:56 2010
@@ -153,6 +153,13 @@
    */
   public void endVisit(CssUrl x, Context ctx) {
   }
+
+  /**
+   * @param x the node being visited
+   * @param ctx the context for the visit
+   */
+  public void endVisit(CssUnknownAtRule x, Context ctx) {
+  }

   /**
    * @param x the node being visited
@@ -270,6 +277,15 @@
   public boolean visit(CssUrl x, Context ctx) {
     return true;
   }
+
+  /**
+   * @param x the node being visited
+   * @param ctx the context for the visit
+   * @return
+   */
+  public boolean visit(CssUnknownAtRule x, Context ctx) {
+    return true;
+  }

   protected void doAccept(List<? extends CssNode> list) {
     for (CssNode node : list) {
=======================================
--- /releases/2.0/user/test/com/google/gwt/resources/ResourcesSuite.java Tue Jan 19 06:47:00 2010 +++ /releases/2.0/user/test/com/google/gwt/resources/ResourcesSuite.java Fri Jan 22 06:04:56 2010
@@ -25,6 +25,7 @@
 import com.google.gwt.resources.css.CssReorderTest;
 import com.google.gwt.resources.css.CssRtlTest;
 import com.google.gwt.resources.css.ExtractClassNamesVisitorTest;
+import com.google.gwt.resources.css.UnknownAtRuleTest;
 import com.google.gwt.resources.ext.ResourceGeneratorUtilTest;

 import junit.framework.Test;
@@ -46,7 +47,7 @@
     suite.addTestSuite(NestedBundleTest.class);
     suite.addTestSuite(ResourceGeneratorUtilTest.class);
     suite.addTestSuite(TextResourceTest.class);
-
+    suite.addTestSuite(UnknownAtRuleTest.class);
     return suite;
   }
 }
=======================================
--- /releases/2.0/user/test/com/google/gwt/resources/client/test.css Tue Jan 19 06:59:10 2010 +++ /releases/2.0/user/test/com/google/gwt/resources/client/test.css Fri Jan 22 06:04:56 2010
@@ -221,3 +221,8 @@
 /* The @external parser attempts to be flexible */
 @external externalA, .externalB externalC;
 .externalA .replacement, .externalB, .externalC {border: GREEN;}
+
+/* Check unknown at-rules */
+...@dontignorethis;
+...@dontignorethis { /* the space between the name and the { is important */ }
+...@dontignorethistoo{ some { random : content } }

--
http://groups.google.com/group/Google-Web-Toolkit-Contributors

Reply via email to