Exemple #1
0
 private static void WriteClone(IAbstractEmitterBlock block, int insertPosition, bool nullable)
 {
     if (nullable)
     {
         block.Emitter.Output.Insert(insertPosition,
                                     JS.Types.SYSTEM_NULLABLE + "." + JS.Funcs.Math.LIFT1 + "(\"" + JS.Funcs.CLONE + "\", ");
         block.WriteCloseParentheses();
     }
     else
     {
         block.Write("." + JS.Funcs.CLONE + "()");
     }
 }
Exemple #2
0
        public static void CheckValueTypeClone(ResolveResult resolveResult, Expression expression, IAbstractEmitterBlock block)
        {
            if (resolveResult == null || resolveResult.IsError)
            {
                return;
            }

            if (resolveResult is InvocationResolveResult ||
               block.Emitter.IsAssignment)
            {
                return;
            }

            if (resolveResult.Type.Kind == TypeKind.Struct)
            {
                var typeDef = block.Emitter.GetTypeDefinition(resolveResult.Type);
                if (block.Emitter.Validator.IsIgnoreType(typeDef))
                {
                    return;
                }

                var memberResult = resolveResult as MemberResolveResult;

                var field = memberResult != null ? memberResult.Member as DefaultResolvedField : null;

                if (field != null && field.IsReadOnly)
                {
                    block.Write(".$clone()");
                    return;
                }

                if (expression == null ||
                    expression.Parent is NamedExpression ||
                    expression.Parent is ObjectCreateExpression ||
                    expression.Parent is ArrayInitializerExpression ||
                    expression.Parent is ReturnStatement ||
                    expression.Parent is InvocationExpression ||
                    expression.Parent is AssignmentExpression ||
                    expression.Parent is VariableInitializer)
                {
                    block.Write(".$clone()");
                }
            }
        }
Exemple #3
0
        public IReferenceInterceptor OnReference(IAbstractEmitterBlock block, MemberReferenceExpression expression, MemberResolveResult resolveResult)
        {
            ReferenceInterceptor interceptor = this.GetReferenceInterceptor();

            interceptor.Block         = block;
            interceptor.Expression    = expression;
            interceptor.ResolveResult = resolveResult;

            foreach (var plugin in this.Parts)
            {
                plugin.OnReference(interceptor);
                if (interceptor.Cancel)
                {
                    return(interceptor);
                }
            }

            return(interceptor);
        }
Exemple #4
0
        public IInvocationInterceptor OnInvocation(IAbstractEmitterBlock block, InvocationExpression expression, InvocationResolveResult resolveResult)
        {
            InvocationInterceptor interceptor = this.GetInvocationInterceptor();

            interceptor.Block         = block;
            interceptor.Expression    = expression;
            interceptor.ResolveResult = resolveResult;

            foreach (var plugin in this.Parts)
            {
                plugin.OnInvocation(interceptor);
                if (interceptor.Cancel)
                {
                    return(interceptor);
                }
            }

            return(interceptor);
        }
