summaryrefslogtreecommitdiffstats
path: root/theme-compiler/src/com/vaadin/sass/visitor
diff options
context:
space:
mode:
authorMarc Englund <marc@vaadin.com>2012-10-04 15:46:02 +0300
committerMarc Englund <marc@vaadin.com>2012-10-04 15:46:02 +0300
commitc380ecbe45dbb507e12f5cf22c72313229e66530 (patch)
tree67d91903f56c40713b2b47aef8a8dab8b9841848 /theme-compiler/src/com/vaadin/sass/visitor
parent98318862015078a756e3a37ef709eecf7012cdfd (diff)
downloadvaadin-framework-c380ecbe45dbb507e12f5cf22c72313229e66530.tar.gz
vaadin-framework-c380ecbe45dbb507e12f5cf22c72313229e66530.zip
Partial fix for sass mixins with multiple optional params #9846 (author: seba)
Change-Id: Iacd94ffb41a91e9dd20874cd7f981830e4267a87
Diffstat (limited to 'theme-compiler/src/com/vaadin/sass/visitor')
-rw-r--r--theme-compiler/src/com/vaadin/sass/visitor/MixinVisitor.java50
1 files changed, 44 insertions, 6 deletions
diff --git a/theme-compiler/src/com/vaadin/sass/visitor/MixinVisitor.java b/theme-compiler/src/com/vaadin/sass/visitor/MixinVisitor.java
index bf1fb65ae3..fecc717437 100644
--- a/theme-compiler/src/com/vaadin/sass/visitor/MixinVisitor.java
+++ b/theme-compiler/src/com/vaadin/sass/visitor/MixinVisitor.java
@@ -25,6 +25,7 @@ import com.vaadin.sass.tree.IVariableNode;
import com.vaadin.sass.tree.MixinDefNode;
import com.vaadin.sass.tree.MixinNode;
import com.vaadin.sass.tree.Node;
+import com.vaadin.sass.tree.VariableNode;
import com.vaadin.sass.util.DeepCopy;
public class MixinVisitor implements Visitor {
@@ -78,12 +79,7 @@ public class MixinVisitor implements Visitor {
MixinDefNode defClone = (MixinDefNode) DeepCopy.copy(mixinDef);
- int i = 0;
- for (final LexicalUnitImpl unit : mixinNode.getArglist()) {
- defClone.getArglist().get(i)
- .setExpr((LexicalUnitImpl) DeepCopy.copy(unit));
- i++;
- }
+ replacePossibleArguments(mixinNode, defClone);
Node previous = mixinNode;
for (final Node child : defClone.getChildren()) {
@@ -102,6 +98,48 @@ public class MixinVisitor implements Visitor {
current.removeChild(mixinNode);
}
+ /**
+ * We have to replace all the mixin parameters. This is done in two phases.
+ * First phase replaces all the named parameters while the second replaces
+ * in order of remaining unmodified parameters.
+ *
+ * @param mixinNode
+ * @param def
+ */
+ private void replacePossibleArguments(MixinNode mixinNode, MixinDefNode def) {
+
+ if (mixinNode.getArglist().size() > 0) {
+ ArrayList<VariableNode> remainingNodes = new ArrayList<VariableNode>(
+ def.getArglist());
+ ArrayList<LexicalUnitImpl> remainingUnits = new ArrayList<LexicalUnitImpl>(
+ mixinNode.getArglist());
+
+ for (final LexicalUnitImpl unit : mixinNode.getArglist()) {
+ if (unit.getLexicalUnitType() == LexicalUnitImpl.SCSS_VARIABLE
+ && unit.getNextLexicalUnit() != null) {
+ for (final VariableNode node : def.getArglist()) {
+ if (node.getName().equals(unit.getValue().toString())) {
+ node.setExpr((LexicalUnitImpl) DeepCopy.copy(unit
+ .getNextLexicalUnit()));
+ remainingNodes.remove(node);
+ remainingUnits.remove(unit);
+ break;
+ }
+ }
+ }
+ }
+
+ int i = 0;
+ for (final LexicalUnitImpl unit : remainingUnits) {
+ remainingNodes.get(i).setExpr(
+ (LexicalUnitImpl) DeepCopy.copy(unit));
+ i++;
+ }
+
+ }
+
+ }
+
private void replaceChildVariables(MixinDefNode mixinDef, Node node) {
for (final Node child : node.getChildren()) {
replaceChildVariables(mixinDef, child);