2010-05-31 Jb Evain <jbevain@novell.com>
[mcs.git] / tools / linker / Mono.Linker.Steps / ResolveFromXApiStep.cs
blob453eebac6662b5882c534ee5b7b83c20e9e0c447
1 //
2 // ResolveFromXApiStep.cs
3 //
4 // Author:
5 // Jb Evain (jbevain@novell.com)
6 //
7 // (C) 2007 Novell, Inc.
8 //
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.
29 using System.Xml.XPath;
31 using Mono.Linker;
33 using Mono.Cecil;
35 namespace Mono.Linker.Steps {
37 public class ResolveFromXApiStep : ResolveStep, IXApiVisitor {
39 static readonly string _name = "name";
40 static readonly string _ns = string.Empty;
42 LinkContext _context;
44 XPathDocument _document;
46 public ResolveFromXApiStep (XPathDocument document)
48 _document = document;
51 public override void Process (LinkContext context)
53 _context = context;
54 XApiReader reader = new XApiReader (_document, this);
55 reader.Process (context);
58 public void OnAssembly (XPathNavigator nav, AssemblyDefinition assembly)
62 public void OnAttribute (XPathNavigator nav)
64 string name = GetName (nav);
66 TypeDefinition type = _context.GetType (name);
67 if (type != null)
68 MarkType (type);
71 public void OnClass (XPathNavigator nav, TypeDefinition type)
73 MarkType (type);
76 public void OnInterface (XPathNavigator nav, TypeDefinition type)
78 MarkType (type);
81 public void OnField (XPathNavigator nav, FieldDefinition field)
83 MarkField (field);
86 public void OnMethod (XPathNavigator nav, MethodDefinition method)
88 MarkMethod (method);
91 public void OnConstructor (XPathNavigator nav, MethodDefinition method)
93 MarkMethod (method);
96 public void OnProperty (XPathNavigator nav, PropertyDefinition property)
100 public void OnEvent (XPathNavigator nav, EventDefinition evt)
102 if (evt.AddMethod != null)
103 MarkMethod (evt.AddMethod);
104 if (evt.InvokeMethod != null)
105 MarkMethod (evt.InvokeMethod);
106 if (evt.RemoveMethod != null)
107 MarkMethod (evt.RemoveMethod);
110 static string GetName (XPathNavigator nav)
112 return GetAttribute (nav, _name);
115 static string GetAttribute (XPathNavigator nav, string attribute)
117 return nav.GetAttribute (attribute, _ns);
120 static void MarkType (TypeDefinition type)
122 InternalMark (type);
125 static void MarkField (FieldDefinition field)
127 InternalMark (field);
130 static void InternalMark (IAnnotationProvider provider)
132 Annotations.Mark (provider);
133 Annotations.SetPublic (provider);
136 static void MarkMethod (MethodDefinition method)
138 InternalMark (method);
139 Annotations.SetAction (method, MethodAction.Parse);