diff options
5 files changed, 71 insertions, 10 deletions
diff --git a/sass/src/com/vaadin/sass/parser/LexicalUnitImpl.java b/sass/src/com/vaadin/sass/parser/LexicalUnitImpl.java index e268da8ed5..a6b03a864c 100644 --- a/sass/src/com/vaadin/sass/parser/LexicalUnitImpl.java +++ b/sass/src/com/vaadin/sass/parser/LexicalUnitImpl.java @@ -357,7 +357,7 @@ public class LexicalUnitImpl implements LexicalUnit, SCSSLexicalUnit, dimension = another.getDimension(); sdimension = another.getSdimension(); s = another.getStringValue(); - fname = getFunctionName(); + fname = another.getFunctionName(); params = another.getParameters(); prev = another.getPreviousLexicalUnit(); LexicalUnit finalNextInAnother = another; diff --git a/sass/src/com/vaadin/sass/visitor/VariableVisitor.java b/sass/src/com/vaadin/sass/visitor/VariableVisitor.java index bb790a0aee..eb2e6a0b83 100644 --- a/sass/src/com/vaadin/sass/visitor/VariableVisitor.java +++ b/sass/src/com/vaadin/sass/visitor/VariableVisitor.java @@ -28,13 +28,20 @@ public class VariableVisitor implements Visitor { private void traverse(Node node, Map<String, LexicalUnitImpl> variables) { if (node instanceof RuleNode) { LexicalUnit value = ((RuleNode) node).getValue(); - updateValue(value, variables); + while (updateValue(value, variables)) { + ; + } } else { Set<Node> toBeDeleted = new HashSet<Node>(); for (Node child : node.getChildren()) { if (child instanceof VariableNode) { - variables.put(((VariableNode) child).getName(), - (LexicalUnitImpl) ((VariableNode) child).getExpr()); + VariableNode varChild = (VariableNode) child; + if (!varChild.isGuarded() || varChild.isGuarded() + && variables.get(varChild.getName()) == null) { + variables.put(((VariableNode) child).getName(), + (LexicalUnitImpl) ((VariableNode) child) + .getExpr()); + } toBeDeleted.add(child); } else { traverse(child, new HashMap<String, LexicalUnitImpl>( @@ -47,17 +54,22 @@ public class VariableVisitor implements Visitor { } } - private void updateValue(LexicalUnit value, + private boolean updateValue(LexicalUnit value, Map<String, LexicalUnitImpl> variables) { + boolean onceMore = false; if (value == null) { - return; + return false; } if (value.getLexicalUnitType() == SCSSLexicalUnit.SCSS_VARIABLE) { - LexicalUnitImpl variableValue = variables.get( - value.getStringValue()).clone(); + LexicalUnitImpl variableValue = variables.get(value + .getStringValue()); if (variableValue != null) { - LexicalUnitImpl lexVal = (LexicalUnitImpl) value; - lexVal.replaceValue(variableValue); + LexicalUnitImpl variableValueCloned = variableValue.clone(); + if (variableValueCloned != null) { + LexicalUnitImpl lexVal = (LexicalUnitImpl) value; + lexVal.replaceValue(variableValueCloned); + onceMore = true; + } } } else if (value.getLexicalUnitType() == SCSSLexicalUnit.SAC_FUNCTION) { LexicalUnit params = value.getParameters(); @@ -65,5 +77,6 @@ public class VariableVisitor implements Visitor { } LexicalUnit next = value.getNextLexicalUnit(); updateValue(next, variables); + return onceMore; } } diff --git a/tests/sass/resources/css/var-guarded.css b/tests/sass/resources/css/var-guarded.css new file mode 100644 index 0000000000..c4a8c49d12 --- /dev/null +++ b/tests/sass/resources/css/var-guarded.css @@ -0,0 +1,4 @@ +#main { + content: "First content"; + new-content: "First time reference"; +}
\ No newline at end of file diff --git a/tests/sass/resources/scss/var-guarded.scss b/tests/sass/resources/scss/var-guarded.scss new file mode 100644 index 0000000000..8f7aab8fa9 --- /dev/null +++ b/tests/sass/resources/scss/var-guarded.scss @@ -0,0 +1,8 @@ +$content: "First content"; +$content: "Second content?" !default; +$new_content: "First time reference" !default; + +#main { + content: $content; + new-content: $new_content; +}
\ No newline at end of file diff --git a/tests/sass/src/com/vaadin/sass/testcases/scss/VariableGuarded.java b/tests/sass/src/com/vaadin/sass/testcases/scss/VariableGuarded.java new file mode 100644 index 0000000000..2c37737e69 --- /dev/null +++ b/tests/sass/src/com/vaadin/sass/testcases/scss/VariableGuarded.java @@ -0,0 +1,36 @@ +package com.vaadin.sass.testcases.scss; + +import java.io.IOException; + +import junit.framework.Assert; + +import org.junit.Test; +import org.w3c.css.sac.CSSException; + +import com.vaadin.sass.AbstractTestBase; +import com.vaadin.sass.ScssStylesheet; +import com.vaadin.sass.handler.SCSSDocumentHandler; +import com.vaadin.sass.handler.SCSSDocumentHandlerImpl; +import com.vaadin.sass.parser.Parser; + +public class VariableGuarded extends AbstractTestBase { + String scss = "/scss/var-guarded.scss"; + String css = "/css/var-guarded.css"; + + @Test + public void testParser() throws CSSException, IOException { + Parser parser = new Parser(); + SCSSDocumentHandler handler = new SCSSDocumentHandlerImpl(); + parser.setDocumentHandler(handler); + parser.parseStyleSheet(getClass().getResource(scss).getPath()); + ScssStylesheet root = handler.getStyleSheet(); + Assert.assertEquals(4, root.getChildren().size()); + } + + @Test + public void testCompiler() throws Exception { + testCompiler(scss, css); + Assert.assertEquals("Original CSS and parsed CSS doesn't match", + comparisonCss, parsedScss); + } +} |