From f8612c3d387ce90c1303740d6d91e0eb1a6e1cd4 Mon Sep 17 00:00:00 2001 From: Lauri Kotilainen Date: Fri, 5 May 2017 14:29:05 +0300 Subject: [PATCH] - Support interpolation in property names - Fixes #527 --- src/dotless.Core/Parser/Parsers.cs | 11 +++++++++++ src/dotless.Core/Parser/Tree/Rule.cs | 17 ++++++++++++++++- src/dotless.Test/Specs/VariablesFixture.cs | 16 ++++++++++++++++ 3 files changed, 43 insertions(+), 1 deletion(-) diff --git a/src/dotless.Core/Parser/Parsers.cs b/src/dotless.Core/Parser/Parsers.cs index 9a2235a9..8c6be6de 100644 --- a/src/dotless.Core/Parser/Parsers.cs +++ b/src/dotless.Core/Parser/Parsers.cs @@ -1202,11 +1202,18 @@ public Rule Rule(Parser parser) Variable variable = null; string name = Property(parser); + bool interpolatedName = false; if (string.IsNullOrEmpty(name)) { variable = Variable(parser); if (variable != null) { name = variable.Name; + } else { + var interpolation = InterpolatedVariable(parser); + if (interpolation != null) { + interpolatedName = true; + name = interpolation.Name; + } } } @@ -1251,6 +1258,10 @@ public Rule Rule(Parser parser) var rule = NodeProvider.Rule(name, value, parser.Tokenizer.GetNodeLocation(memo.TokenizerLocation.Index)); + if (interpolatedName) { + rule.InterpolatedName = true; + rule.Variable = false; + } rule.PostNameComments = postNameComments; PopComments(); return rule; diff --git a/src/dotless.Core/Parser/Tree/Rule.cs b/src/dotless.Core/Parser/Tree/Rule.cs index 3299a3e6..4c62e4f0 100644 --- a/src/dotless.Core/Parser/Tree/Rule.cs +++ b/src/dotless.Core/Parser/Tree/Rule.cs @@ -14,6 +14,7 @@ public class Rule : Node public NodeList PostNameComments { get; set; } public bool IsSemiColonRequired { get; set; } public bool Variadic { get; set; } + public bool InterpolatedName { get; set; } public Rule(string name, Node value) : this(name, value, false) { @@ -37,7 +38,7 @@ public override Node Evaluate(Env env) throw new ParsingException("No value found for rule " + Name, Location); } - var rule = new Rule(Name, Value.Evaluate(env)).ReducedFrom(this); + var rule = new Rule(EvaluateName(env), Value.Evaluate(env)).ReducedFrom(this); rule.IsSemiColonRequired = this.IsSemiColonRequired; rule.PostNameComments = this.PostNameComments; @@ -46,6 +47,20 @@ public override Node Evaluate(Env env) return rule; } + private string EvaluateName(Env env) { + if (!InterpolatedName) { + return Name; + } + + var evaluatedVariable = env.FindVariable(Name).Evaluate(env) as Rule; + var evaluatedValue = evaluatedVariable?.Value as Keyword; + if (evaluatedValue == null) { + throw new ParsingException("Invalid variable value for property name", Location); + } + + return evaluatedValue.ToCSS(env); + } + protected override Node CloneCore() { return new Rule(Name, Value.Clone(), Variadic) { IsSemiColonRequired = IsSemiColonRequired, diff --git a/src/dotless.Test/Specs/VariablesFixture.cs b/src/dotless.Test/Specs/VariablesFixture.cs index 75c446c4..d35ca461 100644 --- a/src/dotless.Test/Specs/VariablesFixture.cs +++ b/src/dotless.Test/Specs/VariablesFixture.cs @@ -541,5 +541,21 @@ public void IndirectRecursiveVariableDefinition() "; AssertLess(input, ""); } + + [Test] + public void VariableInterpolationInPropertyName() { + var input = @" +.test { + @var: color; + @{var}: red; +} +"; + + var expected = @" +.test { + color: red; +}"; + AssertLess(input, expected); + } } } \ No newline at end of file