From ed12060c3da708d4a0d766af98e4cc2b64659a5c Mon Sep 17 00:00:00 2001 From: Anthony Martin <38542602+anthony-c-martin@users.noreply.github.com> Date: Thu, 4 Jan 2024 17:29:42 -0500 Subject: [PATCH] use-resource-symbol-reference linter rule: detect .name access as well as .id --- .../UseResourceSymbolReferenceRuleTests.cs | 15 +++++++++++++++ .../Rules/UseResourceSymbolReferenceRule.cs | 2 +- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/Bicep.Core.UnitTests/Diagnostics/LinterRuleTests/UseResourceSymbolReferenceRuleTests.cs b/src/Bicep.Core.UnitTests/Diagnostics/LinterRuleTests/UseResourceSymbolReferenceRuleTests.cs index 91714292934..c0f2d6784c5 100644 --- a/src/Bicep.Core.UnitTests/Diagnostics/LinterRuleTests/UseResourceSymbolReferenceRuleTests.cs +++ b/src/Bicep.Core.UnitTests/Diagnostics/LinterRuleTests/UseResourceSymbolReferenceRuleTests.cs @@ -27,6 +27,21 @@ public void Codefix_handles_list_functions_with_reference_based_id_and_apiversio name: 'stgName' } +var blah = stg.listKeys().keys +"); + + [TestMethod] + public void Codefix_handles_list_functions_with_reference_based_name_and_apiversion() => AssertCodeFix(@" +resource stg 'Microsoft.Storage/storageAccounts@2022-09-01' existing = { + name: 'stgName' +} + +var blah = listKe|ys(stg.name, stg.apiVersion).keys +", @" +resource stg 'Microsoft.Storage/storageAccounts@2022-09-01' existing = { + name: 'stgName' +} + var blah = stg.listKeys().keys "); diff --git a/src/Bicep.Core/Analyzers/Linter/Rules/UseResourceSymbolReferenceRule.cs b/src/Bicep.Core/Analyzers/Linter/Rules/UseResourceSymbolReferenceRule.cs index 878e7c12bea..81acc34772e 100644 --- a/src/Bicep.Core/Analyzers/Linter/Rules/UseResourceSymbolReferenceRule.cs +++ b/src/Bicep.Core/Analyzers/Linter/Rules/UseResourceSymbolReferenceRule.cs @@ -60,7 +60,7 @@ public override IEnumerable AnalyzeInternal(SemanticModel model, Di private IEnumerable AnalyzeResourceId(SemanticModel model, SyntaxBase syntax) { if (syntax is PropertyAccessSyntax idProp && - idProp.PropertyName.NameEquals("id") && + (idProp.PropertyName.NameEquals("id") || idProp.PropertyName.NameEquals("name")) && model.ResourceMetadata.TryLookup(idProp.BaseExpression) is DeclaredResourceMetadata idResource) { yield return idResource;