Skip to content

Commit

Permalink
Fix for issue 13663
Browse files Browse the repository at this point in the history
  • Loading branch information
anthony-c-martin committed Mar 20, 2024
1 parent 96f6c3a commit 1c122c2
Show file tree
Hide file tree
Showing 2 changed files with 49 additions and 3 deletions.
33 changes: 33 additions & 0 deletions src/Bicep.Core.IntegrationTests/ScenarioTests.cs
Expand Up @@ -5950,4 +5950,37 @@ public void Distinction_between_empty_and_untyped_objects_should_survive_compila
("BCP037", DiagnosticLevel.Warning, """The property "snap" is not allowed on objects of type "{ }". No other properties are allowed."""),
});
}

// https://github.com/Azure/bicep/issues/13663
[TestMethod]
public void Test_Issue13663()
{
var moduleResult = CompilationHelper.Compile("""
type moduleTags = {
*: string
}

@export()
func genModuleTags(moduleName string) moduleTags => {
'${contains(moduleName, 'name') ? 'name' : 'noName '} name': moduleName
}
""");

var result = CompilationHelper.Compile(
("main.bicep", """
import * as sharedTypes from 'compiled.json'

var moduleTags = sharedTypes.genModuleTags('name')

output moduleTags object = moduleTags
"""),
("compiled.json", moduleResult.Template!.ToString()));

var evaluated = TemplateEvaluator.Evaluate(result.Template);

evaluated.Should().HaveValueAtPath("$.outputs['moduleTags'].value", new JObject
{
["name name"] = "name",
});
}
}
Expand Up @@ -409,6 +409,21 @@ private Expression ConvertToVariableValue(string originalName)

private Expression ConvertToExpression(IReadOnlyDictionary<JToken, LanguageExpression> parsedExpressions, JToken toConvert)
{
ObjectPropertyExpression convertObjectProperty(JProperty property)
{
// The ExpressionsEngine.ParseLanguageExpressionsRecursive method represent key name lookups
// by storing the JProperty, rather than the key string.
var key = parsedExpressions.TryGetValue(property, out var keyExpression) ?
ConvertToExpression(keyExpression) :
ConvertToExpression(parsedExpressions, property.Name);

return new(
sourceSyntax,
key,
ConvertToExpression(parsedExpressions, property.Value));
}


if (parsedExpressions.TryGetValue(toConvert, out var armExpression))
{
return ConvertToExpression(armExpression);
Expand All @@ -417,9 +432,7 @@ private Expression ConvertToExpression(IReadOnlyDictionary<JToken, LanguageExpre
return toConvert switch
{
JObject objectToCovert => ExpressionFactory.CreateObject(
objectToCovert.Properties().Select(jProperty => new ObjectPropertyExpression(sourceSyntax,
ConvertToExpression(parsedExpressions, jProperty.Name),
ConvertToExpression(parsedExpressions, jProperty.Value))),
objectToCovert.Properties().Select(convertObjectProperty),
sourceSyntax),
JArray arrayToConvert => ExpressionFactory.CreateArray(
arrayToConvert.Select(item => ConvertToExpression(parsedExpressions, item)),
Expand Down

0 comments on commit 1c122c2

Please sign in to comment.