Esempio n. 1
0
        // This method reads ViewStateManager nodes from the xaml nodestream and outputs that in the
        // viewStateInfo dictionary. The input reader is positioned at the begining of the workflow definition.
        // The method returns a reader positioned at the begining of the workflow definition with the ViewStateManager
        // nodes removed.
        static XamlReader StripViewStateElement(XamlReader inputReader, out Dictionary <string, XamlNodeList> viewStateInfo, out Dictionary <string, SourceLocation> viewStateSourceLocationMap)
        {
            viewStateSourceLocationMap = null;
            XamlNodeList strippedNodeList = new XamlNodeList(inputReader.SchemaContext);
            XamlMember   viewStateManager = new XamlMember(ViewStateManager, GetViewStateManager, SetViewStateManager, inputReader.SchemaContext);

            using (XamlWriter strippedWriter = strippedNodeList.Writer)
            {
                IXamlLineInfo         lineInfo         = inputReader as IXamlLineInfo;
                IXamlLineInfoConsumer lineInfoComsumer = strippedWriter as IXamlLineInfoConsumer;
                bool shouldPassLineInfo = lineInfo != null && lineInfo.HasLineInfo && lineInfoComsumer != null && lineInfoComsumer.ShouldProvideLineInfo;

                viewStateInfo = null;
                while (inputReader.Read())
                {
                    if (inputReader.NodeType == XamlNodeType.StartMember && inputReader.Member.Equals(viewStateManager))
                    {
                        ReadViewStateInfo(inputReader.ReadSubtree(), out viewStateInfo, out viewStateSourceLocationMap);
                    }

                    if (shouldPassLineInfo)
                    {
                        lineInfoComsumer.SetLineInfo(lineInfo.LineNumber, lineInfo.LinePosition);
                    }

                    strippedWriter.WriteNode(inputReader);
                }
            }

            return(strippedNodeList.GetReader());
        }
Esempio n. 2
0
        ClassData ReadClassData(XamlNodeList xamlNodes, string xamlFileName)
        {
            ClassImporter importer  = new ClassImporter(xamlFileName, this.AssemblyName, this.Language.Equals("VB") ? this.RootNamespace : null);
            ClassData     classData = importer.ReadFromXaml(xamlNodes);

            return(classData);
        }
Esempio n. 3
0
		public void ReadWriteListShouldRoundtrip()
		{
			var sc = new XamlSchemaContext();
			var list = new XamlNodeList(sc);

			var reader = new XamlObjectReader(new TestClass4 { Foo = "foo", Bar = "bar" }, sc);
			XamlServices.Transform(reader, list.Writer);

			var writer = new XamlObjectWriter(sc);
			var listReader = list.GetReader();
			XamlServices.Transform(listReader, writer);

			Assert.IsNotNull(writer.Result, "#1");
			Assert.IsInstanceOf<TestClass4>(writer.Result, "#2");

			Assert.AreEqual("foo", ((TestClass4)writer.Result).Foo, "#3");
			Assert.AreEqual("bar", ((TestClass4)writer.Result).Bar, "#4");

			// try reading a 2nd time, we should not get the same reader
			writer = new XamlObjectWriter(sc);
			var listReader2 = list.GetReader();
			Assert.AreNotSame(listReader, listReader2, "#5");
			XamlServices.Transform(listReader2, writer);

			Assert.IsNotNull(writer.Result, "#6");
			Assert.IsInstanceOf<TestClass4>(writer.Result, "#7");

			Assert.AreEqual("foo", ((TestClass4)writer.Result).Foo, "#8");
			Assert.AreEqual("bar", ((TestClass4)writer.Result).Bar, "#9");
		}
Esempio n. 4
0
        public FooContainerFactory(IXamlObjectWriterFactory objectWriterFactory, XamlReader xamlReader)
        {
            this.nodeList = new XamlNodeList(xamlReader.SchemaContext);
            XamlServices.Transform(xamlReader, nodeList.Writer);

            this.objectWriterFactory = objectWriterFactory;
        }
Esempio n. 5
0
        public void ReadWriteListShouldRoundtrip()
        {
            var sc   = new XamlSchemaContext();
            var list = new XamlNodeList(sc);

            var reader = new XamlObjectReader(new TestClass4 {
                Foo = "foo", Bar = "bar"
            }, sc);

            XamlServices.Transform(reader, list.Writer);

            var writer     = new XamlObjectWriter(sc);
            var listReader = list.GetReader();

            XamlServices.Transform(listReader, writer);

            Assert.IsNotNull(writer.Result, "#1");
            Assert.IsInstanceOf <TestClass4>(writer.Result, "#2");

            Assert.AreEqual("foo", ((TestClass4)writer.Result).Foo, "#3");
            Assert.AreEqual("bar", ((TestClass4)writer.Result).Bar, "#4");

            // try reading a 2nd time, we should not get the same reader
            writer = new XamlObjectWriter(sc);
            var listReader2 = list.GetReader();

            Assert.AreNotSame(listReader, listReader2, "#5");
            XamlServices.Transform(listReader2, writer);

            Assert.IsNotNull(writer.Result, "#6");
            Assert.IsInstanceOf <TestClass4>(writer.Result, "#7");

            Assert.AreEqual("foo", ((TestClass4)writer.Result).Foo, "#8");
            Assert.AreEqual("bar", ((TestClass4)writer.Result).Bar, "#9");
        }
