X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mcs%2Fmcs%2Fcontext.cs;h=316968454ef3442f14de3a7f707dd3800ecb805f;hb=76ce601441e821a12585ae269d29fa34c2143864;hp=27df55b98e255b54c755a2a37b9e0847ac86fb44;hpb=ba80f0847931c24bc7f14848a51c276d4c4efb59;p=mono.git diff --git a/mcs/mcs/context.cs b/mcs/mcs/context.cs index 27df55b98e2..316968454ef 100644 --- a/mcs/mcs/context.cs +++ b/mcs/mcs/context.cs @@ -11,15 +11,28 @@ using System; using System.Collections.Generic; +using System.IO; + +#if STATIC +using IKVM.Reflection.Emit; +#else using System.Reflection.Emit; +#endif namespace Mono.CSharp { + public enum LookupMode + { + Normal = 0, + Probing = 1, + IgnoreAccessibility = 2 + } + // // Implemented by elements which can act as independent contexts // during resolve phase. Used mostly for lookups. // - public interface IMemberContext + public interface IMemberContext : IModuleContext { // // A scope type context, it can be inflated for generic types @@ -42,17 +55,17 @@ namespace Mono.CSharp bool IsObsolete { get; } bool IsUnsafe { get; } bool IsStatic { get; } - bool HasUnresolvedConstraints { get; } - ModuleContainer Module { get; } string GetSignatureForError (); - IList LookupExtensionMethod (TypeSpec extensionType, string name, int arity, ref NamespaceEntry scope); - FullNamedExpression LookupNamespaceOrType (string name, int arity, Location loc, bool ignore_cs0104); + IList LookupExtensionMethod (TypeSpec extensionType, string name, int arity, ref NamespaceContainer scope); + FullNamedExpression LookupNamespaceOrType (string name, int arity, LookupMode mode, Location loc); FullNamedExpression LookupNamespaceAlias (string name); + } - // TODO: It has been replaced by module - CompilerContext Compiler { get; } + public interface IModuleContext + { + ModuleContainer Module { get; } } // @@ -146,7 +159,7 @@ namespace Mono.CSharp return branching; } - public FlowBranchingIterator StartFlowBranching (Iterator iterator, FlowBranching parent) + public FlowBranchingIterator StartFlowBranching (StateMachineInitializer iterator, FlowBranching parent) { FlowBranchingIterator branching = new FlowBranchingIterator (parent, iterator); current_flow_branching = branching; @@ -254,6 +267,8 @@ namespace Mono.CSharp UsingInitializerScope = 1 << 12, + LockScope = 1 << 13, + /// /// Whether control flow analysis is enabled /// @@ -347,7 +362,7 @@ namespace Mono.CSharp // // The default setting comes from the command line option // - if (RootContext.Checked) + if (mc.Module.Compiler.Settings.Checked) flags |= Options.CheckedScope; // @@ -362,8 +377,12 @@ namespace Mono.CSharp flags |= options; } - public CompilerContext Compiler { - get { return MemberContext.Compiler; } + #region Properties + + public BuiltinTypes BuiltinTypes { + get { + return MemberContext.Module.Compiler.BuiltinTypes; + } } public virtual ExplicitBlock ConstructorBlock { @@ -403,12 +422,35 @@ namespace Mono.CSharp get { return (flags & Options.DoFlowAnalysis) != 0; } } - public bool HasUnresolvedConstraints { - get { return false; } + public bool IsInProbingMode { + get { + return (flags & Options.ProbingMode) != 0; + } } - public bool IsInProbingMode { - get { return (flags & Options.ProbingMode) != 0; } + public bool IsObsolete { + get { + // Disables obsolete checks when probing is on + return MemberContext.IsObsolete; + } + } + + public bool IsStatic { + get { + return MemberContext.IsStatic; + } + } + + public bool IsUnsafe { + get { + return HasSet (Options.UnsafeScope) || MemberContext.IsUnsafe; + } + } + + public bool IsRuntimeBinder { + get { + return Module.Compiler.IsRuntimeBinder; + } } public bool IsVariableCapturingRequired { @@ -427,6 +469,14 @@ namespace Mono.CSharp get { return (flags & Options.OmitStructFlowAnalysis) != 0; } } + public Report Report { + get { + return Module.Compiler.Report; + } + } + + #endregion + public bool MustCaptureVariable (INamedBlockVariable local) { if (CurrentAnonymousMethod == null) @@ -450,11 +500,6 @@ namespace Mono.CSharp return (this.flags & options) != 0; } - public Report Report { - get { - return Compiler.Report; - } - } // Temporarily set all the given flags to the given value. Should be used in an 'using' statement public FlagsHandle Set (Options options) @@ -474,29 +519,14 @@ namespace Mono.CSharp return MemberContext.GetSignatureForError (); } - public bool IsObsolete { - get { - // Disables obsolete checks when probing is on - return MemberContext.IsObsolete; - } - } - - public bool IsStatic { - get { return MemberContext.IsStatic; } - } - - public bool IsUnsafe { - get { return HasSet (Options.UnsafeScope) || MemberContext.IsUnsafe; } - } - - public IList LookupExtensionMethod (TypeSpec extensionType, string name, int arity, ref NamespaceEntry scope) + public IList LookupExtensionMethod (TypeSpec extensionType, string name, int arity, ref NamespaceContainer scope) { return MemberContext.LookupExtensionMethod (extensionType, name, arity, ref scope); } - public FullNamedExpression LookupNamespaceOrType (string name, int arity, Location loc, bool ignore_cs0104) + public FullNamedExpression LookupNamespaceOrType (string name, int arity, LookupMode mode, Location loc) { - return MemberContext.LookupNamespaceOrType (name, arity, loc, ignore_cs0104); + return MemberContext.LookupNamespaceOrType (name, arity, mode, loc); } public FullNamedExpression LookupNamespaceAlias (string name) @@ -552,24 +582,35 @@ namespace Mono.CSharp // public class CompilerContext { + static readonly TimeReporter DisabledTimeReporter = new TimeReporter (false); + readonly Report report; - readonly BuildinTypes buildin_types; + readonly BuiltinTypes builtin_types; + readonly CompilerSettings settings; + + Dictionary all_source_files; - public CompilerContext (Report report) + public CompilerContext (CompilerSettings settings, Report report) { + this.settings = settings; this.report = report; - this.buildin_types = new BuildinTypes (); + this.builtin_types = new BuiltinTypes (); + this.TimeReporter = DisabledTimeReporter; } #region Properties - public BuildinTypes BuildinTypes { + public BuiltinTypes BuiltinTypes { get { - return buildin_types; + return builtin_types; } } - public bool IsRuntimeBinder { get; set; } + // Used for special handling of runtime dynamic context mostly + // by error reporting but also by member accessibility checks + public bool IsRuntimeBinder { + get; set; + } public Report Report { get { @@ -577,7 +618,51 @@ namespace Mono.CSharp } } + public CompilerSettings Settings { + get { + return settings; + } + } + + public List SourceFiles { + get { + return settings.SourceFiles; + } + } + + internal TimeReporter TimeReporter { + get; set; + } + #endregion + + // + // This is used when we encounter a #line preprocessing directive during parsing + // to register additional source file names + // + public SourceFile LookupFile (CompilationSourceFile comp_unit, string name) + { + if (all_source_files == null) { + all_source_files = new Dictionary (); + foreach (var source in SourceFiles) + all_source_files[source.FullPathName] = source; + } + + string path; + if (!Path.IsPathRooted (name)) { + string root = Path.GetDirectoryName (comp_unit.FullPathName); + path = Path.Combine (root, name); + } else + path = name; + + SourceFile retval; + if (all_source_files.TryGetValue (path, out retval)) + return retval; + + retval = Location.AddFile (name, path); + all_source_files.Add (path, retval); + return retval; + } } //