2 // symbolwriter.cs: The symbol writer
5 // Martin Baulig (martin@ximian.com)
7 // (C) 2003 Ximian, Inc.
11 using System.Collections;
12 using System.Reflection;
13 using System.Reflection.Emit;
14 using System.Diagnostics.SymbolStore;
16 namespace Mono.CSharp {
17 public class SymbolWriter {
18 ISymbolWriter symwriter;
19 MethodInfo define_namespace;
20 MethodInfo open_method;
22 protected SymbolWriter (ISymbolWriter symwriter)
24 this.symwriter = symwriter;
29 Type type = symwriter.GetType ();
30 define_namespace = type.GetMethod ("DefineNamespace", new Type[] {
31 typeof (string), typeof (ISymbolDocumentWriter),
32 typeof (string []), typeof (int) });
33 if (define_namespace == null)
36 open_method = type.GetMethod ("OpenMethod", new Type[] {
37 typeof (ISymbolDocumentWriter), typeof (int), typeof (int),
38 typeof (int), typeof (int), typeof (MethodBase), typeof (int) });
39 if (open_method == null)
42 Location.DefineSymbolDocuments (this);
43 Namespace.DefineNamespaces (this);
48 public ISymbolDocumentWriter DefineDocument (string path)
50 return symwriter.DefineDocument (
51 path, SymLanguageType.CSharp, SymLanguageVendor.Microsoft,
52 SymDocumentType.Text);
55 public int DefineNamespace (string name, SourceFile file, string[] using_list, int parent)
57 return (int) define_namespace.Invoke (symwriter, new object[] {
58 name, file.SymbolDocument, using_list, parent });
61 public void OpenMethod (TypeContainer parent, MethodBase method, Location start, Location end)
63 int ns_id = parent.NamespaceEntry.SymbolFileID;
64 open_method.Invoke (symwriter, new object[] {
65 start.SymbolDocument, start.Row, 0, end.Row, 0, method, ns_id });
68 public void CloseMethod ()
70 symwriter.CloseMethod ();
73 public static SymbolWriter GetSymbolWriter (ModuleBuilder module)
75 ISymbolWriter symwriter = module.GetSymWriter ();
77 if (symwriter == null)
80 SymbolWriter writer = new SymbolWriter (symwriter);
81 if (!writer.Initialize ())