Esempio n. 6
0
		public void WriterShouldThrowExceptionIfNotClosed()
		{
			var sc = new XamlSchemaContext();
			var list = new XamlNodeList(sc);
			list.Writer.WriteStartObject(sc.GetXamlType(typeof(TestClass4)));
			list.Writer.WriteEndObject();
			Assert.Throws<XamlException> (() => list.GetReader());
		}
Esempio n. 7
0
 bool ValidateXaml(XamlNodeList xamlNodeList, string xamlFileName)
 {
     using (XamlReader xamlReader = xamlNodeList.GetReader())
     {
         IList <LogData> validationErrors = null;
         ClassValidator  validator        = new ClassValidator(xamlFileName, null, null);
         return(validator.ValidateXaml(xamlReader, true, this.AssemblyName, out validationErrors));
     }
 }
Esempio n. 8
0
        public void WriterShouldThrowExceptionIfNotClosed()
        {
            var sc   = new XamlSchemaContext();
            var list = new XamlNodeList(sc);

            list.Writer.WriteStartObject(sc.GetXamlType(typeof(TestClass4)));
            list.Writer.WriteEndObject();
            Assert.Throws <XamlException> (() => list.GetReader());
        }
        private static ICustomTypeDescriptor LoadAndValidateActivity(XamlNodeList xamlNodes)
        {
            object result = LoadActivity(xamlNodes);

            if (result == null || !result.GetType().IsDynamicActivity())
            {
                throw new ArgumentException("The root type of the XAML must be Activity, and the root element must contain an x:Class directive", "xamlNodes");
            }
            return((ICustomTypeDescriptor)result);
        }
Esempio n. 10
0
 internal static void WriteNodeList(XamlWriter writer, XamlNodeList nodeList)
 {
     // We need to pass the ErrorNodes contents through as a NodeList, because XOW doesn't
     // currently support unknown types, even inside a DeferLoad block.
     // But if a NodeList is written to XOW as a Value, XOW will unpack, forcing us to re-buffer
     // the nodes in our deferring loader. So we wrap the NodeList value inside a dummy StartObject.
     writer.WriteStartObject(XamlLanguage.Object);
     writer.WriteStartMember(XamlLanguage.Initialization);
     writer.WriteValue(nodeList);
     writer.WriteEndMember();
     writer.WriteEndObject();
 }
Esempio n. 11
0
        public TemplateContent(IEnumerable <NamespaceDeclaration> namespaces, XamlReader reader)
        {
            List = new XamlNodeList(reader.SchemaContext);

            //we need to rpeserve all namespace and prefixes to writer
            //otherwise they are lost. a bug in Portable.xaml or by design ??
            foreach (var ns in namespaces)
            {
                List.Writer.WriteNamespace(ns);
            }

            XamlServices.Transform(reader, List.Writer);
        }
 public DynamicActivityXamlType(XamlNodeList xamlNodes, IEnumerable <string> xamlNamespaces)
     : base(LoadAndValidateActivity(xamlNodes.CheckNotNull("xamlNodes")), xamlNodes.Writer.SchemaContext)
 {
     XamlNodes = xamlNodes;
     if (xamlNamespaces != null)
     {
         List <string> namespaces = xamlNamespaces.ToList();
         if (namespaces.Count > 0)
         {
             namespaces.Add(ClrNamespace);
             _namespaces = namespaces.AsReadOnly();
         }
     }
 }
Esempio n. 13
0
        private DynamicActivityXamlType CreateXamlType(string path)
        {
            XamlNodeList xamlNodes = new XamlNodeList(this);

            using (XamlXmlReader xamlReader = new XamlXmlReader(path, this))
            {
                XamlServices.Transform(xamlReader, xamlNodes.Writer);
            }

            // Namespaces are only evaluated at construction, so if an additional namespace is
            // registered later, we don't update the XamlType.
            IEnumerable <string>    namespaces = GetNamespacesFor(path).OrderBy(ns => ns, StringComparer.Ordinal);
            DynamicActivityXamlType result     = new DynamicActivityXamlType(xamlNodes, namespaces);

            return(result);
        }