Exemple #5
0
        public static void CheckValueTypeClone(ResolveResult resolveResult, Expression expression, IAbstractEmitterBlock block, int insertPosition)
        {
            if (resolveResult == null || resolveResult.IsError)
            {
                return;
            }

            if (block.Emitter.IsAssignment)
            {
                return;
            }

            if (resolveResult is InvocationResolveResult)
            {
                bool ret = true;
                if (expression.Parent is InvocationExpression)
                {
                    var invocationExpression = (InvocationExpression)expression.Parent;
                    if (invocationExpression.Arguments.Any(a => a == expression))
                    {
                        ret = false;
                    }
                }
                else if (expression.Parent is AssignmentExpression)
                {
                    ret = false;
                }
                else if (expression.Parent is VariableInitializer)
                {
                    ret = false;
                }

                if (ret)
                {
                    return;
                }
            }

            var nullable = resolveResult.Type.IsKnownType(KnownTypeCode.NullableOfT);
            var type = nullable ? ((ParameterizedType)resolveResult.Type).TypeArguments[0] : resolveResult.Type;
            if (type.Kind == TypeKind.Struct)
            {
                var typeDef = block.Emitter.GetTypeDefinition(type);
                if (block.Emitter.Validator.IsIgnoreType(typeDef) || block.Emitter.Validator.IsImmutableType(typeDef))
                {
                    return;
                }

                var mutableFields = type.GetFields(f => !f.IsReadOnly && !f.IsConst, GetMemberOptions.IgnoreInheritedMembers);
                var autoProps = typeDef.Properties.Where(Helpers.IsAutoProperty);
                var autoEvents = type.GetEvents(null, GetMemberOptions.IgnoreInheritedMembers);

                if (!mutableFields.Any() && !autoProps.Any() && !autoEvents.Any())
                {
                    return;
                }

                var memberResult = resolveResult as MemberResolveResult;

                var field = memberResult != null ? memberResult.Member as DefaultResolvedField : null;

                if (field != null && field.IsReadOnly)
                {
                    if (nullable)
                    {
                        block.Emitter.Output.Insert(insertPosition, "Bridge.Nullable.lift1(\"$clone\", ");
                        block.WriteCloseParentheses();
                    }
                    else
                    {
                        block.Write(".$clone()");
                    }

                    return;
                }

                if (expression == null ||
                    expression.Parent is NamedExpression ||
                    expression.Parent is ObjectCreateExpression ||
                    expression.Parent is ArrayInitializerExpression ||
                    expression.Parent is ReturnStatement ||
                    expression.Parent is InvocationExpression ||
                    expression.Parent is AssignmentExpression ||
                    expression.Parent is VariableInitializer)
                {
                    if (expression.Parent is InvocationExpression)
                    {
                        var invocationExpression = (InvocationExpression)expression.Parent;
                        if (invocationExpression.Target == expression)
                        {
                            return;
                        }
                    }

                    if (nullable)
                    {
                        block.Emitter.Output.Insert(insertPosition, "Bridge.Nullable.lift1(\"$clone\", ");
                        block.WriteCloseParentheses();
                    }
                    else
                    {
                        block.Write(".$clone()");
                    }
                }
            }
        }
Exemple #6
0
        public static void EmitComment(IAbstractEmitterBlock block, AstNode node, bool?getter = null, VariableInitializer varInitializer = null)
        {
            if (block.Emitter.AssemblyInfo.GenerateDocumentation == Bridge.Contract.DocumentationMode.None || node.Parent == null)
            {
                return;
            }

            var visitor = new DocumentationCommentVisitor();

            node.AcceptChildren(visitor);

            if (block.Emitter.AssemblyInfo.GenerateDocumentation == Bridge.Contract.DocumentationMode.Basic && visitor.Comments.Count == 0)
            {
                return;
            }

            object value  = null;
            var    rr     = block.Emitter.Resolver.ResolveNode(varInitializer ?? node, block.Emitter);
            string source = BuildCommentString(visitor.Comments);

            if (node is FieldDeclaration)
            {
                var initializer = varInitializer.Initializer as PrimitiveExpression;

                if (initializer != null)
                {
                    value = initializer.Value;
                }
            }
            else if (node is EventDeclaration)
            {
                var eventDecl = (EventDeclaration)node;
                foreach (var evVar in eventDecl.Variables)
                {
                    var ev_rr = block.Emitter.Resolver.ResolveNode(evVar, block.Emitter);
                    var memberResolveResult = ev_rr as MemberResolveResult;
                    var ev = memberResolveResult.Member as IEvent;

                    if (!getter.HasValue || getter.Value)
                    {
                        var comment = new JsDocComment();
                        InitMember(comment, ev.AddAccessor, block.Emitter, null);
                        comment.Function = Helpers.GetEventRef(ev, block.Emitter, false);
                        block.Write(
                            block.WriteIndentToString(XmlToJsDoc.ReadComment(source, ev_rr, block.Emitter, comment)));
                        block.WriteNewLine();
                    }

                    if (!getter.HasValue || !getter.Value)
                    {
                        var comment = new JsDocComment();
                        InitMember(comment, ev.RemoveAccessor, block.Emitter, null);
                        comment.Function = Helpers.GetEventRef(ev, block.Emitter, true);
                        block.Write(
                            block.WriteIndentToString(XmlToJsDoc.ReadComment(source, ev_rr, block.Emitter, comment)));
                        block.WriteNewLine();
                    }
                }

                return;
            }

            var prop = node as PropertyDeclaration;

            if (prop != null)
            {
                var memberResolveResult = rr as MemberResolveResult;
                var rProp = memberResolveResult.Member as IProperty;

                var comment = new JsDocComment();
                InitMember(comment, rProp, block.Emitter, null);
                comment.Function = Helpers.GetPropertyRef(rProp, block.Emitter);
                block.Write(block.WriteIndentToString(XmlToJsDoc.ReadComment(source, rr, block.Emitter, comment)));
                block.WriteNewLine();
                return;
            }

            var indexer = node as IndexerDeclaration;

            if (indexer != null)
            {
                var memberResolveResult = rr as MemberResolveResult;
                var rProp = memberResolveResult.Member as IProperty;

                var comment = new JsDocComment();
                InitMember(comment, getter.HasValue && getter.Value ? rProp.Getter : rProp.Setter, block.Emitter, null);
                block.Write(block.WriteIndentToString(XmlToJsDoc.ReadComment(source, rr, block.Emitter, comment)));
                block.WriteNewLine();
                return;
            }

            block.Write(block.WriteIndentToString(XmlToJsDoc.Convert(source, rr, block.Emitter, value)));

            block.WriteNewLine();
        }
