+ public class CompilationUnit : SourceFile, ICompileUnit
+ {
+ CompileUnitEntry comp_unit;
+ Hashtable include_files;
+ Hashtable conditionals;
+
+ public CompilationUnit (string name, string path, int index)
+ : base (name, path, index, false)
+ { }
+
+ public void AddFile (SourceFile file)
+ {
+ if (include_files == null)
+ include_files = new Hashtable ();
+
+ if (!include_files.Contains (file.Path))
+ include_files.Add (file.Path, file);
+ }
+
+ public void AddDefine (string value)
+ {
+ if (conditionals == null)
+ conditionals = new Hashtable (2);
+
+ conditionals [value] = true;
+ }
+
+ public void AddUndefine (string value)
+ {
+ if (conditionals == null)
+ conditionals = new Hashtable (2);
+
+ conditionals [value] = null;
+ }
+
+ CompileUnitEntry ICompileUnit.Entry {
+ get { return comp_unit; }
+ }
+
+ public CompileUnitEntry CompileUnitEntry {
+ get { return comp_unit; }
+ }
+
+ public override void DefineSymbolInfo (MonoSymbolWriter symwriter)
+ {
+ base.DefineSymbolInfo (symwriter);
+
+ comp_unit = symwriter.DefineCompilationUnit (SourceFileEntry);
+
+ if (include_files != null) {
+ foreach (SourceFile include in include_files.Values) {
+ include.DefineSymbolInfo (symwriter);
+ comp_unit.AddFile (include.SourceFileEntry);
+ }
+ }
+ }
+
+ public bool IsConditionalDefined (string value)
+ {
+ if (conditionals != null) {
+ object res = conditionals [value];
+ if (res != null)
+ return (bool)res;
+
+ // When conditional was undefined
+ if (conditionals.Contains (value))
+ return false;
+ }
+
+ return RootContext.IsConditionalDefined (value);
+ }
+ }
+