Esempio n. 14
0
        public override object StandardXamlLoader(string xamlString)
        {
            XamlSchemaContext xsc          = System.Windows.Markup.XamlReader.GetWpfSchemaContext();
            XamlNodeList      xamlNodeList = new XamlNodeList(xsc);

            XamlServices.Transform(new XamlXmlReader(XmlReader.Create(new StringReader(xamlString)), xsc), xamlNodeList.Writer);

            NodeListValidator.Validate(xamlNodeList);

            System.Xaml.XamlReader reader = xamlNodeList.GetReader();
            object root = System.Windows.Markup.XamlReader.Load(reader);

            if (root == null)
            {
                throw new NullReferenceException("Load returned null Root");
            }
            return(root);
        }
        public override object Load(XamlReader xamlReader, IServiceProvider serviceProvider)
        {
            IXamlSchemaContextProvider schema     = (IXamlSchemaContextProvider)serviceProvider.GetService(typeof(IXamlSchemaContextProvider));
            XamlNodeList nodeList                 = new XamlNodeList(schema.SchemaContext);
            Dictionary <string, Type> typesByName = new Dictionary <string, Type>();
            bool nextValueIsName = false;
            Type currentType     = null;

            using (XamlWriter writer = nodeList.Writer)
            {
                while (xamlReader.Read())
                {
                    switch (xamlReader.NodeType)
                    {
                    case XamlNodeType.StartObject:
                        currentType = xamlReader.Type.UnderlyingType;
                        break;

                    case XamlNodeType.StartMember:
                        // HACK: This matches any Name property. Should probably just match
                        // FrameworkElement and x:Name but this'll do for now...
                        if (xamlReader.Member.Name == "Name")
                        {
                            nextValueIsName = true;
                        }

                        break;

                    case XamlNodeType.Value:
                        if (nextValueIsName)
                        {
                            typesByName.Add((string)xamlReader.Value, currentType);
                            nextValueIsName = false;
                        }

                        break;
                    }

                    writer.WriteNode(xamlReader);
                }
            }

            return(new TemplateContent(nodeList, typesByName));
        }
Esempio n. 16
0
        // Given the viewStateInfo dictionary, this method returns a xaml node list matching a ViewStateManager
        // object.
        static XamlNodeList CreateViewStateManagerNodeList(Dictionary <string, XamlNodeList> viewStateInfo, XamlSchemaContext schemaContext)
        {
            XamlNodeList viewStateManagerNodeList = new XamlNodeList(schemaContext);

            XamlMember viewStateDataMember  = new XamlMember(typeof(ViewStateManager).GetProperty("ViewStateData"), schemaContext);
            XamlType   viewStateManagerType = new XamlType(typeof(ViewStateManager), schemaContext);
            XamlType   viewStateDataType    = new XamlType(typeof(ViewStateData), schemaContext);
            XamlMember idMember             = new XamlMember(typeof(ViewStateData).GetProperty("Id"), schemaContext);

            using (XamlWriter viewStateManagerNodeWriter = viewStateManagerNodeList.Writer)
            {
                viewStateManagerNodeWriter.WriteStartObject(viewStateManagerType);
                viewStateManagerNodeWriter.WriteStartMember(viewStateDataMember);
                viewStateManagerNodeWriter.WriteGetObject();
                viewStateManagerNodeWriter.WriteStartMember(XamlLanguage.Items);

                foreach (KeyValuePair <string, XamlNodeList> entry in viewStateInfo)
                {
                    viewStateManagerNodeWriter.WriteStartObject(viewStateDataType);

                    viewStateManagerNodeWriter.WriteStartMember(idMember);
                    viewStateManagerNodeWriter.WriteValue(entry.Key);
                    viewStateManagerNodeWriter.WriteEndMember(); // idMember

                    XamlReader viewStateValueReader = entry.Value.GetReader();
                    while (viewStateValueReader.Read())
                    {
                        viewStateManagerNodeWriter.WriteNode(viewStateValueReader);
                    }

                    viewStateManagerNodeWriter.WriteEndObject(); // viewStateDataType
                }

                viewStateManagerNodeWriter.WriteEndMember(); // XamlLanguage.Items
                viewStateManagerNodeWriter.WriteEndObject(); // GetObject
                viewStateManagerNodeWriter.WriteEndMember(); // viewStateDataMember
                viewStateManagerNodeWriter.WriteEndObject(); // viewStateManagerType
                viewStateManagerNodeWriter.Close();
            }

            return(viewStateManagerNodeList);
        }
Esempio n. 17
0
        public virtual object StandardXamlLoader(string xamlString)
        {
            var          xamlXmlReader = new XamlXmlReader(XmlReader.Create(new StringReader(xamlString)));
            XamlNodeList xamlNodeList  = new XamlNodeList(xamlXmlReader.SchemaContext);

            XamlServices.Transform(xamlXmlReader, xamlNodeList.Writer);

            NodeListValidator.Validate(xamlNodeList);

            XamlReader       reader    = xamlNodeList.GetReader();
            XamlObjectWriter objWriter = new XamlObjectWriter(reader.SchemaContext);

            XamlServices.Transform(reader, objWriter);
            object root = objWriter.Result;

            if (root == null)
            {
                throw new NullReferenceException("Load returned null Root");
            }
            return(root);
        }
Esempio n. 18
0
        public void WriteDeferred(XamlDeferringLoader loader, XamlNodeList nodeList, bool setValue)
        {
            nodeList.Writer.Close();
            var obj = loader.Load(nodeList.GetReader(), service_provider);
            var cms = CurrentMemberState;

            if (cms != null)
            {
                cms.Value = obj;
            }
            else
            {
                var state = object_states.Peek();
                state.Value          = obj;
                state.IsInstantiated = true;
            }
            if (setValue)
            {
                manager.Value();
            }
        }
