@@ -142,7 +142,7 @@ public void Initilaize(Dictionary<string, List<string>> result)
142142 paths = result . ContainsKey ( "ValidDllPaths" ) ? result [ "ValidDllPaths" ] : result [ "ValidPaths" ] ;
143143 foreach ( string path in paths )
144144 {
145- if ( Path . GetExtension ( path ) . ToLower ( CultureInfo . CurrentCulture ) == ".dll" )
145+ if ( String . Equals ( Path . GetExtension ( path ) , ".dll" , StringComparison . OrdinalIgnoreCase ) )
146146 {
147147 catalog . Catalogs . Add ( new AssemblyCatalog ( path ) ) ;
148148 }
@@ -241,8 +241,8 @@ public List<ExternalRule> GetExternalRule(string[] moduleNames)
241241
242242 FunctionInfo funcInfo = ( FunctionInfo ) psobject . ImmediateBaseObject ;
243243 ParameterMetadata param = funcInfo . Parameters . Values
244- . First < ParameterMetadata > ( item => item . Name . ToLower ( CultureInfo . CurrentCulture ) . EndsWith ( "ast" , StringComparison . CurrentCulture ) ||
245- item . Name . ToLower ( CultureInfo . CurrentCulture ) . EndsWith ( "token" , StringComparison . CurrentCulture ) ) ;
244+ . First < ParameterMetadata > ( item => item . Name . EndsWith ( "ast" , StringComparison . OrdinalIgnoreCase ) ||
245+ item . Name . EndsWith ( "token" , StringComparison . OrdinalIgnoreCase ) ) ;
246246
247247 //Only add functions that are defined as rules.
248248 if ( param != null )
@@ -251,7 +251,7 @@ public List<ExternalRule> GetExternalRule(string[] moduleNames)
251251 string desc = posh . AddScript ( script ) . Invoke ( ) [ 0 ] . ImmediateBaseObject . ToString ( )
252252 . Replace ( "\r \n " , " " ) . Trim ( ) ;
253253
254- rules . Add ( new ExternalRule ( funcInfo . Name , funcInfo . Name , desc , param . Name ,
254+ rules . Add ( new ExternalRule ( funcInfo . Name , funcInfo . Name , desc , param . ParameterType . Name ,
255255 funcInfo . ModuleName , funcInfo . Module . Path ) ) ;
256256 }
257257 }
@@ -337,7 +337,7 @@ public IEnumerable<DiagnosticRecord> GetExternalRecord(Ast ast, Token[] token, E
337337 {
338338 // Find all AstTypes that appeared in rule groups.
339339 IEnumerable < Ast > childAsts = ast . FindAll ( new Func < Ast , bool > ( ( testAst ) =>
340- ( testAst . GetType ( ) . Name . ToLower ( CultureInfo . CurrentCulture ) == astRuleGroup . Key . ToLower ( CultureInfo . CurrentCulture ) ) ) , false ) ;
340+ Strings . Equals ( testAst . GetType ( ) . Name , astRuleGroup . Key ) ) , false ) ;
341341
342342 foreach ( Ast childAst in childAsts )
343343 {
@@ -381,30 +381,34 @@ public IEnumerable<DiagnosticRecord> GetExternalRecord(Ast ast, Token[] token, E
381381 string message = string . Empty ;
382382 string ruleName = string . Empty ;
383383
384- // Because error stream is merged to output stream,
385- // we need to handle the error records.
386- if ( psobject . ImmediateBaseObject is ErrorRecord )
384+ //Make sure returned DiagnosticRecord is not null
385+ if ( psobject != null && psobject . ImmediateBaseObject != null )
387386 {
388- ErrorRecord record = ( ErrorRecord ) psobject . ImmediateBaseObject ;
389- command . WriteError ( record ) ;
390- continue ;
391- }
392-
393- // DiagnosticRecord may not be correctly returned from external rule.
394- try
395- {
396- Enum . TryParse < DiagnosticSeverity > ( psobject . Properties [ "Severity" ] . Value . ToString ( ) . ToUpper ( ) , out severity ) ;
397- message = psobject . Properties [ "Message" ] . Value . ToString ( ) ;
398- extent = ( IScriptExtent ) psobject . Properties [ "Extent" ] . Value ;
399- ruleName = psobject . Properties [ "RuleName" ] . Value . ToString ( ) ;
400- }
401- catch ( Exception ex )
402- {
403- command . WriteError ( new ErrorRecord ( ex , ex . HResult . ToString ( "X" ) , ErrorCategory . NotSpecified , this ) ) ;
404- continue ;
387+ // Because error stream is merged to output stream,
388+ // we need to handle the error records.
389+ if ( psobject . ImmediateBaseObject is ErrorRecord )
390+ {
391+ ErrorRecord record = ( ErrorRecord ) psobject . ImmediateBaseObject ;
392+ command . WriteError ( record ) ;
393+ continue ;
394+ }
395+
396+ // DiagnosticRecord may not be correctly returned from external rule.
397+ try
398+ {
399+ Enum . TryParse < DiagnosticSeverity > ( psobject . Properties [ "Severity" ] . Value . ToString ( ) . ToUpper ( ) , out severity ) ;
400+ message = psobject . Properties [ "Message" ] . Value . ToString ( ) ;
401+ extent = ( IScriptExtent ) psobject . Properties [ "Extent" ] . Value ;
402+ ruleName = psobject . Properties [ "RuleName" ] . Value . ToString ( ) ;
403+ }
404+ catch ( Exception ex )
405+ {
406+ command . WriteError ( new ErrorRecord ( ex , ex . HResult . ToString ( "X" ) , ErrorCategory . NotSpecified , this ) ) ;
407+ continue ;
408+ }
409+
410+ if ( ! string . IsNullOrEmpty ( message ) ) yield return new DiagnosticRecord ( message , extent , ruleName , severity , null ) ;
405411 }
406-
407- if ( ! string . IsNullOrEmpty ( message ) ) yield return new DiagnosticRecord ( message , extent , ruleName , severity , null ) ;
408412 }
409413 }
410414
@@ -453,7 +457,11 @@ public Dictionary<string, List<string>> CheckRuleExtension(string[] path, PSCmdl
453457 // Adds original path, otherwise path.Except<string>(validModPaths) will fail.
454458 // It's possible that user can provide something like this:
455459 // "..\..\..\ScriptAnalyzer.UnitTest\modules\CommunityAnalyzerRules\CommunityAnalyzerRules.psd1"
456- if ( moduleInfo . ExportedFunctions . Count > 0 ) validModPaths . Add ( childPath ) ;
460+ if ( moduleInfo . ExportedFunctions . Count > 0 )
461+ {
462+ validModPaths . Add ( childPath ) ;
463+ cmdlet . WriteVerbose ( string . Format ( CultureInfo . CurrentCulture , Strings . ImportCustomizedRuleSuccess , childPath ) ) ;
464+ }
457465 }
458466 }
459467 catch
@@ -478,7 +486,7 @@ public Dictionary<string, List<string>> CheckRuleExtension(string[] path, PSCmdl
478486
479487 cmdlet . WriteDebug ( string . Format ( CultureInfo . CurrentCulture , Strings . CheckAssemblyFile , resolvedPath ) ) ;
480488
481- if ( Path . GetExtension ( resolvedPath ) . ToLower ( CultureInfo . CurrentCulture ) == ".dll" )
489+ if ( String . Equals ( Path . GetExtension ( resolvedPath ) , ".dll" , StringComparison . OrdinalIgnoreCase ) )
482490 {
483491 if ( ! File . Exists ( resolvedPath ) )
484492 {
0 commit comments