diff --git a/src/Bicep.Core.IntegrationTests/ExistingResourceTests.cs b/src/Bicep.Core.IntegrationTests/ExistingResourceTests.cs deleted file mode 100644 index 77056ec2386..00000000000 --- a/src/Bicep.Core.IntegrationTests/ExistingResourceTests.cs +++ /dev/null @@ -1,401 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -using System.Diagnostics.CodeAnalysis; -using Bicep.Core.UnitTests; -using Bicep.Core.UnitTests.Assertions; -using Bicep.Core.UnitTests.Utils; -using FluentAssertions; -using Microsoft.VisualStudio.TestTools.UnitTesting; -using Microsoft.WindowsAzure.ResourceStack.Common.Json; -using Newtonsoft.Json.Linq; - -namespace Bicep.Core.IntegrationTests; - -[TestClass] -public class ExistingResourceTests -{ - [NotNull] - public TestContext? TestContext { get; set; } - - [TestMethod] - public void Implicit_dependencies_on_existing_resources_are_reflected_in_symbolic_name_template() - { - var result = CompilationHelper.Compile( - new ServiceBuilder().WithFeatureOverrides(new(SymbolicNameCodegenEnabled: true)), - """ - resource deployedSa 'Microsoft.Storage/storageAccounts@2023-05-01' = { - name: 'account1' - location: resourceGroup().location - sku: { - name: 'Standard_LRS' - } - kind: 'StorageV2' - } - - resource existingSa 'Microsoft.Storage/storageAccounts@2023-05-01' existing = { - name: replace(deployedSa.name, '1', '2') - } - - resource newSa 'Microsoft.Storage/storageAccounts@2023-05-01' = { - name: 'account3' - location: resourceGroup().location - sku: { - name: 'Standard_LRS' - } - kind: 'StorageV2' - properties: { - allowSharedKeyAccess: existingSa.properties.allowSharedKeyAccess - } - } - """); - - result.ExcludingLinterDiagnostics().Should().NotHaveAnyDiagnostics(); - result.Template.Should().HaveJsonAtPath("$.resources.newSa.dependsOn", """["existingSa"]"""); - result.Template.Should().HaveJsonAtPath("$.resources.existingSa.dependsOn", """["deployedSa"]"""); - } - - [TestMethod] - public void Explicit_dependencies_on_existing_resources_are_reflected_in_symbolic_name_template() - { - var result = CompilationHelper.Compile( - new ServiceBuilder().WithFeatureOverrides(new(SymbolicNameCodegenEnabled: true)), - """ - resource deployedSa 'Microsoft.Storage/storageAccounts@2023-05-01' = { - name: 'account1' - location: resourceGroup().location - sku: { - name: 'Standard_LRS' - } - kind: 'StorageV2' - } - - resource existingSa 'Microsoft.Storage/storageAccounts@2023-05-01' existing = { - name: replace(deployedSa.name, '1', '2') - } - - resource newSa 'Microsoft.Storage/storageAccounts@2023-05-01' = { - name: 'account3' - location: resourceGroup().location - sku: { - name: 'Standard_LRS' - } - kind: 'StorageV2' - dependsOn: [ - existingSa - ] - } - """); - - result.ExcludingLinterDiagnostics().Should().NotHaveAnyDiagnostics(); - result.Template.Should().HaveJsonAtPath("$.resources.newSa.dependsOn", """["existingSa"]"""); - result.Template.Should().HaveJsonAtPath("$.resources.existingSa.dependsOn", """["deployedSa"]"""); - } - - [TestMethod] - public void Implicit_dependencies_on_existing_resources_are_expressed_as_direct_dependencies_on_transitive_dependencies_in_non_symbolic_name_template() - { - var result = CompilationHelper.Compile( - new ServiceBuilder().WithFeatureOverrides(new(SymbolicNameCodegenEnabled: false)), - """ - resource deployedSa 'Microsoft.Storage/storageAccounts@2023-05-01' = { - name: 'account1' - location: resourceGroup().location - sku: { - name: 'Standard_LRS' - } - kind: 'StorageV2' - } - - resource existingSa 'Microsoft.Storage/storageAccounts@2023-05-01' existing = { - name: replace(deployedSa.name, '1', '2') - } - - resource newSa 'Microsoft.Storage/storageAccounts@2023-05-01' = { - name: 'account3' - location: resourceGroup().location - sku: { - name: 'Standard_LRS' - } - kind: 'StorageV2' - properties: { - allowSharedKeyAccess: existingSa.properties.allowSharedKeyAccess - } - } - """); - - result.ExcludingLinterDiagnostics().Should().NotHaveAnyDiagnostics(); - result.Template.GetProperty("resources").Should().BeOfType() - .Subject.Count.Should().Be(2); - result.Template.Should().HaveJsonAtPath("$.resources[1].dependsOn", """["[resourceId('Microsoft.Storage/storageAccounts', 'account1')]"]"""); - } - - [TestMethod] - public void Explicit_dependencies_on_existing_resources_are_expressed_as_direct_dependencies_on_transitive_dependencies_in_non_symbolic_name_template() - { - var result = CompilationHelper.Compile( - new ServiceBuilder().WithFeatureOverrides(new(SymbolicNameCodegenEnabled: false)), - """ - resource deployedSa 'Microsoft.Storage/storageAccounts@2023-05-01' = { - name: 'account1' - location: resourceGroup().location - sku: { - name: 'Standard_LRS' - } - kind: 'StorageV2' - } - - resource existingSa 'Microsoft.Storage/storageAccounts@2023-05-01' existing = { - name: replace(deployedSa.name, '1', '2') - } - - resource newSa 'Microsoft.Storage/storageAccounts@2023-05-01' = { - name: 'account3' - location: resourceGroup().location - sku: { - name: 'Standard_LRS' - } - kind: 'StorageV2' - dependsOn: [ - existingSa - ] - } - """); - - result.ExcludingLinterDiagnostics().Should().NotHaveAnyDiagnostics(); - result.Template.GetProperty("resources").Should().BeOfType() - .Subject.Count.Should().Be(2); - result.Template.Should().HaveJsonAtPath("$.resources[1].dependsOn", """["[resourceId('Microsoft.Storage/storageAccounts', 'account1')]"]"""); - } - - [TestMethod] - public void Implicit_dependencies_on_deployed_resource_identifying_properties_are_expressed_in_symbolic_name_template() - { - var result = CompilationHelper.Compile( - new ServiceBuilder().WithFeatureOverrides(new(SymbolicNameCodegenEnabled: true)), - """ - resource deployedSa 'Microsoft.Storage/storageAccounts@2023-05-01' = { - name: 'account1' - location: resourceGroup().location - sku: { - name: 'Standard_LRS' - } - kind: 'StorageV2' - } - - resource secondDeployedSa 'Microsoft.Storage/storageAccounts@2023-05-01' = { - name: replace(deployedSa.name, '1', '2') - location: resourceGroup().location - sku: { - name: 'Standard_LRS' - } - kind: 'StorageV2' - } - - resource newSa 'Microsoft.Storage/storageAccounts@2023-05-01' = { - name: replace(secondDeployedSa.name, '2', '3') - location: resourceGroup().location - sku: { - name: 'Standard_LRS' - } - kind: 'StorageV2' - } - """); - - result.ExcludingLinterDiagnostics().Should().NotHaveAnyDiagnostics(); - result.Template.Should().HaveJsonAtPath("$.resources.newSa.dependsOn", """["secondDeployedSa"]"""); - result.Template.Should().HaveJsonAtPath("$.resources.secondDeployedSa.dependsOn", """["deployedSa"]"""); - } - - [DataTestMethod] - [DataRow(true)] - [DataRow(false)] - public void Implicit_dependencies_on_existing_resource_identifying_properties_are_expressed_as_direct_dependencies_on_transitive_dependencies_in_symbolic_name_template(bool useArrayAccess) - { - var result = CompilationHelper.Compile( - new ServiceBuilder().WithFeatureOverrides(new(SymbolicNameCodegenEnabled: true)), - $$""" - resource deployedSa 'Microsoft.Storage/storageAccounts@2023-05-01' = { - name: 'account1' - location: resourceGroup().location - sku: { - name: 'Standard_LRS' - } - kind: 'StorageV2' - } - - resource existingSa 'Microsoft.Storage/storageAccounts@2023-05-01' existing = { - name: replace(deployedSa.name, '1', '2') - } - - resource newSa 'Microsoft.Storage/storageAccounts@2023-05-01' = { - name: 'account3' - location: resourceGroup().location - sku: { - name: 'Standard_LRS' - } - kind: 'StorageV2' - properties: { - allowSharedKeyAccess: bool(existingSa{{(useArrayAccess ? "['name']" : ".name")}}) - } - } - """); - - result.ExcludingLinterDiagnostics().Should().NotHaveAnyDiagnostics(); - result.Template.Should().HaveJsonAtPath("$.resources.newSa.dependsOn", """["deployedSa"]"""); - result.Template.Should().HaveJsonAtPath("$.resources.existingSa.dependsOn", """["deployedSa"]"""); - } - - [DataTestMethod] - [DataRow(true)] - [DataRow(false)] - public void Implicit_dependencies_on_existing_resource_collection_identifying_properties_are_expressed_as_direct_dependencies_on_transitive_dependencies_in_symbolic_name_template(bool useArrayAccess) - { - var result = CompilationHelper.Compile( - new ServiceBuilder().WithFeatureOverrides(new(SymbolicNameCodegenEnabled: true)), - $$""" - resource deployedSa 'Microsoft.Storage/storageAccounts@2023-05-01' = { - name: 'account1' - location: resourceGroup().location - sku: { - name: 'Standard_LRS' - } - kind: 'StorageV2' - } - - resource existingSa 'Microsoft.Storage/storageAccounts@2023-05-01' existing = [for i in range(0, 1): { - name: '${replace(deployedSa.name, '1', '2')}_${i}' - }] - - resource newSa 'Microsoft.Storage/storageAccounts@2023-05-01' = { - name: 'account3' - location: resourceGroup().location - sku: { - name: 'Standard_LRS' - } - kind: 'StorageV2' - properties: { - allowSharedKeyAccess: bool(existingSa[0]{{(useArrayAccess ? "['name']" : ".name")}}) - } - } - """); - - result.ExcludingLinterDiagnostics().Should().NotHaveAnyDiagnostics(); - result.Template.Should().HaveJsonAtPath("$.resources.newSa.dependsOn", """["deployedSa"]"""); - result.Template.Should().HaveJsonAtPath("$.resources.existingSa.dependsOn", """["deployedSa"]"""); - } - - [TestMethod] - public void Existing_resource_function_calls_are_expressed_as_direct_dependencies_on_transitive_dependencies_in_symbolic_name_template() - { - var result = CompilationHelper.Compile( - new ServiceBuilder().WithFeatureOverrides(new(SymbolicNameCodegenEnabled: true)), - """ - resource deployedSa 'Microsoft.Storage/storageAccounts@2023-05-01' = { - name: 'account1' - location: resourceGroup().location - sku: { - name: 'Standard_LRS' - } - kind: 'StorageV2' - } - - resource existingSa 'Microsoft.Storage/storageAccounts@2023-05-01' existing = { - name: replace(deployedSa.name, '1', '2') - } - - resource newSa 'Microsoft.Storage/storageAccounts@2023-05-01' = { - name: 'account3' - location: resourceGroup().location - sku: { - name: 'Standard_LRS' - } - kind: 'StorageV2' - properties: { - allowSharedKeyAccess: !empty(existingSa.listKeys().keys) - } - } - """); - - result.ExcludingLinterDiagnostics().Should().NotHaveAnyDiagnostics(); - result.Template.Should().HaveJsonAtPath("$.resources.newSa.dependsOn", """["deployedSa"]"""); - result.Template.Should().HaveJsonAtPath("$.resources.existingSa.dependsOn", """["deployedSa"]"""); - } - - [TestMethod] - public void Existing_resource_collection_function_calls_are_expressed_as_direct_dependencies_on_transitive_dependencies_in_symbolic_name_template() - { - var result = CompilationHelper.Compile( - new ServiceBuilder().WithFeatureOverrides(new(SymbolicNameCodegenEnabled: true)), - """ - resource deployedSa 'Microsoft.Storage/storageAccounts@2023-05-01' = { - name: 'account1' - location: resourceGroup().location - sku: { - name: 'Standard_LRS' - } - kind: 'StorageV2' - } - - resource existingSa 'Microsoft.Storage/storageAccounts@2023-05-01' existing = [for i in range(0, 1): { - name: '${replace(deployedSa.name, '1', '2')}_${i}' - }] - - resource newSa 'Microsoft.Storage/storageAccounts@2023-05-01' = { - name: 'account3' - location: resourceGroup().location - sku: { - name: 'Standard_LRS' - } - kind: 'StorageV2' - properties: { - allowSharedKeyAccess: !empty(existingSa[0].listKeys().keys) - } - } - """); - - result.ExcludingLinterDiagnostics().Should().NotHaveAnyDiagnostics(); - result.Template.Should().HaveJsonAtPath("$.resources.newSa.dependsOn", """["deployedSa"]"""); - result.Template.Should().HaveJsonAtPath("$.resources.existingSa.dependsOn", """["deployedSa"]"""); - } - - [TestMethod] - public void Using_an_existing_resource_as_an_explicit_parent_does_not_generate_an_explicit_dependency() - { - var result = CompilationHelper.Compile( - new ServiceBuilder().WithFeatureOverrides(new(SymbolicNameCodegenEnabled: true)), - """ - resource virtualNetwork 'Microsoft.Network/virtualNetworks@2020-08-01' existing = { - name: 'vnet' - } - - resource subnet 'Microsoft.Network/virtualNetworks/subnets@2020-08-01' existing = { - parent: virtualNetwork - name: 'subnet' - } - - resource sa 'Microsoft.Storage/storageAccounts@2023-05-01' = { - name: 'storage' - location: resourceGroup().location - sku: { - name: 'Standard_LRS' - } - kind: 'StorageV2' - properties: { - networkAcls: { - defaultAction: 'Deny' - virtualNetworkRules: [ - { - action: 'Allow' - id: subnet.id - } - ] - } - } - } - """); - - result.ExcludingLinterDiagnostics().Should().NotHaveAnyDiagnostics(); - result.Template.Should().NotHaveValueAtPath("$.resources.sa.dependsOn"); - } -} diff --git a/src/Bicep.Core.IntegrationTests/ScenarioTests.cs b/src/Bicep.Core.IntegrationTests/ScenarioTests.cs index d344ed8957b..34ce8c6b160 100644 --- a/src/Bicep.Core.IntegrationTests/ScenarioTests.cs +++ b/src/Bicep.Core.IntegrationTests/ScenarioTests.cs @@ -5065,7 +5065,7 @@ public void Test_Issue10343() ")); var evaluated = TemplateEvaluator.Evaluate(result.Template); - evaluated.Should().HaveValueAtPath("resources.foo3.dependsOn", new JArray("foo1")); + evaluated.Should().HaveValueAtPath("resources.foo3.dependsOn", new JArray("foo2")); } // https://github.com/Azure/bicep/issues/11292 @@ -6315,7 +6315,7 @@ public void Test_Issue13596(bool enableSymbolicNameCodegen) if (enableSymbolicNameCodegen) { - result.Template.Should().HaveJsonAtPath("$.resources.secret.dependsOn", """["mod"]"""); + result.Template.Should().HaveJsonAtPath("$.resources.secret.dependsOn", """["sa"]"""); } else { diff --git a/src/Bicep.Core.Samples/Files/baselines/Modules_CRLF/main.symbolicnames.json b/src/Bicep.Core.Samples/Files/baselines/Modules_CRLF/main.symbolicnames.json index d7d45d40a31..3e017187bf6 100644 --- a/src/Bicep.Core.Samples/Files/baselines/Modules_CRLF/main.symbolicnames.json +++ b/src/Bicep.Core.Samples/Files/baselines/Modules_CRLF/main.symbolicnames.json @@ -6,7 +6,7 @@ "_generator": { "name": "bicep", "version": "dev", - "templateHash": "14846102413726496336" + "templateHash": "12632249060210513106" } }, "parameters": { @@ -1851,7 +1851,10 @@ } } } - } + }, + "dependsOn": [ + "kv" + ] }, "secureModule2": { "type": "Microsoft.Resources/deployments", @@ -1909,7 +1912,10 @@ } } } - } + }, + "dependsOn": [ + "scopedKv" + ] }, "secureModuleLooped": { "copy": { @@ -1971,7 +1977,11 @@ } } } - } + }, + "dependsOn": [ + "[format('loopedKv[{0}]', copyIndex())]", + "[format('loopedKv[{0}]', copyIndex())]" + ] }, "secureModuleCondition": { "type": "Microsoft.Resources/deployments", @@ -2014,7 +2024,10 @@ } } } - } + }, + "dependsOn": [ + "kv" + ] }, "withSpace": { "type": "Microsoft.Resources/deployments", diff --git a/src/Bicep.Core.Samples/Files/baselines/NestedResources_LF/main.symbolicnames.json b/src/Bicep.Core.Samples/Files/baselines/NestedResources_LF/main.symbolicnames.json index 64df58ab467..22c63d37b0d 100644 --- a/src/Bicep.Core.Samples/Files/baselines/NestedResources_LF/main.symbolicnames.json +++ b/src/Bicep.Core.Samples/Files/baselines/NestedResources_LF/main.symbolicnames.json @@ -6,7 +6,7 @@ "_generator": { "name": "bicep", "version": "dev", - "templateHash": "236868819280717113" + "templateHash": "16972434704035043060" } }, "parameters": { @@ -71,13 +71,19 @@ "properties": { "size": "[reference('existingParent').size]", "style": "[reference('existingParent::existingChild').style]" - } + }, + "dependsOn": [ + "existingParent::existingChild" + ] }, "existingParent::existingChild": { "existing": true, "type": "My.Rp/parentType/childType", "apiVersion": "2020-12-01", - "name": "[format('{0}/{1}', 'existingParent', 'existingChild')]" + "name": "[format('{0}/{1}', 'existingParent', 'existingChild')]", + "dependsOn": [ + "existingParent" + ] }, "conditionParent::conditionChild::conditionGrandchild": { "condition": "[and(and(parameters('createParent'), parameters('createChild')), parameters('createGrandchild'))]", diff --git a/src/Bicep.Core.Samples/Files/baselines/Resources_CRLF/main.symbolicnames.json b/src/Bicep.Core.Samples/Files/baselines/Resources_CRLF/main.symbolicnames.json index 8d3119402ef..661a30a1688 100644 --- a/src/Bicep.Core.Samples/Files/baselines/Resources_CRLF/main.symbolicnames.json +++ b/src/Bicep.Core.Samples/Files/baselines/Resources_CRLF/main.symbolicnames.json @@ -6,7 +6,7 @@ "_generator": { "name": "bicep", "version": "dev", - "templateHash": "15062227467638827925" + "templateHash": "12953345672979673276" } }, "parameters": { @@ -665,7 +665,10 @@ "p3_child1": { "type": "Microsoft.Rp1/resource1/child1", "apiVersion": "2020-06-01", - "name": "[format('{0}/{1}', 'res1', 'child1')]" + "name": "[format('{0}/{1}', 'res1', 'child1')]", + "dependsOn": [ + "p3_res1" + ] }, "p4_res1": { "existing": true, @@ -679,7 +682,10 @@ "type": "Microsoft.Rp1/resource1/child1", "apiVersion": "2020-06-01", "scope": "/", - "name": "[format('{0}/{1}', 'res1', 'child1')]" + "name": "[format('{0}/{1}', 'res1', 'child1')]", + "dependsOn": [ + "p4_res1" + ] }, "sqlServer": { "type": "Microsoft.Sql/servers", diff --git a/src/Bicep.Core.Samples/Files/user_submitted/101/api-management-modular/NameValues.symbolicnames.json b/src/Bicep.Core.Samples/Files/user_submitted/101/api-management-modular/NameValues.symbolicnames.json index 845c44692a8..60c427e12e0 100644 --- a/src/Bicep.Core.Samples/Files/user_submitted/101/api-management-modular/NameValues.symbolicnames.json +++ b/src/Bicep.Core.Samples/Files/user_submitted/101/api-management-modular/NameValues.symbolicnames.json @@ -6,7 +6,7 @@ "_generator": { "name": "bicep", "version": "dev", - "templateHash": "14248540637091011874" + "templateHash": "11528852364160566097" } }, "parameters": { @@ -56,7 +56,10 @@ "secret": "[variables('apimNameValueSet')[copyIndex()].isSecret]", "value": "[variables('apimNameValueSet')[copyIndex()].value]", "tags": "[variables('apimNameValueSet')[copyIndex()].tags]" - } + }, + "dependsOn": [ + "parentAPIM" + ] } }, "outputs": { diff --git a/src/Bicep.Core.Samples/Files/user_submitted/101/api-management-modular/groups.symbolicnames.json b/src/Bicep.Core.Samples/Files/user_submitted/101/api-management-modular/groups.symbolicnames.json index 19d32e018c7..881398951c6 100644 --- a/src/Bicep.Core.Samples/Files/user_submitted/101/api-management-modular/groups.symbolicnames.json +++ b/src/Bicep.Core.Samples/Files/user_submitted/101/api-management-modular/groups.symbolicnames.json @@ -6,7 +6,7 @@ "_generator": { "name": "bicep", "version": "dev", - "templateHash": "6816770503491912011" + "templateHash": "403029788224868668" } }, "parameters": { @@ -47,7 +47,10 @@ "properties": { "displayName": "[variables('groupsSet')[copyIndex()].groupDisplayName]", "description": "[variables('groupsSet')[copyIndex()].groupDescription]" - } + }, + "dependsOn": [ + "parentAPIM" + ] } }, "outputs": { diff --git a/src/Bicep.Core.Samples/Files/user_submitted/101/api-management-modular/main.symbolicnames.json b/src/Bicep.Core.Samples/Files/user_submitted/101/api-management-modular/main.symbolicnames.json index 93fb1129aba..4a4fd0e31f6 100644 --- a/src/Bicep.Core.Samples/Files/user_submitted/101/api-management-modular/main.symbolicnames.json +++ b/src/Bicep.Core.Samples/Files/user_submitted/101/api-management-modular/main.symbolicnames.json @@ -6,7 +6,7 @@ "_generator": { "name": "bicep", "version": "dev", - "templateHash": "2208926443863165998" + "templateHash": "13726378283629199613" } }, "parameters": { @@ -163,7 +163,7 @@ "_generator": { "name": "bicep", "version": "dev", - "templateHash": "6816770503491912011" + "templateHash": "403029788224868668" } }, "parameters": { @@ -204,7 +204,10 @@ "properties": { "displayName": "[variables('groupsSet')[copyIndex()].groupDisplayName]", "description": "[variables('groupsSet')[copyIndex()].groupDescription]" - } + }, + "dependsOn": [ + "parentAPIM" + ] } }, "outputs": { @@ -248,7 +251,7 @@ "_generator": { "name": "bicep", "version": "dev", - "templateHash": "16793550498477002119" + "templateHash": "8034218730798252475" } }, "parameters": { @@ -298,7 +301,10 @@ "email": "[variables('usersSet')[copyIndex()].email]", "state": "[variables('usersSet')[copyIndex()].state]", "note": "[variables('usersSet')[copyIndex()].notes]" - } + }, + "dependsOn": [ + "parentAPIM" + ] } } } @@ -330,7 +336,7 @@ "_generator": { "name": "bicep", "version": "dev", - "templateHash": "14248540637091011874" + "templateHash": "11528852364160566097" } }, "parameters": { @@ -380,7 +386,10 @@ "secret": "[variables('apimNameValueSet')[copyIndex()].isSecret]", "value": "[variables('apimNameValueSet')[copyIndex()].value]", "tags": "[variables('apimNameValueSet')[copyIndex()].tags]" - } + }, + "dependsOn": [ + "parentAPIM" + ] } }, "outputs": { diff --git a/src/Bicep.Core.Samples/Files/user_submitted/101/api-management-modular/users.symbolicnames.json b/src/Bicep.Core.Samples/Files/user_submitted/101/api-management-modular/users.symbolicnames.json index 5ddeded3c45..eeabf03052f 100644 --- a/src/Bicep.Core.Samples/Files/user_submitted/101/api-management-modular/users.symbolicnames.json +++ b/src/Bicep.Core.Samples/Files/user_submitted/101/api-management-modular/users.symbolicnames.json @@ -6,7 +6,7 @@ "_generator": { "name": "bicep", "version": "dev", - "templateHash": "16793550498477002119" + "templateHash": "8034218730798252475" } }, "parameters": { @@ -56,7 +56,10 @@ "email": "[variables('usersSet')[copyIndex()].email]", "state": "[variables('usersSet')[copyIndex()].state]", "note": "[variables('usersSet')[copyIndex()].notes]" - } + }, + "dependsOn": [ + "parentAPIM" + ] } } } \ No newline at end of file diff --git a/src/Bicep.Core.Samples/Files/user_submitted/101/azure-bastion/main.symbolicnames.json b/src/Bicep.Core.Samples/Files/user_submitted/101/azure-bastion/main.symbolicnames.json index 3efaa313022..3b21ef6c973 100644 --- a/src/Bicep.Core.Samples/Files/user_submitted/101/azure-bastion/main.symbolicnames.json +++ b/src/Bicep.Core.Samples/Files/user_submitted/101/azure-bastion/main.symbolicnames.json @@ -6,7 +6,7 @@ "_generator": { "name": "bicep", "version": "dev", - "templateHash": "12715898051173612753" + "templateHash": "5898567106534730923" } }, "parameters": { @@ -149,7 +149,10 @@ ] } } - } + }, + "dependsOn": [ + "existingVirtualNetwork" + ] }, "bastionHost": { "type": "Microsoft.Network/bastionHosts", diff --git a/src/Bicep.Core.Samples/Files/user_submitted/101/databricks-all-in-one-template-for-vnet-injection/main.symbolicnames.json b/src/Bicep.Core.Samples/Files/user_submitted/101/databricks-all-in-one-template-for-vnet-injection/main.symbolicnames.json index 6d80df386ac..5c21d866751 100644 --- a/src/Bicep.Core.Samples/Files/user_submitted/101/databricks-all-in-one-template-for-vnet-injection/main.symbolicnames.json +++ b/src/Bicep.Core.Samples/Files/user_submitted/101/databricks-all-in-one-template-for-vnet-injection/main.symbolicnames.json @@ -6,7 +6,7 @@ "_generator": { "name": "bicep", "version": "dev", - "templateHash": "14481747842301389436" + "templateHash": "16714276462655423062" } }, "parameters": { @@ -275,6 +275,7 @@ } }, "dependsOn": [ + "managedResourceGroup", "vnet" ] } diff --git a/src/Bicep.Core.Samples/Files/user_submitted/101/function-premium-vnet-integration/main.symbolicnames.json b/src/Bicep.Core.Samples/Files/user_submitted/101/function-premium-vnet-integration/main.symbolicnames.json index 492bcdc0395..8694153e7d6 100644 --- a/src/Bicep.Core.Samples/Files/user_submitted/101/function-premium-vnet-integration/main.symbolicnames.json +++ b/src/Bicep.Core.Samples/Files/user_submitted/101/function-premium-vnet-integration/main.symbolicnames.json @@ -6,7 +6,7 @@ "_generator": { "name": "bicep", "version": "dev", - "templateHash": "746252077949181675" + "templateHash": "18250750169409311102" } }, "parameters": { @@ -217,7 +217,7 @@ }, "dependsOn": [ "function", - "virtualNetwork" + "subnet" ] }, "subnet": { diff --git a/src/Bicep.Core.Samples/Files/user_submitted/101/template-spec-deploy/main.symbolicnames.json b/src/Bicep.Core.Samples/Files/user_submitted/101/template-spec-deploy/main.symbolicnames.json index b29207a898f..6c0c89c4180 100644 --- a/src/Bicep.Core.Samples/Files/user_submitted/101/template-spec-deploy/main.symbolicnames.json +++ b/src/Bicep.Core.Samples/Files/user_submitted/101/template-spec-deploy/main.symbolicnames.json @@ -6,7 +6,7 @@ "_generator": { "name": "bicep", "version": "dev", - "templateHash": "12321629843193403120" + "templateHash": "15369804211876997670" } }, "parameters": { @@ -32,7 +32,10 @@ "apiVersion": "2019-06-01-preview", "subscriptionId": "[parameters('templateSpecSub')]", "resourceGroup": "[parameters('templateSpecRg')]", - "name": "[format('{0}/{1}', parameters('templateSpecName'), parameters('templateSpecVersion'))]" + "name": "[format('{0}/{1}', parameters('templateSpecName'), parameters('templateSpecVersion'))]", + "dependsOn": [ + "ts" + ] }, "ts": { "existing": true, @@ -52,7 +55,10 @@ "id": "[extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', parameters('templateSpecSub'), parameters('templateSpecRg')), 'Microsoft.Resources/templateSpecs/versions', parameters('templateSpecName'), parameters('templateSpecVersion'))]" }, "parameters": {} - } + }, + "dependsOn": [ + "ts" + ] } } } \ No newline at end of file diff --git a/src/Bicep.Core.Samples/Files/user_submitted/101/website-with-container/main.symbolicnames.json b/src/Bicep.Core.Samples/Files/user_submitted/101/website-with-container/main.symbolicnames.json index d8ee5cab6f8..23c17d94d9f 100644 --- a/src/Bicep.Core.Samples/Files/user_submitted/101/website-with-container/main.symbolicnames.json +++ b/src/Bicep.Core.Samples/Files/user_submitted/101/website-with-container/main.symbolicnames.json @@ -6,7 +6,7 @@ "_generator": { "name": "bicep", "version": "dev", - "templateHash": "15571119746721048953" + "templateHash": "13381616690819142544" } }, "parameters": { @@ -82,6 +82,7 @@ "serverFarmId": "[resourceId('Microsoft.Web/serverfarms', variables('farmName'))]" }, "dependsOn": [ + "containerRegistry", "farm" ] }, diff --git a/src/Bicep.Core.Samples/Files/user_submitted/201/avd-backplane-with-network-and-storage-and-monitoring/avd-image-builder-module.symbolicnames.json b/src/Bicep.Core.Samples/Files/user_submitted/201/avd-backplane-with-network-and-storage-and-monitoring/avd-image-builder-module.symbolicnames.json index 54c2ede3073..efcd4d0c39e 100644 --- a/src/Bicep.Core.Samples/Files/user_submitted/201/avd-backplane-with-network-and-storage-and-monitoring/avd-image-builder-module.symbolicnames.json +++ b/src/Bicep.Core.Samples/Files/user_submitted/201/avd-backplane-with-network-and-storage-and-monitoring/avd-image-builder-module.symbolicnames.json @@ -6,7 +6,7 @@ "_generator": { "name": "bicep", "version": "dev", - "templateHash": "2725585745262341266" + "templateHash": "9616745895991063718" } }, "parameters": { @@ -99,7 +99,10 @@ "replicationRegions": [] } ] - } + }, + "dependsOn": [ + "managedidentity" + ] }, "aibdef": { "condition": "[parameters('InvokeRunImageBuildThroughDeploymentScript')]", diff --git a/src/Bicep.Core.Samples/Files/user_submitted/201/avd-backplane-with-network-and-storage-and-monitoring/main.symbolicnames.json b/src/Bicep.Core.Samples/Files/user_submitted/201/avd-backplane-with-network-and-storage-and-monitoring/main.symbolicnames.json index 4286dcb4ead..7996c9f2d4e 100644 --- a/src/Bicep.Core.Samples/Files/user_submitted/201/avd-backplane-with-network-and-storage-and-monitoring/main.symbolicnames.json +++ b/src/Bicep.Core.Samples/Files/user_submitted/201/avd-backplane-with-network-and-storage-and-monitoring/main.symbolicnames.json @@ -6,7 +6,7 @@ "_generator": { "name": "bicep", "version": "dev", - "templateHash": "16802600261940372275" + "templateHash": "14611001828329396005" } }, "parameters": { @@ -1107,7 +1107,7 @@ "_generator": { "name": "bicep", "version": "dev", - "templateHash": "2725585745262341266" + "templateHash": "9616745895991063718" } }, "parameters": { @@ -1200,7 +1200,10 @@ "replicationRegions": [] } ] - } + }, + "dependsOn": [ + "managedidentity" + ] }, "aibdef": { "condition": "[parameters('InvokeRunImageBuildThroughDeploymentScript')]", diff --git a/src/Bicep.Core.Samples/Files/user_submitted/201/cloud-shell-vnet/main.symbolicnames.json b/src/Bicep.Core.Samples/Files/user_submitted/201/cloud-shell-vnet/main.symbolicnames.json index c1a55e368f1..9c8a6af505f 100644 --- a/src/Bicep.Core.Samples/Files/user_submitted/201/cloud-shell-vnet/main.symbolicnames.json +++ b/src/Bicep.Core.Samples/Files/user_submitted/201/cloud-shell-vnet/main.symbolicnames.json @@ -6,7 +6,7 @@ "_generator": { "name": "bicep", "version": "dev", - "templateHash": "14742848894010970609" + "templateHash": "16407625085363720986" } }, "parameters": { @@ -138,7 +138,10 @@ } } ] - } + }, + "dependsOn": [ + "existingVNET" + ] }, "networkProfile": { "type": "Microsoft.Network/networkProfiles", @@ -234,7 +237,8 @@ } }, "dependsOn": [ - "containerSubnet" + "containerSubnet", + "existingVNET" ] }, "privateEndpoint": { @@ -299,6 +303,7 @@ } }, "dependsOn": [ + "existingVNET", "relaySubnet" ] }, diff --git a/src/Bicep.Core.Samples/Files/user_submitted/201/private-aks-cluster/aks.symbolicnames.json b/src/Bicep.Core.Samples/Files/user_submitted/201/private-aks-cluster/aks.symbolicnames.json index 15a8bfe0e48..764dcccf1ce 100644 --- a/src/Bicep.Core.Samples/Files/user_submitted/201/private-aks-cluster/aks.symbolicnames.json +++ b/src/Bicep.Core.Samples/Files/user_submitted/201/private-aks-cluster/aks.symbolicnames.json @@ -6,7 +6,7 @@ "_generator": { "name": "bicep", "version": "dev", - "templateHash": "15899882108574365379" + "templateHash": "17167772107049027399" } }, "parameters": { @@ -335,7 +335,10 @@ "existing": true, "type": "Microsoft.Network/virtualNetworks/subnets", "apiVersion": "2020-08-01", - "name": "[format('{0}/{1}', variables('virtualNetworkName'), parameters('aksSubnetName'))]" + "name": "[format('{0}/{1}', variables('virtualNetworkName'), parameters('aksSubnetName'))]", + "dependsOn": [ + "virtualNetwork" + ] }, "aksCluster": { "type": "Microsoft.ContainerService/managedClusters", @@ -405,7 +408,10 @@ "apiServerAccessProfile": { "enablePrivateCluster": "[parameters('aksClusterEnablePrivateCluster')]" } - } + }, + "dependsOn": [ + "aksSubnet" + ] } } } \ No newline at end of file diff --git a/src/Bicep.Core.Samples/Files/user_submitted/201/private-aks-cluster/main.symbolicnames.json b/src/Bicep.Core.Samples/Files/user_submitted/201/private-aks-cluster/main.symbolicnames.json index 2f95d96fb07..8aae100fd78 100644 --- a/src/Bicep.Core.Samples/Files/user_submitted/201/private-aks-cluster/main.symbolicnames.json +++ b/src/Bicep.Core.Samples/Files/user_submitted/201/private-aks-cluster/main.symbolicnames.json @@ -6,7 +6,7 @@ "_generator": { "name": "bicep", "version": "dev", - "templateHash": "7099217802857967896" + "templateHash": "13138224916093371784" } }, "parameters": { @@ -1620,7 +1620,7 @@ "_generator": { "name": "bicep", "version": "dev", - "templateHash": "15899882108574365379" + "templateHash": "17167772107049027399" } }, "parameters": { @@ -1949,7 +1949,10 @@ "existing": true, "type": "Microsoft.Network/virtualNetworks/subnets", "apiVersion": "2020-08-01", - "name": "[format('{0}/{1}', variables('virtualNetworkName'), parameters('aksSubnetName'))]" + "name": "[format('{0}/{1}', variables('virtualNetworkName'), parameters('aksSubnetName'))]", + "dependsOn": [ + "virtualNetwork" + ] }, "aksCluster": { "type": "Microsoft.ContainerService/managedClusters", @@ -2019,7 +2022,10 @@ "apiServerAccessProfile": { "enablePrivateCluster": "[parameters('aksClusterEnablePrivateCluster')]" } - } + }, + "dependsOn": [ + "aksSubnet" + ] } } } diff --git a/src/Bicep.Core.Samples/Files/user_submitted/201/redis-premium-persistence/main.symbolicnames.json b/src/Bicep.Core.Samples/Files/user_submitted/201/redis-premium-persistence/main.symbolicnames.json index 6eecc656081..4f6df8922fe 100644 --- a/src/Bicep.Core.Samples/Files/user_submitted/201/redis-premium-persistence/main.symbolicnames.json +++ b/src/Bicep.Core.Samples/Files/user_submitted/201/redis-premium-persistence/main.symbolicnames.json @@ -6,7 +6,7 @@ "_generator": { "name": "bicep", "version": "dev", - "templateHash": "140703399417510606" + "templateHash": "308803406197414192" } }, "parameters": { @@ -115,7 +115,10 @@ "rdb-backup-max-snapshot-count": "1", "rdb-storage-connection-string": "[format('DefaultEndpointsProtocol=https;BlobEndpoint=https://{0}.blob.{1};AccountName={2};AccountKey={3}', parameters('storageAccountName'), environment().suffixes.storage, parameters('storageAccountName'), listKeys(resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName')), '2021-04-01').keys[0].value)]" } - } + }, + "dependsOn": [ + "storageAccount" + ] }, "diagSettings": { "type": "Microsoft.Insights/diagnosticSettings", diff --git a/src/Bicep.Core.Samples/Files/user_submitted/301/publish-api-to-apim-opendocs/main.symbolicnames.json b/src/Bicep.Core.Samples/Files/user_submitted/301/publish-api-to-apim-opendocs/main.symbolicnames.json index 305ded79299..e42168d3cf1 100644 --- a/src/Bicep.Core.Samples/Files/user_submitted/301/publish-api-to-apim-opendocs/main.symbolicnames.json +++ b/src/Bicep.Core.Samples/Files/user_submitted/301/publish-api-to-apim-opendocs/main.symbolicnames.json @@ -6,7 +6,7 @@ "_generator": { "name": "bicep", "version": "dev", - "templateHash": "15303901391681280108" + "templateHash": "6433078083851594853" } }, "parameters": { @@ -93,7 +93,10 @@ "approvalRequired": "[variables('productsSet')[copyIndex()].isApprovalRequired]", "subscriptionsLimit": "[variables('productsSet')[copyIndex()].subscriptionLimit]", "state": "[variables('productsSet')[copyIndex()].publishState]" - } + }, + "dependsOn": [ + "apiManagementService" + ] }, "functionAPI": { "type": "Microsoft.ApiManagement/service/apis", @@ -103,7 +106,10 @@ "format": "[parameters('apiFormat')]", "value": "[parameters('apiEndPointURL')]", "path": "[parameters('apiPath')]" - } + }, + "dependsOn": [ + "apiManagementService" + ] }, "attachAPIToProducts": { "copy": { diff --git a/src/Bicep.Core.Samples/Files/user_submitted/301/sql-database-with-management/main.symbolicnames.json b/src/Bicep.Core.Samples/Files/user_submitted/301/sql-database-with-management/main.symbolicnames.json index 5d2e9ba9706..668409e5091 100644 --- a/src/Bicep.Core.Samples/Files/user_submitted/301/sql-database-with-management/main.symbolicnames.json +++ b/src/Bicep.Core.Samples/Files/user_submitted/301/sql-database-with-management/main.symbolicnames.json @@ -6,7 +6,7 @@ "_generator": { "name": "bicep", "version": "dev", - "templateHash": "18004286018796895982" + "templateHash": "6525915520291992178" } }, "parameters": { @@ -59,7 +59,7 @@ "_generator": { "name": "bicep", "version": "dev", - "templateHash": "4095861435543068833" + "templateHash": "9981193661517957529" } }, "parameters": { @@ -172,7 +172,7 @@ "_generator": { "name": "bicep", "version": "dev", - "templateHash": "12233551922218996438" + "templateHash": "4926441281649354787" } }, "parameters": { @@ -404,6 +404,7 @@ "dependsOn": [ "auditSettings", "dummyDeployments", + "logAnalyticsWorkspace", "masterDb", "sqlDatabases" ] @@ -437,6 +438,7 @@ }, "dependsOn": [ "dummyDeployments", + "logAnalyticsWorkspace", "masterDb", "sqlDatabases" ] @@ -536,7 +538,7 @@ "_generator": { "name": "bicep", "version": "dev", - "templateHash": "5796360048593136515" + "templateHash": "2334572005318909582" } }, "parameters": { @@ -661,6 +663,7 @@ }, "dependsOn": [ "auditSettings", + "logAnalyticsWorkspace", "sqlDb", "transparentDataEncryption" ] @@ -693,6 +696,7 @@ "workspaceId": "[extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', parameters('sqlDatabase').diagnosticLogsAndMetrics.subscriptionId, parameters('sqlDatabase').diagnosticLogsAndMetrics.resourceGroupName), 'Microsoft.OperationalInsights/workspaces', parameters('sqlDatabase').diagnosticLogsAndMetrics.name)]" }, "dependsOn": [ + "logAnalyticsWorkspace", "sqlDb", "transparentDataEncryption" ] @@ -882,7 +886,10 @@ } } } - } + }, + "dependsOn": [ + "[format('sqlPassKeyVaults[{0}]', copyIndex())]" + ] } } } diff --git a/src/Bicep.Core.Samples/Files/user_submitted/301/sql-database-with-management/modules/sql-database.symbolicnames.json b/src/Bicep.Core.Samples/Files/user_submitted/301/sql-database-with-management/modules/sql-database.symbolicnames.json index 91c2b2b44c7..666760ec5ce 100644 --- a/src/Bicep.Core.Samples/Files/user_submitted/301/sql-database-with-management/modules/sql-database.symbolicnames.json +++ b/src/Bicep.Core.Samples/Files/user_submitted/301/sql-database-with-management/modules/sql-database.symbolicnames.json @@ -6,7 +6,7 @@ "_generator": { "name": "bicep", "version": "dev", - "templateHash": "5796360048593136515" + "templateHash": "2334572005318909582" } }, "parameters": { @@ -131,6 +131,7 @@ }, "dependsOn": [ "auditSettings", + "logAnalyticsWorkspace", "sqlDb", "transparentDataEncryption" ] @@ -163,6 +164,7 @@ "workspaceId": "[extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', parameters('sqlDatabase').diagnosticLogsAndMetrics.subscriptionId, parameters('sqlDatabase').diagnosticLogsAndMetrics.resourceGroupName), 'Microsoft.OperationalInsights/workspaces', parameters('sqlDatabase').diagnosticLogsAndMetrics.name)]" }, "dependsOn": [ + "logAnalyticsWorkspace", "sqlDb", "transparentDataEncryption" ] diff --git a/src/Bicep.Core.Samples/Files/user_submitted/301/sql-database-with-management/modules/sql-logical-server.symbolicnames.json b/src/Bicep.Core.Samples/Files/user_submitted/301/sql-database-with-management/modules/sql-logical-server.symbolicnames.json index 70412b918e9..89652c209c8 100644 --- a/src/Bicep.Core.Samples/Files/user_submitted/301/sql-database-with-management/modules/sql-logical-server.symbolicnames.json +++ b/src/Bicep.Core.Samples/Files/user_submitted/301/sql-database-with-management/modules/sql-logical-server.symbolicnames.json @@ -6,7 +6,7 @@ "_generator": { "name": "bicep", "version": "dev", - "templateHash": "12233551922218996438" + "templateHash": "4926441281649354787" } }, "parameters": { @@ -238,6 +238,7 @@ "dependsOn": [ "auditSettings", "dummyDeployments", + "logAnalyticsWorkspace", "masterDb", "sqlDatabases" ] @@ -271,6 +272,7 @@ }, "dependsOn": [ "dummyDeployments", + "logAnalyticsWorkspace", "masterDb", "sqlDatabases" ] @@ -370,7 +372,7 @@ "_generator": { "name": "bicep", "version": "dev", - "templateHash": "5796360048593136515" + "templateHash": "2334572005318909582" } }, "parameters": { @@ -495,6 +497,7 @@ }, "dependsOn": [ "auditSettings", + "logAnalyticsWorkspace", "sqlDb", "transparentDataEncryption" ] @@ -527,6 +530,7 @@ "workspaceId": "[extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', parameters('sqlDatabase').diagnosticLogsAndMetrics.subscriptionId, parameters('sqlDatabase').diagnosticLogsAndMetrics.resourceGroupName), 'Microsoft.OperationalInsights/workspaces', parameters('sqlDatabase').diagnosticLogsAndMetrics.name)]" }, "dependsOn": [ + "logAnalyticsWorkspace", "sqlDb", "transparentDataEncryption" ] diff --git a/src/Bicep.Core.Samples/Files/user_submitted/301/sql-database-with-management/modules/sql-logical-servers.symbolicnames.json b/src/Bicep.Core.Samples/Files/user_submitted/301/sql-database-with-management/modules/sql-logical-servers.symbolicnames.json index b5e6ffe6fd7..566dc2f2f90 100644 --- a/src/Bicep.Core.Samples/Files/user_submitted/301/sql-database-with-management/modules/sql-logical-servers.symbolicnames.json +++ b/src/Bicep.Core.Samples/Files/user_submitted/301/sql-database-with-management/modules/sql-logical-servers.symbolicnames.json @@ -6,7 +6,7 @@ "_generator": { "name": "bicep", "version": "dev", - "templateHash": "4095861435543068833" + "templateHash": "9981193661517957529" } }, "parameters": { @@ -119,7 +119,7 @@ "_generator": { "name": "bicep", "version": "dev", - "templateHash": "12233551922218996438" + "templateHash": "4926441281649354787" } }, "parameters": { @@ -351,6 +351,7 @@ "dependsOn": [ "auditSettings", "dummyDeployments", + "logAnalyticsWorkspace", "masterDb", "sqlDatabases" ] @@ -384,6 +385,7 @@ }, "dependsOn": [ "dummyDeployments", + "logAnalyticsWorkspace", "masterDb", "sqlDatabases" ] @@ -483,7 +485,7 @@ "_generator": { "name": "bicep", "version": "dev", - "templateHash": "5796360048593136515" + "templateHash": "2334572005318909582" } }, "parameters": { @@ -608,6 +610,7 @@ }, "dependsOn": [ "auditSettings", + "logAnalyticsWorkspace", "sqlDb", "transparentDataEncryption" ] @@ -640,6 +643,7 @@ "workspaceId": "[extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', parameters('sqlDatabase').diagnosticLogsAndMetrics.subscriptionId, parameters('sqlDatabase').diagnosticLogsAndMetrics.resourceGroupName), 'Microsoft.OperationalInsights/workspaces', parameters('sqlDatabase').diagnosticLogsAndMetrics.name)]" }, "dependsOn": [ + "logAnalyticsWorkspace", "sqlDb", "transparentDataEncryption" ] @@ -829,7 +833,10 @@ } } } - } + }, + "dependsOn": [ + "[format('sqlPassKeyVaults[{0}]', copyIndex())]" + ] } } } \ No newline at end of file diff --git a/src/Bicep.Core/Emit/ResourceDependencyVisitor.cs b/src/Bicep.Core/Emit/ResourceDependencyVisitor.cs index c408b266090..c6a11e1c5e2 100644 --- a/src/Bicep.Core/Emit/ResourceDependencyVisitor.cs +++ b/src/Bicep.Core/Emit/ResourceDependencyVisitor.cs @@ -1,6 +1,5 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. -using System.Collections.Frozen; using System.Collections.Immutable; using System.Diagnostics; using Bicep.Core.DataFlow; @@ -8,15 +7,11 @@ using Bicep.Core.Semantics; using Bicep.Core.Semantics.Metadata; using Bicep.Core.Syntax; -using Bicep.Core.TypeSystem; -using Bicep.Core.TypeSystem.Types; namespace Bicep.Core.Emit { public class ResourceDependencyVisitor : AstVisitor { - private static readonly FrozenSet ResourceInfoProperties - = new[] { "id", "name", "type", "apiVersion" }.ToFrozenSet(); private readonly SemanticModel model; private Options? options; private readonly IDictionary> resourceDependencies; @@ -73,7 +68,7 @@ int GetIndexOfAncestor(ImmutableArray an { for (int i = ancestors.Length - 1; i >= 0; i--) { - if (!ancestors[i].Resource.IsExistingResource) + if (!ancestors[i].Resource.IsExistingResource || options?.IncludeExisting == true) { // we found the non-existing resource - we're done return i; @@ -99,7 +94,6 @@ int GetIndexOfAncestor(ImmutableArray an this.currentDeclaration = resource.Symbol; this.resourceDependencies[resource.Symbol] = new HashSet(ancestors.Select((a, i) => new ResourceDependency(a.Resource.Symbol, a.IndexExpression, i == lastAncestorIndex ? ResourceDependencyKind.Primary : ResourceDependencyKind.Transitive))); - base.VisitResourceDeclarationSyntax(syntax); // restore previous declaration @@ -180,17 +174,7 @@ public override void VisitVariableAccessSyntax(VariableAccessSyntax syntax) return; case ResourceSymbol resourceSymbol: - // Only add an explicit dependency on an existing resource IFF the compiled template will include - // the existing resource AND this resource will read from the GET response. If we are instead - // skipping existing resources, setting the current declaration's parent, calling a function like - // `listKeys()` on the resource, or just referring to data that ARM can resolve via the - // `resourceInfo()` function, skip the explicit dependency. This will allow the ARM engine to - // recognize when an existing resource is unused and skip the unnecessary GET request. - if (resourceSymbol.DeclaringResource.IsExistingResource() && ( - options?.IncludeExisting is not true || - IsResourceIdentifierAccessBase(syntax) || - IsResourceFunctionCallBase(syntax) || - IsWithinResourceParentPropertyValue(syntax))) + if (resourceSymbol.DeclaringResource.IsExistingResource() && options?.IncludeExisting != true) { var existingDependencies = GetResourceDependencies(resourceSymbol); @@ -207,35 +191,6 @@ public override void VisitVariableAccessSyntax(VariableAccessSyntax syntax) } } - private bool IsResourceIdentifierAccessBase(SyntaxBase syntax) => model.Binder.GetParent(syntax) switch - { - PropertyAccessSyntax propertyAccess - => ResourceInfoProperties.Contains(propertyAccess.PropertyName.IdentifierName), - ArrayAccessSyntax arrayAccess when model.GetTypeInfo(arrayAccess.IndexExpression) is StringLiteralType idx - => ResourceInfoProperties.Contains(idx.RawStringValue), - ArrayAccessSyntax arrayAccess when model.GetSymbolInfo(arrayAccess.BaseExpression) is ResourceSymbol r && - r.IsCollection && - TypeValidator.AreTypesAssignable(model.GetTypeInfo(arrayAccess.IndexExpression), LanguageConstants.Int) - => IsResourceIdentifierAccessBase(arrayAccess), - _ => false, - }; - - private bool IsResourceFunctionCallBase(SyntaxBase syntax) => model.Binder.GetParent(syntax) switch - { - InstanceFunctionCallSyntax => true, - ArrayAccessSyntax arrayAccess when model.GetSymbolInfo(arrayAccess.BaseExpression) is ResourceSymbol r && - r.IsCollection && - TypeValidator.AreTypesAssignable(model.GetTypeInfo(arrayAccess.IndexExpression), LanguageConstants.Int) - => IsResourceFunctionCallBase(arrayAccess), - _ => false, - }; - - private bool IsWithinResourceParentPropertyValue(SyntaxBase syntax) - => currentDeclaration is ResourceSymbol currentResource && - currentResource.DeclaringResource.TryGetBody() is ObjectSyntax declarationBody && - declarationBody.TryGetPropertyByName(LanguageConstants.ResourceParentPropertyName) is { } parentProp && - model.Binder.IsDescendant(syntax, parentProp); - public override void VisitResourceAccessSyntax(ResourceAccessSyntax syntax) { if (currentDeclaration is null)