+ public class CompilationUnit : SourceFile, ICompileUnit
+ {
+ CompileUnitEntry comp_unit;
+ Dictionary<string, SourceFile> include_files;
+ Dictionary<string, bool> conditionals;
+
+ public CompilationUnit (string name, string path, int index)
+ : base (name, path, index, false)
+ { }
+
+ public void AddFile (SourceFile file)
+ {
+ if (file == this)
+ return;
+
+ if (include_files == null)
+ include_files = new Dictionary<string, SourceFile> ();
+
+ if (!include_files.ContainsKey (file.Path))
+ include_files.Add (file.Path, file);
+ }
+
+ public void AddDefine (string value)
+ {
+ if (conditionals == null)
+ conditionals = new Dictionary<string, bool> (2);
+
+ conditionals [value] = true;
+ }
+
+ public void AddUndefine (string value)
+ {
+ if (conditionals == null)
+ conditionals = new Dictionary<string, bool> (2);
+
+ conditionals [value] = false;
+ }
+
+ 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) {
+ bool res;
+ if (conditionals.TryGetValue (value, out res))
+ return res;
+
+ // When conditional was undefined
+ if (conditionals.ContainsKey (value))
+ return false;
+ }
+
+ return RootContext.IsConditionalDefined (value);
+ }
+ }
+