Esempio n. 19
0
        XamlNodeList ReadXamlNodes(string xamlFileName)
        {
            XamlNodeList nodeList = new XamlNodeList(this.SchemaContext);

            try
            {
                XamlXmlReaderSettings settings = new XamlXmlReaderSettings
                {
                    AllowProtectedMembersOnRoot = true,
                    ProvideLineInfo             = true
                };

                using (StreamReader streamReader = new StreamReader(xamlFileName))
                {
                    XamlReader reader = new XamlXmlReader(XmlReader.Create(streamReader, new XmlReaderSettings {
                        XmlResolver = null
                    }), this.SchemaContext, settings);
                    XamlServices.Transform(reader, nodeList.Writer);
                }
            }
            catch (XmlException e)
            {
                XamlBuildTaskServices.LogException(this.BuildLogger, e.Message, xamlFileName, e.LineNumber, e.LinePosition);
                return(null);
            }
            catch (XamlException e)
            {
                XamlBuildTaskServices.LogException(this.BuildLogger, e.Message, xamlFileName, e.LineNumber, e.LinePosition);
                return(null);
            }

            if (nodeList.Count > 0)
            {
                return(nodeList);
            }
            else
            {
                return(null);
            }
        }
Esempio n. 20
0
 void RemoveXamlSpaceAttribute(ClassData classData)
 {
     using (XamlReader reader = classData.EmbeddedResourceXaml.GetReader())
     {
         XamlNodeList newList = new XamlNodeList(reader.SchemaContext);
         using (XamlWriter writer = newList.Writer)
         {
             bool nodesAvailable = reader.Read();
             while (nodesAvailable)
             {
                 if (reader.NodeType == XamlNodeType.StartMember && reader.Member == XamlLanguage.Space)
                 {
                     reader.Skip();
                 }
                 else
                 {
                     writer.WriteNode(reader);
                     nodesAvailable = reader.Read();
                 }
             }
         }
         classData.EmbeddedResourceXaml = newList;
     }
 }
Esempio n. 21
0
        // This method removes IdRef nodes from the nodestream. This method would be called
        // when a 4.5 workflow definition is retargeted to 4.0.
        public static XamlReader RemoveIdRefs(XamlObjectReader inputReader)
        {
            XamlMember idRefMember = new XamlMember(IdRef, GetIdRef, SetIdRef, inputReader.SchemaContext);

            XamlNodeList outputNodeList = new XamlNodeList(inputReader.SchemaContext);

            using (XamlWriter outputWriter = outputNodeList.Writer)
            {
                while (inputReader.Read())
                {
                    if (inputReader.NodeType == XamlNodeType.StartMember && inputReader.Member.Equals(idRefMember))
                    {
                        // Exhaust the idRefMember sub-tree.
                        XamlReader idRefReader = inputReader.ReadSubtree();
                        while (idRefReader.Read())
                        {
                            ;
                        }
                    }
                    outputWriter.WriteNode(inputReader);
                }
            }
            return(outputNodeList.GetReader());
        }
Esempio n. 22
0
        public override object StandardXamlLoader(string xamlString)
        {
            eventHandled = false;
            var          xamlXmlReader = new XamlXmlReader(XmlReader.Create(new StringReader(xamlString)));
            XamlNodeList xamlNodeList  = new XamlNodeList(xamlXmlReader.SchemaContext);

            XamlServices.Transform(xamlXmlReader, xamlNodeList.Writer);

            XamlReader reader = xamlNodeList.GetReader();
            XamlObjectWriterSettings settings = new XamlObjectWriterSettings()
            {
                RootObjectInstance = null, AfterBeginInitHandler = ObjectCreated
            };
            XamlObjectWriter objWriter = new XamlObjectWriter(reader.SchemaContext, settings);

            XamlServices.Transform(reader, objWriter);
            object root = objWriter.Result;

            if (root == null)
            {
                throw new NullReferenceException("Load returned null Root");
            }
            return(root);
        }
