From 9d52c21a2ecc3c01ae321f04fd1d39f378e34794 Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Wed, 15 Feb 2006 19:14:39 +0000 Subject: [PATCH] VB.NET projects can now target Mono via the MonoBasic compiler. All Mono compiler command lines now logged and can be seen when running MSBuild from the command prompt. Added Gtk# project and file template for VB.NET. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@1157 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../file/VBNet/FileCategorySortOrder.xml | 5 + .../templates/file/VBNet/VBNet.Gtk.Window.xft | 39 +++ data/templates/project/VBNet/GtkProject.xpt | 107 +++++++ .../VBNet/ProjectCategorySortOrder.xml | 5 + .../ICSharpCode.Build.Tasks.sln | 16 +- .../Project/CompilerCommandLineArguments.cs | 94 +++--- .../ICSharpCode.Build.Tasks/Project/Gmcs.cs | 2 +- .../Project/ICSharpCode.Build.Tasks.csproj | 8 +- .../Project/ICompilerResultsParser.cs | 2 +- .../ICSharpCode.Build.Tasks/Project/Mbas.cs | 142 +++++++++ .../ICSharpCode.Build.Tasks/Project/Mcs.cs | 2 +- .../Project/MonoBasicCompilerResultsParser.cs | 65 +++++ ....cs => MonoCSharpCompilerResultsParser.cs} | 8 +- .../Project/MonoCSharpCompilerTask.cs | 158 ++++++++++ .../Project/MonoCompiler.cs | 2 +- .../Project/MonoCompilerTask.cs | 163 +++-------- .../SharpDevelop.Build.Mono.Gmcs.targets | 2 +- .../SharpDevelop.Build.Mono.Mbas.targets | 114 ++++++++ .../SharpDevelop.Build.Mono.Mcs.targets | 2 +- .../SharpDevelop.Build.VisualBasic.targets | 5 +- .../Test/CompilerCommandLineTestFixture.cs | 273 ------------------ .../Test/GeneralErrorParseTestFixture.cs | 2 +- .../Test/ICSharpCode.Build.Tasks.Tests.csproj | 6 +- .../ICSharpCode.Build.Tasks/Test/MockMbas.cs | 28 ++ .../Test/MockMonoCSharpCompilerTask.cs | 34 +++ .../Test/MonoBasicCommandLineTestFixture.cs | 206 +++++++++++++ ...onoCSharpCompilerCommandLineTestFixture.cs | 231 +++++++++++++++ .../Test/NormalMbasErrorParseTestFixture.cs | 65 +++++ .../Test/NormalMonoErrorParseTestFixture.cs | 2 +- 29 files changed, 1315 insertions(+), 473 deletions(-) create mode 100644 data/templates/file/VBNet/FileCategorySortOrder.xml create mode 100644 data/templates/file/VBNet/VBNet.Gtk.Window.xft create mode 100644 data/templates/project/VBNet/GtkProject.xpt create mode 100644 data/templates/project/VBNet/ProjectCategorySortOrder.xml create mode 100644 src/Libraries/ICSharpCode.Build.Tasks/Project/Mbas.cs create mode 100644 src/Libraries/ICSharpCode.Build.Tasks/Project/MonoBasicCompilerResultsParser.cs rename src/Libraries/ICSharpCode.Build.Tasks/Project/{CompilerResultsParser.cs => MonoCSharpCompilerResultsParser.cs} (90%) create mode 100644 src/Libraries/ICSharpCode.Build.Tasks/Project/MonoCSharpCompilerTask.cs create mode 100644 src/Libraries/ICSharpCode.Build.Tasks/Project/SharpDevelop.Build.Mono.Mbas.targets delete mode 100644 src/Libraries/ICSharpCode.Build.Tasks/Test/CompilerCommandLineTestFixture.cs create mode 100644 src/Libraries/ICSharpCode.Build.Tasks/Test/MockMbas.cs create mode 100644 src/Libraries/ICSharpCode.Build.Tasks/Test/MockMonoCSharpCompilerTask.cs create mode 100644 src/Libraries/ICSharpCode.Build.Tasks/Test/MonoBasicCommandLineTestFixture.cs create mode 100644 src/Libraries/ICSharpCode.Build.Tasks/Test/MonoCSharpCompilerCommandLineTestFixture.cs create mode 100644 src/Libraries/ICSharpCode.Build.Tasks/Test/NormalMbasErrorParseTestFixture.cs diff --git a/data/templates/file/VBNet/FileCategorySortOrder.xml b/data/templates/file/VBNet/FileCategorySortOrder.xml new file mode 100644 index 0000000000..6b3a62d232 --- /dev/null +++ b/data/templates/file/VBNet/FileCategorySortOrder.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/data/templates/file/VBNet/VBNet.Gtk.Window.xft b/data/templates/file/VBNet/VBNet.Gtk.Window.xft new file mode 100644 index 0000000000..15489bcea0 --- /dev/null +++ b/data/templates/file/VBNet/VBNet.Gtk.Window.xft @@ -0,0 +1,39 @@ + + diff --git a/data/templates/project/VBNet/GtkProject.xpt b/data/templates/project/VBNet/GtkProject.xpt new file mode 100644 index 0000000000..b7087ebb0e --- /dev/null +++ b/data/templates/project/VBNet/GtkProject.xpt @@ -0,0 +1,107 @@ + + diff --git a/data/templates/project/VBNet/ProjectCategorySortOrder.xml b/data/templates/project/VBNet/ProjectCategorySortOrder.xml new file mode 100644 index 0000000000..117d6a82d2 --- /dev/null +++ b/data/templates/project/VBNet/ProjectCategorySortOrder.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/src/Libraries/ICSharpCode.Build.Tasks/ICSharpCode.Build.Tasks.sln b/src/Libraries/ICSharpCode.Build.Tasks/ICSharpCode.Build.Tasks.sln index 26da2d8060..bda7f92c70 100644 --- a/src/Libraries/ICSharpCode.Build.Tasks/ICSharpCode.Build.Tasks.sln +++ b/src/Libraries/ICSharpCode.Build.Tasks/ICSharpCode.Build.Tasks.sln @@ -1,8 +1,22 @@ Microsoft Visual Studio Solution File, Format Version 9.00 -# SharpDevelop 2.0.0.546 +# SharpDevelop 2.0.0.1116 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.Build.Tasks", "Project\ICSharpCode.Build.Tasks.csproj", "{4139CCF6-FB49-4A9D-B2CF-331E9EA3198D}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.Build.Tasks.Tests", "Test\ICSharpCode.Build.Tasks.Tests.csproj", "{B7C2A664-B454-4920-AC6E-318F5274B2EF}" EndProject Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {B7C2A664-B454-4920-AC6E-318F5274B2EF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B7C2A664-B454-4920-AC6E-318F5274B2EF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B7C2A664-B454-4920-AC6E-318F5274B2EF}.Release|Any CPU.Build.0 = Release|Any CPU + {B7C2A664-B454-4920-AC6E-318F5274B2EF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4139CCF6-FB49-4A9D-B2CF-331E9EA3198D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4139CCF6-FB49-4A9D-B2CF-331E9EA3198D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4139CCF6-FB49-4A9D-B2CF-331E9EA3198D}.Release|Any CPU.Build.0 = Release|Any CPU + {4139CCF6-FB49-4A9D-B2CF-331E9EA3198D}.Release|Any CPU.ActiveCfg = Release|Any CPU + EndGlobalSection EndGlobal diff --git a/src/Libraries/ICSharpCode.Build.Tasks/Project/CompilerCommandLineArguments.cs b/src/Libraries/ICSharpCode.Build.Tasks/Project/CompilerCommandLineArguments.cs index 57c05a3f0f..b24f97529c 100644 --- a/src/Libraries/ICSharpCode.Build.Tasks/Project/CompilerCommandLineArguments.cs +++ b/src/Libraries/ICSharpCode.Build.Tasks/Project/CompilerCommandLineArguments.cs @@ -9,16 +9,16 @@ using Microsoft.Build.Framework; using Microsoft.Build.Tasks; using Microsoft.Build.Utilities; using System; +using System.Globalization; using System.Text; using System.IO; namespace ICSharpCode.Build.Tasks { public class CompilerCommandLineArguments : CommandLineBuilderExtension - { - public CompilerCommandLineArguments(MonoCompilerTask compilerTask) + { + public CompilerCommandLineArguments() { - GenerateCommandLineArguments(compilerTask); } public static bool IsNetModule(string fileName) @@ -26,36 +26,28 @@ namespace ICSharpCode.Build.Tasks return Path.GetExtension(fileName).ToLowerInvariant() == ".netmodule"; } - void GenerateCommandLineArguments(MonoCompilerTask compilerTask) + public void AppendFileNameIfNotNull(string switchName, ITaskItem fileItem) { - AppendSwitchIfTrue("-noconfig", compilerTask.NoConfig); - AppendSwitch("-warn:", compilerTask.WarningLevel.ToString()); - AppendFileNameIfNotNull("-out:", compilerTask.OutputAssembly); - AppendTarget(compilerTask.TargetType); - AppendSwitchWithoutParameterIfNotNull("-debug", compilerTask.DebugType); - AppendSwitchIfTrue("-optimize", compilerTask.Optimize); - AppendSwitchIfTrue("-nologo", compilerTask.NoLogo); - AppendSwitchIfTrue("-unsafe", compilerTask.AllowUnsafeBlocks); - AppendSwitchIfTrue("-nostdlib", compilerTask.NoStandardLib); - AppendSwitchIfTrue("-checked", compilerTask.CheckForOverflowUnderflow); - AppendSwitchIfTrue("-delaysign", compilerTask.DelaySign); - AppendSwitchIfNotNull("-langversion:", compilerTask.LangVersion); - AppendSwitchIfNotNull("-keycontainer:", compilerTask.KeyContainer); - AppendSwitchIfNotNull("-keyfile:", compilerTask.KeyFile); - AppendSwitchIfNotNull("-define:", compilerTask.DefineConstants); - AppendSwitchIfTrue("-warnaserror", compilerTask.TreatWarningsAsErrors); - AppendSwitchIfNotNull("-nowarn:", compilerTask.DisabledWarnings); - AppendSwitchIfNotNull("-main:", compilerTask.MainEntryPoint); - AppendFileNameIfNotNull("-doc:", compilerTask.DocumentationFile); - AppendSwitchIfNotNull("-lib:", compilerTask.AdditionalLibPaths, ","); - AppendReferencesIfNotNull(compilerTask.References); - AppendResourcesIfNotNull(compilerTask.Resources); - AppendFileNameIfNotNull("-win32res:", compilerTask.Win32Resource); - AppendFileNameIfNotNull("-win32icon:", compilerTask.Win32Icon); - AppendFileNamesIfNotNull(compilerTask.Sources, " "); + if (fileItem != null) { + AppendFileNameIfNotNull(switchName, fileItem.ItemSpec); + } + } + + public void AppendTarget(string targetType) + { + if (targetType != null) { + AppendSwitch("-target:", targetType.ToLowerInvariant()); + } } - void AppendReferencesIfNotNull(ITaskItem[] references) + public void AppendSwitchIfTrue(string switchName, bool parameter) + { + if (parameter) { + AppendSwitch(switchName); + } + } + + public void AppendReferencesIfNotNull(ITaskItem[] references) { if (references == null) { return; @@ -71,44 +63,23 @@ namespace ICSharpCode.Build.Tasks } } - void AppendResourcesIfNotNull(ITaskItem[] resources) + public void AppendItemsIfNotNull(string switchName, ITaskItem[] items) { - if (resources == null) { + if (items == null) { return; } - foreach (ITaskItem resource in resources) { - AppendFileNameIfNotNull("-resource:", resource); - } - } - - void AppendSwitchWithoutParameterIfNotNull(string switchName, string parameter) - { - if (parameter != null && parameter.Trim().Length > 0) { - AppendSwitch(switchName); - } - } - - void AppendSwitchIfTrue(string switchName, bool parameter) - { - if (parameter) { - AppendSwitch(switchName); + foreach (ITaskItem item in items) { + AppendFileNameIfNotNull(switchName, item); } } - void AppendSwitch(string switchName, string parameter) + public void AppendSwitch(string switchName, string parameter) { AppendSwitchIfNotNull(switchName, parameter); } - void AppendFileNameIfNotNull(string switchName, ITaskItem fileItem) - { - if (fileItem != null) { - AppendFileNameIfNotNull(switchName, fileItem.ItemSpec); - } - } - - void AppendFileNameIfNotNull(string switchName, string fileName) + public void AppendFileNameIfNotNull(string switchName, string fileName) { if (fileName != null) { AppendSpaceIfNotEmpty(); @@ -117,10 +88,13 @@ namespace ICSharpCode.Build.Tasks } } - void AppendTarget(string targetType) + /// + /// Appends and lower cases the switch's value if it is not null. + /// + public void AppendLowerCaseSwitchIfNotNull(string switchName, string parameter) { - if (targetType != null) { - AppendSwitch("-target:", targetType.ToLowerInvariant()); + if (parameter != null) { + AppendSwitch(switchName, parameter.ToLower(CultureInfo.InvariantCulture)); } } } diff --git a/src/Libraries/ICSharpCode.Build.Tasks/Project/Gmcs.cs b/src/Libraries/ICSharpCode.Build.Tasks/Project/Gmcs.cs index a6221b26a7..d246d0bffd 100644 --- a/src/Libraries/ICSharpCode.Build.Tasks/Project/Gmcs.cs +++ b/src/Libraries/ICSharpCode.Build.Tasks/Project/Gmcs.cs @@ -13,7 +13,7 @@ namespace ICSharpCode.Build.Tasks /// /// MSBuild task for Mono's GMCS. /// - public class Gmcs : MonoCompilerTask + public class Gmcs : MonoCSharpCompilerTask { protected override string ToolName { get { diff --git a/src/Libraries/ICSharpCode.Build.Tasks/Project/ICSharpCode.Build.Tasks.csproj b/src/Libraries/ICSharpCode.Build.Tasks/Project/ICSharpCode.Build.Tasks.csproj index d8b483cc05..6f9b8685da 100644 --- a/src/Libraries/ICSharpCode.Build.Tasks/Project/ICSharpCode.Build.Tasks.csproj +++ b/src/Libraries/ICSharpCode.Build.Tasks/Project/ICSharpCode.Build.Tasks.csproj @@ -42,7 +42,7 @@ - + Always @@ -61,6 +61,12 @@ Always + + + Always + + + diff --git a/src/Libraries/ICSharpCode.Build.Tasks/Project/ICompilerResultsParser.cs b/src/Libraries/ICSharpCode.Build.Tasks/Project/ICompilerResultsParser.cs index bb13d6e612..8714a4ad96 100644 --- a/src/Libraries/ICSharpCode.Build.Tasks/Project/ICompilerResultsParser.cs +++ b/src/Libraries/ICSharpCode.Build.Tasks/Project/ICompilerResultsParser.cs @@ -12,6 +12,6 @@ namespace ICSharpCode.Build.Tasks { public interface ICompilerResultsParser { - CompilerResults Parse(TempFileCollection tempFiles, string fileName); + CompilerResults Parse(TempFileCollection tempFiles, string outputFileName, string errorFileName); } } diff --git a/src/Libraries/ICSharpCode.Build.Tasks/Project/Mbas.cs b/src/Libraries/ICSharpCode.Build.Tasks/Project/Mbas.cs new file mode 100644 index 0000000000..b9e17cd4ff --- /dev/null +++ b/src/Libraries/ICSharpCode.Build.Tasks/Project/Mbas.cs @@ -0,0 +1,142 @@ +// +// +// +// +// $Revision$ +// + +using Microsoft.Build.Framework; +using Microsoft.Build.Utilities; +using System; +using System.CodeDom.Compiler; + +namespace ICSharpCode.Build.Tasks +{ + /// + /// MSBuild task for Mono's Visual Basic compiler Mbas. + /// + public class Mbas : MonoCompilerTask + { + ITaskItem[] imports; + string optionCompare; + bool optionExplicit; + bool optionStrict; + bool noWarnings; + bool removeIntegerChecks; + string rootNamespace; + + public ITaskItem[] Imports { + get { + return imports; + } + set { + imports = value; + } + } + + public string OptionCompare { + get { + return optionCompare; + } + set { + optionCompare = value; + } + } + + public bool OptionExplicit { + get { + return optionExplicit; + } + set { + optionExplicit = value; + } + } + + public bool OptionStrict { + get { + return optionStrict; + } + set { + optionStrict = value; + } + } + + public bool NoWarnings { + get { + return noWarnings; + } + set { + noWarnings = value; + } + } + + public bool RemoveIntegerChecks { + get { + return removeIntegerChecks; + } + set { + removeIntegerChecks = value; + } + } + + public string RootNamespace { + get { + return rootNamespace; + } + set { + rootNamespace = value; + } + } + + /// + /// Command line arguments that will be passed to the compiler. + /// + protected override string GenerateCommandLineArguments() + { + CompilerCommandLineArguments args = new CompilerCommandLineArguments(); + + args.AppendFileNameIfNotNull("-out:", OutputAssembly); + if (IsWarningLevelSet) { + args.AppendSwitch("-wlevel:", WarningLevel.ToString()); + } + args.AppendTarget(TargetType); + args.AppendSwitchIfTrue("-debug", EmitDebugInformation); + args.AppendLowerCaseSwitchIfNotNull("-debug:", DebugType); + args.AppendSwitchIfTrue("-nologo", NoLogo); + args.AppendSwitchIfTrue("-nowarn", noWarnings); + args.AppendSwitchIfTrue("-unsafe", AllowUnsafeBlocks); + args.AppendSwitchIfTrue("-nostdlib", NoStandardLib); + args.AppendSwitchIfNotNull("-define:", DefineConstants); + args.AppendSwitchIfNotNull("-main:", MainEntryPoint); + args.AppendSwitchIfNotNull("-lib:", AdditionalLibPaths, ","); + args.AppendSwitchIfNotNull("-ignorewarn:", DisabledWarnings); + args.AppendSwitchIfTrue("-optionstrict", OptionStrict); + args.AppendSwitchIfTrue("-optionexplicit", OptionExplicit); + args.AppendSwitchIfTrue("-warnaserror", TreatWarningsAsErrors); + args.AppendSwitchIfTrue("-removeintchecks", removeIntegerChecks); + args.AppendSwitchIfNotNull("-rootnamespace:", rootNamespace); + args.AppendItemsIfNotNull("-imports:", Imports); + args.AppendReferencesIfNotNull(References); + args.AppendItemsIfNotNull("-resource:", Resources); + args.AppendFileNamesIfNotNull(Sources, " "); + + return args.ToString(); + } + + protected override ICompilerResultsParser GetCompilerResultsParser() + { + return new MonoBasicCompilerResultsParser(); + } + + protected override string ToolName { + get { + return "Mbas.exe"; + } + } + + protected override string GenerateFullPathToTool() + { + return MonoToolLocationHelper.GetPathToTool(ToolName); + } + } +} diff --git a/src/Libraries/ICSharpCode.Build.Tasks/Project/Mcs.cs b/src/Libraries/ICSharpCode.Build.Tasks/Project/Mcs.cs index 39ef1f539e..beb5a485ee 100644 --- a/src/Libraries/ICSharpCode.Build.Tasks/Project/Mcs.cs +++ b/src/Libraries/ICSharpCode.Build.Tasks/Project/Mcs.cs @@ -13,7 +13,7 @@ namespace ICSharpCode.Build.Tasks /// /// MSBuild task for Mono's MCS. /// - public class Mcs : MonoCompilerTask + public class Mcs : MonoCSharpCompilerTask { protected override string ToolName { get { diff --git a/src/Libraries/ICSharpCode.Build.Tasks/Project/MonoBasicCompilerResultsParser.cs b/src/Libraries/ICSharpCode.Build.Tasks/Project/MonoBasicCompilerResultsParser.cs new file mode 100644 index 0000000000..a76e4f5474 --- /dev/null +++ b/src/Libraries/ICSharpCode.Build.Tasks/Project/MonoBasicCompilerResultsParser.cs @@ -0,0 +1,65 @@ +// +// +// +// +// $Revision$ +// + +using System; +using System.CodeDom.Compiler; +using System.IO; +using System.Text; +using System.Text.RegularExpressions; + +namespace ICSharpCode.Build.Tasks +{ + public class MonoBasicCompilerResultsParser : ICompilerResultsParser + { + public const string NormalErrorPattern = @"(?.*)\((?\d+),(?\d+)\)\s+(?\w+)\s+(?[\d\w]+):\s+(?.*)"; + + Regex normalError = new Regex(NormalErrorPattern, RegexOptions.Compiled); + + public MonoBasicCompilerResultsParser() + { + } + + public CompilerResults Parse(TempFileCollection tempFiles, string outputFileName, string errorFileName) + { + CompilerResults results = new CompilerResults(tempFiles); + + StringBuilder compilerOutput = new StringBuilder(); + StreamReader resultsReader = File.OpenText(outputFileName); + + while (true) { + string curLine = resultsReader.ReadLine(); + compilerOutput.Append(curLine); + compilerOutput.Append('\n'); + if (curLine == null) { + break; + } + curLine = curLine.Trim(); + if (curLine.Length == 0) { + continue; + } + + CompilerError error = new CompilerError(); + + // try to match standard mono errors + Match match = normalError.Match(curLine); + if (match.Success) { + error.Column = Int32.Parse(match.Result("${column}")); + error.Line = Int32.Parse(match.Result("${line}")); + error.FileName = Path.GetFullPath(match.Result("${file}")); + error.IsWarning = match.Result("${error}") == "warning"; + error.ErrorNumber = match.Result("${number}"); + error.ErrorText = match.Result("${message}"); + + results.Errors.Add(error); + } + } + resultsReader.Close(); + + return results; + } + } +} diff --git a/src/Libraries/ICSharpCode.Build.Tasks/Project/CompilerResultsParser.cs b/src/Libraries/ICSharpCode.Build.Tasks/Project/MonoCSharpCompilerResultsParser.cs similarity index 90% rename from src/Libraries/ICSharpCode.Build.Tasks/Project/CompilerResultsParser.cs rename to src/Libraries/ICSharpCode.Build.Tasks/Project/MonoCSharpCompilerResultsParser.cs index d7597cba67..fdefcfb638 100644 --- a/src/Libraries/ICSharpCode.Build.Tasks/Project/CompilerResultsParser.cs +++ b/src/Libraries/ICSharpCode.Build.Tasks/Project/MonoCSharpCompilerResultsParser.cs @@ -13,7 +13,7 @@ using System.Text.RegularExpressions; namespace ICSharpCode.Build.Tasks { - public class CompilerResultsParser : ICompilerResultsParser + public class MonoCSharpCompilerResultsParser : ICompilerResultsParser { public const string NormalErrorPattern = @"(?.*)\((?\d+),(?\d+)\):\s+(?\w+)\s+(?[\d\w]+):\s+(?.*)"; public const string GeneralErrorPattern = @"(?.+?)\s+(?[\d\w]+?):\s+(?.*)"; @@ -21,16 +21,16 @@ namespace ICSharpCode.Build.Tasks Regex normalError = new Regex(NormalErrorPattern, RegexOptions.Compiled); Regex generalError = new Regex(GeneralErrorPattern, RegexOptions.Compiled); - public CompilerResultsParser() + public MonoCSharpCompilerResultsParser() { } - public CompilerResults Parse(TempFileCollection tempFiles, string fileName) + public CompilerResults Parse(TempFileCollection tempFiles, string outputFileName, string errorFileName) { CompilerResults results = new CompilerResults(tempFiles); StringBuilder compilerOutput = new StringBuilder(); - StreamReader resultsReader = File.OpenText(fileName); + StreamReader resultsReader = File.OpenText(errorFileName); while (true) { string curLine = resultsReader.ReadLine(); diff --git a/src/Libraries/ICSharpCode.Build.Tasks/Project/MonoCSharpCompilerTask.cs b/src/Libraries/ICSharpCode.Build.Tasks/Project/MonoCSharpCompilerTask.cs new file mode 100644 index 0000000000..aa2e535067 --- /dev/null +++ b/src/Libraries/ICSharpCode.Build.Tasks/Project/MonoCSharpCompilerTask.cs @@ -0,0 +1,158 @@ +// +// +// +// +// $Revision$ +// + +using System; + +namespace ICSharpCode.Build.Tasks +{ + /// + /// Base class for the Mcs and Gmcs tasks. + /// + public abstract class MonoCSharpCompilerTask : MonoCompilerTask + { + bool checkForOverflowUnderflow; + bool delaySign; + string documentationFile; + string keyContainer; + string keyFile; + string langVersion; + string moduleAssemblyName; + bool noConfig; + string win32Icon; + string win32Resource; + + public bool CheckForOverflowUnderflow { + get { + return checkForOverflowUnderflow; + } + set { + checkForOverflowUnderflow = value; + } + } + + public bool DelaySign { + get { + return delaySign; + } + + set { + delaySign = value; + } + } + + public string DocumentationFile { + get { + return documentationFile; + } + set { + documentationFile = value; + } + } + + public string KeyContainer { + get { + return keyContainer; + } + set { + keyContainer = value; + } + } + + public string KeyFile { + get { + return keyFile; + } + set { + keyFile = value; + } + } + + public string LangVersion { + get { + return langVersion; + } + set { + langVersion = value; + } + } + + public string ModuleAssemblyName { + get { + return moduleAssemblyName; + } + set { + moduleAssemblyName = value; + } + } + + public bool NoConfig { + get { + return noConfig; + } + set { + noConfig = value; + } + } + + public string Win32Icon { + get { + return win32Icon; + } + set { + win32Icon = value; + } + } + + public string Win32Resource { + get { + return win32Resource; + } + set { + win32Resource = value; + } + } + + protected override string GenerateCommandLineArguments() + { + CompilerCommandLineArguments args = new CompilerCommandLineArguments(); + args.AppendSwitchIfTrue("-noconfig", noConfig); + if (IsWarningLevelSet) { + args.AppendSwitch("-warn:", WarningLevel.ToString()); + } + args.AppendFileNameIfNotNull("-out:", OutputAssembly); + args.AppendTarget(TargetType); + args.AppendSwitchIfTrue("-debug", EmitDebugInformation); + args.AppendSwitchIfTrue("-optimize", Optimize); + args.AppendSwitchIfTrue("-nologo", NoLogo); + args.AppendSwitchIfTrue("-unsafe", AllowUnsafeBlocks); + args.AppendSwitchIfTrue("-nostdlib", NoStandardLib); + args.AppendSwitchIfTrue("-checked", checkForOverflowUnderflow); + args.AppendSwitchIfTrue("-delaysign", delaySign); + args.AppendSwitchIfNotNull("-langversion:", langVersion); + args.AppendSwitchIfNotNull("-keycontainer:", keyContainer); + args.AppendSwitchIfNotNull("-keyfile:", keyFile); + args.AppendSwitchIfNotNull("-define:", DefineConstants); + args.AppendSwitchIfTrue("-warnaserror", TreatWarningsAsErrors); + args.AppendSwitchIfNotNull("-nowarn:", DisabledWarnings); + args.AppendSwitchIfNotNull("-main:", MainEntryPoint); + args.AppendFileNameIfNotNull("-doc:", documentationFile); + args.AppendSwitchIfNotNull("-lib:", AdditionalLibPaths, ","); + args.AppendReferencesIfNotNull(References); + args.AppendItemsIfNotNull("-resource:", Resources); + args.AppendFileNameIfNotNull("-win32res:", win32Resource); + args.AppendFileNameIfNotNull("-win32icon:", win32Icon); + args.AppendFileNamesIfNotNull(Sources, " "); + + return args.ToString(); + } + + protected override ICompilerResultsParser GetCompilerResultsParser() + { + return new MonoCSharpCompilerResultsParser(); + } + } +} diff --git a/src/Libraries/ICSharpCode.Build.Tasks/Project/MonoCompiler.cs b/src/Libraries/ICSharpCode.Build.Tasks/Project/MonoCompiler.cs index d5b6295717..0756782bda 100644 --- a/src/Libraries/ICSharpCode.Build.Tasks/Project/MonoCompiler.cs +++ b/src/Libraries/ICSharpCode.Build.Tasks/Project/MonoCompiler.cs @@ -35,7 +35,7 @@ namespace ICSharpCode.Build.Tasks int returnValue = Executor.ExecWaitWithCapture(command, tempFiles, ref outputFileName, ref errorFileName); - results = parser.Parse(tempFiles, errorFileName); + results = parser.Parse(tempFiles, outputFileName, errorFileName); File.Delete(responseFileName); File.Delete(outputFileName); diff --git a/src/Libraries/ICSharpCode.Build.Tasks/Project/MonoCompilerTask.cs b/src/Libraries/ICSharpCode.Build.Tasks/Project/MonoCompilerTask.cs index eb4ab3b389..cfbc9dc813 100644 --- a/src/Libraries/ICSharpCode.Build.Tasks/Project/MonoCompilerTask.cs +++ b/src/Libraries/ICSharpCode.Build.Tasks/Project/MonoCompilerTask.cs @@ -13,28 +13,22 @@ using System.CodeDom.Compiler; namespace ICSharpCode.Build.Tasks { /// - /// Base class task for the mono compilers mcs and gmcs. + /// Base class task for the mono compilers mcs, gmcs and mbas. /// public abstract class MonoCompilerTask : MyToolTask { + public const int DefaultWarningLevel = 2; + string[] additionalLibPaths; string[] addModules; bool allowUnsafeBlocks; - bool checkForOverflowUnderflow; int codePage; string debugType; string defineConstants; - bool delaySign; string disabledWarnings; - string documentationFile; - string emitDebugInformation; - string keyContainer; - string keyFile; - string langVersion; + bool emitDebugInformation; ITaskItem[] linkResources; string mainEntryPoint; - string moduleAssemblyName; - bool noConfig; bool noLogo; bool noStandardLib; bool optimize; @@ -45,9 +39,17 @@ namespace ICSharpCode.Build.Tasks ITaskItem[] sources; string targetType; bool treatWarningsAsErrors; - int warningLevel; - string win32Icon; - string win32Resource; + int warningLevel = DefaultWarningLevel; + bool warningLevelSet; + + public bool AllowUnsafeBlocks { + get { + return allowUnsafeBlocks; + } + set { + allowUnsafeBlocks = value; + } + } public string[] AdditionalLibPaths { get { @@ -67,24 +69,6 @@ namespace ICSharpCode.Build.Tasks } } - public bool AllowUnsafeBlocks { - get { - return allowUnsafeBlocks; - } - set { - allowUnsafeBlocks = value; - } - } - - public bool CheckForOverflowUnderflow { - get { - return checkForOverflowUnderflow; - } - set { - checkForOverflowUnderflow = value; - } - } - public int CodePage { get { return codePage; @@ -102,7 +86,7 @@ namespace ICSharpCode.Build.Tasks debugType = value; } } - + public string DefineConstants { get { return defineConstants; @@ -112,16 +96,6 @@ namespace ICSharpCode.Build.Tasks } } - public bool DelaySign { - get { - return delaySign; - } - - set { - delaySign = value; - } - } - public string DisabledWarnings { get { return disabledWarnings; @@ -130,17 +104,8 @@ namespace ICSharpCode.Build.Tasks disabledWarnings = value; } } - - public string DocumentationFile { - get { - return documentationFile; - } - set { - documentationFile = value; - } - } - - public string EmitDebugInformation { + + public bool EmitDebugInformation { get { return emitDebugInformation; } @@ -149,33 +114,6 @@ namespace ICSharpCode.Build.Tasks } } - public string KeyContainer { - get { - return keyContainer; - } - set { - keyContainer = value; - } - } - - public string KeyFile { - get { - return keyFile; - } - set { - keyFile = value; - } - } - - public string LangVersion { - get { - return langVersion; - } - set { - langVersion = value; - } - } - public ITaskItem[] LinkResources { get { return linkResources; @@ -193,25 +131,7 @@ namespace ICSharpCode.Build.Tasks mainEntryPoint = value; } } - - public string ModuleAssemblyName { - get { - return moduleAssemblyName; - } - set { - moduleAssemblyName = value; - } - } - - public bool NoConfig { - get { - return noConfig; - } - set { - noConfig = value; - } - } - + public bool NoLogo { get { return noLogo; @@ -220,7 +140,7 @@ namespace ICSharpCode.Build.Tasks noLogo = value; } } - + public bool NoStandardLib { get { return noStandardLib; @@ -229,6 +149,7 @@ namespace ICSharpCode.Build.Tasks noStandardLib = value; } } + public bool Optimize { get { @@ -307,32 +228,17 @@ namespace ICSharpCode.Build.Tasks } set { warningLevel = value; - } - } - - public string Win32Icon { - get { - return win32Icon; - } - set { - win32Icon = value; - } - } - - public string Win32Resource { - get { - return win32Resource; - } - set { - win32Resource = value; + warningLevelSet = true; } } public override bool Execute() { - string args = GenerateCommandLineArguments(); - + string args = GenerateCommandLineArguments(); ToolPath = GenerateFullPathToTool(); + + LogToolCommand(String.Concat(ToolPath, " ", args)); + MonoCompiler compiler = new MonoCompiler(); int returnValue = compiler.Run(ToolPath, args, GetCompilerResultsParser()); @@ -353,18 +259,29 @@ namespace ICSharpCode.Build.Tasks return errorCount == 0; } + /// + /// Determines whether the warning level property has been set. + /// + protected bool IsWarningLevelSet { + get { + return warningLevelSet; + } + } + /// /// Command line arguments that will be passed to the compiler. /// protected virtual string GenerateCommandLineArguments() { - CompilerCommandLineArguments args = new CompilerCommandLineArguments(this); - return args.ToString(); + return String.Empty; } + /// + /// Gets the parser that handles the compiler output. + /// protected virtual ICompilerResultsParser GetCompilerResultsParser() { - return new CompilerResultsParser(); + return null; } } } diff --git a/src/Libraries/ICSharpCode.Build.Tasks/Project/SharpDevelop.Build.Mono.Gmcs.targets b/src/Libraries/ICSharpCode.Build.Tasks/Project/SharpDevelop.Build.Mono.Gmcs.targets index 43920fdff5..7629f8c358 100644 --- a/src/Libraries/ICSharpCode.Build.Tasks/Project/SharpDevelop.Build.Mono.Gmcs.targets +++ b/src/Libraries/ICSharpCode.Build.Tasks/Project/SharpDevelop.Build.Mono.Gmcs.targets @@ -12,7 +12,7 @@ AssemblyFile="$(SharpDevelopBinPath)\ICSharpCode.Build.Tasks.dll"/> - $(MSBuildAllProjects);$(SharpDevelopBinPath)\SharpDevelop.Build.Mono.targets + $(MSBuildAllProjects);$(SharpDevelopBuildBinPath)\SharpDevelop.Build.Mono.Gmcs.targets .cs C# diff --git a/src/Libraries/ICSharpCode.Build.Tasks/Project/SharpDevelop.Build.Mono.Mbas.targets b/src/Libraries/ICSharpCode.Build.Tasks/Project/SharpDevelop.Build.Mono.Mbas.targets new file mode 100644 index 0000000000..af6994b527 --- /dev/null +++ b/src/Libraries/ICSharpCode.Build.Tasks/Project/SharpDevelop.Build.Mono.Mbas.targets @@ -0,0 +1,114 @@ + + + + + + + + + + + $(MSBuildAllProjects);$(SharpDevelopBuildBinPath)\SharpDevelop.Build.Mono.Mbas.targets + .vb + VB + + + + + + {CandidateAssemblyFiles}; + $(ReferencePath); + {HintPathFromItem}; + {TargetFrameworkDirectory}; + {MonoGAC}; + {RawFileName}; + $(OutputPath) + + + + + + + + + + + + + + + + + + + + + GetFrameworkPaths; + GetRedistLists; + PrepareForBuild; + AddMonoAssemblySearchPaths + + + + + + + + + + + + + + + diff --git a/src/Libraries/ICSharpCode.Build.Tasks/Project/SharpDevelop.Build.Mono.Mcs.targets b/src/Libraries/ICSharpCode.Build.Tasks/Project/SharpDevelop.Build.Mono.Mcs.targets index 53a7a5a219..00888d0a1e 100644 --- a/src/Libraries/ICSharpCode.Build.Tasks/Project/SharpDevelop.Build.Mono.Mcs.targets +++ b/src/Libraries/ICSharpCode.Build.Tasks/Project/SharpDevelop.Build.Mono.Mcs.targets @@ -12,7 +12,7 @@ AssemblyFile="$(SharpDevelopBinPath)\ICSharpCode.Build.Tasks.dll"/> - $(MSBuildAllProjects);$(SharpDevelopBinPath)\SharpDevelop.Build.Mono.targets + $(MSBuildAllProjects);$(SharpDevelopBuildBinPath)\SharpDevelop.Build.Mono.Mcs.targets .cs C# diff --git a/src/Libraries/ICSharpCode.Build.Tasks/Project/SharpDevelop.Build.VisualBasic.targets b/src/Libraries/ICSharpCode.Build.Tasks/Project/SharpDevelop.Build.VisualBasic.targets index d3efa3602f..55c756912a 100644 --- a/src/Libraries/ICSharpCode.Build.Tasks/Project/SharpDevelop.Build.VisualBasic.targets +++ b/src/Libraries/ICSharpCode.Build.Tasks/Project/SharpDevelop.Build.VisualBasic.targets @@ -133,7 +133,8 @@ Win32Icon="$(ApplicationIcon)" Win32Resource="$(Win32Resource)" /> - - + + + diff --git a/src/Libraries/ICSharpCode.Build.Tasks/Test/CompilerCommandLineTestFixture.cs b/src/Libraries/ICSharpCode.Build.Tasks/Test/CompilerCommandLineTestFixture.cs deleted file mode 100644 index 77482bf640..0000000000 --- a/src/Libraries/ICSharpCode.Build.Tasks/Test/CompilerCommandLineTestFixture.cs +++ /dev/null @@ -1,273 +0,0 @@ -// -// -// -// -// $Revision$ -// - -using ICSharpCode.Build.Tasks; -using NUnit.Framework; -using Microsoft.Build.Utilities; -using System; -using System.Collections.Generic; - -namespace ICSharpCode.Build.Tasks.Tests -{ - [TestFixture] - public class CompilerCommandLineTestFixture - { - [Test] - public void NoArguments() - { - Mcs mcs = new Mcs(); - - CompilerCommandLineArguments args = new CompilerCommandLineArguments(mcs); - Assert.AreEqual("-warn:0", args.ToString()); - } - - [Test] - public void OutputAssembly() - { - Mcs mcs = new Mcs(); - string outputAssembly = @"obj\debug\test.exe"; - mcs.OutputAssembly = new TaskItem(outputAssembly); - - CompilerCommandLineArguments args = new CompilerCommandLineArguments(mcs); - Assert.AreEqual(@"-warn:0 -out:obj\debug\test.exe", args.ToString()); - } - - [Test] - public void OutputAssemblyWithSpace() - { - Mcs mcs = new Mcs(); - string outputAssembly = @"obj\debug\test this.exe"; - mcs.OutputAssembly = new TaskItem(outputAssembly); - - CompilerCommandLineArguments args = new CompilerCommandLineArguments(mcs); - Assert.AreEqual("-warn:0 -out:\"obj\\debug\\test this.exe\"", args.ToString()); - } - - [Test] - public void WinExeTarget() - { - Mcs mcs = new Mcs(); - mcs.TargetType = "Exe"; - - CompilerCommandLineArguments args = new CompilerCommandLineArguments(mcs); - Assert.AreEqual("-warn:0 -target:exe", args.ToString()); - } - - [Test] - public void ModuleTarget() - { - Mcs mcs = new Mcs(); - mcs.TargetType = "Module"; - - CompilerCommandLineArguments args = new CompilerCommandLineArguments(mcs); - Assert.AreEqual("-warn:0 -target:module", args.ToString()); - } - - [Test] - public void FullDebugging() - { - Mcs mcs = new Mcs(); - mcs.DebugType = "Full"; - - CompilerCommandLineArguments args = new CompilerCommandLineArguments(mcs); - Assert.AreEqual("-warn:0 -debug", args.ToString()); - } - - [Test] - public void Optimize() - { - Mcs mcs = new Mcs(); - mcs.Optimize = true; - - CompilerCommandLineArguments args = new CompilerCommandLineArguments(mcs); - Assert.AreEqual("-warn:0 -optimize", args.ToString()); - } - - [Test] - public void NoLogo() - { - Mcs mcs = new Mcs(); - mcs.NoLogo = true; - - CompilerCommandLineArguments args = new CompilerCommandLineArguments(mcs); - Assert.AreEqual("-warn:0 -nologo", args.ToString()); - } - - [Test] - public void Unsafe() - { - Mcs mcs = new Mcs(); - mcs.AllowUnsafeBlocks = true; - - CompilerCommandLineArguments args = new CompilerCommandLineArguments(mcs); - Assert.AreEqual("-warn:0 -unsafe", args.ToString()); - } - - [Test] - public void NoStandardLib() - { - Mcs mcs = new Mcs(); - mcs.NoStandardLib = true; - - CompilerCommandLineArguments args = new CompilerCommandLineArguments(mcs); - Assert.AreEqual("-warn:0 -nostdlib", args.ToString()); - } - - [Test] - public void DelaySign() - { - Mcs mcs = new Mcs(); - mcs.DelaySign = true; - - CompilerCommandLineArguments args = new CompilerCommandLineArguments(mcs); - Assert.AreEqual("-warn:0 -delaysign", args.ToString()); - } - - [Test] - public void DefineConstants() - { - Mcs mcs = new Mcs(); - mcs.DefineConstants = "DEBUG;TRACE"; - - CompilerCommandLineArguments args = new CompilerCommandLineArguments(mcs); - Assert.AreEqual("-warn:0 -define:\"DEBUG;TRACE\"", args.ToString()); - } - - [Test] - public void WarnAsError() - { - Mcs mcs = new Mcs(); - mcs.TreatWarningsAsErrors = true; - - CompilerCommandLineArguments args = new CompilerCommandLineArguments(mcs); - Assert.AreEqual("-warn:0 -warnaserror", args.ToString()); - } - - [Test] - public void NoWarn() - { - Mcs mcs = new Mcs(); - mcs.DisabledWarnings = "1234,5678"; - - CompilerCommandLineArguments args = new CompilerCommandLineArguments(mcs); - Assert.AreEqual("-warn:0 -nowarn:\"1234,5678\"", args.ToString()); - } - - [Test] - public void MainEntryPoint() - { - Mcs mcs = new Mcs(); - mcs.MainEntryPoint = "Console.MainClass.Main"; - - CompilerCommandLineArguments args = new CompilerCommandLineArguments(mcs); - Assert.AreEqual("-warn:0 -main:Console.MainClass.Main", args.ToString()); - } - - [Test] - public void DocumentationFile() - { - Mcs mcs = new Mcs(); - mcs.DocumentationFile = @"obj\debug test\test.exe.xml"; - - CompilerCommandLineArguments args = new CompilerCommandLineArguments(mcs); - Assert.AreEqual("-warn:0 -doc:\"obj\\debug test\\test.exe.xml\"", args.ToString()); - } - - [Test] - public void SingleSourceFile() - { - Mcs mcs = new Mcs(); - mcs.Sources = new TaskItem[] { new TaskItem("proj src\\Main.cs") }; - - CompilerCommandLineArguments args = new CompilerCommandLineArguments(mcs); - Assert.AreEqual("-warn:0 \"proj src\\Main.cs\"", args.ToString()); - } - - [Test] - public void MultipleSourceFiles() - { - Mcs mcs = new Mcs(); - mcs.Sources = new TaskItem[] { new TaskItem("proj src\\Main.cs"), - new TaskItem("AssemblyInfo.cs") }; - - CompilerCommandLineArguments args = new CompilerCommandLineArguments(mcs); - Assert.AreEqual("-warn:0 \"proj src\\Main.cs\" AssemblyInfo.cs", args.ToString()); - } - - [Test] - public void SingleReference() - { - Mcs mcs = new Mcs(); - mcs.References = new TaskItem[] { new TaskItem("proj refs\\Test.dll") }; - - CompilerCommandLineArguments args = new CompilerCommandLineArguments(mcs); - Assert.AreEqual("-warn:0 -r:\"proj refs\\Test.dll\"", args.ToString()); - } - - [Test] - public void NetModuleReference() - { - Mcs mcs = new Mcs(); - mcs.References = new TaskItem[] { new TaskItem("proj refs\\Test.dll"), - new TaskItem("proj refs\\Run.netmodule") }; - - CompilerCommandLineArguments args = new CompilerCommandLineArguments(mcs); - Assert.AreEqual("-warn:0 -r:\"proj refs\\Test.dll\" -addmodule:\"proj refs\\Run.netmodule\"", args.ToString()); - } - - [Test] - public void AdditionalLibPaths() - { - Mcs mcs = new Mcs(); - mcs.AdditionalLibPaths = new string[] { "proj\\My libs", "proj\\My libs2" }; - - CompilerCommandLineArguments args = new CompilerCommandLineArguments(mcs); - Assert.AreEqual("-warn:0 -lib:\"proj\\My libs\",\"proj\\My libs2\"", args.ToString()); - } - - [Test] - public void EmbeddedResources() - { - Mcs mcs = new Mcs(); - mcs.Resources = new TaskItem[] { new TaskItem("proj res\\Test.xml"), - new TaskItem("proj res\\Run.xml") }; - - CompilerCommandLineArguments args = new CompilerCommandLineArguments(mcs); - Assert.AreEqual("-warn:0 -resource:\"proj res\\Test.xml\" -resource:\"proj res\\Run.xml\"", args.ToString()); - } - - [Test] - public void Win32Resource() - { - Mcs mcs = new Mcs(); - mcs.Win32Resource = "Project Resources\\Test.res"; - - CompilerCommandLineArguments args = new CompilerCommandLineArguments(mcs); - Assert.AreEqual("-warn:0 -win32res:\"Project Resources\\Test.res\"", args.ToString()); - } - - [Test] - public void Win32Icon() - { - Mcs mcs = new Mcs(); - mcs.Win32Icon = "Project Icons\\app.ico"; - - CompilerCommandLineArguments args = new CompilerCommandLineArguments(mcs); - Assert.AreEqual("-warn:0 -win32icon:\"Project Icons\\app.ico\"", args.ToString()); - } - - [Test] - public void Checked() - { - Mcs mcs = new Mcs(); - mcs.CheckForOverflowUnderflow = true; - - CompilerCommandLineArguments args = new CompilerCommandLineArguments(mcs); - Assert.AreEqual("-warn:0 -checked", args.ToString()); - } - } -} diff --git a/src/Libraries/ICSharpCode.Build.Tasks/Test/GeneralErrorParseTestFixture.cs b/src/Libraries/ICSharpCode.Build.Tasks/Test/GeneralErrorParseTestFixture.cs index e678e6c175..dc552df526 100644 --- a/src/Libraries/ICSharpCode.Build.Tasks/Test/GeneralErrorParseTestFixture.cs +++ b/src/Libraries/ICSharpCode.Build.Tasks/Test/GeneralErrorParseTestFixture.cs @@ -22,7 +22,7 @@ namespace ICSharpCode.Build.Tasks.Tests { string error = "error CS1904: `CS0169' is not a valid warning number"; - Regex regex = new Regex(CompilerResultsParser.GeneralErrorPattern, RegexOptions.Compiled); + Regex regex = new Regex(MonoCSharpCompilerResultsParser.GeneralErrorPattern, RegexOptions.Compiled); match = regex.Match(error); } diff --git a/src/Libraries/ICSharpCode.Build.Tasks/Test/ICSharpCode.Build.Tasks.Tests.csproj b/src/Libraries/ICSharpCode.Build.Tasks/Test/ICSharpCode.Build.Tasks.Tests.csproj index 18358c80eb..225768913c 100644 --- a/src/Libraries/ICSharpCode.Build.Tasks/Test/ICSharpCode.Build.Tasks.Tests.csproj +++ b/src/Libraries/ICSharpCode.Build.Tasks/Test/ICSharpCode.Build.Tasks.Tests.csproj @@ -43,10 +43,14 @@ - + + + + + diff --git a/src/Libraries/ICSharpCode.Build.Tasks/Test/MockMbas.cs b/src/Libraries/ICSharpCode.Build.Tasks/Test/MockMbas.cs new file mode 100644 index 0000000000..7c4ccbcabf --- /dev/null +++ b/src/Libraries/ICSharpCode.Build.Tasks/Test/MockMbas.cs @@ -0,0 +1,28 @@ +// +// +// +// +// $Revision$ +// + +using ICSharpCode.Build.Tasks; +using System; + +namespace ICSharpCode.Build.Tasks.Tests +{ + /// + /// Helper class that allows us to test protected methods of the + /// Mbas class. + /// + public class MockMbas : Mbas + { + /// + /// Generates the Mbas command line arguments via the protected + /// GenerateCommandLineArguments method. + /// + public string GetCommandLine() + { + return base.GenerateCommandLineArguments(); + } + } +} diff --git a/src/Libraries/ICSharpCode.Build.Tasks/Test/MockMonoCSharpCompilerTask.cs b/src/Libraries/ICSharpCode.Build.Tasks/Test/MockMonoCSharpCompilerTask.cs new file mode 100644 index 0000000000..7b3f7585e4 --- /dev/null +++ b/src/Libraries/ICSharpCode.Build.Tasks/Test/MockMonoCSharpCompilerTask.cs @@ -0,0 +1,34 @@ +// +// +// +// +// $Revision$ +// + +using ICSharpCode.Build.Tasks; +using System; + +namespace ICSharpCode.Build.Tasks.Tests +{ + /// + /// Helper class that allows us to test protected methods of the + /// MonoCSharpCompilerTask class. + /// + public class MockMonoCSharpCompilerTask : MonoCSharpCompilerTask + { + /// + /// Generates the MonoCSharpCompilerTask command line arguments via the + /// protected GenerateCommandLineArguments method. + /// + public string GetCommandLine() + { + return base.GenerateCommandLineArguments(); + } + + protected override string ToolName { + get { + return "MonoCSharp.exe"; + } + } + } +} diff --git a/src/Libraries/ICSharpCode.Build.Tasks/Test/MonoBasicCommandLineTestFixture.cs b/src/Libraries/ICSharpCode.Build.Tasks/Test/MonoBasicCommandLineTestFixture.cs new file mode 100644 index 0000000000..452cbc17d7 --- /dev/null +++ b/src/Libraries/ICSharpCode.Build.Tasks/Test/MonoBasicCommandLineTestFixture.cs @@ -0,0 +1,206 @@ +// +// +// +// +// $Revision$ +// + +using ICSharpCode.Build.Tasks; +using NUnit.Framework; +using Microsoft.Build.Utilities; +using System; +using System.Collections.Generic; + +namespace ICSharpCode.Build.Tasks.Tests +{ + [TestFixture] + public class MonoBasicCommandLineTestFixture + { + [Test] + public void NoArgs() + { + MockMbas mbas = new MockMbas(); + Assert.AreEqual(String.Empty, mbas.GetCommandLine()); + } + + [Test] + public void NoStandardLib() + { + MockMbas mbas = new MockMbas(); + mbas.NoStandardLib = true; + Assert.AreEqual("-nostdlib", mbas.GetCommandLine()); + } + + [Test] + public void OutputAssembly() + { + MockMbas mbas = new MockMbas(); + string outputAssembly = @"obj\debug\test.exe"; + mbas.OutputAssembly = new TaskItem(outputAssembly); + Assert.AreEqual(@"-out:obj\debug\test.exe", mbas.GetCommandLine()); + } + + [Test] + public void Unsafe() + { + MockMbas mbas = new MockMbas(); + mbas.AllowUnsafeBlocks = true; + Assert.AreEqual("-unsafe", mbas.GetCommandLine()); + } + + [Test] + public void WarnAsError() + { + MockMbas mbas = new MockMbas(); + mbas.TreatWarningsAsErrors = true; + Assert.AreEqual("-warnaserror", mbas.GetCommandLine()); + } + + [Test] + public void WinExeTarget() + { + MockMbas mbas = new MockMbas(); + mbas.TargetType = "Exe"; + Assert.AreEqual("-target:exe", mbas.GetCommandLine()); + } + + [Test] + public void FullDebugging() + { + MockMbas mbas = new MockMbas(); + mbas.DebugType = "Full"; + Assert.AreEqual("-debug:full", mbas.GetCommandLine()); + } + + [Test] + public void EmitDebuggingInfo() + { + MockMbas mbas = new MockMbas(); + mbas.EmitDebugInformation = true; + Assert.AreEqual("-debug", mbas.GetCommandLine()); + } + + [Test] + public void NoLogo() + { + MockMbas mbas = new MockMbas(); + mbas.NoLogo = true; + Assert.AreEqual("-nologo", mbas.GetCommandLine()); + } + + [Test] + public void DefineConstants() + { + MockMbas mbas = new MockMbas(); + mbas.DefineConstants = "DEBUG=1,TRACE=1"; + Assert.AreEqual("-define:\"DEBUG=1,TRACE=1\"", mbas.GetCommandLine()); + } + + [Test] + public void MainEntryPoint() + { + MockMbas mbas = new MockMbas(); + mbas.MainEntryPoint = "Console.MainClass.Main"; + Assert.AreEqual("-main:Console.MainClass.Main", mbas.GetCommandLine()); + } + + [Test] + public void SingleSourceFile() + { + MockMbas mbas = new MockMbas(); + mbas.Sources = new TaskItem[] { new TaskItem("proj src\\Main.vb") }; + Assert.AreEqual("\"proj src\\Main.vb\"", mbas.GetCommandLine()); + } + + [Test] + public void SingleReference() + { + MockMbas mbas = new MockMbas(); + mbas.References = new TaskItem[] { new TaskItem("proj refs\\Test.dll") }; + Assert.AreEqual("-r:\"proj refs\\Test.dll\"", mbas.GetCommandLine()); + } + + [Test] + public void AdditionalLibPaths() + { + MockMbas mbas = new MockMbas(); + mbas.AdditionalLibPaths = new string[] { "proj\\My libs", "proj\\My libs2" }; + Assert.AreEqual("-lib:\"proj\\My libs\",\"proj\\My libs2\"", mbas.GetCommandLine()); + } + + [Test] + public void EmbeddedResources() + { + MockMbas mbas = new MockMbas(); + mbas.Resources = new TaskItem[] { new TaskItem("proj res\\Test.xml"), + new TaskItem("proj res\\Run.xml") }; + Assert.AreEqual("-resource:\"proj res\\Test.xml\" -resource:\"proj res\\Run.xml\"", mbas.GetCommandLine()); + } + + [Test] + public void OptionStrict() + { + MockMbas mbas = new MockMbas(); + mbas.OptionStrict = true; + Assert.AreEqual("-optionstrict", mbas.GetCommandLine()); + } + + [Test] + public void OptionExplicit() + { + MockMbas mbas = new MockMbas(); + mbas.OptionExplicit = true; + Assert.AreEqual("-optionexplicit", mbas.GetCommandLine()); + } + + [Test] + public void MultipleImports() + { + MockMbas mbas = new MockMbas(); + mbas.Imports = new TaskItem[] { new TaskItem("System.IO"), + new TaskItem("Microsoft.VisualBasic") }; + Assert.AreEqual("-imports:System.IO -imports:Microsoft.VisualBasic", mbas.GetCommandLine()); + } + + [Test] + public void RemoveIntChecks() + { + MockMbas mbas = new MockMbas(); + mbas.RemoveIntegerChecks = true; + Assert.AreEqual("-removeintchecks", mbas.GetCommandLine()); + } + + [Test] + public void RootNamespace() + { + MockMbas mbas = new MockMbas(); + mbas.RootNamespace = "MyNamespace"; + Assert.AreEqual("-rootnamespace:MyNamespace", mbas.GetCommandLine()); + } + + [Test] + public void WarningLevel() + { + MockMbas mbas = new MockMbas(); + mbas.WarningLevel = 3; + Assert.AreEqual("-wlevel:3", mbas.GetCommandLine()); + } + + [Test] + public void NoWarnings() + { + MockMbas mbas = new MockMbas(); + mbas.NoWarnings = true; + Assert.AreEqual("-nowarn", mbas.GetCommandLine()); + } + + [Test] + public void DisabledWarnings() + { + MockMbas mbas = new MockMbas(); + mbas.DisabledWarnings = "1234,5678"; + Assert.AreEqual("-ignorewarn:\"1234,5678\"", mbas.GetCommandLine()); + } + + } +} diff --git a/src/Libraries/ICSharpCode.Build.Tasks/Test/MonoCSharpCompilerCommandLineTestFixture.cs b/src/Libraries/ICSharpCode.Build.Tasks/Test/MonoCSharpCompilerCommandLineTestFixture.cs new file mode 100644 index 0000000000..36078f9304 --- /dev/null +++ b/src/Libraries/ICSharpCode.Build.Tasks/Test/MonoCSharpCompilerCommandLineTestFixture.cs @@ -0,0 +1,231 @@ +// +// +// +// +// $Revision$ +// + +using ICSharpCode.Build.Tasks; +using NUnit.Framework; +using Microsoft.Build.Utilities; +using System; +using System.Collections.Generic; + +namespace ICSharpCode.Build.Tasks.Tests +{ + [TestFixture] + public class MonoCSharpCompilerCommandLineTestFixture + { + [Test] + public void NoArguments() + { + MockMonoCSharpCompilerTask mcs = new MockMonoCSharpCompilerTask(); + Assert.AreEqual(String.Empty, mcs.GetCommandLine()); + } + + [Test] + public void OutputAssembly() + { + MockMonoCSharpCompilerTask mcs = new MockMonoCSharpCompilerTask(); + string outputAssembly = @"obj\debug\test.exe"; + mcs.OutputAssembly = new TaskItem(outputAssembly); + Assert.AreEqual(@"-out:obj\debug\test.exe", mcs.GetCommandLine()); + } + + [Test] + public void OutputAssemblyWithSpace() + { + MockMonoCSharpCompilerTask mcs = new MockMonoCSharpCompilerTask(); + string outputAssembly = @"obj\debug\test this.exe"; + mcs.OutputAssembly = new TaskItem(outputAssembly); + Assert.AreEqual("-out:\"obj\\debug\\test this.exe\"", mcs.GetCommandLine()); + } + + [Test] + public void WinExeTarget() + { + MockMonoCSharpCompilerTask mcs = new MockMonoCSharpCompilerTask(); + mcs.TargetType = "Exe"; + Assert.AreEqual("-target:exe", mcs.GetCommandLine()); + } + + [Test] + public void ModuleTarget() + { + MockMonoCSharpCompilerTask mcs = new MockMonoCSharpCompilerTask(); + mcs.TargetType = "Module"; + Assert.AreEqual("-target:module", mcs.GetCommandLine()); + } + + [Test] + public void EmitDebuggingInfo() + { + MockMonoCSharpCompilerTask mcs = new MockMonoCSharpCompilerTask(); + mcs.EmitDebugInformation = true; + Assert.AreEqual("-debug", mcs.GetCommandLine()); + } + + [Test] + public void Optimize() + { + MockMonoCSharpCompilerTask mcs = new MockMonoCSharpCompilerTask(); + mcs.Optimize = true; + Assert.AreEqual("-optimize", mcs.GetCommandLine()); + } + + [Test] + public void NoLogo() + { + MockMonoCSharpCompilerTask mcs = new MockMonoCSharpCompilerTask(); + mcs.NoLogo = true; + Assert.AreEqual("-nologo", mcs.GetCommandLine()); + } + + [Test] + public void Unsafe() + { + MockMonoCSharpCompilerTask mcs = new MockMonoCSharpCompilerTask(); + mcs.AllowUnsafeBlocks = true; + Assert.AreEqual("-unsafe", mcs.GetCommandLine()); + } + + [Test] + public void NoStandardLib() + { + MockMonoCSharpCompilerTask mcs = new MockMonoCSharpCompilerTask(); + mcs.NoStandardLib = true; + Assert.AreEqual("-nostdlib", mcs.GetCommandLine()); + } + + [Test] + public void DelaySign() + { + MockMonoCSharpCompilerTask mcs = new MockMonoCSharpCompilerTask(); + mcs.DelaySign = true; + Assert.AreEqual("-delaysign", mcs.GetCommandLine()); + } + + [Test] + public void DefineConstants() + { + MockMonoCSharpCompilerTask mcs = new MockMonoCSharpCompilerTask(); + mcs.DefineConstants = "DEBUG;TRACE"; + Assert.AreEqual("-define:\"DEBUG;TRACE\"", mcs.GetCommandLine()); + } + + [Test] + public void WarnAsError() + { + MockMonoCSharpCompilerTask mcs = new MockMonoCSharpCompilerTask(); + mcs.TreatWarningsAsErrors = true; + Assert.AreEqual("-warnaserror", mcs.GetCommandLine()); + } + + [Test] + public void DisabledWarnings() + { + MockMonoCSharpCompilerTask mcs = new MockMonoCSharpCompilerTask(); + mcs.DisabledWarnings = "1234,5678"; + Assert.AreEqual("-nowarn:\"1234,5678\"", mcs.GetCommandLine()); + } + + [Test] + public void MainEntryPoint() + { + MockMonoCSharpCompilerTask mcs = new MockMonoCSharpCompilerTask(); + mcs.MainEntryPoint = "Console.MainClass.Main"; + Assert.AreEqual("-main:Console.MainClass.Main", mcs.GetCommandLine()); + } + + [Test] + public void DocumentationFile() + { + MockMonoCSharpCompilerTask mcs = new MockMonoCSharpCompilerTask(); + mcs.DocumentationFile = @"obj\debug test\test.exe.xml"; + Assert.AreEqual("-doc:\"obj\\debug test\\test.exe.xml\"", mcs.GetCommandLine()); + } + + [Test] + public void SingleSourceFile() + { + MockMonoCSharpCompilerTask mcs = new MockMonoCSharpCompilerTask(); + mcs.Sources = new TaskItem[] { new TaskItem("proj src\\Main.cs") }; + Assert.AreEqual("\"proj src\\Main.cs\"", mcs.GetCommandLine()); + } + + [Test] + public void MultipleSourceFiles() + { + MockMonoCSharpCompilerTask mcs = new MockMonoCSharpCompilerTask(); + mcs.Sources = new TaskItem[] { new TaskItem("proj src\\Main.cs"), + new TaskItem("AssemblyInfo.cs") }; + Assert.AreEqual("\"proj src\\Main.cs\" AssemblyInfo.cs", mcs.GetCommandLine()); + } + + [Test] + public void SingleReference() + { + MockMonoCSharpCompilerTask mcs = new MockMonoCSharpCompilerTask(); + mcs.References = new TaskItem[] { new TaskItem("proj refs\\Test.dll") }; + Assert.AreEqual("-r:\"proj refs\\Test.dll\"", mcs.GetCommandLine()); + } + + [Test] + public void NetModuleReference() + { + MockMonoCSharpCompilerTask mcs = new MockMonoCSharpCompilerTask(); + mcs.References = new TaskItem[] { new TaskItem("proj refs\\Test.dll"), + new TaskItem("proj refs\\Run.netmodule") }; + Assert.AreEqual("-r:\"proj refs\\Test.dll\" -addmodule:\"proj refs\\Run.netmodule\"", mcs.GetCommandLine()); + } + + [Test] + public void AdditionalLibPaths() + { + MockMonoCSharpCompilerTask mcs = new MockMonoCSharpCompilerTask(); + mcs.AdditionalLibPaths = new string[] { "proj\\My libs", "proj\\My libs2" }; + Assert.AreEqual("-lib:\"proj\\My libs\",\"proj\\My libs2\"", mcs.GetCommandLine()); + } + + [Test] + public void EmbeddedResources() + { + MockMonoCSharpCompilerTask mcs = new MockMonoCSharpCompilerTask(); + mcs.Resources = new TaskItem[] { new TaskItem("proj res\\Test.xml"), + new TaskItem("proj res\\Run.xml") }; + Assert.AreEqual("-resource:\"proj res\\Test.xml\" -resource:\"proj res\\Run.xml\"", mcs.GetCommandLine()); + } + + [Test] + public void Win32Resource() + { + MockMonoCSharpCompilerTask mcs = new MockMonoCSharpCompilerTask(); + mcs.Win32Resource = "Project Resources\\Test.res"; + Assert.AreEqual("-win32res:\"Project Resources\\Test.res\"", mcs.GetCommandLine()); + } + + [Test] + public void Win32Icon() + { + MockMonoCSharpCompilerTask mcs = new MockMonoCSharpCompilerTask(); + mcs.Win32Icon = "Project Icons\\app.ico"; + Assert.AreEqual("-win32icon:\"Project Icons\\app.ico\"", mcs.GetCommandLine()); + } + + [Test] + public void Checked() + { + MockMonoCSharpCompilerTask mcs = new MockMonoCSharpCompilerTask(); + mcs.CheckForOverflowUnderflow = true; + Assert.AreEqual("-checked", mcs.GetCommandLine()); + } + + [Test] + public void WarningLevel() + { + MockMonoCSharpCompilerTask mcs = new MockMonoCSharpCompilerTask(); + mcs.WarningLevel = 3; + Assert.AreEqual("-warn:3", mcs.GetCommandLine()); + } + } +} diff --git a/src/Libraries/ICSharpCode.Build.Tasks/Test/NormalMbasErrorParseTestFixture.cs b/src/Libraries/ICSharpCode.Build.Tasks/Test/NormalMbasErrorParseTestFixture.cs new file mode 100644 index 0000000000..870f4cefd6 --- /dev/null +++ b/src/Libraries/ICSharpCode.Build.Tasks/Test/NormalMbasErrorParseTestFixture.cs @@ -0,0 +1,65 @@ +// +// +// +// +// $Revision$ +// + +using ICSharpCode.Build.Tasks; +using NUnit.Framework; +using System; +using System.Text.RegularExpressions; + +namespace ICSharpCode.Build.Tasks.Tests +{ + [TestFixture] + public class NormalMbasErrorParseTestFixture + { + Match match; + + [TestFixtureSetUp] + public void FixtureSetUp() + { + string error = "Form1.vb(38,3) error BC30201: Expression expected"; + + Regex regex = new Regex(MonoBasicCompilerResultsParser.NormalErrorPattern, RegexOptions.Compiled); + match = regex.Match(error); + } + + [Test] + public void Column() + { + Assert.AreEqual("3", match.Result("${column}")); + } + + [Test] + public void Line() + { + Assert.AreEqual("38", match.Result("${line}")); + } + + [Test] + public void FileName() + { + Assert.AreEqual("Form1.vb", match.Result("${file}")); + } + + [Test] + public void Warning() + { + Assert.AreEqual("error", match.Result("${error}")); + } + + [Test] + public void ErrorNumber() + { + Assert.AreEqual("BC30201", match.Result("${number}")); + } + + [Test] + public void ErrorText() + { + Assert.AreEqual("Expression expected", match.Result("${message}")); + } + } +} diff --git a/src/Libraries/ICSharpCode.Build.Tasks/Test/NormalMonoErrorParseTestFixture.cs b/src/Libraries/ICSharpCode.Build.Tasks/Test/NormalMonoErrorParseTestFixture.cs index a405b1e965..d427f14ae5 100644 --- a/src/Libraries/ICSharpCode.Build.Tasks/Test/NormalMonoErrorParseTestFixture.cs +++ b/src/Libraries/ICSharpCode.Build.Tasks/Test/NormalMonoErrorParseTestFixture.cs @@ -22,7 +22,7 @@ namespace ICSharpCode.Build.Tasks.Tests { string error = "MyClass.cs(19,7): warning CS0169: The private field `Foo.MyClass.foo' is never used"; - Regex regex = new Regex(CompilerResultsParser.NormalErrorPattern, RegexOptions.Compiled); + Regex regex = new Regex(MonoCSharpCompilerResultsParser.NormalErrorPattern, RegexOptions.Compiled); match = regex.Match(error); }