From: Sebastian Nyholm Date: Thu, 15 Nov 2012 12:33:28 +0000 (+0200) Subject: (#10182) Rule order not preserved when using parent reference in sass X-Git-Tag: 7.0.0.beta10~81^2 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=refs%2Fchanges%2F77%2F277%2F1;p=vaadin-framework.git (#10182) Rule order not preserved when using parent reference in sass Change-Id: Ief701eef3a262c4fd0c14241c54b3d57cb858027 --- diff --git a/theme-compiler/src/com/vaadin/sass/ScssStylesheet.java b/theme-compiler/src/com/vaadin/sass/ScssStylesheet.java index 45578deb19..5f46844641 100644 --- a/theme-compiler/src/com/vaadin/sass/ScssStylesheet.java +++ b/theme-compiler/src/com/vaadin/sass/ScssStylesheet.java @@ -38,7 +38,6 @@ import com.vaadin.sass.tree.Node; import com.vaadin.sass.tree.VariableNode; import com.vaadin.sass.tree.controldirective.IfElseDefNode; import com.vaadin.sass.visitor.ImportNodeHandler; -import com.vaadin.sass.visitor.ParentSelectorHandler; public class ScssStylesheet extends Node { @@ -52,6 +51,8 @@ public class ScssStylesheet extends Node { private static final HashSet ifElseDefNodes = new HashSet(); + private static HashMap lastNodeAdded = new HashMap(); + private String fileName; /** @@ -130,7 +131,7 @@ public class ScssStylesheet extends Node { mixinDefs.clear(); variables.clear(); ifElseDefNodes.clear(); - ParentSelectorHandler.clear(); + lastNodeAdded.clear(); importOtherFiles(this); populateDefinitions(this); traverse(this); @@ -245,4 +246,8 @@ public class ScssStylesheet extends Node { return fileName; } + public static HashMap getLastNodeAdded() { + return lastNodeAdded; + } + } diff --git a/theme-compiler/src/com/vaadin/sass/visitor/BlockNodeHandler.java b/theme-compiler/src/com/vaadin/sass/visitor/BlockNodeHandler.java index d338cb0843..0d00fd2d0c 100644 --- a/theme-compiler/src/com/vaadin/sass/visitor/BlockNodeHandler.java +++ b/theme-compiler/src/com/vaadin/sass/visitor/BlockNodeHandler.java @@ -19,13 +19,12 @@ package com.vaadin.sass.visitor; import java.util.ArrayList; import java.util.HashMap; +import com.vaadin.sass.ScssStylesheet; import com.vaadin.sass.tree.BlockNode; import com.vaadin.sass.tree.Node; public class BlockNodeHandler { - private static HashMap lastNodeAdded = new HashMap(); - public static void traverse(BlockNode node) { Node parent = node.getParentNode(); @@ -61,6 +60,7 @@ public class BlockNodeHandler { } node.setSelectorList(newList); Node oldParent = node.getParentNode(); + HashMap lastNodeAdded = ScssStylesheet.getLastNodeAdded(); if (lastNodeAdded.get(oldParent) != null) { node.getParentNode().getParentNode() .appendChild(node, lastNodeAdded.get(oldParent)); diff --git a/theme-compiler/src/com/vaadin/sass/visitor/ParentSelectorHandler.java b/theme-compiler/src/com/vaadin/sass/visitor/ParentSelectorHandler.java index 4098cc7cad..cb7b0ac8a8 100644 --- a/theme-compiler/src/com/vaadin/sass/visitor/ParentSelectorHandler.java +++ b/theme-compiler/src/com/vaadin/sass/visitor/ParentSelectorHandler.java @@ -19,13 +19,12 @@ package com.vaadin.sass.visitor; import java.util.ArrayList; import java.util.HashMap; +import com.vaadin.sass.ScssStylesheet; import com.vaadin.sass.tree.BlockNode; import com.vaadin.sass.tree.Node; public class ParentSelectorHandler { - private static HashMap parentSelectors = new HashMap(); - public static void traverse(BlockNode block) throws Exception { Node parentNode = block.getParentNode(); if (parentNode instanceof BlockNode) { @@ -48,22 +47,20 @@ public class ParentSelectorHandler { if (isParentSelector) { block.setSelectorList(newList); Node oldparent = block.getParentNode(); - if (parentSelectors.containsKey(block.getParentNode())) { + HashMap lastNodeAdded = ScssStylesheet + .getLastNodeAdded(); + if (lastNodeAdded.containsKey(block.getParentNode())) { block.getParentNode() .getParentNode() .appendChild(block, - parentSelectors.get(block.getParentNode())); + lastNodeAdded.get(block.getParentNode())); } else { block.getParentNode().getParentNode() .appendChild(block, block.getParentNode()); } - parentSelectors.put(oldparent, block); + lastNodeAdded.put(oldparent, block); } } } - - public static void clear() { - parentSelectors.clear(); - } } diff --git a/theme-compiler/tests/resources/css/parent-selector.css b/theme-compiler/tests/resources/css/parent-selector.css index 0330782fbf..e7e37e92ab 100644 --- a/theme-compiler/tests/resources/css/parent-selector.css +++ b/theme-compiler/tests/resources/css/parent-selector.css @@ -3,6 +3,10 @@ a { text-decoration: none; } +a .sub { + color: blue; +} + a:hover { text-decoration: underline; } diff --git a/theme-compiler/tests/resources/scss/parent-selector.scss b/theme-compiler/tests/resources/scss/parent-selector.scss index ee02f8bf76..68f66a4a27 100644 --- a/theme-compiler/tests/resources/scss/parent-selector.scss +++ b/theme-compiler/tests/resources/scss/parent-selector.scss @@ -1,6 +1,9 @@ a { font-weight: bold; text-decoration: none; + .sub { + color: blue; + } &:hover { text-decoration: underline; } body.firefox & { font-weight: normal; } } diff --git a/theme-compiler/tests/src/com/vaadin/sass/testcases/scss/ParentSelector.java b/theme-compiler/tests/src/com/vaadin/sass/testcases/scss/ParentSelector.java index e1e1fee3b4..ebe62fd678 100644 --- a/theme-compiler/tests/src/com/vaadin/sass/testcases/scss/ParentSelector.java +++ b/theme-compiler/tests/src/com/vaadin/sass/testcases/scss/ParentSelector.java @@ -41,10 +41,10 @@ public class ParentSelector extends AbstractTestBase { parser.parseStyleSheet(getClass().getResource(scss).getPath()); ScssStylesheet root = handler.getStyleSheet(); BlockNode blockNode = (BlockNode) root.getChildren().get(0); - Assert.assertEquals(4, blockNode.getChildren().size()); - BlockNode nestedBlock1 = (BlockNode) blockNode.getChildren().get(2); + Assert.assertEquals(5, blockNode.getChildren().size()); + BlockNode nestedBlock1 = (BlockNode) blockNode.getChildren().get(3); Assert.assertEquals("&:hover", nestedBlock1.getSelectorList().get(0)); - BlockNode nestedBlock2 = (BlockNode) blockNode.getChildren().get(3); + BlockNode nestedBlock2 = (BlockNode) blockNode.getChildren().get(4); Assert.assertEquals("body.firefox &", nestedBlock2.getSelectorList() .get(0)); }