Esempio n. 23
0
        bool ProcessDirective(XamlReader reader, ClassData classData,
                              NamedObject currentObject, bool isRootElement, XamlNodeList strippedXamlNodes, out bool readNextNode)
        {
            Fx.Assert(reader.NodeType == XamlNodeType.StartMember, "Current node should be a Start Member Node");

            XamlMember member = reader.Member;
            bool       directiveRecognized = false;

            readNextNode = false;

            switch (member.Name)
            {
            case "Name":
                // Unlike all the other directives that we process, x:Name should be written
                // to the stripped output.
                strippedXamlNodes.Writer.WriteStartMember(member);

                string objectName = ReadAtom(reader, XamlLanguage.Name.Name);
                if (!objectName.StartsWith(XamlBuildTaskServices.SerializerReferenceNamePrefix,
                                           StringComparison.Ordinal))
                {
                    currentObject.Name = objectName;
                    classData.NamedObjects.Add(currentObject);
                }

                strippedXamlNodes.Writer.WriteValue(objectName);
                strippedXamlNodes.Writer.WriteEndMember();
                directiveRecognized = true;
                break;

            case "Class":
                if (isRootElement)
                {
                    string fullClassName = ReadAtom(reader, XamlLanguage.Class.Name);
                    SetClassName(fullClassName, classData);
                    directiveRecognized = true;
                }
                break;

            case "ClassModifier":
                if (isRootElement)
                {
                    string classModifier = ReadAtom(reader, XamlLanguage.ClassModifier.Name);
                    classData.IsPublic  = XamlBuildTaskServices.IsPublic(classModifier);
                    directiveRecognized = true;
                }
                break;

            case "FieldModifier":
                string fieldModifier = ReadAtom(reader, XamlLanguage.FieldModifier.Name);
                currentObject.Visibility = XamlBuildTaskServices.GetMemberVisibility(fieldModifier);
                directiveRecognized      = true;
                break;

            case "Code":
                string codeSnippet = ReadAtom(reader, XamlLanguage.Code.Name);
                classData.CodeSnippets.Add(codeSnippet);
                directiveRecognized = true;
                break;

            case "Members":
                foreach (PropertyData property in ReadProperties(reader.ReadSubtree()))
                {
                    classData.Properties.Add(property);
                }
                if (!classData.RequiresCompilationPass2)
                {
                    foreach (PropertyData property in classData.Properties)
                    {
                        if (property.Type.IsUnknown)
                        {
                            classData.RequiresCompilationPass2 = true;
                            break;
                        }
                    }
                }
                directiveRecognized = true;
                readNextNode        = true;
                break;

            case "ClassAttributes":
                foreach (AttributeData attribute in ReadAttributesCollection(reader.ReadSubtree()))
                {
                    classData.Attributes.Add(attribute);
                }
                directiveRecognized = true;
                readNextNode        = true;
                break;
            }

            if (directiveRecognized == true && readNextNode == false)
            {
                reader.Read();
                Fx.Assert(reader.NodeType == XamlNodeType.EndMember, "Current node should be a XamlEndmember");
            }

            return(directiveRecognized);
        }
Esempio n. 24
0
        XamlNodeList RewriteRootNode(XamlNodeList strippedXamlNodes, string name, string @namespace)
        {
            // Rewrite the root node to have the name of class declared via x:Class (rather than the base class)
            // Also, for any properties on the root object that are declared in this class, need to rewrite the
            // namespace to include the root namespace, if there is one.

            string oldNamespace = null;

            if (!string.IsNullOrEmpty(this.rootNamespace))
            {
                oldNamespace = @namespace;
                if (!string.IsNullOrEmpty(@namespace))
                {
                    @namespace = this.rootNamespace + "." + @namespace;
                }
                else
                {
                    @namespace = this.rootNamespace;
                }
            }

            string namespaceName = string.Format(CultureInfo.InvariantCulture, "{0}{1};{2}{3}", XamlBuildTaskServices.ClrNamespaceUriNamespacePart, @namespace, XamlBuildTaskServices.ClrNamespaceUriAssemblyPart, this.localAssemblyName);

            XamlReader        reader = strippedXamlNodes.GetReader();
            XamlSchemaContext xsc    = reader.SchemaContext;
            XamlNodeList      newStrippedXamlNodes = new XamlNodeList(xsc);
            XamlWriter        writer = newStrippedXamlNodes.Writer;

            int      depth        = 0;
            XamlType rootXamlType = null;

            while (reader.Read())
            {
                switch (reader.NodeType)
                {
                case XamlNodeType.StartObject:
                case XamlNodeType.GetObject:
                    depth++;
                    break;

                case XamlNodeType.EndObject:
                    depth--;
                    break;
                }
                if (reader.NodeType == XamlNodeType.StartObject && depth == 1)
                {
                    rootXamlType = new XamlType(namespaceName, name, null, xsc);
                    writer.WriteStartObject(rootXamlType);
                }
                else if (reader.NodeType == XamlNodeType.StartMember && depth == 1 && reader.Member.IsUnknown &&
                         reader.Member.DeclaringType != null && reader.Member.DeclaringType.Name == rootXamlType.Name)
                {
                    string     clrNs;
                    XamlMember member = reader.Member;
                    if (XamlBuildTaskServices.TryExtractClrNs(member.PreferredXamlNamespace, out clrNs) &&
                        clrNs == oldNamespace)
                    {
                        // This is a member defined on the document root type, but missing the project root namespace. Fix it.
                        XamlMember newMember = new XamlMember(member.Name, rootXamlType, member.IsAttachable);
                        Fx.Assert(rootXamlType != null, "First StartObject should already have been processed");
                        writer.WriteStartMember(newMember);
                    }
                    else
                    {
                        writer.WriteNode(reader);
                    }
                }
                else
                {
                    writer.WriteNode(reader);
                }
            }

            writer.Close();
            return(newStrippedXamlNodes);
        }
