Skip to content

Commit aee3f2b

Browse files
author
Kapil Borle
committed
Add method to get value from hashtable ast
1 parent f830fc3 commit aee3f2b

File tree

1 file changed

+133
-2
lines changed

1 file changed

+133
-2
lines changed

Engine/Generic/Settings.cs

Lines changed: 133 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
using System;
1414
using System.Collections;
1515
using System.Collections.Generic;
16+
using System.Globalization;
1617
using System.IO;
1718
using System.Linq;
1819
using 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

Comments
 (0)