718
718
FieldReference cachedDictField = m.Get<AstNode>("cachedDict").Single().Annotation<FieldReference>();
719
if (cachedDictField == null || !cachedDictField.DeclaringType.Name.StartsWith("<PrivateImplementationDetails>", StringComparison.Ordinal))
719
if (cachedDictField == null)
721
721
List<Statement> dictCreation = m.Get<BlockStatement>("dictCreation").Single().Statements.ToList();
722
722
List<KeyValuePair<string, int>> dict = BuildDictionary(dictCreation);
766
766
List<KeyValuePair<string, int>> BuildDictionary(List<Statement> dictCreation)
768
if (context.Settings.ObjectOrCollectionInitializers && dictCreation.Count == 1)
769
return BuildDictionaryFromInitializer(dictCreation[0]);
771
return BuildDictionaryFromAddMethodCalls(dictCreation);
774
static readonly Statement assignInitializedDictionary = new ExpressionStatement {
775
Expression = new AssignmentExpression {
776
Left = new AnyNode().ToExpression(),
777
Right = new ObjectCreateExpression {
778
Type = new AnyNode(),
779
Arguments = { new Repeat(new AnyNode()) },
780
Initializer = new ArrayInitializerExpression {
781
Elements = { new Repeat(new AnyNode("dictJumpTable")) }
787
private List<KeyValuePair<string, int>> BuildDictionaryFromInitializer(Statement statement)
789
List<KeyValuePair<string, int>> dict = new List<KeyValuePair<string, int>>();
790
Match m = assignInitializedDictionary.Match(statement);
794
foreach (ArrayInitializerExpression initializer in m.Get<ArrayInitializerExpression>("dictJumpTable")) {
795
KeyValuePair<string, int> pair;
796
if (TryGetPairFrom(initializer.Elements, out pair))
803
private static List<KeyValuePair<string, int>> BuildDictionaryFromAddMethodCalls(List<Statement> dictCreation)
768
805
List<KeyValuePair<string, int>> dict = new List<KeyValuePair<string, int>>();
769
806
for (int i = 0; i < dictCreation.Count; i++) {
770
807
ExpressionStatement es = dictCreation[i] as ExpressionStatement;
773
810
InvocationExpression ie = es.Expression as InvocationExpression;
776
PrimitiveExpression arg1 = ie.Arguments.ElementAtOrDefault(0) as PrimitiveExpression;
777
PrimitiveExpression arg2 = ie.Arguments.ElementAtOrDefault(1) as PrimitiveExpression;
778
if (arg1 != null && arg2 != null && arg1.Value is string && arg2.Value is int)
779
dict.Add(new KeyValuePair<string, int>((string)arg1.Value, (int)arg2.Value));
814
KeyValuePair<string, int> pair;
815
if (TryGetPairFrom(ie.Arguments, out pair))
821
private static bool TryGetPairFrom(AstNodeCollection<Expression> expressions, out KeyValuePair<string, int> pair)
823
PrimitiveExpression arg1 = expressions.ElementAtOrDefault(0) as PrimitiveExpression;
824
PrimitiveExpression arg2 = expressions.ElementAtOrDefault(1) as PrimitiveExpression;
825
if (arg1 != null && arg2 != null && arg1.Value is string && arg2.Value is int) {
826
pair = new KeyValuePair<string, int>((string)arg1.Value, (int)arg2.Value);
830
pair = default(KeyValuePair<string, int>);
785
836
#region Automatic Properties