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)); }
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)); }
// // This parses the -arg and /arg options to the compiler, even if the strings // in the following text use "/arg" on the strings. // ParseResult ParseOption (string option, ref string[] args, CompilerSettings settings) { int idx = option.IndexOf (':'); string arg, value; if (idx == -1) { arg = option; value = ""; } else { arg = option.Substring (0, idx); value = option.Substring (idx + 1); } switch (arg.ToLowerInvariant ()) { case "/nologo": return ParseResult.Success; case "/t": case "/target": switch (value) { case "exe": settings.Target = Target.Exe; break; case "winexe": settings.Target = Target.WinExe; break; case "library": settings.Target = Target.Library; settings.TargetExt = ".dll"; break; case "module": settings.Target = Target.Module; settings.TargetExt = ".netmodule"; break; default: report.Error (2019, "Invalid target type for -target. Valid options are `exe', `winexe', `library' or `module'"); return ParseResult.Error; } return ParseResult.Success; case "/out": if (value.Length == 0) { Error_RequiresFileName (option); return ParseResult.Error; } settings.OutputFile = value; return ParseResult.Success; case "/o": case "/o+": case "/optimize": case "/optimize+": settings.Optimize = true; return ParseResult.Success; case "/o-": case "/optimize-": settings.Optimize = false; return ParseResult.Success; // TODO: Not supported by csc 3.5+ case "/incremental": case "/incremental+": case "/incremental-": // nothing. return ParseResult.Success; case "/d": case "/define": { if (value.Length == 0) { Error_RequiresArgument (option); return ParseResult.Error; } foreach (string d in value.Split (argument_value_separator)) { string conditional = d.Trim (); if (!Tokenizer.IsValidIdentifier (conditional)) { report.Warning (2029, 1, "Invalid conditional define symbol `{0}'", conditional); continue; } RootContext.AddConditional (conditional); } return ParseResult.Success; } case "/bugreport": // // We should collect data, runtime, etc and store in the file specified // output.WriteLine ("To file bug reports, please visit: http://www.mono-project.com/Bugs"); return ParseResult.Success; case "/pkg": { string packages; if (value.Length == 0) { Error_RequiresArgument (option); return ParseResult.Error; } packages = String.Join (" ", value.Split (new Char[] { ';', ',', '\n', '\r' })); string pkgout = null;// Driver.GetPackageFlags(packages, report); if (pkgout == null) return ParseResult.Error; string[] xargs = pkgout.Trim (new Char[] { ' ', '\n', '\r', '\t' }).Split (new Char[] { ' ', '\t' }); args = AddArgs (args, xargs); return ParseResult.Success; } case "/linkres": case "/linkresource": case "/res": case "/resource": AssemblyResource res = null; string[] s = value.Split (argument_value_separator, StringSplitOptions.RemoveEmptyEntries); switch (s.Length) { case 1: if (s[0].Length == 0) goto default; res = new AssemblyResource (s[0], Path.GetFileName (s[0])); break; case 2: res = new AssemblyResource (s[0], s[1]); break; case 3: if (s[2] != "public" && s[2] != "private") { report.Error (1906, "Invalid resource visibility option `{0}'. Use either `public' or `private' instead", s[2]); return ParseResult.Error; } res = new AssemblyResource (s[0], s[1], s[2] == "private"); break; default: report.Error (-2005, "Wrong number of arguments for option `{0}'", option); return ParseResult.Error; } if (res != null) { res.IsEmbeded = arg[1] == 'r' || arg[1] == 'R'; AddResource (res, settings); } return ParseResult.Success; case "/recurse": if (value.Length == 0) { Error_RequiresFileName (option); return ParseResult.Error; } ProcessSourceFiles (value, true); return ParseResult.Success; case "/r": case "/reference": { if (value.Length == 0) { Error_RequiresFileName (option); return ParseResult.Error; } string[] refs = value.Split (argument_value_separator); foreach (string r in refs) { if (r.Length == 0) continue; string val = r; int index = val.IndexOf ('='); if (index > -1) { string alias = r.Substring (0, index); string assembly = r.Substring (index + 1); AddAssemblyReference (alias, assembly, settings); if (refs.Length != 1) { report.Error (2034, "Cannot specify multiple aliases using single /reference option"); return ParseResult.Error; } } else { settings.AssemblyReferences.Add (val); } } return ParseResult.Success; } case "/addmodule": { if (value.Length == 0) { Error_RequiresFileName (option); return ParseResult.Error; } string[] refs = value.Split (argument_value_separator); foreach (string r in refs) { settings.Modules.Add (r); } return ParseResult.Success; } case "/win32res": { if (value.Length == 0) { Error_RequiresFileName (option); return ParseResult.Error; } if (settings.Win32IconFile != null) report.Error (1565, "Cannot specify the `win32res' and the `win32ico' compiler option at the same time"); settings.Win32ResourceFile = value; return ParseResult.Success; } case "/win32icon": { if (value.Length == 0) { Error_RequiresFileName (option); return ParseResult.Error; } if (settings.Win32ResourceFile != null) report.Error (1565, "Cannot specify the `win32res' and the `win32ico' compiler option at the same time"); settings.Win32IconFile = value; return ParseResult.Success; } case "/doc": { if (value.Length == 0) { Error_RequiresFileName (option); return ParseResult.Error; } //settings.Documentation = new Documentation (value); return ParseResult.Error; } case "/lib": { string[] libdirs; if (value.Length == 0) { return ParseResult.Error; } libdirs = value.Split (argument_value_separator); foreach (string dir in libdirs) settings.ReferencesLookupPaths.Add (dir); return ParseResult.Success; } case "/debug-": settings.GenerateDebugInfo = false; return ParseResult.Success; case "/debug": if (value == "full" || value == "") settings.GenerateDebugInfo = true; return ParseResult.Success; case "/debug+": settings.GenerateDebugInfo = true; return ParseResult.Success; case "/checked": case "/checked+": settings.Checked = true; return ParseResult.Success; case "/checked-": settings.Checked = false; return ParseResult.Success; case "/clscheck": case "/clscheck+": settings.VerifyClsCompliance = true; return ParseResult.Success; case "/clscheck-": settings.VerifyClsCompliance = false; return ParseResult.Success; case "/unsafe": case "/unsafe+": settings.Unsafe = true; return ParseResult.Success; case "/unsafe-": settings.Unsafe = false; return ParseResult.Success; case "/warnaserror": case "/warnaserror+": if (value.Length == 0) { report.WarningsAreErrors = true; } else { foreach (string wid in value.Split (numeric_value_separator)) report.AddWarningAsError (wid); } return ParseResult.Success; case "/warnaserror-": if (value.Length == 0) { report.WarningsAreErrors = false; } else { foreach (string wid in value.Split (numeric_value_separator)) report.RemoveWarningAsError (wid); } return ParseResult.Success; case "/warn": if (value.Length == 0) { Error_RequiresArgument (option); return ParseResult.Error; } SetWarningLevel (value); return ParseResult.Success; case "/nowarn": if (value.Length == 0) { Error_RequiresArgument (option); return ParseResult.Error; } var warns = value.Split (numeric_value_separator); foreach (string wc in warns) { try { if (wc.Trim ().Length == 0) continue; int warn = Int32.Parse (wc); if (warn < 1) { throw new ArgumentOutOfRangeException ("warn"); } report.SetIgnoreWarning (warn); } catch { report.Error (1904, "`{0}' is not a valid warning number", wc); return ParseResult.Error; } } return ParseResult.Success; case "/noconfig": settings.LoadDefaultReferences = false; return ParseResult.Success; case "/platform": if (value.Length == 0) { Error_RequiresArgument (option); return ParseResult.Error; } switch (value.ToLower (CultureInfo.InvariantCulture)) { case "anycpu": settings.Platform = Platform.AnyCPU; break; case "x86": settings.Platform = Platform.X86; break; case "x64": settings.Platform = Platform.X64; break; case "itanium": settings.Platform = Platform.IA64; break; default: report.Error (1672, "Invalid platform type for -platform. Valid options are `anycpu', `x86', `x64' or `itanium'"); return ParseResult.Error; } return ParseResult.Success; case "/sdk": if (value.Length == 0) { Error_RequiresArgument (option); return ParseResult.Error; } settings.SdkVersion = value; return ParseResult.Success; // We just ignore this. case "/errorreport": case "/filealign": if (value.Length == 0) { Error_RequiresArgument (option); return ParseResult.Error; } return ParseResult.Success; case "/helpinternal": OtherFlags (); return ParseResult.Stop; case "/help": case "/?": Usage (); return ParseResult.Stop; case "/main": case "/m": if (value.Length == 0) { Error_RequiresArgument (option); return ParseResult.Error; } settings.MainClass = value; return ParseResult.Success; case "/nostdlib": case "/nostdlib+": settings.StdLib = false; return ParseResult.Success; case "/nostdlib-": settings.StdLib = true; return ParseResult.Success; case "/fullpaths": report.Printer.ShowFullPaths = true; return ParseResult.Success; case "/keyfile": if (value.Length == 0) { Error_RequiresFileName (option); return ParseResult.Error; } settings.StrongNameKeyFile = value; return ParseResult.Success; case "/keycontainer": if (value.Length == 0) { Error_RequiresArgument (option); return ParseResult.Error; } settings.StrongNameKeyContainer = value; return ParseResult.Success; case "/delaysign+": case "/delaysign": settings.StrongNameDelaySign = true; return ParseResult.Success; case "/delaysign-": settings.StrongNameDelaySign = false; return ParseResult.Success; case "/langversion": if (value.Length == 0) { Error_RequiresArgument (option); return ParseResult.Error; } switch (value.ToLowerInvariant ()) { case "iso-1": settings.Version = LanguageVersion.ISO_1; return ParseResult.Success; case "default": settings.Version = LanguageVersion.Default; RootContext.AddConditional ("__V2__"); return ParseResult.Success; case "iso-2": settings.Version = LanguageVersion.ISO_2; return ParseResult.Success; case "3": settings.Version = LanguageVersion.V_3; return ParseResult.Success; case "future": settings.Version = LanguageVersion.Future; return ParseResult.Success; } report.Error (1617, "Invalid -langversion option `{0}'. It must be `ISO-1', `ISO-2', `3' or `Default'", value); return ParseResult.Error; case "/codepage": if (value.Length == 0) { Error_RequiresArgument (option); return ParseResult.Error; } switch (value) { case "utf8": settings.Encoding = new UTF8Encoding (); break; case "reset": settings.Encoding = new UTF8Encoding ();//Encoding.Default; break; default: try { settings.Encoding = new UTF8Encoding(); //Encoding.GetEncoding(int.Parse(value)); } catch { report.Error (2016, "Code page `{0}' is invalid or not installed", value); } return ParseResult.Error; } return ParseResult.Success; default: return ParseResult.UnknownOption; } }
// // Currently handles the Unix-like command line options, but will be // deprecated in favor of the CSCParseOption, which will also handle the // options that start with a dash in the future. // ParseResult ParseOptionUnix (string arg, ref string[] args, ref int i, CompilerSettings settings) { switch (arg){ case "-v": CSharpParser.yacc_verbose_flag++; return ParseResult.Success; case "--version": Version (); return ParseResult.Stop; case "--parse": settings.ParseOnly = true; return ParseResult.Success; case "--main": case "-m": report.Warning (-29, 1, "Compatibility: Use -main:CLASS instead of --main CLASS or -m CLASS"); if ((i + 1) >= args.Length){ Error_RequiresArgument (arg); return ParseResult.Error; } settings.MainClass = args[++i]; return ParseResult.Success; case "--unsafe": report.Warning (-29, 1, "Compatibility: Use -unsafe instead of --unsafe"); settings.Unsafe = true; return ParseResult.Success; case "/?": case "/h": case "/help": case "--help": Usage (); return ParseResult.Stop; case "--define": report.Warning (-29, 1, "Compatibility: Use -d:SYMBOL instead of --define SYMBOL"); if ((i + 1) >= args.Length){ Error_RequiresArgument (arg); return ParseResult.Error; } RootContext.AddConditional (args [++i]); return ParseResult.Success; case "--tokenize": settings.TokenizeOnly = true; return ParseResult.Success; case "-o": case "--output": report.Warning (-29, 1, "Compatibility: Use -out:FILE instead of --output FILE or -o FILE"); if ((i + 1) >= args.Length){ Error_RequiresArgument (arg); return ParseResult.Error; } settings.OutputFile = args[++i]; return ParseResult.Success; case "--checked": report.Warning (-29, 1, "Compatibility: Use -checked instead of --checked"); settings.Checked = true; return ParseResult.Success; case "--stacktrace": report.Printer.Stacktrace = true; return ParseResult.Success; case "--linkresource": case "--linkres": report.Warning (-29, 1, "Compatibility: Use -linkres:VALUE instead of --linkres VALUE"); if ((i + 1) >= args.Length){ Error_RequiresArgument (arg); return ParseResult.Error; } AddResource (new AssemblyResource (args[++i], args[i]), settings); return ParseResult.Success; case "--resource": case "--res": report.Warning (-29, 1, "Compatibility: Use -res:VALUE instead of --res VALUE"); if ((i + 1) >= args.Length){ Error_RequiresArgument (arg); return ParseResult.Error; } AddResource (new AssemblyResource (args[++i], args[i], true), settings); return ParseResult.Success; case "--target": report.Warning (-29, 1, "Compatibility: Use -target:KIND instead of --target KIND"); if ((i + 1) >= args.Length){ Error_RequiresArgument (arg); return ParseResult.Error; } string type = args [++i]; switch (type){ case "library": settings.Target = Target.Library; settings.TargetExt = ".dll"; break; case "exe": settings.Target = Target.Exe; break; case "winexe": settings.Target = Target.WinExe; break; case "module": settings.Target = Target.Module; settings.TargetExt = ".dll"; break; default: report.Error (2019, "Invalid target type for -target. Valid options are `exe', `winexe', `library' or `module'"); break; } return ParseResult.Success; case "-r": report.Warning (-29, 1, "Compatibility: Use -r:LIBRARY instead of -r library"); if ((i + 1) >= args.Length){ Error_RequiresArgument (arg); return ParseResult.Error; } string val = args [++i]; int idx = val.IndexOf ('='); if (idx > -1) { string alias = val.Substring (0, idx); string assembly = val.Substring (idx + 1); AddAssemblyReference (alias, assembly, settings); return ParseResult.Success; } settings.AssemblyReferences.Add (val); return ParseResult.Success; case "-L": report.Warning (-29, 1, "Compatibility: Use -lib:ARG instead of --L arg"); if ((i + 1) >= args.Length){ Error_RequiresArgument (arg); return ParseResult.Error; } settings.ReferencesLookupPaths.Add (args [++i]); return ParseResult.Success; case "--lint": settings.EnhancedWarnings = true; return ParseResult.Success; case "--nostdlib": report.Warning (-29, 1, "Compatibility: Use -nostdlib instead of --nostdlib"); settings.StdLib = false; return ParseResult.Success; case "--nowarn": report.Warning (-29, 1, "Compatibility: Use -nowarn instead of --nowarn"); if ((i + 1) >= args.Length){ Error_RequiresArgument (arg); return ParseResult.Error; } int warn = 0; try { warn = int.Parse (args [++i]); } catch { Usage (); //Environment.Exit (1); } report.SetIgnoreWarning (warn); return ParseResult.Success; case "--wlevel": report.Warning (-29, 1, "Compatibility: Use -warn:LEVEL instead of --wlevel LEVEL"); if ((i + 1) >= args.Length){ Error_RequiresArgument (arg); return ParseResult.Error; } SetWarningLevel (args [++i]); return ParseResult.Success; case "--mcs-debug": if ((i + 1) >= args.Length){ Error_RequiresArgument (arg); return ParseResult.Error; } try { Report.DebugFlags = int.Parse (args [++i]); } catch { Error_RequiresArgument (arg); return ParseResult.Error; } return ParseResult.Success; case "--about": About (); return ParseResult.Stop; case "--recurse": report.Warning (-29, 1, "Compatibility: Use -recurse:PATTERN option instead --recurse PATTERN"); if ((i + 1) >= args.Length){ Error_RequiresArgument (arg); return ParseResult.Error; } ProcessSourceFiles (args [++i], true); return ParseResult.Success; case "--timestamp": settings.Timestamps = true; return ParseResult.Success; case "--debug": case "-g": report.Warning (-29, 1, "Compatibility: Use -debug option instead of -g or --debug"); settings.GenerateDebugInfo = true; return ParseResult.Success; case "--noconfig": report.Warning (-29, 1, "Compatibility: Use -noconfig option instead of --noconfig"); settings.LoadDefaultReferences = false; return ParseResult.Success; default: if (arg.StartsWith ("--fatal")){ int fatal = 1; if (arg.StartsWith ("--fatal=")) int.TryParse (arg.Substring (8), out fatal); report.Printer.FatalCounter = fatal; return ParseResult.Success; } if (arg.StartsWith ("--runtime:", StringComparison.Ordinal)) { string version = arg.Substring (10); switch (version) { case "v1": case "V1": settings.StdLibRuntimeVersion = RuntimeVersion.v1; break; case "v2": case "V2": settings.StdLibRuntimeVersion = RuntimeVersion.v2; break; case "v4": case "V4": settings.StdLibRuntimeVersion = RuntimeVersion.v4; break; } return ParseResult.Success; } return ParseResult.UnknownOption; } }
private void ExtractTreeRoot() { RootContext rootContext = new RootContext(); Type rootContextType = rootContext.GetType(); _treeRoot = (ModuleContainer)rootContextType.InvokeMember("root", BindingFlags.GetField | BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Static, null, rootContext, null); }
static CompiledMethod CompileBlock(Class host, Undo undo) { RootContext.ResolveTree(); if (Report.Errors != 0) { undo.ExecuteUndo(); return(null); } RootContext.PopulateTypes(); if (Report.Errors != 0) { undo.ExecuteUndo(); return(null); } TypeBuilder tb = null; MethodBuilder mb = null; if (host != null) { tb = host.TypeBuilder; mb = null; foreach (MemberCore member in host.Methods) { if (member.Name != "Host") { continue; } MethodOrOperator method = (MethodOrOperator)member; mb = method.MethodBuilder; break; } if (mb == null) { throw new Exception("Internal error: did not find the method builder for the generated method"); } } RootContext.EmitCode(); if (Report.Errors != 0) { return(null); } RootContext.CloseTypes(); if (Environment.GetEnvironmentVariable("SAVE") != null) { CodeGen.Save(current_debug_name, false); } if (host == null) { return(null); } // // Unlike Mono, .NET requires that the MethodInfo is fetched, it cant // work from MethodBuilders. Retarded, I know. // Type tt = CodeGen.Assembly.Builder.GetType(tb.Name); MethodInfo mi = tt.GetMethod(mb.Name); // Pull the FieldInfos from the type, and keep track of them foreach (Field field in queued_fields) { FieldInfo fi = tt.GetField(field.Name); FieldInfo old = (FieldInfo)fields [field.Name]; // If a previous value was set, nullify it, so that we do // not leak memory if (old != null) { if (old.FieldType.IsValueType) { // // TODO: Clear fields for structs // } else { try { old.SetValue(null, null); } catch { } } } fields [field.Name] = fi; } //types.Add (tb); queued_fields.Clear(); return((CompiledMethod)System.Delegate.CreateDelegate(typeof(CompiledMethod), mi)); }
public static string [] GetCompletions(string input, out string prefix) { prefix = ""; if (input == null || input.Length == 0) { return(null); } lock (evaluator_lock){ if (!inited) { Init(); } bool partial_input; CSharpParser parser = ParseString(ParseMode.GetCompletions, input, out partial_input); if (parser == null) { if (CSharpParser.yacc_verbose_flag != 0) { Console.WriteLine("DEBUG: No completions available"); } return(null); } Class parser_result = parser.InteractiveResult as Class; if (parser_result == null) { if (CSharpParser.yacc_verbose_flag != 0) { Console.WriteLine("Do not know how to cope with !Class yet"); } return(null); } try { RootContext.ResolveTree(); if (ctx.Report.Errors != 0) { return(null); } RootContext.PopulateTypes(); if (ctx.Report.Errors != 0) { return(null); } MethodOrOperator method = null; foreach (MemberCore member in parser_result.Methods) { if (member.Name != "Host") { continue; } method = (MethodOrOperator)member; break; } if (method == null) { throw new InternalErrorException("did not find the the Host method"); } BlockContext bc = new BlockContext(method, method.Block, method.ReturnType); try { method.Block.Resolve(null, bc, method.ParameterInfo, method); } catch (CompletionResult cr) { prefix = cr.BaseText; return(cr.Result); } } finally { parser.undo.ExecuteUndo(); } } return(null); }