void ProcessTypes(List <TypeNode> notifyNodes)
    {
        foreach (var node in notifyNodes)
        {
            if (node.EventInvoker == null)
            {
                continue;
            }
            LogInfo("\t" + node.TypeDefinition.FullName);

            foreach (var propertyData in node.PropertyDatas)
            {
                var body = propertyData.PropertyDefinition.SetMethod.Body;

                var alreadyHasEquality = HasEqualityChecker.AlreadyHasEquality(propertyData.PropertyDefinition, propertyData.BackingFieldReference);

                body.SimplifyMacros();

                body.MakeLastStatementReturn();

                var propertyWeaver = new PropertyWeaver(this, propertyData, node, ModuleDefinition.TypeSystem);
                propertyWeaver.Execute();

                if (!alreadyHasEquality)
                {
                    var equalityCheckWeaver = new EqualityCheckWeaver(propertyData, this);
                    equalityCheckWeaver.Execute();
                }

                body.InitLocals = true;
                body.OptimizeMacros();
            }
            ProcessTypes(node.Nodes);
        }
    }
    void Process(List<TypeNode> notifyNodes)
    {
        foreach (var node in notifyNodes)
        {
            if (node.EventInvoker == null)
            {
                continue;
            }
            logger.LogMessage("\t" + node.TypeDefinition.FullName);

            foreach (var propertyData in node.PropertyDatas)
            {
                if (AlreadyContainsNotification(propertyData.PropertyDefinition, node.EventInvoker.MethodReference.Name))
                {
                    if (propertyData.NotificationAddedDirectly)
                    {
                        throw new WeavingException(string.Format("{0} Already has notification functionality. Please remove the attribute on this property.", propertyData.PropertyDefinition.GetName()));
                    }
                    logger.LogMessage(string.Format("\t{0} Already has notification functionality. Property will be ignored.", propertyData.PropertyDefinition.GetName()));
                    continue;
                }
                var methodBody = propertyData.PropertyDefinition.SetMethod.Body;
                methodBody.SimplifyMacros();

                methodBody.MakeLastStatementReturn();

                var propertyWeaver = new PropertyWeaver(msCoreReferenceFinder, logger, propertyData, node);
                propertyWeaver.Execute();

                var equalityCheckWeaver = new EqualityCheckWeaver( logger, propertyData, typeEqualityFinder);
                equalityCheckWeaver.Execute();

                methodBody.InitLocals = true;

                methodBody.OptimizeMacros();
            }
            Process(node.Nodes);
        }
    }
    void Process(List <TypeNode> notifyNodes)
    {
        foreach (var node in notifyNodes)
        {
            if (node.EventInvoker == null)
            {
                continue;
            }
            logger.LogMessage("\t" + node.TypeDefinition.FullName);

            foreach (var propertyData in node.PropertyDatas)
            {
                if (AlreadyContainsNotification(propertyData.PropertyDefinition, node.EventInvoker.MethodReference.Name))
                {
                    if (propertyData.NotificationAddedDirectly)
                    {
                        throw new WeavingException(string.Format("{0} Already has notification functionality. Please remove the attribute on this property.", propertyData.PropertyDefinition.GetName()));
                    }
                    logger.LogMessage(string.Format("\t{0} Already has notification functionality. Property will be ignored.", propertyData.PropertyDefinition.GetName()));
                    continue;
                }
                var methodBody = propertyData.PropertyDefinition.SetMethod.Body;
                methodBody.SimplifyMacros();

                methodBody.MakeLastStatementReturn();

                var propertyWeaver = new PropertyWeaver(msCoreReferenceFinder, logger, propertyData, node);
                propertyWeaver.Execute();

                var equalityCheckWeaver = new EqualityCheckWeaver(logger, propertyData, typeEqualityFinder);
                equalityCheckWeaver.Execute();

                methodBody.InitLocals = true;

                methodBody.OptimizeMacros();
            }
            Process(node.Nodes);
        }
    }
    void ProcessTypes(List<TypeNode> notifyNodes)
    {
        foreach (var node in notifyNodes)
        {
            if (node.EventInvoker == null)
            {
                continue;
            }

            LogDebug("\t" + node.TypeDefinition.FullName);

            foreach (var propertyData in node.PropertyDatas)
            {
                var body = propertyData.PropertyDefinition.SetMethod.Body;

                var alreadyHasEquality = HasEqualityChecker.AlreadyHasEquality(propertyData.PropertyDefinition, propertyData.BackingFieldReference);
               
                body.SimplifyMacros();
             
                body.MakeLastStatementReturn();

                var propertyWeaver = new PropertyWeaver(this, propertyData, node, ModuleDefinition.TypeSystem);
                propertyWeaver.Execute();

                if (!alreadyHasEquality)
                {
                    var equalityCheckWeaver = new EqualityCheckWeaver(propertyData, node.TypeDefinition, this);
                    equalityCheckWeaver.Execute();
                }

                body.InitLocals = true;
                body.OptimizeMacros();
            }

            ProcessTypes(node.Nodes);
        }
    }