Esempio n. 25
0
 // More validation will need to be added.
 public static void Validate(XamlNodeList nodeList)
 {
     ValidateStartEndCounts(nodeList.GetReader());
     ValidateNamespaceOnlyBeforeStartObject(nodeList.GetReader());
 }
Esempio n. 26
0
 public KeyRecord(bool shared, bool sharedSet, int valuePosition, XamlSchemaContext context) :
     this(shared, sharedSet, valuePosition)
 {
     _data = new XamlNodeList(context, 8);
 }
Esempio n. 27
0
 public StaticResource(XamlType type, XamlSchemaContext schemaContext)
 {
     ResourceNodeList = new XamlNodeList(schemaContext, 8);
     ResourceNodeList.Writer.WriteStartObject(type);
 }
Esempio n. 28
0
 public TestTemplate(XamlReader xamlReader, IXamlObjectWriterFactory factory)
 {
     XamlObjectWriterFactory = factory;
     _xamlNodeList           = new XamlNodeList(xamlReader.SchemaContext);
     XamlServices.Transform(xamlReader, _xamlNodeList.Writer);
 }
Esempio n. 29
0
        bool ProcessMarkupItem(ITaskItem markupItem, CodeDomProvider codeDomProvider)
        {
            string markupItemFileName = markupItem.ItemSpec;

            XamlBuildTaskServices.PopulateModifiers(codeDomProvider);

            XamlNodeList xamlNodes = ReadXamlNodes(markupItemFileName);

            if (xamlNodes == null)
            {
                return(false);
            }

            ClassData classData = ReadClassData(xamlNodes, markupItemFileName);

            string outputFileName = GetFileName(markupItemFileName);
            string codeFileName   = Path.ChangeExtension(outputFileName, GetGeneratedSourceExtension(codeDomProvider));
            string markupFileName = Path.ChangeExtension(outputFileName, GeneratedSourceExtension + XamlBuildTaskServices.XamlExtension);

            classData.EmbeddedResourceFileName = Path.GetFileName(markupFileName);
            classData.HelperClassFullName      = this.HelperClassFullName;

            // Check if code file with partial class exists
            classData.SourceFileExists = UserProvidedFileExists(markupItemFileName, codeDomProvider);

            // Store the full type name as metadata on the markup item
            string rootNamespacePrefix = null;
            string namespacePrefix     = null;
            string typeFullName        = null;

            if (this.Language.Equals("VB") && !String.IsNullOrWhiteSpace(classData.RootNamespace))
            {
                rootNamespacePrefix = classData.RootNamespace + ".";
            }

            if (!String.IsNullOrWhiteSpace(classData.Namespace))
            {
                namespacePrefix = classData.Namespace + ".";
            }

            if (rootNamespacePrefix != null)
            {
                if (namespacePrefix != null)
                {
                    typeFullName = rootNamespacePrefix + namespacePrefix + classData.Name;
                }
                else
                {
                    typeFullName = rootNamespacePrefix + classData.Name;
                }
            }
            else
            {
                if (namespacePrefix != null)
                {
                    typeFullName = namespacePrefix + classData.Name;
                }
                else
                {
                    typeFullName = classData.Name;
                }
            }

            markupItem.SetMetadata("typeName", typeFullName);

            // Execute extensions here to give them a chance to mutate the ClassData before we generate code.
            if (this.SupportExtensions)
            {
                if (!ExecuteExtensions(classData, markupItem))
                {
                    return(false);
                }
            }

            // Generate code file
            CodeCompileUnit codeUnit = new ClassGenerator(this.BuildLogger, codeDomProvider, this.Language).Generate(classData);

            WriteCode(codeDomProvider, codeUnit, codeFileName);
            this.GeneratedCodeFiles.Add(codeFileName);

            // Generate resource file
            if (!string.IsNullOrEmpty(this.AssemblyName))
            {
                // Generate xaml "implementation" file
                XmlWriterSettings xmlSettings = new XmlWriterSettings {
                    Indent = true, IndentChars = "  ", CloseOutput = true
                };
                using (XmlWriter xmlWriter = XmlWriter.Create(File.Open(markupFileName, FileMode.Create), xmlSettings))
                {
                    XamlXmlWriterSettings xamlSettings = new XamlXmlWriterSettings()
                    {
                        CloseOutput = true
                    };

                    // Process EmbeddedResourceXaml to remove xml:space="preserve"
                    // due to a bug in XamlXmlWriter. XamlXmlWriter throws
                    // if there are duplicate xml:space attributes.
                    // It is ok to remove the xml:space attribute
                    // as the XamlXmlWriter would add it in the next step
                    // if needed.
                    RemoveXamlSpaceAttribute(classData);

                    using (XamlReader reader = classData.EmbeddedResourceXaml.GetReader())
                    {
                        using (XamlXmlWriter xamlWriter = new XamlXmlWriter(xmlWriter, reader.SchemaContext, xamlSettings))
                        {
                            XamlServices.Transform(reader, xamlWriter);
                        }
                    }
                }
                this.GeneratedResources.Add(markupFileName);
            }

            if (classData.RequiresCompilationPass2)
            {
                this.RequiresCompilationPass2 = true;
            }
            else
            {
                if (!this.SupportExtensions)
                {
                    if (!ValidateXaml(xamlNodes, markupItemFileName))
                    {
                        this.RequiresCompilationPass2 = true;
                    }
                }
                else
                {
                    // skip validation if we are doing in-proc compile
                    // OR if we have pass 2 extensions hooked up
                    // as we anyway need to run pass 2 in that case
                    if (!this.IsInProcessXamlMarkupCompile && !this.MarkupCompilePass2ExtensionsPresent)
                    {
                        if (!ValidateXaml(xamlNodes, markupItemFileName))
                        {
                            this.RequiresCompilationPass2 = true;
                        }
                    }
                }
            }
            return(true);
        }
