13
13
using System ;
14
14
using System . Collections ;
15
15
using System . Collections . Generic ;
16
+ using System . Globalization ;
16
17
using System . IO ;
17
18
using System . Linq ;
18
19
using System . Management . Automation . Language ;
@@ -37,7 +38,7 @@ public Settings(object settings, Func<string, string> presetResolver)
37
38
{
38
39
if ( settings == null )
39
40
{
40
- throw new ArgumentNullException ( " settings" ) ;
41
+ throw new ArgumentNullException ( nameof ( settings ) ) ;
41
42
}
42
43
43
44
includeRules = new List < string > ( ) ;
@@ -317,5 +318,135 @@ private void parseSettingsFile(string settingsFilePath)
317
318
318
319
parseSettingsHashtable ( hashtable ) ;
319
320
}
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
+ }
320
451
}
321
- }
452
+ }
0 commit comments