Fixes complex property restriction in SDM.
Previously there was a bug in the restricting/releasing process of
temporarily modifying binding properties in SDM as it triggered compiles
customized for individual requesting browsers.
When releasing a restriction on a complex property that contained some
conditionals it would wipe out those conditionals with a single "all"
condition.
Change-Id: Ib593475fe62c1f860d141a275cbce2e8ceb46fde
diff --git a/dev/codeserver/java/com/google/gwt/dev/codeserver/Recompiler.java b/dev/codeserver/java/com/google/gwt/dev/codeserver/Recompiler.java
index 0e86063..ca42e9d 100644
--- a/dev/codeserver/java/com/google/gwt/dev/codeserver/Recompiler.java
+++ b/dev/codeserver/java/com/google/gwt/dev/codeserver/Recompiler.java
@@ -425,8 +425,7 @@
// Undo all permutation restriction customizations from previous compiles.
for (BindingProperty bindingProperty : moduleDef.getProperties().getBindingProperties()) {
- String[] allowedValues = bindingProperty.getAllowedValues(bindingProperty.getRootCondition());
- bindingProperty.setRootGeneratedValues(allowedValues);
+ bindingProperty.resetGeneratedValues();
}
// A snapshot of the module's configuration before we modified it.
diff --git a/dev/core/src/com/google/gwt/dev/cfg/BindingProperty.java b/dev/core/src/com/google/gwt/dev/cfg/BindingProperty.java
index a796c4c..9990506 100644
--- a/dev/core/src/com/google/gwt/dev/cfg/BindingProperty.java
+++ b/dev/core/src/com/google/gwt/dev/cfg/BindingProperty.java
@@ -325,6 +325,15 @@
return generatedValues.allConditionsHaveOneValue();
}
+ /**
+ * Undo any value restrictions that have been put in place specifically on the set of values used
+ * for code generation as opposed to being present in the actual module definition.
+ */
+ public void resetGeneratedValues() {
+ generatedValues.valueMap.clear();
+ generatedValues.valueMap.putAll(allowedValues.valueMap);
+ }
+
public void setFallback(String token) {
fallback = token;
}
diff --git a/user/test/com/google/gwt/dev/cfg/PropertyTest.java b/user/test/com/google/gwt/dev/cfg/PropertyTest.java
index 74cfce8..f7da7f2 100644
--- a/user/test/com/google/gwt/dev/cfg/PropertyTest.java
+++ b/user/test/com/google/gwt/dev/cfg/PropertyTest.java
@@ -25,6 +25,7 @@
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.Iterator;
+import java.util.List;
import java.util.Set;
/**
@@ -32,6 +33,14 @@
*/
public class PropertyTest extends TestCase {
+ private static int computePermutationCount(ModuleDef moduleDef) {
+ PropertyPermutations propertyPermutations =
+ new PropertyPermutations(moduleDef.getProperties(), moduleDef.getActiveLinkerNames());
+ List<PropertyPermutations> collapsePropertySets = propertyPermutations.collapseProperties();
+ int numPermutations = collapsePropertySets.size();
+ return numPermutations;
+ }
+
private static TreeLogger getRootLogger() {
PrintWriterTreeLogger logger = new PrintWriterTreeLogger(new PrintWriter(
System.err, true));
@@ -167,4 +176,26 @@
// OK
}
}
+
+ public void testRestrictAndReleaseProperty() throws UnableToCompleteException {
+ ModuleDef moduleDef = ModuleDefLoader.loadFromClassPath(getRootLogger(), new CompilerContext(),
+ getClass().getCanonicalName() + "2");
+ Properties properties = moduleDef.getProperties();
+
+ // Show that there are initially 7 combinations of form and ratio.
+ assertEquals(7, computePermutationCount(moduleDef));
+
+ // Restrict a simple property that contains no conditions.
+ properties.findBindingProp("form").setRootGeneratedValues("desktop");
+ assertEquals(3, computePermutationCount(moduleDef));
+
+ // Restrict a *complex* property that contains some conditions.
+ properties.findBindingProp("ratio").setRootGeneratedValues("widescreen");
+ assertEquals(1, computePermutationCount(moduleDef));
+
+ // Unrestrict both properties and show that the original permutation count is restored.
+ properties.findBindingProp("form").resetGeneratedValues();
+ properties.findBindingProp("ratio").resetGeneratedValues();
+ assertEquals(7, computePermutationCount(moduleDef));
+ }
}
diff --git a/user/test/com/google/gwt/dev/cfg/PropertyTest2.gwt.xml b/user/test/com/google/gwt/dev/cfg/PropertyTest2.gwt.xml
new file mode 100644
index 0000000..871facd
--- /dev/null
+++ b/user/test/com/google/gwt/dev/cfg/PropertyTest2.gwt.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- -->
+<!-- Copyright 2015 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 -->
+<!-- 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. License for the specific language governing permissions and -->
+<!-- limitations under the License. -->
+<module>
+ <define-property name="form" values="desktop,tablet,phone" />
+
+ <define-property name="ratio" values="normal,widescreen,theatre" />
+ <set-property name="ratio" value="normal,widescreen,theatre" />
+ <set-property name="ratio" value="theatre" >
+ <when-property-is name="form" value="phone" />
+ </set-property>
+</module>