Skip to content

Commit

Permalink
Ensure implicit extensions are output
Browse files Browse the repository at this point in the history
  • Loading branch information
anthony-c-martin committed Jan 31, 2025
1 parent 1f5e087 commit 935301a
Show file tree
Hide file tree
Showing 7 changed files with 64 additions and 16 deletions.
38 changes: 38 additions & 0 deletions src/Bicep.Core.IntegrationTests/ExtensionRegistryTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -722,4 +722,42 @@ extension foo

result.Should().GenerateATemplate();
}

[TestMethod]
public async Task Implicit_extensions_are_included_in_output()
{
// https://github.com/Azure/bicep/issues/15395
var fileSystem = new MockFileSystem();
var services = await ExtensionTestHelper.GetServiceBuilderWithPublishedExtension(ThirdPartyTypeHelper.GetTestTypesTgz(), AllFeaturesEnabled, fileSystem);

fileSystem.File.WriteAllText("/bicepconfig.json", """
{
"extensions": {
"foo": "br:example.azurecr.io/extensions/foo:1.2.3"
},
"implicitExtensions": ["foo"],
"experimentalFeaturesEnabled": {
"extensibility": true
}
}
""");
var result = await CompilationHelper.RestoreAndCompile(services, """
resource fooRes 'fooType@v1' = {
identifier: 'foo'
properties: {
required: 'bar'
}
}
""");

result.Should().GenerateATemplate();
result.Template.Should().HaveJsonAtPath("$.imports", """
{
"foo": {
"provider": "ThirdPartyExtension",
"version": "1.0.0"
}
}
""");
}
}
10 changes: 5 additions & 5 deletions src/Bicep.Core/Emit/TemplateWriter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1021,7 +1021,7 @@ private void EmitVariablesIfPresent(ExpressionEmitter emitter, IEnumerable<Decla
});
}

