e79aa3c0ed
Former-commit-id: a2155e9bd80020e49e72e86c44da02a8ac0e57a4
111 lines
4.4 KiB
C#
111 lines
4.4 KiB
C#
//----------------------------------------------------------------
|
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
//----------------------------------------------------------------
|
|
|
|
namespace System.Activities.XamlIntegration
|
|
{
|
|
using System;
|
|
using System.Xaml;
|
|
using System.Runtime;
|
|
|
|
static class XamlWriterExtensions
|
|
{
|
|
public static void PropagateLineInfo(XamlWriter targetWriter, IXamlLineInfo lineInfo)
|
|
{
|
|
if (lineInfo != null)
|
|
{
|
|
IXamlLineInfoConsumer consumer = targetWriter as IXamlLineInfoConsumer;
|
|
Fx.Assert(consumer != null && consumer.ShouldProvideLineInfo, "Should only call this function to write into a XamlNodeQueue.Writer, which is always IXamlLineInfoConsumer");
|
|
consumer.SetLineInfo(lineInfo.LineNumber, lineInfo.LinePosition);
|
|
}
|
|
}
|
|
|
|
public static void PropagateLineInfo(XamlWriter targetWriter, int lineNumber, int linePosition)
|
|
{
|
|
IXamlLineInfoConsumer consumer = targetWriter as IXamlLineInfoConsumer;
|
|
Fx.Assert(consumer != null && consumer.ShouldProvideLineInfo, "Should only call this function to write into a XamlNodeQueue.Writer, which is always IXamlLineInfoConsumer");
|
|
consumer.SetLineInfo(lineNumber, linePosition);
|
|
}
|
|
|
|
// This method is a workaround for TFS bug #788190, since XamlReader.ReadSubtree() should (but doesn't) preserve IXamlLineInfo on the subreader
|
|
public static void Transform(XamlReader reader, XamlWriter writer, IXamlLineInfo readerLineInfo, bool closeWriter)
|
|
{
|
|
IXamlLineInfoConsumer consumer = writer as IXamlLineInfoConsumer;
|
|
Fx.Assert(consumer != null && consumer.ShouldProvideLineInfo, "Should only call this function to write into a XamlNodeQueue.Writer, which is always IXamlLineInfoConsumer");
|
|
bool shouldPassLineNumberInfo = false;
|
|
if (readerLineInfo != null)
|
|
{
|
|
shouldPassLineNumberInfo = true;
|
|
}
|
|
|
|
while (reader.Read())
|
|
{
|
|
if (shouldPassLineNumberInfo)
|
|
{
|
|
consumer.SetLineInfo(readerLineInfo.LineNumber, readerLineInfo.LinePosition);
|
|
}
|
|
writer.WriteNode(reader);
|
|
}
|
|
|
|
if (closeWriter)
|
|
{
|
|
writer.Close();
|
|
}
|
|
}
|
|
|
|
public static void WriteNode(this XamlWriter writer, XamlReader reader, IXamlLineInfo lineInfo)
|
|
{
|
|
PropagateLineInfo(writer, lineInfo);
|
|
writer.WriteNode(reader);
|
|
}
|
|
|
|
public static void WriteEndMember(this XamlWriter writer, IXamlLineInfo lineInfo)
|
|
{
|
|
PropagateLineInfo(writer, lineInfo);
|
|
writer.WriteEndMember();
|
|
}
|
|
|
|
public static void WriteEndObject(this XamlWriter writer, IXamlLineInfo lineInfo)
|
|
{
|
|
PropagateLineInfo(writer, lineInfo);
|
|
writer.WriteEndObject();
|
|
}
|
|
|
|
public static void WriteGetObject(this XamlWriter writer, IXamlLineInfo lineInfo)
|
|
{
|
|
PropagateLineInfo(writer, lineInfo);
|
|
writer.WriteGetObject();
|
|
}
|
|
|
|
public static void WriteNamespace(this XamlWriter writer, NamespaceDeclaration namespaceDeclaration, IXamlLineInfo lineInfo)
|
|
{
|
|
PropagateLineInfo(writer, lineInfo);
|
|
writer.WriteNamespace(namespaceDeclaration);
|
|
}
|
|
|
|
public static void WriteStartMember(this XamlWriter writer, XamlMember xamlMember, IXamlLineInfo lineInfo)
|
|
{
|
|
PropagateLineInfo(writer, lineInfo);
|
|
writer.WriteStartMember(xamlMember);
|
|
}
|
|
|
|
public static void WriteStartMember(this XamlWriter writer, XamlMember xamlMember, int lineNumber, int linePosition)
|
|
{
|
|
PropagateLineInfo(writer, lineNumber, linePosition);
|
|
writer.WriteStartMember(xamlMember);
|
|
}
|
|
|
|
public static void WriteStartObject(this XamlWriter writer, XamlType type, IXamlLineInfo lineInfo)
|
|
{
|
|
PropagateLineInfo(writer, lineInfo);
|
|
writer.WriteStartObject(type);
|
|
}
|
|
|
|
public static void WriteValue(this XamlWriter writer, object value, IXamlLineInfo lineInfo)
|
|
{
|
|
PropagateLineInfo(writer, lineInfo);
|
|
writer.WriteValue(value);
|
|
}
|
|
}
|
|
}
|