Exemple #7
0
        public static void EmitComment(IAbstractEmitterBlock block, AstNode node)
        {
            if (block.Emitter.AssemblyInfo.GenerateDocumentation == Bridge.Contract.DocumentationMode.None || node.Parent == null)
            {
                return;
            }

            var visitor = new DocumentationCommentVisitor();

            node.AcceptChildren(visitor);

            if (block.Emitter.AssemblyInfo.GenerateDocumentation == Bridge.Contract.DocumentationMode.Basic && visitor.Comments.Count == 0)
            {
                return;
            }

            object value = null;

            if (node is FieldDeclaration)
            {
                var fieldDecl = (FieldDeclaration)node;
                node = fieldDecl.Variables.First();
                var initializer = fieldDecl.Variables.First().Initializer as PrimitiveExpression;

                if (initializer != null)
                {
                    value = initializer.Value;
                }
            }
            else if (node is EventDeclaration)
            {
                var eventDecl = (EventDeclaration)node;
                node = eventDecl.Variables.First();
                var initializer = eventDecl.Variables.First().Initializer as PrimitiveExpression;

                if (initializer != null)
                {
                    value = initializer.Value;
                }
            }

            var    rr     = block.Emitter.Resolver.ResolveNode(node, block.Emitter);
            string source = BuildCommentString(visitor.Comments);

            var prop = node as PropertyDeclaration;

            if (prop != null)
            {
                var memberResolveResult = rr as MemberResolveResult;
                var rProp = memberResolveResult.Member as DefaultResolvedProperty;

                var comment = new JsDocComment();
                InitMember(comment, rProp.Getter, block.Emitter, null);
                comment.Function = Helpers.GetPropertyRef(rProp, block.Emitter, false);
                block.Write(block.WriteIndentToString(XmlToJsDoc.ReadComment(source, rr, block.Emitter, comment)));
                block.WriteNewLine();

                comment = new JsDocComment();
                InitMember(comment, rProp.Setter, block.Emitter, null);
                comment.Function = Helpers.GetPropertyRef(rProp, block.Emitter, true);
                block.Write(block.WriteIndentToString(XmlToJsDoc.ReadComment(source, rr, block.Emitter, comment)));
                block.WriteNewLine();
                return;
            }

            block.Write(block.WriteIndentToString(XmlToJsDoc.Convert(source, rr, block.Emitter, value)));

            block.WriteNewLine();
        }
Exemple #8
0
        public static void CheckValueTypeClone(ResolveResult resolveResult, Expression expression, IAbstractEmitterBlock block)
        {
            if (resolveResult == null || resolveResult.IsError)
            {
                return;
            }

            if (resolveResult is InvocationResolveResult ||
                block.Emitter.IsAssignment)
            {
                return;
            }

            if (resolveResult.Type.Kind == TypeKind.Struct)
            {
                var typeDef = block.Emitter.GetTypeDefinition(resolveResult.Type);
                if (block.Emitter.Validator.IsIgnoreType(typeDef))
                {
                    return;
                }

                var memberResult = resolveResult as MemberResolveResult;

                var field = memberResult != null ? memberResult.Member as DefaultResolvedField : null;

                if (field != null && field.IsReadOnly)
                {
                    block.Write(".$clone()");
                    return;
                }

                if (expression == null ||
                    expression.Parent is NamedExpression ||
                    expression.Parent is ObjectCreateExpression ||
                    expression.Parent is ArrayInitializerExpression ||
                    expression.Parent is ReturnStatement ||
                    expression.Parent is InvocationExpression ||
                    expression.Parent is AssignmentExpression ||
                    expression.Parent is VariableInitializer)
                {
                    block.Write(".$clone()");
                }
            }
        }
