diff options
author | Marc Englund <marc@vaadin.com> | 2012-10-04 15:46:02 +0300 |
---|---|---|
committer | Marc Englund <marc@vaadin.com> | 2012-10-04 15:46:02 +0300 |
commit | c380ecbe45dbb507e12f5cf22c72313229e66530 (patch) | |
tree | 67d91903f56c40713b2b47aef8a8dab8b9841848 /theme-compiler/src/com/vaadin/sass/visitor | |
parent | 98318862015078a756e3a37ef709eecf7012cdfd (diff) | |
download | vaadin-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.java | 50 |
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); |