diff options
author | Marc Englund <marc@vaadin.com> | 2012-11-22 16:02:27 +0200 |
---|---|---|
committer | Marc Englund <marc@vaadin.com> | 2012-11-22 16:18:13 +0200 |
commit | b913ab2907b9976e9844d77bb15ff14ac612d870 (patch) | |
tree | ec028314e00689671efb8f2b41959a9f6d0c9a2e | |
parent | a071e06d1e9d4db6e73390f2e2de897744632d61 (diff) | |
download | vaadin-framework-b913ab2907b9976e9844d77bb15ff14ac612d870.tar.gz vaadin-framework-b913ab2907b9976e9844d77bb15ff14ac612d870.zip |
Warns and removes if parent reference '&' is used w/o parent, fixes #10327
Change-Id: I58eaf3f2acd27a7627c8df31e411a75fc4a48016
4 files changed, 37 insertions, 0 deletions
diff --git a/theme-compiler/src/com/vaadin/sass/ScssStylesheet.java b/theme-compiler/src/com/vaadin/sass/ScssStylesheet.java index 5f46844641..216b03edbe 100644 --- a/theme-compiler/src/com/vaadin/sass/ScssStylesheet.java +++ b/theme-compiler/src/com/vaadin/sass/ScssStylesheet.java @@ -23,6 +23,7 @@ import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; import java.util.Map; +import java.util.logging.Logger; import org.w3c.css.sac.CSSException; import org.w3c.css.sac.InputSource; @@ -250,4 +251,7 @@ public class ScssStylesheet extends Node { return lastNodeAdded; } + public static final void warning(String msg) { + Logger.getLogger(ScssStylesheet.class.getName()).warning(msg); + } } diff --git a/theme-compiler/src/com/vaadin/sass/visitor/BlockNodeHandler.java b/theme-compiler/src/com/vaadin/sass/visitor/BlockNodeHandler.java index d128da0b4b..f8f893b8fd 100644 --- a/theme-compiler/src/com/vaadin/sass/visitor/BlockNodeHandler.java +++ b/theme-compiler/src/com/vaadin/sass/visitor/BlockNodeHandler.java @@ -61,9 +61,34 @@ public class BlockNodeHandler { if (parent instanceof BlockNode) { combineParentSelectorListToChild(node); + + } else if (node.getSelectors().contains("&")) { + ScssStylesheet.warning("Base-level rule contains" + + " the parent-selector-referencing character '&';" + + " the character will be removed:\n" + node); + removeParentReference(node); } } + /** + * Goes through the selector list of the given BlockNode and removes the '&' + * character from the selectors. + * + * @param node + */ + private static void removeParentReference(BlockNode node) { + ArrayList<String> newList = new ArrayList<String>(); + for (String childSelector : node.getSelectorList()) { + // remove parent selector + if (childSelector.contains("&")) { + newList.add(childSelector.replace("&", "")); + } else { + newList.add(childSelector); + } + } + node.setSelectorList(newList); + } + private static void combineParentSelectorListToChild(BlockNode node) { ArrayList<String> newList = new ArrayList<String>(); BlockNode parentBlock = (BlockNode) node.getParentNode(); diff --git a/theme-compiler/tests/resources/css/parent-selector.css b/theme-compiler/tests/resources/css/parent-selector.css index 1aa389f593..2a73313f0c 100644 --- a/theme-compiler/tests/resources/css/parent-selector.css +++ b/theme-compiler/tests/resources/css/parent-selector.css @@ -41,4 +41,8 @@ body.firefox a { .root2 .part .one, .root2 .part .non-parent, .root2 .part2 .one, .root2 .part2 .non-parent { color: blue; +} + +.drop-parent-reference { + color: green; }
\ No newline at end of file diff --git a/theme-compiler/tests/resources/scss/parent-selector.scss b/theme-compiler/tests/resources/scss/parent-selector.scss index c0ef46afb3..74f0e15b9e 100644 --- a/theme-compiler/tests/resources/scss/parent-selector.scss +++ b/theme-compiler/tests/resources/scss/parent-selector.scss @@ -46,4 +46,8 @@ a { color: blue; } } +} + +&.drop-parent-reference { + color: green; }
\ No newline at end of file |