Exemple #9
0
        public static void EmitComment(IAbstractEmitterBlock block, AstNode node)
        {
            if (block.Emitter.AssemblyInfo.GenerateDocumentation == Bridge.Contract.DocumentationMode.None || node.Parent == null)
            {
                return;
            }

            var visitor = new DocumentationCommentVisitor();
            node.AcceptChildren(visitor);

            if (block.Emitter.AssemblyInfo.GenerateDocumentation == Bridge.Contract.DocumentationMode.Basic && visitor.Comments.Count == 0)
            {
                return;
            }

            object value = null;
            if (node is FieldDeclaration)
            {
                var fieldDecl = (FieldDeclaration)node;
                node = fieldDecl.Variables.First();
                var initializer = fieldDecl.Variables.First().Initializer as PrimitiveExpression;

                if (initializer != null)
                {
                    value = initializer.Value;
                }
            }
            else if (node is EventDeclaration)
            {
                var eventDecl = (EventDeclaration)node;
                node = eventDecl.Variables.First();
                var initializer = eventDecl.Variables.First().Initializer as PrimitiveExpression;

                if (initializer != null)
                {
                    value = initializer.Value;
                }
            }

            var rr = block.Emitter.Resolver.ResolveNode(node, block.Emitter);
            string source = BuildCommentString(visitor.Comments);

            var prop = node as PropertyDeclaration;
            if (prop != null)
            {
                var memberResolveResult = rr as MemberResolveResult;
                var rProp = memberResolveResult.Member as DefaultResolvedProperty;

                var comment = new JsDocComment();
                InitMember(comment, rProp.Getter, block.Emitter, null);
                comment.Function = Helpers.GetPropertyRef(rProp, block.Emitter, false);
                block.Write(block.WriteIndentToString(XmlToJsDoc.ReadComment(source, rr, block.Emitter, comment)));
                block.WriteNewLine();

                comment = new JsDocComment();
                InitMember(comment, rProp.Setter, block.Emitter, null);
                comment.Function = Helpers.GetPropertyRef(rProp, block.Emitter, true);
                block.Write(block.WriteIndentToString(XmlToJsDoc.ReadComment(source, rr, block.Emitter, comment)));
                block.WriteNewLine();
                return;
            }

            block.Write(block.WriteIndentToString(XmlToJsDoc.Convert(source, rr, block.Emitter, value)));

            block.WriteNewLine();
        }
