/// <summary> /// Extends the base class by placing the blocks of macros into methods on the base class /// of the same name. /// </summary> /// <example> /// MyMethod: /// PerformActions /// /// If an overridable method called MyMethod exists on <see cref="BaseClassCompilerStep.BaseClass"/>, then /// it is overridden as follows: /// <code> /// public override void MyMethod() { PerformActions(); } /// </code> /// </example> protected override void ExtendBaseClass(Module module, ClassDefinition definition) { List <MethodInfo> methodsThatAreOverridable = new List <MethodInfo>(); MethodInfo[] baseClassMethods = BaseClass.GetMethods(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.InvokeMethod); foreach (MethodInfo method in baseClassMethods) { if (method.DeclaringType == typeof(object)) { continue; } if (method.IsVirtual || method.IsAbstract) { methodsThatAreOverridable.Add(method); } } MethodSubstitutionTransformer mst = new MethodSubstitutionTransformer(methodsThatAreOverridable.ToArray(), definition); mst.Visit(module); foreach (Statement statement in module.Globals.Statements) { ExpressionStatement es = statement as ExpressionStatement; if (es != null) { BinaryExpression be = es.Expression as BinaryExpression; if (be != null) { if (be.Left.NodeType == NodeType.ReferenceExpression && be.Operator == BinaryOperatorType.Assign) { ReferenceExpression refExp = be.Left as ReferenceExpression; Field field = new Field(refExp.LexicalInfo); field.Name = refExp.Name; field.Initializer = be.Right; definition.Members.Add(field); } } } } if (transformers != null) { foreach (DepthFirstTransformer transformer in transformers) { transformer.Visit(module); } } }
/// <summary> /// Extends the base class by placing the blocks of macros into methods on the base class /// of the same name. /// </summary> /// <example> /// MyMethod: /// PerformActions /// /// If an overridable method called MyMethod exists on <see cref="BaseClassCompilerStep.BaseClass"/>, then /// it is overridden as follows: /// <code> /// public override void MyMethod() { PerformActions(); } /// </code> /// </example> protected override void ExtendBaseClass(Module module, ClassDefinition definition) { List<MethodInfo> methodsThatAreOverridable = new List<MethodInfo>(); MethodInfo[] baseClassMethods = BaseClass.GetMethods(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.InvokeMethod); foreach (MethodInfo method in baseClassMethods) { if(method.DeclaringType==typeof(object)) continue; if (method.IsVirtual || method.IsAbstract) methodsThatAreOverridable.Add(method); } MethodSubstitutionTransformer mst = new MethodSubstitutionTransformer(methodsThatAreOverridable.ToArray(), definition); mst.Visit(module); foreach (Statement statement in module.Globals.Statements) { ExpressionStatement es = statement as ExpressionStatement; if (es != null) { BinaryExpression be = es.Expression as BinaryExpression; if (be != null) { if (be.Left.NodeType == NodeType.ReferenceExpression && be.Operator == BinaryOperatorType.Assign) { ReferenceExpression refExp = be.Left as ReferenceExpression; Field field = new Field(refExp.LexicalInfo); field.Name = refExp.Name; field.Initializer = be.Right; definition.Members.Add(field); } } } } if (transformers != null) { foreach (DepthFirstTransformer transformer in transformers) transformer.Visit(module); } }