Esempio n. 30
0
        // Throws InvalidOperationException at DesignTime: Input XAML contains invalid constructs for generating a class. For example, unexpected content or unknown class or field modifiers.
        public ClassData ReadFromXaml(XamlNodeList nodes)
        {
            if (nodes == null)
            {
                throw FxTrace.Exception.ArgumentNull("nodeList");
            }

            Stack <NamedObject> currentTypes            = new Stack <NamedObject>();
            XamlReader          reader                  = nodes.GetReader();
            XamlSchemaContext   xsc                     = reader.SchemaContext;
            XamlNodeList        strippedXamlNodes       = new XamlNodeList(xsc);
            XamlWriter          strippedXamlNodesWriter = strippedXamlNodes.Writer;

            ClassData result = new ClassData()
            {
                FileName      = this.xamlFileName,
                IsPublic      = this.DefaultClassIsPublic,
                RootNamespace = this.rootNamespace
            };

            // We loop through the provided XAML; for each node, we do two things:
            //  1. If it's a directive that's relevant to x:Class, we extract the data.
            //  2. Unless it's a directive that's exclusively relevant to x:Class, we write it to strippedXamlNodes.
            // The result is two outputs: class data, and stripped XAML that can be used to initialize the
            // an instance of the class.

            bool readNextNode = false;

            while (readNextNode || reader.Read())
            {
                bool stripNodeFromXaml = false;
                readNextNode = false;

                namespaceTable.ManageNamespace(reader);

                switch (reader.NodeType)
                {
                case XamlNodeType.StartObject:
                    if (result.BaseType == null)
                    {
                        result.BaseType = reader.Type;
                    }
                    currentTypes.Push(new NamedObject()
                    {
                        Type       = reader.Type,
                        Visibility = DefaultFieldVisibility,
                    });
                    break;

                case XamlNodeType.EndObject:
                    currentTypes.Pop();
                    break;

                case XamlNodeType.StartMember:
                    XamlMember member = reader.Member;

                    if (member.IsDirective)
                    {
                        bool isRootElement = (currentTypes.Count == 1);
                        stripNodeFromXaml = ProcessDirective(reader, result, currentTypes.Peek(), isRootElement, strippedXamlNodes, out readNextNode);
                    }
                    else
                    {
                        NamedObject currentType     = currentTypes.Peek();
                        XamlType    currentXamlType = currentType.Type;
                        if (currentXamlType.IsUnknown)
                        {
                            result.RequiresCompilationPass2 = true;
                        }
                    }
                    break;

                case XamlNodeType.EndMember:
                    break;

                case XamlNodeType.Value:
                    break;

                case XamlNodeType.NamespaceDeclaration:
                    break;

                case XamlNodeType.None:
                    break;

                case XamlNodeType.GetObject:
                    //Push a dummy NamedObject so that it gets popped when you see the corresponding EndObject
                    currentTypes.Push(new NamedObject());
                    break;

                default:

                    Debug.Fail("Unrecognized XamlNodeType value" + reader.NodeType.ToString());
                    break;
                }

                if (!stripNodeFromXaml)
                {
                    WritestrippedXamlNode(reader, strippedXamlNodesWriter);
                }
            }

            // ClassData.Name should be initialized to a non-null non-empty value if
            // the file contains x:Class. Throw an error if neither is found.
            if (result.Name == null)
            {
                string xClassDirectiveName = "{" + XamlLanguage.Class.PreferredXamlNamespace + "}" + XamlLanguage.Class.Name;

                throw FxTrace.Exception.AsError(LogInvalidOperationException(null, SR.TaskCannotProcessFileWithoutType(xClassDirectiveName)));
            }

            strippedXamlNodes.Writer.Close();
            strippedXamlNodes = RewriteRootNode(strippedXamlNodes, result.Name, result.Namespace);

            result.EmbeddedResourceXaml = strippedXamlNodes;
            return(result);
        }
Esempio n. 31
0
 public XamlReaderMarkupFactory(System.Xaml.XamlReader reader, IXamlObjectWriterFactory xamlObjectWriterFactory)
 {
     _xamlObjectWriterFactory = xamlObjectWriterFactory;
     _xamlNodeList            = new XamlNodeList(reader.SchemaContext);
     XamlServices.Transform(reader, _xamlNodeList.Writer);
 }