Exemple #10
0
        public static void CheckValueTypeClone(ResolveResult resolveResult, Expression expression, IAbstractEmitterBlock block, int insertPosition)
        {
            if (resolveResult == null || resolveResult.IsError)
            {
                return;
            }

            if (block.Emitter.IsAssignment)
            {
                return;
            }

            if (resolveResult is InvocationResolveResult)
            {
                bool ret = true;
                if (expression.Parent is InvocationExpression)
                {
                    var invocationExpression = (InvocationExpression)expression.Parent;
                    if (invocationExpression.Arguments.Any(a => a == expression))
                    {
                        ret = false;
                    }
                }
                else if (expression.Parent is AssignmentExpression)
                {
                    ret = false;
                }

                if (ret)
                {
                    return;
                }
            }

            var nullable = resolveResult.Type.IsKnownType(KnownTypeCode.NullableOfT);
            var type = nullable ? ((ParameterizedType)resolveResult.Type).TypeArguments[0] : resolveResult.Type;
            if (type.Kind == TypeKind.Struct)
            {
                var typeDef = block.Emitter.GetTypeDefinition(type);
                if (block.Emitter.Validator.IsIgnoreType(typeDef))
                {
                    return;
                }

                var mutableFields = type.GetFields(f => !f.IsReadOnly && !f.IsConst, GetMemberOptions.IgnoreInheritedMembers);
                var autoProps = typeDef.Properties.Where(Helpers.IsAutoProperty);
                var autoEvents = type.GetEvents(null, GetMemberOptions.IgnoreInheritedMembers);

                if (!mutableFields.Any() && !autoProps.Any() && !autoEvents.Any())
                {
                    return;
                }

                var memberResult = resolveResult as MemberResolveResult;

                var field = memberResult != null ? memberResult.Member as DefaultResolvedField : null;

                if (field != null && field.IsReadOnly)
                {
                    if (nullable)
                    {
                        block.Emitter.Output.Insert(insertPosition, "Bridge.Nullable.lift1(\"$clone\", ");
                        block.WriteCloseParentheses();
                    }
                    else
                    {
                        block.Write(":__clone__()");    
                    }
                    
                    return;
                }

                if (expression == null ||
                    expression.Parent is NamedExpression ||
                    expression.Parent is ObjectCreateExpression ||
                    expression.Parent is ArrayInitializerExpression ||
                    expression.Parent is ReturnStatement ||
                    expression.Parent is InvocationExpression ||
                    expression.Parent is AssignmentExpression ||
                    expression.Parent is VariableInitializer)
                {
                    if (expression.Parent is InvocationExpression)
                    {
                        var invocationExpression = (InvocationExpression)expression.Parent;
                        if (invocationExpression.Target == expression)
                        {
                            return;
                        }
                    }

                    if (nullable)
                    {
                        block.Emitter.Output.Insert(insertPosition, "Bridge.Nullable.lift1(\"$clone\", ");
                        block.WriteCloseParentheses();
                    }
                    else
                    {
                        block.Write(":__clone__()");
                    }
                }
            }
        }
Exemple #11
0
        public static void CheckValueTypeClone(ResolveResult resolveResult, Expression expression, IAbstractEmitterBlock block, int insertPosition)
        {
            if (resolveResult == null || resolveResult.IsError)
            {
                return;
            }

            if (block.Emitter.IsAssignment)
            {
                return;
            }

            var conversion = block.Emitter.Resolver.Resolver.GetConversion(expression);

            if (conversion.IsBoxingConversion || conversion.IsUnboxingConversion)
            {
                return;
            }

            if (resolveResult is InvocationResolveResult)
            {
                bool ret = true;
                if (expression.Parent is InvocationExpression)
                {
                    var invocationExpression = (InvocationExpression)expression.Parent;
                    if (invocationExpression.Arguments.Any(a => a == expression))
                    {
                        ret = false;
                    }
                }
                else if (expression.Parent is AssignmentExpression)
                {
                    ret = false;
                }
                else if (expression.Parent is VariableInitializer)
                {
                    ret = false;
                }

                if (ret)
                {
                    return;
                }
            }

            var rrtype = resolveResult.Type;

            var forEachResolveResult = resolveResult as ForEachResolveResult;

            if (forEachResolveResult != null)
            {
                rrtype = forEachResolveResult.ElementType;
            }

            var nullable = rrtype.IsKnownType(KnownTypeCode.NullableOfT);
            var type     = nullable ? ((ParameterizedType)rrtype).TypeArguments[0] : rrtype;

            if (type.Kind == TypeKind.Struct)
            {
                if (Helpers.IsImmutableStruct(block.Emitter, type))
                {
                    return;
                }

                var memberResult = resolveResult as MemberResolveResult;

                var field = memberResult != null ? memberResult.Member as DefaultResolvedField : null;

                if (field != null && field.IsReadOnly)
                {
                    if (nullable)
                    {
                        block.Emitter.Output.Insert(insertPosition, JS.Types.SYSTEM_NULLABLE + "." + JS.Funcs.Math.LIFT1 + "(\"" + JS.Funcs.CLONE + "\", ");
                        block.WriteCloseParentheses();
                    }
                    else
                    {
                        block.Write("." + JS.Funcs.CLONE + "()");
                    }

                    return;
                }

                var isOperator = false;
                if (expression != null &&
                    (expression.Parent is BinaryOperatorExpression || expression.Parent is UnaryOperatorExpression))
                {
                    var orr = block.Emitter.Resolver.ResolveNode(expression.Parent, block.Emitter) as OperatorResolveResult;

                    isOperator = orr != null && orr.UserDefinedOperatorMethod != null;
                }

                if (expression == null || isOperator ||
                    expression.Parent is NamedExpression ||
                    expression.Parent is ObjectCreateExpression ||
                    expression.Parent is ArrayInitializerExpression ||
                    expression.Parent is ReturnStatement ||
                    expression.Parent is InvocationExpression ||
                    expression.Parent is AssignmentExpression ||
                    expression.Parent is VariableInitializer ||
                    expression.Parent is ForeachStatement && resolveResult is ForEachResolveResult)
                {
                    if (expression != null && expression.Parent is InvocationExpression)
                    {
                        var invocationExpression = (InvocationExpression)expression.Parent;
                        if (invocationExpression.Target == expression)
                        {
                            return;
                        }
                    }

                    if (nullable)
                    {
                        block.Emitter.Output.Insert(insertPosition, JS.Types.SYSTEM_NULLABLE + "." + JS.Funcs.Math.LIFT1 + "(\"" + JS.Funcs.CLONE + "\", ");
                        block.WriteCloseParentheses();
                    }
                    else
                    {
                        block.Write("." + JS.Funcs.CLONE + "()");
                    }
                }
            }
        }
