5
// Michael Hutchinson <mhutchinson@novell.com>
7
// Copyright (C) 2008 Novell, Inc (http://www.novell.com)
9
// Permission is hereby granted, free of charge, to any person obtaining
10
// a copy of this software and associated documentation files (the
11
// "Software"), to deal in the Software without restriction, including
12
// without limitation the rights to use, copy, modify, merge, publish,
13
// distribute, sublicense, and/or sell copies of the Software, and to
14
// permit persons to whom the Software is furnished to do so, subject to
15
// the following conditions:
17
// The above copyright notice and this permission notice shall be
18
// included in all copies or substantial portions of the Software.
20
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
24
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
30
using System.Collections.Generic;
35
using MonoDevelop.Xml.StateEngine;
36
using MonoDevelop.Projects.Dom;
37
using MonoDevelop.Projects.Dom.Parser;
39
namespace MonoDevelop.Moonlight
43
public class MoonlightParser : AbstractParser
46
public MoonlightParser () : base (null, "application/xaml+xml")
50
public override bool CanParse (string fileName)
52
return fileName.EndsWith (".xaml");
55
public override ParsedDocument Parse (string fileName, string fileContent)
57
XmlParsedDocument doc = new XmlParsedDocument (fileName);
58
TextReader tr = new StringReader (fileContent);
60
Parser xmlParser = new Parser (new XmlFreeState (), true);
62
doc.XDocument = xmlParser.Nodes.GetRoot ();
63
doc.Add (xmlParser.Errors);
65
if (doc.XDocument != null || doc.XDocument.RootElement != null) {
66
if (!doc.XDocument.RootElement.IsEnded)
67
doc.XDocument.RootElement.End (xmlParser.Location);
71
catch (Exception ex) {
72
MonoDevelop.Core.LoggingService.LogError ("Unhandled error parsing xaml document", ex);
81
static void GenerateCU (XmlParsedDocument doc)
83
if (doc.XDocument == null || doc.XDocument.RootElement == null) {
84
doc.Add (new Error (ErrorType.Error, 1, 1, "No root node found."));
88
XAttribute rootClass = doc.XDocument.RootElement.Attributes [new XName ("x", "Class")];
89
if (rootClass == null) {
90
doc.Add (new Error (ErrorType.Error, 1, 1, "Root node does not contain an x:Class attribute."));
94
bool isApplication = doc.XDocument.RootElement.Name.Name == "Application";
96
string rootNamespace, rootType, rootAssembly;
97
XamlG.ParseXmlns (rootClass.Value, out rootType, out rootNamespace, out rootAssembly);
99
CompilationUnit cu = new CompilationUnit (doc.FileName);
100
doc.CompilationUnit = cu;
102
DomRegion rootRegion = doc.XDocument.RootElement.Region;
103
if (doc.XDocument.RootElement.IsClosed)
104
rootRegion.End = doc.XDocument.RootElement.ClosingTag.Region.End;
106
DomType declType = new DomType (cu, ClassType.Class, Modifiers.Partial | Modifiers.Public, rootType,
107
doc.XDocument.RootElement.Region.Start, rootNamespace, rootRegion);
110
DomMethod initcomp = new DomMethod ();
111
initcomp.Name = "InitializeComponent";
112
initcomp.Modifiers = Modifiers.Public;
113
initcomp.ReturnType = DomReturnType.Void;
114
declType.Add (initcomp);
116
DomField _contentLoaded = new DomField ("_contentLoaded");
117
_contentLoaded.ReturnType = new DomReturnType ("System.Boolean");
122
cu.Add (new DomUsing (new DomRegion (), "System"));
123
cu.Add (new DomUsing (new DomRegion (), "System.Windows"));
124
cu.Add (new DomUsing (new DomRegion (), "System.Windows.Controls"));
125
cu.Add (new DomUsing (new DomRegion (), "System.Windows.Documents"));
126
cu.Add (new DomUsing (new DomRegion (), "System.Windows.Input"));
127
cu.Add (new DomUsing (new DomRegion (), "System.Windows.Media"));
128
cu.Add (new DomUsing (new DomRegion (), "System.Windows.Media.Animation"));
129
cu.Add (new DomUsing (new DomRegion (), "System.Windows.Shapes"));
131
// Dictionary<string,string> namespaceMap = new Dictionary<string, string> ();
132
// namespaceMap["x"] = "http://schemas.microsoft.com/winfx/2006/xaml";
134
XName nameAtt = new XName ("x", "Name");
136
IEnumerable<DomField> fields =
137
from XElement el in doc.XDocument.RootElement.AllDescendentElements
138
let name = el.Attributes [nameAtt]
140
select new DomField (name.Value, Modifiers.Internal, el.Region.Start,
141
new DomReturnType (ResolveType (el)));
143
foreach (DomField f in fields)
147
static string ResolveType (XElement el)
150
// string name = attr.Value;
151
// string ns = XamlG.GetNamespace (node);
152
// string type = node.LocalName;
155
// type = String.Concat (ns, ".", type);