1313using System ;
1414using System . Collections ;
1515using System . Collections . Generic ;
16+ using System . Globalization ;
1617using System . IO ;
1718using System . Linq ;
1819using System . Management . Automation . Language ;
@@ -37,7 +38,7 @@ public Settings(object settings, Func<string, string> presetResolver)
3738 {
3839 if ( settings == null )
3940 {
40- throw new ArgumentNullException ( " settings" ) ;
41+ throw new ArgumentNullException ( nameof ( settings ) ) ;
4142 }
4243
4344 includeRules = new List < string > ( ) ;
@@ -317,5 +318,135 @@ private void parseSettingsFile(string settingsFilePath)
317318
318319 parseSettingsHashtable ( hashtable ) ;
319320 }
321+
322+ private Hashtable GetValue ( HashtableAst hashtableAst )
323+ {
324+ #if ! PSV3
325+ return hashtableAst . SafeGetValue ( ) as Hashtable ;
326+ #else
327+ return GetHashtableFromHashTableAst ( hashTableAst ) ;
328+ #endif
329+ }
330+
331+ private Hashtable GetHashtableFromHashTableAst ( HashtableAst hashTableAst )
332+ {
333+ var output = new Hashtable ( ) ;
334+ foreach ( var kvp in hashTableAst . KeyValuePairs )
335+ {
336+ var keyAst = kvp . Item1 as StringConstantExpressionAst ;
337+ if ( keyAst == null )
338+ {
339+ // first item (the key) should be a string
340+ ThrowInvalidDataException ( kvp . Item1 ) ;
341+ }
342+ var key = keyAst . Value ;
343+
344+ // parse the item2 as array
345+ PipelineAst pipeAst = kvp . Item2 as PipelineAst ;
346+ List < string > rhsList = new List < string > ( ) ;
347+ if ( pipeAst != null )
348+ {
349+ ExpressionAst pureExp = pipeAst . GetPureExpression ( ) ;
350+ if ( pureExp is StringConstantExpressionAst )
351+ {
352+ rhsList . Add ( ( ( StringConstantExpressionAst ) pureExp ) . Value ) ;
353+ }
354+ else if ( pureExp is HashtableAst )
355+ {
356+ output [ key ] = GetHashtableFromHashTableAst ( ( HashtableAst ) pureExp ) ;
357+ continue ;
358+ }
359+ else
360+ {
361+ rhsList = GetArrayFromAst ( pureExp ) ;
362+ }
363+ }
364+
365+ if ( rhsList . Count == 0 )
366+ {
367+ ThrowInvalidDataException ( kvp . Item2 ) ;
368+ }
369+
370+ output [ key ] = rhsList ;
371+ }
372+
373+ return output ;
374+ }
375+
376+ private List < string > GetArrayFromAst ( ExpressionAst exprAst )
377+ {
378+ ArrayLiteralAst arrayLitAst = exprAst as ArrayLiteralAst ;
379+ var result = new List < string > ( ) ;
380+
381+ if ( arrayLitAst == null && exprAst is ArrayExpressionAst )
382+ {
383+ ArrayExpressionAst arrayExp = ( ArrayExpressionAst ) exprAst ;
384+ return arrayExp == null ? null : GetArrayFromArrayExpressionAst ( arrayExp ) ;
385+ }
386+
387+ if ( arrayLitAst == null )
388+ {
389+ ThrowInvalidDataException ( arrayLitAst ) ;
390+ }
391+
392+ foreach ( var element in arrayLitAst . Elements )
393+ {
394+ var elementValue = element as StringConstantExpressionAst ;
395+ if ( elementValue == null )
396+ {
397+ ThrowInvalidDataException ( element ) ;
398+ }
399+
400+ result . Add ( elementValue . Value ) ;
401+ }
402+
403+ return result ;
404+ }
405+
406+ private List < string > GetArrayFromArrayExpressionAst ( ArrayExpressionAst arrayExp )
407+ {
408+ var result = new List < string > ( ) ;
409+ if ( arrayExp . SubExpression != null )
410+ {
411+ StatementAst stateAst = arrayExp . SubExpression . Statements . FirstOrDefault ( ) ;
412+ if ( stateAst != null && stateAst is PipelineAst )
413+ {
414+ CommandBaseAst cmdBaseAst = ( stateAst as PipelineAst ) . PipelineElements . FirstOrDefault ( ) ;
415+ if ( cmdBaseAst != null && cmdBaseAst is CommandExpressionAst )
416+ {
417+ CommandExpressionAst cmdExpAst = cmdBaseAst as CommandExpressionAst ;
418+ if ( cmdExpAst . Expression is StringConstantExpressionAst )
419+ {
420+ return new List < string > ( )
421+ {
422+ ( cmdExpAst . Expression as StringConstantExpressionAst ) . Value
423+ } ;
424+ }
425+ else
426+ {
427+ // It should be an ArrayLiteralAst at this point
428+ return GetArrayFromAst ( cmdExpAst . Expression ) ;
429+ }
430+ }
431+ }
432+ }
433+
434+ return null ;
435+ }
436+
437+ private void ThrowInvalidDataException ( Ast ast )
438+ {
439+ ThrowInvalidDataException ( ast . Extent ) ;
440+ }
441+
442+ private void ThrowInvalidDataException ( IScriptExtent extent )
443+ {
444+ throw new InvalidDataException ( string . Format (
445+ CultureInfo . CurrentCulture ,
446+ Strings . WrongValueFormat ,
447+ extent . StartLineNumber ,
448+ extent . StartColumnNumber ,
449+ extent . File ?? "" ) ) ;
450+ }
320451 }
321- }
452+ }
0 commit comments