Exemple #12
0
        public static void CheckValueTypeClone(ResolveResult resolveResult, Expression expression, IAbstractEmitterBlock block, int insertPosition)
        {
            if (resolveResult == null || resolveResult.IsError)
            {
                return;
            }

            if (block.Emitter.IsAssignment)
            {
                return;
            }

            var conversion = block.Emitter.Resolver.Resolver.GetConversion(expression);

            if (block.Emitter.Rules.Boxing == BoxingRule.Managed && (conversion.IsBoxingConversion || conversion.IsUnboxingConversion))
            {
                return;
            }

            bool writeClone = false;

            if (resolveResult is InvocationResolveResult)
            {
                bool ret = true;
                if (expression.Parent is InvocationExpression invocationExpression)
                {
                    if (invocationExpression.Arguments.Any(a => a == expression))
                    {
                        ret = false;
                    }
                }
                else if (expression.Parent is AssignmentExpression)
                {
                    ret = false;
                }
                else if (expression.Parent is VariableInitializer)
                {
                    ret = false;
                }
                else
                {
                    if ((resolveResult as MemberResolveResult)?.Member is IProperty prop && prop.IsIndexer)
                    {
                        ret        = false;
                        writeClone = true;
                    }
                }

                if (ret)
                {
                    return;
                }
            }

            var rrtype   = resolveResult.Type;
            var nullable = rrtype.IsKnownType(KnownTypeCode.NullableOfT);

            if (resolveResult is ForEachResolveResult forEachResolveResult)
            {
                rrtype = forEachResolveResult.ElementType;
            }

            var type = nullable ? ((ParameterizedType)rrtype).TypeArguments[0] : rrtype;

            if (type.Kind == TypeKind.Struct)
            {
                if (IsImmutableStruct(block.Emitter, type))
                {
                    return;
                }

                if (writeClone)
                {
                    WriteClone(block, insertPosition, nullable);
                    return;
                }


                var field = resolveResult is MemberResolveResult memberResult ? memberResult.Member as DefaultResolvedField : null;

                if (field != null && field.IsReadOnly)
                {
                    WriteClone(block, insertPosition, nullable);
                    return;
                }

                var isOperator = false;
                if (expression != null &&
                    (expression.Parent is BinaryOperatorExpression || expression.Parent is UnaryOperatorExpression))
                {
                    isOperator = block.Emitter.Resolver.ResolveNode(expression.Parent) is OperatorResolveResult orr && orr.UserDefinedOperatorMethod != null;
                }

                if (expression == null || isOperator ||
                    expression.Parent is NamedExpression ||
                    expression.Parent is ObjectCreateExpression ||
                    expression.Parent is ArrayInitializerExpression ||
                    expression.Parent is ReturnStatement ||
                    expression.Parent is InvocationExpression ||
                    expression.Parent is AssignmentExpression ||
                    expression.Parent is VariableInitializer ||
                    expression.Parent is ForeachStatement && resolveResult is ForEachResolveResult)
                {
                    if (expression != null && expression.Parent is InvocationExpression)
                    {
                        var invocationExpression = (InvocationExpression)expression.Parent;
                        if (invocationExpression.Target == expression)
                        {
                            return;
                        }
                    }

                    WriteClone(block, insertPosition, nullable);
                }
            }
        }