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 if (file.SymbolDocument == null)
59 return (int) define_namespace.Invoke (symwriter, new object[] {
60 name, file.SymbolDocument, using_list, parent });
63 public void OpenMethod (TypeContainer parent, MethodBase method, Location start, Location end)
65 int ns_id = parent.NamespaceEntry.SymbolFileID;
66 open_method.Invoke (symwriter, new object[] {
67 start.SymbolDocument, start.Row, 0, end.Row, 0, method, ns_id });
70 public void CloseMethod ()
72 symwriter.CloseMethod ();
75 public static SymbolWriter GetSymbolWriter (ModuleBuilder module)
77 ISymbolWriter symwriter = module.GetSymWriter ();
79 if (symwriter == null)
82 SymbolWriter writer = new SymbolWriter (symwriter);
83 if (!writer.Initialize ())