private void EmitExtensionsIfPresent(ExpressionEmitter emitter, ImmutableArray<DeclaredExtensionExpression> extensions)
private void EmitExtensionsIfPresent(ExpressionEmitter emitter, ImmutableArray<ExtensionExpression> extensions)
{
if (!extensions.Any())
{
Expand All @@ -1043,7 +1043,7 @@ private void EmitExtensionsIfPresent(ExpressionEmitter emitter, ImmutableArray<D
}
}

private static void EmitProviders(ExpressionEmitter emitter, ImmutableArray<DeclaredExtensionExpression> extensions)
private static void EmitProviders(ExpressionEmitter emitter, ImmutableArray<ExtensionExpression> extensions)
{
emitter.EmitObjectProperty("imports", () =>
{
Expand All @@ -1064,7 +1064,7 @@ private static void EmitProviders(ExpressionEmitter emitter, ImmutableArray<Decl
});
}

private static void EmitExtensions(ExpressionEmitter emitter, ImmutableArray<DeclaredExtensionExpression> extensions)
private static void EmitExtensions(ExpressionEmitter emitter, ImmutableArray<ExtensionExpression> extensions)
{
emitter.EmitObjectProperty("extensions", () =>
{
Expand All @@ -1084,7 +1084,7 @@ private static void EmitExtensions(ExpressionEmitter emitter, ImmutableArray<Dec
});
}

private static void EmitExtensionConfig(DeclaredExtensionExpression extension, ExpressionEmitter emitter)
private static void EmitExtensionConfig(ExtensionExpression extension, ExpressionEmitter emitter)
{
if (extension.Config is null)
{
Expand Down Expand Up @@ -1159,7 +1159,7 @@ private static TypeSymbol GetExtensionConfigType(string configName, ObjectType c
throw new UnreachableException($"Configuration name: '{configName}' does not exist as part of extension configuration.");
}

private DeclaredExtensionExpression GetExtensionForLocalDeploy()
private ExtensionExpression GetExtensionForLocalDeploy()
{
return new(
null,
Expand Down
6 changes: 3 additions & 3 deletions src/Bicep.Core/Intermediate/Expression.cs
Original file line number Diff line number Diff line change
Expand Up @@ -387,7 +387,7 @@ public override void Accept(IExpressionVisitor visitor)
protected override object? GetDebugAttributes() => new { Name };
}

public record DeclaredExtensionExpression(
public record ExtensionExpression(
SyntaxBase? SourceSyntax,
string Name,
NamespaceSettings Settings,
Expand All @@ -396,7 +396,7 @@ public record DeclaredExtensionExpression(
) : DescribableExpression(SourceSyntax, Description)
{
public override void Accept(IExpressionVisitor visitor)
=> visitor.VisitDeclaredExtensionExpression(this);
=> visitor.VisitExtensionExpression(this);

protected override object? GetDebugAttributes() => new { Name };
}
Expand Down Expand Up @@ -525,7 +525,7 @@ public override void Accept(IExpressionVisitor visitor)
public record ProgramExpression(
SyntaxBase? SourceSyntax,
ImmutableArray<DeclaredMetadataExpression> Metadata,
ImmutableArray<DeclaredExtensionExpression> Extensions,
ImmutableArray<ExtensionExpression> Extensions,
ImmutableArray<DeclaredTypeExpression> Types,
ImmutableArray<DeclaredParameterExpression> Parameters,
ImmutableArray<DeclaredVariableExpression> Variables,
Expand Down
18 changes: 14 additions & 4 deletions src/Bicep.Core/Intermediate/ExpressionBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -169,7 +169,7 @@ private Expression ConvertWithoutLowering(SyntaxBase syntax)

case ExtensionDeclarationSyntax extension:
var symbol = GetDeclaredSymbol<ExtensionNamespaceSymbol>(extension);
return EvaluateDecorators(extension, new DeclaredExtensionExpression(
return EvaluateDecorators(extension, new ExtensionExpression(
extension,
symbol.Name,
GetTypeInfo<NamespaceType>(extension).Settings,
Expand Down Expand Up @@ -448,9 +448,19 @@ private ProgramExpression ConvertProgram(ProgramSyntax syntax)
.OfType<DeclaredMetadataExpression>()
.ToImmutableArray();

var extensions = Context.SemanticModel.Root.ExtensionDeclarations
var declaredExtensions = Context.SemanticModel.Root.ExtensionDeclarations
.Select(x => ConvertWithoutLowering(x.DeclaringSyntax))
.OfType<DeclaredExtensionExpression>()
.OfType<ExtensionExpression>()
.ToImmutableArray();

var implicitExtension = Context.SemanticModel.Binder.NamespaceResolver.ImplicitNamespaces
.Select(x => x.Value.TryGetNamespaceType())
.WhereNotNull()
.Where(x =>
// The 'az' and 'sys' namespaces do not utilize the extensibility contract and do not need to be emitted in the template
!LanguageConstants.IdentifierComparer.Equals(x.Settings.BicepExtensionName, SystemNamespaceType.BuiltInName) &&
!LanguageConstants.IdentifierComparer.Equals(x.Settings.BicepExtensionName, AzNamespaceType.BuiltInName))
.Select(x => new ExtensionExpression(null, x.Name, x.Settings, null))
.ToImmutableArray();

var typeDefinitions = Context.SemanticModel.Root.TypeDeclarations
Expand Down Expand Up @@ -502,7 +512,7 @@ private ProgramExpression ConvertProgram(ProgramSyntax syntax)
return new ProgramExpression(
syntax,
metadataArray,
extensions,
[.. declaredExtensions, .. implicitExtension],
typeDefinitions,
parameters,
functionVariables.AddRange(variables),
Expand Down
4 changes: 2 additions & 2 deletions src/Bicep.Core/Intermediate/ExpressionRewriteVisitor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -246,8 +246,8 @@ public virtual Expression ReplaceDeclaredMetadataExpression(DeclaredMetadataExpr
return hasChanges ? expression with { Value = value, Description = description } : expression;
}

void IExpressionVisitor.VisitDeclaredExtensionExpression(DeclaredExtensionExpression expression) => ReplaceCurrent(expression, ReplaceDeclaredExtensionExpression);
public virtual Expression ReplaceDeclaredExtensionExpression(DeclaredExtensionExpression expression)
void IExpressionVisitor.VisitExtensionExpression(ExtensionExpression expression) => ReplaceCurrent(expression, ReplaceExtensionExpression);
public virtual Expression ReplaceExtensionExpression(ExtensionExpression expression)
{
var hasChanges =
TryRewrite(expression.Config, out var config) |
Expand Down
2 changes: 1 addition & 1 deletion src/Bicep.Core/Intermediate/ExpressionVisitor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,7 @@ private void VisitDescribableExpression(DescribableExpression expression)
Visit(expression.Description);
}

public virtual void VisitDeclaredExtensionExpression(DeclaredExtensionExpression expression)
public virtual void VisitExtensionExpression(ExtensionExpression expression)
{
VisitDescribableExpression(expression);
Visit(expression.Config);
Expand Down
2 changes: 1 addition & 1 deletion src/Bicep.Core/Intermediate/IExpressionVisitor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ public interface IExpressionVisitor

void VisitDeclaredMetadataExpression(DeclaredMetadataExpression expression);

void VisitDeclaredExtensionExpression(DeclaredExtensionExpression expression);
void VisitExtensionExpression(ExtensionExpression expression);

void VisitDeclaredParameterExpression(DeclaredParameterExpression expression);

Expand Down

0 comments on commit 935301a

Please sign in to comment.