summaryrefslogtreecommitdiff
path: root/dsa/FireBase/Offline/Internals/MemberAccessVisitor.cs
diff options
context:
space:
mode:
Diffstat (limited to 'dsa/FireBase/Offline/Internals/MemberAccessVisitor.cs')
-rw-r--r--dsa/FireBase/Offline/Internals/MemberAccessVisitor.cs46
1 files changed, 46 insertions, 0 deletions
diff --git a/dsa/FireBase/Offline/Internals/MemberAccessVisitor.cs b/dsa/FireBase/Offline/Internals/MemberAccessVisitor.cs
new file mode 100644
index 0000000..89a77da
--- /dev/null
+++ b/dsa/FireBase/Offline/Internals/MemberAccessVisitor.cs
@@ -0,0 +1,46 @@
+using System.Collections.Generic;
+using System.Linq.Expressions;
+using System.Reflection;
+using Newtonsoft.Json;
+
+namespace Firebase.Database.Offline.Internals
+{
+ public class MemberAccessVisitor : ExpressionVisitor
+ {
+ private readonly IList<string> propertyNames = new List<string>();
+
+ private bool wasDictionaryAccess;
+
+ public IEnumerable<string> PropertyNames => propertyNames;
+
+ public override Expression Visit(Expression expr)
+ {
+ if (expr?.NodeType == ExpressionType.MemberAccess)
+ {
+ if (wasDictionaryAccess)
+ {
+ wasDictionaryAccess = false;
+ }
+ else
+ {
+ var memberExpr = (MemberExpression) expr;
+ var jsonAttr = memberExpr.Member.GetCustomAttribute<JsonPropertyAttribute>();
+
+ propertyNames.Add(jsonAttr?.PropertyName ?? memberExpr.Member.Name);
+ }
+ }
+ else if (expr?.NodeType == ExpressionType.Call)
+ {
+ var callExpr = (MethodCallExpression) expr;
+ if (callExpr.Method.Name == "get_Item" && callExpr.Arguments.Count == 1)
+ {
+ var e = Expression.Lambda(callExpr.Arguments[0]).Compile();
+ propertyNames.Add(e.DynamicInvoke().ToString());
+ wasDictionaryAccess = callExpr.Arguments[0].NodeType == ExpressionType.MemberAccess;
+ }
+ }
+
+ return base.Visit(expr);
+ }
+ }
+} \ No newline at end of file