Paradox Game Engine  v1.0.0 beta06
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Events Macros Pages
ParadoxAssignmentCloner.cs
Go to the documentation of this file.
1 // Copyright (c) 2014 Silicon Studio Corp. (http://siliconstudio.co.jp)
2 // This file is distributed under GPL v3. See LICENSE.md for details.
3 using SiliconStudio.Paradox.Shaders.Parser.Ast;
4 using SiliconStudio.Shaders.Ast;
5 
6 namespace SiliconStudio.Paradox.Shaders.Parser.Mixins
7 {
8  /// <summary>
9  /// Class used to clone an expression without the references it may contain
10  /// </summary>
11  internal static class ParadoxAssignmentCloner
12  {
13  public static Expression Run(Expression expression)
14  {
15  return Clone(expression);
16  }
17 
18  private static Expression Clone(Expression expression)
19  {
20  if (expression is ArrayInitializerExpression)
21  return Clone((ArrayInitializerExpression)expression);
22  if (expression is BinaryExpression)
23  return Clone((BinaryExpression)expression);
24  if (expression is ConditionalExpression)
25  return Clone((ConditionalExpression)expression);
26  if (expression is EmptyExpression)
27  return Clone((EmptyExpression)expression);
28  if (expression is ExpressionList)
29  return Clone((ExpressionList)expression);
30  if (expression is IndexerExpression)
31  return Clone((IndexerExpression)expression);
32  if (expression is KeywordExpression)
33  return Clone((KeywordExpression)expression);
34  if (expression is LiteralExpression)
35  return Clone((LiteralExpression)expression);
36  if (expression is MemberReferenceExpression)
37  return Clone((MemberReferenceExpression)expression);
38  if (expression is MethodInvocationExpression)
39  return Clone((MethodInvocationExpression)expression);
40  if (expression is ParenthesizedExpression)
41  return Clone((ParenthesizedExpression)expression);
42  if (expression is TypeReferenceExpression)
43  return Clone((TypeReferenceExpression)expression);
44  if (expression is UnaryExpression)
45  return Clone((UnaryExpression)expression);
46  if (expression is VariableReferenceExpression)
47  return Clone((VariableReferenceExpression)expression);
48  return null;
49  }
50 
51  private static ArrayInitializerExpression Clone(ArrayInitializerExpression expression)
52  {
53  var aie = new ArrayInitializerExpression();
54  foreach (var item in expression.Items)
55  aie.Items.Add(Clone(item));
56  return aie;
57  }
58 
59  private static BinaryExpression Clone(BinaryExpression expression)
60  {
61  return new BinaryExpression(expression.Operator, Clone(expression.Left), Clone(expression.Right));
62  }
63 
64  private static ConditionalExpression Clone(ConditionalExpression expression)
65  {
66  return new ConditionalExpression(Clone(expression.Condition), Clone(expression.Left), Clone(expression.Right));
67  }
68 
69  private static EmptyExpression Clone(EmptyExpression expression)
70  {
71  return expression;
72  }
73 
74  private static ExpressionList Clone(ExpressionList expression)
75  {
76  var parameters = new Expression[expression.Count];
77  for (int i = 0; i < expression.Count; ++i)
78  parameters[i] = Clone(expression[i]);
79  return new ExpressionList(parameters);
80  }
81 
82  private static IndexerExpression Clone(IndexerExpression expression)
83  {
84  var ire = new IndexerExpression(Clone(expression.Target), Clone(expression.Index));
85  if (expression.TypeInference.TargetType is ParadoxType)
86  ire.TypeInference.TargetType = expression.TypeInference.TargetType;
87  return ire;
88  }
89 
90  private static KeywordExpression Clone(KeywordExpression expression)
91  {
92  return expression;
93  }
94 
95  private static LiteralExpression Clone(LiteralExpression expression)
96  {
97  return expression;
98  }
99 
100  private static MemberReferenceExpression Clone(MemberReferenceExpression expression)
101  {
102  var mre = new MemberReferenceExpression(Clone(expression.Target), expression.Member);
103  if (expression.TypeInference.TargetType is ParadoxType)
104  mre.TypeInference.TargetType = expression.TypeInference.TargetType;
105  return mre;
106  }
107 
108  private static MethodInvocationExpression Clone(MethodInvocationExpression expression)
109  {
110  var parameters = new Expression[expression.Arguments.Count];
111  for (int i = 0; i < expression.Arguments.Count; ++i)
112  parameters[i] = Clone(expression.Arguments[i]);
113  return new MethodInvocationExpression(Clone(expression.Target), parameters);
114  }
115 
116  private static ParenthesizedExpression Clone(ParenthesizedExpression expression)
117  {
118  return new ParenthesizedExpression(Clone(expression.Content));
119  }
120 
121  private static TypeReferenceExpression Clone(TypeReferenceExpression expression)
122  {
123  return expression;
124  }
125 
126  private static UnaryExpression Clone(UnaryExpression expression)
127  {
128  return new UnaryExpression(expression.Operator, Clone(expression.Expression));
129  }
130 
131  private static VariableReferenceExpression Clone(VariableReferenceExpression expression)
132  {
133  var vre = new VariableReferenceExpression(expression.Name);
134  if (expression.TypeInference.TargetType is ParadoxType)
135  vre.TypeInference.TargetType = expression.TypeInference.TargetType;
136  return vre;
137  }
138  }
139 }
Expression Right
Gets or sets the right expression.
TypeBase TargetType
Gets or sets the type.
Expression Content
Gets or sets the expression.
Describes a binary expression.
List< Expression > Items
Gets or sets the items.
Keyword expression statement like continue; break; discard;
Expression used to initliaze an array {...expressions,}
Expression Index
Gets or sets the index.
The clone mixin to clone the current mixins where the clone is emitted.
Expression Left
Gets or sets the left expression.
An expression surrounded by parenthesis.
UnaryOperator Operator
Gets or sets the operator.
TypeInference TypeInference
Gets or sets the type reference.
Definition: Expression.cs:28
Expression Expression
Gets or sets the expression.
List< Expression > Arguments
Gets or sets the arguments.
Expression Target
Gets or sets the target.
A member reference in the form {this}.{Name}
BinaryOperator Operator
Gets or sets the binary operator.
Expression Condition
Gets or sets the condition.