Unhandled exception. System.NotImplementedException: Cannot emit unexpected expression of type ResourceFunctionCallExpression
- Dominant language
- Bicep
- Stars
- 3.6k
- Forks
- 830
- Avg merge
- 1d 2h
- Merged PRs (30d)
- 79
Description
**Bicep version**
Bicep CLI version 0.28.1 (ba1e9f8c1e)
**Describe the bug**
When building the bicep template in which an existing KeyVault is used in order to retrieve secrets that are passed to a module via parameters, an exception with the following message: Unhandled exception. System.NotImplementedException: Cannot emit unexpected expression of type ResourceFunctionCallExpression is thrown.
**To Reproduce**
1. Define the module, for example the module in zipped attachment (for a deployment of APIM).
```bicep
@minLength(1)
@maxLength(50)
@description('Optional: The name of the API.')
param name string
@description('Mandatory: The location of the resource.')
param location string
@description('Optional: The URL and SSL certificate of the API management service. If not provided, the API management service will not have any custom URL.')
param customUrlInfo urlInfo?
@description('Optional: The URL and SSL certificate of the developer portal of the API management service. If not provided, the developer portal will not have any custom URL.')
param developerPortalUrlInfo urlInfo?
var proxyConfigurations = customUrlInfo != null ? [{
type: 'Proxy'
hostName: customUrlInfo!.url
encodedCertificate: customUrlInfo!.sslInfo.certificate
certificatePassword: customUrlInfo!.sslInfo.certificatePassword
}] : []
var portalConfigurations = developerPortalUrlInfo != null ? [{
type: 'DeveloperPortal'
hostName: developerPortalUrlInfo!.url
encodedCertificate: developerPortalUrlInfo!.sslInfo.certificate
certificatePassword: developerPortalUrlInfo!.sslInfo.certificatePassword
}] : []
var hostnameConfigurations = union(proxyConfigurations, portalConfigurations)
resource apim 'Microsoft.ApiManagement/service@2022-08-01' = {
name: name
location: location
sku: {
name: 'Developer'
capacity: 1
}
properties: {
publisherEmail: 'issue@github.com'
publisherName: 'Github'
hostnameConfigurations: hostnameConfigurations
virtualNetworkType: 'External'
disableGateway: false
natGatewayState: 'Disabled'
publicNetworkAccess: 'Disabled'
}
}
@description('The name of the API management service (APIM).')
output name string = apim.name
@description('The identifier of the service principal of the system-assigned managed identity of APIM.')
output principalId string = apim.identity.principalId
@export()
type urlInfo = {
url: string
sslInfo: certificateInfo
}
type certificateInfo = {
@secure()
@description('Base64 encoded certificate')
certificate: string
@secure()
certificatePassword: string
}
```
2. Use that module, for example the bicep template in zipped attachment.
```bicep
resource KeyVault 'Microsoft.KeyVault/vaults@2023-07-01' existing = {
#disable-next-line use-stable-resource-identifiers
name: 'some-existing-key-vault-deployment-name'
}
module APIM './minimal-apim.bicep' = {
name: 'some-apim-deployment-name'
params: {
name: 'some-apim-name'
location: 'some-location'
customUrlInfo: {
url: 'https://api-dev.github.com'
sslInfo: {
certificate: KeyVault.getSecret('api-dev.github.com-ssl-certificate')
certificatePassword: KeyVault.getSecret('api-dev.github.com-ssl-certificate-password')
}
}
developerPortalUrlInfo: {
url: 'https://apiportal-dev.github.com'
sslInfo: {
certificate: KeyVault.getSecret('apiportal-dev.github.com-ssl-certificate')
certificatePassword: KeyVault.getSecret('apiportal-dev.github.com-ssl-certificate')
}
}
}
}
output apim object = APIM.outputs
```
3. Execute the command az bicep build -f .bicep
**Additional context**
Exception with message and complete stacktrace:
```
Unhandled exception. System.NotImplementedException: Cannot emit unexpected expression of type ResourceFunctionCallExpression
at Bicep.Core.Emit.ExpressionConverter.ConvertExpression(Expression expression)
at Bicep.Core.Emit.ExpressionEmitter.EmitLanguageExpression(Expression expression)
at Bicep.Core.Emit.ExpressionEmitter.EmitExpression(Expression expression)
at Bicep.Core.Emit.ExpressionEmitter.<>c__DisplayClass22_0.b__0()
at Bicep.Core.Emit.PositionTrackingJsonTextWriter.WritePropertyWithPosition(IPositionable keyPosition, String name, Action valueFunc)
at Bicep.Core.Emit.ExpressionEmitter.EmitPropertyInternal(LanguageExpression expressionKey, Action valueFunc, IPositionable location, Boolean skipCopyCheck)
at Bicep.Core.Emit.ExpressionEmitter.EmitProperty(Expression name, Expression expression)
at Bicep.Core.Emit.ExpressionEmitter.EmitProperty(String name, Expression expression)
at Bicep.Core.Emit.ExpressionEmitter.EmitObjectProperties(ObjectExpression object)
at Bicep.Core.Emit.ExpressionEmitter.EmitExpression(Expression expression)
at Bicep.Core.Emit.ExpressionEmitter.<>c__DisplayClass22_0.b__0()
at Bicep.Core.Emit.PositionTrackingJsonTextWriter.WritePropertyWithPosition(IPositionable keyPosition, String name, Action valueFunc)
at Bicep.Core.Emit.ExpressionEmitter.EmitPropertyInternal(LanguageExpression expressionKey, Action valueFunc, IPositionable location, Boolean skipCopyCheck)
at Bicep.Core.Emit.ExpressionEmitter.EmitProperty(Expression name, Expression expression)
at Bicep.Core.Emit.ExpressionEmitter.EmitProperty(String name, Expression expression)
at Bicep.Core.Emit.ExpressionEmitter.EmitObjectProperties(ObjectExpression object)
at Bicep.Core.Emit.ExpressionEmitter.EmitExpression(Expression expression)
at Bicep.Core.Emit.ExpressionEmitter.<>c__DisplayClass22_0.b__0()
at Bicep.Core.Emit.PositionTrackingJsonTextWriter.WritePropertyWithPosition(IPositionable keyPosition, String name, Action valueFunc)
at Bicep.Core.Emit.ExpressionEmitter.EmitPropertyInternal(LanguageExpression expressionKey, Action valueFunc, IPositionable location, Boolean skipCopyCheck)
at Bicep.Core.Emit.ExpressionEmitter.EmitProperty(Expression name, Expression expression)
at Bicep.Core.Emit.ExpressionEmitter.EmitProperty(String name, Expression expression)
at Bicep.Core.Emit.ExpressionEmitter.EmitObjectProperties(ObjectExpression object)
at Bicep.Core.Emit.ExpressionEmitter.EmitExpression(Expression expression)
at Bicep.Core.Emit.ExpressionEmitter.<>c__DisplayClass22_0.b__0()
at Bicep.Core.Emit.PositionTrackingJsonTextWriter.WritePropertyWithPosition(IPositionable keyPosition, String name, Action valueFunc)
at Bicep.Core.Emit.ExpressionEmitter.EmitPropertyInternal(LanguageExpression expressionKey, Action valueFunc, IPositionable location, Boolean skipCopyCheck)
at Bicep.Core.Emit.ExpressionEmitter.EmitProperty(Expression name, Expression expression)
at Bicep.Core.Emit.ExpressionEmitter.EmitProperty(String name, Expression expression)
at Bicep.Core.Emit.TemplateWriter.<>c__DisplayClass67_0.b__0()
at Bicep.Core.Emit.PositionTrackingJsonTextWriter.WriteObjectWithPosition(IPositionable sourcePosition, Action propertiesFunc)
at Bicep.Core.Emit.ExpressionEmitter.EmitObject(Action writePropertiesFunc, IPositionable position)
at Bicep.Core.Emit.ExpressionEmitter.<>c__DisplayClass32_0.b__0()
at Bicep.Core.Emit.PositionTrackingJsonTextWriter.WritePropertyWithPosition(IPositionable keyPosition, String name, Action valueFunc)
at Bicep.Core.Emit.ExpressionEmitter.EmitProperty(String propertyName, Action writeValueFunc, IPositionable position)
at Bicep.Core.Emit.ExpressionEmitter.EmitObjectProperty(String propertyName, Action writePropertiesFunc, IPositionable position)
at Bicep.Core.Emit.TemplateWriter.EmitModuleParameters(ExpressionEmitter emitter, DeclaredModuleExpression module)
at Bicep.Core.Emit.TemplateWriter.<>c__DisplayClass68_0.b__2()
at Bicep.Core.Emit.PositionTrackingJsonTextWriter.WriteObjectWithPosition(IPositionable sourcePosition, Action propertiesFunc)
at Bicep.Core.Emit.ExpressionEmitter.EmitObject(Action writePropertiesFunc, IPositionable position)
at Bicep.Core.Emit.ExpressionEmitter.<>c__DisplayClass32_0.b__0()
at Bicep.Core.Emit.PositionTrackingJsonTextWriter.WritePropertyWithPosition(IPositionable keyPosition, String name, Action valueFunc)
at Bicep.Core.Emit.ExpressionEmitter.EmitProperty(String propertyName, Action writeValueFunc, IPositionable position)
at Bicep.Core.Emit.ExpressionEmitter.EmitObjectProperty(String propertyName, Action writePropertiesFunc, IPositionable position)
at Bicep.Core.Emit.TemplateWriter.<>c__DisplayClass68_0.b__0()
at Bicep.Core.Emit.PositionTrackingJsonTextWriter.WriteObjectWithPosition(IPositionable sourcePosition, Action propertiesFunc)
at Bicep.Core.Emit.ExpressionEmitter.EmitObject(Action writePropertiesFunc, IPositionable position)
at Bicep.Core.Emit.TemplateWriter.EmitModule(PositionTrackingJsonTextWriter jsonWriter, DeclaredModuleExpression module, ExpressionEmitter emitter)
at Bicep.Core.Emit.TemplateWriter.<>c__DisplayClass64_0.b__0()
at Bicep.Core.Emit.PositionTrackingJsonTextWriter.WriteArrayWithPosition(IPositionable sourcePosition, Action itemsFunc)
at Bicep.Core.Emit.ExpressionEmitter.EmitArray(Action writeItemsFunc, IPositionable position)
at Bicep.Core.Emit.ExpressionEmitter.<>c__DisplayClass33_0.b__0()
at Bicep.Core.Emit.PositionTrackingJsonTextWriter.WritePropertyWithPosition(IPositionable keyPosition, String name, Action valueFunc)
at Bicep.Core.Emit.ExpressionEmitter.EmitProperty(String propertyName, Action writeValueFunc, IPositionable position)
at Bicep.Core.Emit.ExpressionEmitter.EmitArrayProperty(String propertyName, Action writeItemsFunc, IPositionable position)
at Bicep.Core.Emit.TemplateWriter.EmitResources(PositionTrackingJsonTextWriter jsonWriter, ExpressionEmitter emitter, ImmutableArray`1 resources, ImmutableArray`1 modules)
at Bicep.Core.Emit.TemplateWriter.GenerateTemplateWithoutHash(PositionTrackingJsonTextWriter jsonWriter)
at Bicep.Core.Emit.TemplateWriter.Write(SourceAwareJsonTextWriter writer)
at Bicep.Core.Emit.TemplateEmitter.<>c__DisplayClass8_0.b__0()
at Bicep.Core.Emit.TemplateEmitter.EmitOrFail(Func`1 write)
at Bicep.Core.Emit.TemplateEmitter.Emit(TextWriter textWriter)
at Bicep.Core.Emit.CompilationEmitter.Template(SemanticModel model)
at Bicep.Core.Emit.CompilationEmitter.Template()
at Bicep.Cli.Services.OutputWriter.TemplateToFile(Compilation compilation, Uri outputUri)
at Bicep.Cli.Commands.BuildCommand.RunAsync(BuildArguments args)
at Bicep.Cli.Program.RunAsync(String[] args, CancellationToken cancellationToken)
at Bicep.Cli.Program.<>c__DisplayClass3_0.<b__0>d.MoveNext()
--- End of stack trace from previous location ---
at Bicep.Cli.Program.RunWithCancellationAsync(Func`2 runFunc)
at Bicep.Cli.Program.Main(String[] args)
at Bicep.Cli.Program.(String[] args)
```
Contributor guide
Research direction
Start by reproducing the failure with the shown `az bicep build` command and the minimal module templates. Read the `ExpressionConverter` and `TemplateWriter` paths in the stack trace, then verify that module parameters containing Key Vault `getSecret` calls emit successfully without the `ResourceFunctionCallExpression` exception.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- azure
- Domain
- build-system, cli, cloud
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100