summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sass/src/com/vaadin/sass/parser/LexicalUnitImpl.java2
-rw-r--r--sass/src/com/vaadin/sass/visitor/VariableVisitor.java31
-rw-r--r--tests/sass/resources/css/var-guarded.css4
-rw-r--r--tests/sass/resources/scss/var-guarded.scss8
-rw-r--r--tests/sass/src/com/vaadin/sass/testcases/scss/VariableGuarded.java36
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);
+ }
+}