in src/Bicep.Core.IntegrationTests/CompileTimeImportTests.cs [945:1161]
public void Imported_function_symbols_with_a_lengthy_reference_chain_should_have_declarations_injected_into_compiled_template()
{
var result = CompilationHelper.Compile(
("main.bicep", """
import {foo} from 'mod.bicep'
var greeting = foo('friend')
"""),
("mod.bicep", """
import {bar} from 'mod2.bicep'
@export()
func foo(name nonEmptyString) nonEmptyString => bar(name)
@minLength(1)
type nonEmptyString = string
"""),
("mod2.bicep", """
import * as baz from 'mod3.bicep'
@export()
func bar(name nonEmptyString) nonEmptyString => baz.quux(name)
@minLength(1)
type nonEmptyString = string
"""),
("mod3.bicep", """
import {greet} from 'mod4.bicep'
@export()
func quux(name nonEmptyString) nonEmptyString => indirection(name)
func indirection(name nonEmptyString) nonEmptyString => greet(name)
@minLength(1)
type nonEmptyString = string
"""),
("mod4.bicep", """
import {nonEmptyString} from 'mod5.bicep'
@export()
func greet(name indirection) indirection => 'Hi, ${name}!'
type indirection = nonEmptyString
"""),
("mod5.bicep", """
@export()
@minLength(1)
type nonEmptyString = string
"""));
result.ExcludingLinterDiagnostics().Should().NotHaveAnyDiagnostics();
result.Template.Should().HaveValueAtPath("definitions", JToken.Parse($$"""
{
"_1.nonEmptyString": {
"type": "string",
"minLength": 1,
"metadata": {
"{{LanguageConstants.MetadataImportedFromPropertyName}}": {
"{{LanguageConstants.ImportMetadataSourceTemplatePropertyName}}": "mod.bicep"
}
}
},
"_2.nonEmptyString": {
"type": "string",
"minLength": 1,
"metadata": {
"{{LanguageConstants.MetadataImportedFromPropertyName}}": {
"{{LanguageConstants.ImportMetadataSourceTemplatePropertyName}}": "mod2.bicep"
}
}
},
"_3.nonEmptyString": {
"type": "string",
"minLength": 1,
"metadata": {
"{{LanguageConstants.MetadataImportedFromPropertyName}}": {
"{{LanguageConstants.ImportMetadataSourceTemplatePropertyName}}": "mod3.bicep"
}
}
},
"_4.indirection": {
"$ref": "#/definitions/_5.nonEmptyString",
"metadata": {
"{{LanguageConstants.MetadataImportedFromPropertyName}}": {
"{{LanguageConstants.ImportMetadataSourceTemplatePropertyName}}": "mod4.bicep"
}
}
},
"_5.nonEmptyString": {
"type": "string",
"minLength": 1,
"metadata": {
"{{LanguageConstants.MetadataImportedFromPropertyName}}": {
"{{LanguageConstants.ImportMetadataSourceTemplatePropertyName}}": "mod5.bicep"
}
}
},
}
"""));
result.Template.Should().HaveValueAtPath("functions", JToken.Parse($$"""
[
{
"namespace": "_2",
"members": {
"bar": {
"parameters": [
{
"$ref": "#/definitions/_2.nonEmptyString",
"name": "name"
}
],
"output": {
"$ref": "#/definitions/_2.nonEmptyString",
"value": "[_3.quux(parameters('name'))]"
},
"metadata": {
"{{LanguageConstants.MetadataImportedFromPropertyName}}": {
"{{LanguageConstants.ImportMetadataSourceTemplatePropertyName}}": "mod2.bicep"
}
}
}
}
},
{
"namespace": "__bicep",
"members": {
"foo": {
"parameters": [
{
"$ref": "#/definitions/_1.nonEmptyString",
"name": "name"
}
],
"output": {
"$ref": "#/definitions/_1.nonEmptyString",
"value": "[_2.bar(parameters('name'))]"
},
"metadata": {
"{{LanguageConstants.MetadataImportedFromPropertyName}}": {
"{{LanguageConstants.ImportMetadataSourceTemplatePropertyName}}": "mod.bicep"
}
}
}
}
},
{
"namespace": "_4",
"members": {
"greet": {
"parameters": [
{
"$ref": "#/definitions/_4.indirection",
"name": "name"
}
],
"output": {
"$ref": "#/definitions/_4.indirection",
"value": "[format('Hi, {0}!', parameters('name'))]"
},
"metadata": {
"{{LanguageConstants.MetadataImportedFromPropertyName}}": {
"{{LanguageConstants.ImportMetadataSourceTemplatePropertyName}}": "mod4.bicep"
}
}
}
}
},
{
"namespace": "_3",
"members": {
"indirection": {
"parameters": [
{
"$ref": "#/definitions/_3.nonEmptyString",
"name": "name"
}
],
"output": {
"$ref": "#/definitions/_3.nonEmptyString",
"value": "[_4.greet(parameters('name'))]"
},
"metadata": {
"{{LanguageConstants.MetadataImportedFromPropertyName}}": {
"{{LanguageConstants.ImportMetadataSourceTemplatePropertyName}}": "mod3.bicep"
}
}
},
"quux": {
"parameters": [
{
"$ref": "#/definitions/_3.nonEmptyString",
"name": "name"
}
],
"output": {
"$ref": "#/definitions/_3.nonEmptyString",
"value": "[_3.indirection(parameters('name'))]"
},
"metadata": {
"{{LanguageConstants.MetadataImportedFromPropertyName}}": {
"{{LanguageConstants.ImportMetadataSourceTemplatePropertyName}}": "mod3.bicep"
}
}
}
}
}
]
"""));
result.Template.Should().HaveValueAtPath("variables", JToken.Parse($$"""
{
"greeting": "[__bicep.foo('friend')]"
}
"""));
}