11# Copyright (c) Microsoft Corporation.
22# Licensed under the MIT License.
33
4- $script :CurrentCacheSchemaVersion = 2
4+ $script :CurrentCacheSchemaVersion = 3
55
66function Write-DscTrace {
77 param (
@@ -60,7 +60,7 @@ function Add-AstMembers {
6060
6161 foreach ($member in $TypeAst.Members ) {
6262 $property = $member -as [System.Management.Automation.Language.PropertyMemberAst ]
63- if (($property -eq $null ) -or ($property.IsStatic )) {
63+ if (($null -eq $property ) -or ($property.IsStatic )) {
6464 continue ;
6565 }
6666 $skipProperty = $true
@@ -117,7 +117,7 @@ function FindAndParseResourceDefinitions {
117117 $typeDefinitions = $ast.FindAll (
118118 {
119119 $typeAst = $args [0 ] -as [System.Management.Automation.Language.TypeDefinitionAst ]
120- return $typeAst -ne $null ;
120+ return $null -ne $typeAst ;
121121 },
122122 $false );
123123
@@ -139,6 +139,7 @@ function FindAndParseResourceDefinitions {
139139 $DscResourceInfo.Version = $moduleVersion
140140
141141 $DscResourceInfo.Properties = [System.Collections.Generic.List [DscResourcePropertyInfo ]]::new()
142+ $DscResourceInfo.Capabilities = GetClassBasedCapabilities $typeDefinitionAst.Members
142143 Add-AstMembers $typeDefinitions $typeDefinitionAst $DscResourceInfo.Properties
143144
144145 $resourceList.Add ($DscResourceInfo )
@@ -325,7 +326,7 @@ function Invoke-DscCacheRefresh {
325326
326327 # fill in resource files (and their last-write-times) that will be used for up-do-date checks
327328 $lastWriteTimes = @ {}
328- Get-ChildItem - Recurse - File - Path $dscResource.ParentPath - Include " *.ps1" , " *.psd1" , " *.psm1" , " *.mof" - ea Ignore | % {
329+ Get-ChildItem - Recurse - File - Path $dscResource.ParentPath - Include " *.ps1" , " *.psd1" , " *.psm1" , " *.mof" - ea Ignore | ForEach-Object {
329330 $lastWriteTimes.Add ($_.FullName , $_.LastWriteTime )
330331 }
331332
@@ -338,7 +339,7 @@ function Invoke-DscCacheRefresh {
338339
339340 [dscResourceCache ]$cache = [dscResourceCache ]::new()
340341 $cache.ResourceCache = $dscResourceCacheEntries
341- $m = $env: PSModulePath -split [IO.Path ]::PathSeparator | % { Get-ChildItem - Directory - Path $_ - Depth 1 - ea SilentlyContinue }
342+ $m = $env: PSModulePath -split [IO.Path ]::PathSeparator | ForEach-Object { Get-ChildItem - Directory - Path $_ - Depth 1 - ea SilentlyContinue }
342343 $cache.PSModulePaths = $m.FullName
343344 $cache.CacheSchemaVersion = $script :CurrentCacheSchemaVersion
344345
@@ -529,6 +530,28 @@ function GetTypeInstanceFromModule {
529530 return $instance
530531}
531532
533+ function GetClassBasedCapabilities ($functionMemberAst ) {
534+ $capabilities = [System.Collections.Generic.List [string []]]::new()
535+ # These are the methods that we can potentially expect in a class-based DSC resource.
536+ $availableMethods = @ (' get' , ' set' , ' setHandlesExist' , ' whatIf' , ' test' , ' delete' , ' export' )
537+ $methods = $functionMemberAst | Where-Object { $_ -is [System.Management.Automation.Language.FunctionMemberAst ] -and $_.Name -in $availableMethods }
538+
539+ foreach ($method in $methods.Name ) {
540+ # We go through each method to properly case handle the method names.
541+ switch ($method ) {
542+ ' Get' { $capabilities.Add (' get' ) }
543+ ' Set' { $capabilities.Add (' set' ) }
544+ ' Test' { $capabilities.Add (' test' ) }
545+ ' WhatIf' { $capabilities.Add (' whatIf' ) }
546+ ' SetHandlesExist' { $capabilities.Add (' setHandlesExist' ) }
547+ ' Delete' { $capabilities.Add (' delete' ) }
548+ ' Export' { $capabilities.Add (' export' ) }
549+ }
550+ }
551+
552+ return ($capabilities | Select-Object - Unique)
553+ }
554+
532555# cached resource
533556class dscResourceCacheEntry {
534557 [string ] $Type
@@ -578,4 +601,5 @@ class DscResourceInfo {
578601 [string ] $ImplementedAs
579602 [string ] $CompanyName
580603 [System.Collections.Generic.List [DscResourcePropertyInfo ]] $Properties
604+ [string []] $Capabilities
581605}
0 commit comments