Esempio n. 32
0
        // This method reads a ViewStateData node from the xaml nodestream. It outputs the Id property into viewStateId
        // and the attached viewstate related properties in viewStateNodes. The input reader is positioned on a
        // ViewStateData node within ViewStateManager.
        static void ReadViewState(XamlType viewStateType, XamlReader xamlReader, out string viewStateId, out XamlNodeList viewStateNodes, out SourceLocation sourceLocation)
        {
            int  globalMemberLevel = 0;
            bool skippingUnexpectedAttachedProperty      = false;
            int  skippingUnexpectedAttachedPropertyLevel = 0;

            viewStateId    = null;
            viewStateNodes = new XamlNodeList(viewStateType.SchemaContext);
            sourceLocation = null;

            Stack <Frame> objectNodes = new Stack <Frame>();
            XamlMember    idMember    = new XamlMember(typeof(ViewStateData).GetProperty("Id"), xamlReader.SchemaContext);

            int[] viewStateDataSourceLocation = new int[4];
            int   sourceLocationIndex         = -1;

            IXamlLineInfo         lineInfo         = xamlReader as IXamlLineInfo;
            IXamlLineInfoConsumer lineInfoComsumer = viewStateNodes.Writer as IXamlLineInfoConsumer;
            bool shouldPassLineInfo = lineInfo != null && lineInfo.HasLineInfo && lineInfoComsumer != null && lineInfoComsumer.ShouldProvideLineInfo;

            while (xamlReader.Read())
            {
                bool skipWritingToNodeList = false;
                switch (xamlReader.NodeType)
                {
                case XamlNodeType.StartObject:
                    if (xamlReader.Type.Equals(viewStateType))
                    {
                        skipWritingToNodeList = true;
                    }
                    objectNodes.Push(new Frame {
                        Type = xamlReader.Type
                    });
                    break;

                case XamlNodeType.GetObject:
                    objectNodes.Push(new Frame {
                        Type = null
                    });
                    break;

                case XamlNodeType.StartMember:
                    globalMemberLevel++;
                    if (xamlReader.Member.Equals(idMember))
                    {
                        XamlReader idNode = xamlReader.ReadSubtree();
                        while (idNode.Read())
                        {
                            if (idNode.NodeType == XamlNodeType.Value)
                            {
                                viewStateId = idNode.Value as string;
                            }
                        }
                    }
                    // The xamlReader.ReadSubtree and subsequent while loop to get the Id member
                    // has moved the xamlReader forward to the next member. We need to check to see
                    // if it is an Attached Property that we care about. If it isn't then we need to
                    // skip it and not put it in the resulting XamlNodeList.
                    if (globalMemberLevel == 1 && !IsAttachablePropertyForConvert(xamlReader))
                    {
                        skippingUnexpectedAttachedProperty = true;
                    }
                    if (skippingUnexpectedAttachedProperty)
                    {
                        skippingUnexpectedAttachedPropertyLevel++;
                    }

                    sourceLocationIndex = GetViewStateDataSourceLocationIndexFromCurrentReader(xamlReader);
                    break;

                case XamlNodeType.EndMember:
                    globalMemberLevel--;
                    if (skippingUnexpectedAttachedProperty)
                    {
                        skippingUnexpectedAttachedPropertyLevel--;
                    }
                    break;

                case XamlNodeType.Value:
                    if (xamlReader.Value is int &&
                        sourceLocationIndex >= 0 &&
                        sourceLocationIndex < viewStateDataSourceLocation.Length)
                    {
                        viewStateDataSourceLocation[sourceLocationIndex] = (int)xamlReader.Value;
                    }

                    break;

                case XamlNodeType.EndObject:
                    Frame objectNode = objectNodes.Pop();
                    if (objectNode.Type != null && objectNode.Type.Equals(viewStateType))
                    {
                        skipWritingToNodeList = true;
                        // The ViewStateData's source location should be valid, because
                        // before each EndObject, its SourceLocation is injected.
                        // If not, an exception will be thrown from constructor
                        // of SourceLocation.
                        sourceLocation = new SourceLocation(null,
                                                            viewStateDataSourceLocation[0],
                                                            viewStateDataSourceLocation[1],
                                                            viewStateDataSourceLocation[2],
                                                            viewStateDataSourceLocation[3]
                                                            );
                    }

                    Array.Clear(viewStateDataSourceLocation, 0, viewStateDataSourceLocation.Length);
                    break;
                }
                ;

                if (!skipWritingToNodeList && !skippingUnexpectedAttachedProperty)
                {
                    if (shouldPassLineInfo)
                    {
                        lineInfoComsumer.SetLineInfo(lineInfo.LineNumber, lineInfo.LinePosition);
                    }

                    viewStateNodes.Writer.WriteNode(xamlReader);
                }

                if (skippingUnexpectedAttachedPropertyLevel == 0)
                {
                    skippingUnexpectedAttachedProperty = false;
                }
            }
            viewStateNodes.Writer.Close();
        }