Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/monodevelop.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'main/src/addins/MonoDeveloperExtensions')
-rw-r--r--main/src/addins/MonoDeveloperExtensions/Commands.cs4
-rw-r--r--main/src/addins/MonoDeveloperExtensions/MakefileProject.cs405
-rw-r--r--main/src/addins/MonoDeveloperExtensions/MonoDeveloperExtensions.csproj1
-rw-r--r--main/src/addins/MonoDeveloperExtensions/MonoMakefileFormat.cs164
-rw-r--r--main/src/addins/MonoDeveloperExtensions/MonoSolutionItemHandler.cs42
-rw-r--r--main/src/addins/MonoDeveloperExtensions/NUnit/MonoTestProvider.cs23
6 files changed, 522 insertions, 117 deletions
diff --git a/main/src/addins/MonoDeveloperExtensions/Commands.cs b/main/src/addins/MonoDeveloperExtensions/Commands.cs
index 9c0477378e..8cab36b704 100644
--- a/main/src/addins/MonoDeveloperExtensions/Commands.cs
+++ b/main/src/addins/MonoDeveloperExtensions/Commands.cs
@@ -50,13 +50,13 @@ namespace MonoDeveloper
protected override void Update (CommandInfo info)
{
- info.Visible = MonoMakefileFormat.IsMonoProject (IdeApp.ProjectOperations.CurrentSelectedProject);
+ info.Visible = IdeApp.ProjectOperations.CurrentSelectedItem is MakefileProject;
}
void Install (object prj)
{
DotNetProject p = prj as DotNetProject;
- using (IProgressMonitor monitor = IdeApp.Workbench.ProgressMonitors.GetBuildProgressMonitor ()) {
+ using (ProgressMonitor monitor = IdeApp.Workbench.ProgressMonitors.GetBuildProgressMonitor ()) {
p.RunTarget (monitor, "install", IdeApp.Workspace.ActiveConfiguration);
}
}
diff --git a/main/src/addins/MonoDeveloperExtensions/MakefileProject.cs b/main/src/addins/MonoDeveloperExtensions/MakefileProject.cs
new file mode 100644
index 0000000000..d48001bfad
--- /dev/null
+++ b/main/src/addins/MonoDeveloperExtensions/MakefileProject.cs
@@ -0,0 +1,405 @@
+//
+// MakefileProject.cs
+//
+// Author:
+// Lluis Sanchez Gual <lluis@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin, Inc (http://www.xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+using System;
+using MonoDevelop.Projects;
+using MonoDevelop.Core;
+using System.Collections;
+using System.Threading.Tasks;
+using System.IO;
+using System.Text.RegularExpressions;
+using MonoDevelop.Ide;
+using MonoDevelop.Core.ProgressMonitoring;
+using MonoDevelop.Core.Execution;
+using System.CodeDom.Compiler;
+
+namespace MonoDeveloper
+{
+ public class MakefileProject: WorkspaceObject
+ {
+ string name;
+ FilePath file;
+
+ public MakefileProject (string lang)
+ {
+ }
+
+ public new string Name {
+ get { return name; }
+ set { name = value; }
+ }
+
+ public FilePath FileName {
+ get { return file; }
+ set { file = value; }
+ }
+
+ #region implemented abstract members of WorkspaceObject
+
+ protected override string OnGetName ()
+ {
+ return name;
+ }
+
+ protected override string OnGetItemDirectory ()
+ {
+ return file.ParentDirectory;
+ }
+
+ protected override string OnGetBaseDirectory ()
+ {
+ return file.ParentDirectory;
+ }
+
+ #endregion
+
+
+ DotNetProject project;
+ string outFile;
+ ArrayList refNames = new ArrayList ();
+ bool loading;
+ string testFileBase;
+ object unitTest;
+
+ public MakefileProject (DotNetProject project)
+ {
+ this.project = project;
+ project.FileAddedToProject += OnFileAddedToProject;
+ project.FileRemovedFromProject += OnFileRemovedFromProject;
+ project.FileRenamedInProject += OnFileRenamedInProject;
+ }
+
+ public string SourcesFile {
+ get { return outFile + ".sources"; }
+ }
+
+ public bool SyncFileName {
+ get { return false; }
+ }
+
+ public string ItemId {
+ get {
+ if (project.ParentSolution != null)
+ return project.ParentSolution.GetRelativeChildPath (project.FileName);
+ else
+ return project.Name;
+ }
+ }
+
+ public Task Save (MonoDevelop.Core.ProgressMonitor monitor)
+ {
+ return Task.FromResult (0);
+ }
+
+ internal void Read (MonoMakefile mkfile)
+ {
+ loading = true;
+
+ string basePath = Path.GetDirectoryName (mkfile.FileName);
+ string aname;
+
+ string targetAssembly = mkfile.GetVariable ("LIBRARY");
+ if (targetAssembly == null) {
+ targetAssembly = mkfile.GetVariable ("PROGRAM");
+ if (Path.GetDirectoryName (targetAssembly) == "")
+ targetAssembly = Path.Combine (basePath, targetAssembly);
+ aname = Path.GetFileName (targetAssembly);
+ } else {
+ aname = Path.GetFileName (targetAssembly);
+ string targetName = mkfile.GetVariable ("LIBRARY_NAME");
+ if (targetName != null) targetAssembly = targetName;
+ targetAssembly = "$(topdir)/class/lib/$(PROFILE)/" + targetAssembly;
+ }
+
+ outFile = Path.Combine (basePath, aname);
+ project.FileName = mkfile.FileName;
+
+ ArrayList checkedFolders = new ArrayList ();
+
+ // Parse projects
+ string sources = outFile + ".sources";
+ StreamReader sr = new StreamReader (sources);
+ string line;
+ while ((line = sr.ReadLine ()) != null) {
+ line = line.Trim (' ','\t');
+ if (line != "") {
+ string fname = Path.Combine (basePath, line);
+ project.Files.Add (new ProjectFile (fname));
+
+ string dir = Path.GetDirectoryName (fname);
+ if (!checkedFolders.Contains (dir)) {
+ checkedFolders.Add (dir);
+ fname = Path.Combine (dir, "ChangeLog");
+ if (File.Exists (fname))
+ project.Files.Add (new ProjectFile (fname, BuildAction.Content));
+ }
+ }
+ }
+
+ sr.Close ();
+
+ // Project references
+ string refs = mkfile.GetVariable ("LIB_MCS_FLAGS");
+ if (refs == null || refs == "") refs = mkfile.GetVariable ("LOCAL_MCS_FLAGS");
+
+ if (refs != null && refs != "") {
+ Regex var = new Regex(@"(.*?/r:(?<ref>.*?)(( |\t)|$).*?)*");
+ Match match = var.Match (refs);
+ if (match.Success) {
+ foreach (Capture c in match.Groups["ref"].Captures)
+ refNames.Add (Path.GetFileNameWithoutExtension (c.Value));
+ }
+ }
+
+ int i = basePath.LastIndexOf ("/mcs/", basePath.Length - 2);
+ string topdir = basePath.Substring (0, i + 4);
+ targetAssembly = targetAssembly.Replace ("$(topdir)", topdir);
+
+ if (mkfile.GetVariable ("NO_TEST") != "yes") {
+ string tname = Path.GetFileNameWithoutExtension (aname) + "_test_";
+ testFileBase = Path.Combine (basePath, tname);
+ }
+
+ foreach (string sconf in MonoMakefileFormat.Configurations) {
+ DotNetProjectConfiguration conf = new DotNetProjectConfiguration (sconf);
+ conf.CompilationParameters = project.LanguageBinding.CreateCompilationParameters (null);
+ conf.OutputDirectory = basePath;
+ conf.OutputAssembly = Path.GetFileName (targetAssembly);
+ project.Configurations.Add (conf);
+ }
+
+ loading = false;
+ IdeApp.Workspace.SolutionLoaded += CombineOpened;
+ }
+
+ public void CombineOpened (object sender, SolutionEventArgs args)
+ {
+ if (args.Solution == project.ParentSolution) {
+ foreach (string pref in refNames) {
+ Project p = project.ParentSolution.FindProjectByName (pref);
+ if (p != null) project.References.Add (new ProjectReference (p));
+ }
+ }
+ }
+
+ static Regex regexError = new Regex (@"^(\s*(?<file>.*)\((?<line>\d*)(,(?<column>\d*[\+]*))?\)(:|)\s+)*(?<level>\w+)\s*(?<number>.*):\s(?<message>.*)",
+ RegexOptions.Compiled | RegexOptions.ExplicitCapture);
+
+ public Task<BuildResult> RunTarget (MonoDevelop.Core.ProgressMonitor monitor, string target, ConfigurationSelector configuration)
+ {
+ if (target == ProjectService.BuildTarget)
+ target = "all";
+ else if (target == ProjectService.CleanTarget)
+ target = "clean";
+
+ DotNetProjectConfiguration conf = (DotNetProjectConfiguration) project.GetConfiguration (configuration);
+
+ return Task<BuildResult>.Factory.StartNew (delegate {
+ using (var output = new StringWriter ()) {
+ using (var tw = new LogTextWriter ()) {
+ tw.ChainWriter (output);
+ tw.ChainWriter (monitor.Log);
+
+ using (ProcessWrapper proc = Runtime.ProcessService.StartProcess ("make", "PROFILE=" + conf.Id + " " + target, conf.OutputDirectory, monitor.Log, tw, null))
+ proc.WaitForOutput ();
+
+ tw.UnchainWriter (output);
+ tw.UnchainWriter (monitor.Log);
+
+ CompilerResults cr = new CompilerResults (null);
+ string[] lines = output.ToString ().Split ('\n');
+ foreach (string line in lines) {
+ CompilerError err = CreateErrorFromString (line);
+ if (err != null)
+ cr.Errors.Add (err);
+ }
+
+ return new BuildResult (cr, output.ToString ());
+ }
+ }
+ });
+ }
+
+ private CompilerError CreateErrorFromString (string error_string)
+ {
+ // When IncludeDebugInformation is true, prevents the debug symbols stats from braeking this.
+ if (error_string.StartsWith ("WROTE SYMFILE") ||
+ error_string.StartsWith ("make[") ||
+ error_string.StartsWith ("OffsetTable") ||
+ error_string.StartsWith ("Compilation succeeded") ||
+ error_string.StartsWith ("Compilation failed"))
+ return null;
+
+ CompilerError error = new CompilerError();
+
+ Match match=regexError.Match(error_string);
+ if (!match.Success)
+ return null;
+
+ string level = match.Result("${level}");
+ if (level == "warning")
+ error.IsWarning = true;
+ else if (level != "error")
+ return null;
+
+ if (String.Empty != match.Result("${file}"))
+ error.FileName = Path.Combine (project.BaseDirectory, match.Result("${file}"));
+ if (String.Empty != match.Result("${line}"))
+ error.Line=Int32.Parse(match.Result("${line}"));
+ if (String.Empty != match.Result("${column}"))
+ error.Column = Int32.Parse(match.Result("${column}"));
+ error.ErrorNumber = match.Result ("${number}");
+ error.ErrorText = match.Result ("${message}");
+ return error;
+ }
+
+ void OnFileAddedToProject (object s, ProjectFileEventArgs args)
+ {
+ if (loading) return;
+
+ foreach (ProjectFileEventInfo e in args) {
+ if (e.ProjectFile.BuildAction != BuildAction.Compile)
+ continue;
+ AddSourceFile (e.ProjectFile.Name);
+ }
+ }
+
+ void OnFileRemovedFromProject (object s, ProjectFileEventArgs args)
+ {
+ if (loading) return;
+
+ foreach (ProjectFileEventInfo e in args) {
+ if (e.ProjectFile.BuildAction != BuildAction.Compile)
+ continue;
+
+ RemoveSourceFile (e.ProjectFile.Name);
+ }
+ }
+
+ void OnFileRenamedInProject (object s, ProjectFileRenamedEventArgs args)
+ {
+ if (loading) return;
+
+ foreach (ProjectFileRenamedEventInfo e in args) {
+ if (e.ProjectFile.BuildAction != BuildAction.Compile)
+ continue;
+
+ if (RemoveSourceFile (e.OldName))
+ AddSourceFile (e.NewName);
+ }
+ }
+
+ void AddSourceFile (string sourceFile)
+ {
+ StreamReader sr = null;
+ StreamWriter sw = null;
+
+ try {
+ sr = new StreamReader (outFile + ".sources");
+ sw = new StreamWriter (outFile + ".sources.new");
+
+ string newFile = project.GetRelativeChildPath (sourceFile);
+ if (newFile.StartsWith ("./")) newFile = newFile.Substring (2);
+
+ string line;
+ while ((line = sr.ReadLine ()) != null) {
+ string file = line.Trim (' ','\t');
+ if (newFile != null && (file == "" || string.Compare (file, newFile) > 0)) {
+ sw.WriteLine (newFile);
+ newFile = null;
+ }
+ sw.WriteLine (line);
+ }
+ if (newFile != null)
+ sw.WriteLine (newFile);
+ } finally {
+ if (sr != null) sr.Close ();
+ if (sw != null) sw.Close ();
+ }
+ File.Delete (outFile + ".sources");
+ File.Move (outFile + ".sources.new", outFile + ".sources");
+ }
+
+ bool RemoveSourceFile (string sourceFile)
+ {
+ StreamReader sr = null;
+ StreamWriter sw = null;
+ bool found = false;
+
+ try {
+ sr = new StreamReader (outFile + ".sources");
+ sw = new StreamWriter (outFile + ".sources.new");
+
+ string oldFile = project.GetRelativeChildPath (sourceFile);
+ if (oldFile.StartsWith ("./")) oldFile = oldFile.Substring (2);
+
+ string line;
+ while ((line = sr.ReadLine ()) != null) {
+ string file = line.Trim (' ','\t');
+ if (oldFile != file)
+ sw.WriteLine (line);
+ else
+ found = true;
+ }
+ } finally {
+ if (sr != null) sr.Close ();
+ if (sw != null) sw.Close ();
+ }
+ if (found) {
+ File.Delete (outFile + ".sources");
+ File.Move (outFile + ".sources.new", outFile + ".sources");
+ }
+ return found;
+ }
+
+ public void Dispose ()
+ {
+ project.FileAddedToProject -= OnFileAddedToProject;
+ project.FileRemovedFromProject -= OnFileRemovedFromProject;
+ project.FileRenamedInProject -= OnFileRenamedInProject;
+ IdeApp.Workspace.SolutionLoaded -= CombineOpened;
+ }
+
+ public void OnModified (string hint)
+ {
+ }
+
+ public string GetTestFileBase ()
+ {
+ return testFileBase;
+ }
+
+ public object UnitTest {
+ get { return unitTest; }
+ set { unitTest = value; }
+ }
+
+ public object GetService (Type t)
+ {
+ return null;
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDeveloperExtensions/MonoDeveloperExtensions.csproj b/main/src/addins/MonoDeveloperExtensions/MonoDeveloperExtensions.csproj
index a994b138b5..17c7f36e9b 100644
--- a/main/src/addins/MonoDeveloperExtensions/MonoDeveloperExtensions.csproj
+++ b/main/src/addins/MonoDeveloperExtensions/MonoDeveloperExtensions.csproj
@@ -79,6 +79,7 @@
<Compile Include="Commands.cs" />
<Compile Include="MonoSolutionItemHandler.cs" />
<Compile Include="AddinInfo.cs" />
+ <Compile Include="MakefileProject.cs" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="MonoDeveloperExtensions.addin.xml">
diff --git a/main/src/addins/MonoDeveloperExtensions/MonoMakefileFormat.cs b/main/src/addins/MonoDeveloperExtensions/MonoMakefileFormat.cs
index ce6dd41f4a..45376b3d8b 100644
--- a/main/src/addins/MonoDeveloperExtensions/MonoMakefileFormat.cs
+++ b/main/src/addins/MonoDeveloperExtensions/MonoMakefileFormat.cs
@@ -35,6 +35,7 @@ using MonoDevelop.Core;
using System.Text.RegularExpressions;
using MonoDevelop.Projects;
using MonoDevelop.Projects.Extensions;
+using System.Threading.Tasks;
namespace MonoDeveloper
{
@@ -70,121 +71,118 @@ namespace MonoDeveloper
public bool CanWriteFile (object obj)
{
- return (obj is SolutionFolder) || IsMonoProject (obj);
+ return (obj is SolutionFolder) || (obj is MakefileProject);
}
- public void WriteFile (FilePath file, object node, IProgressMonitor monitor)
+ public Task WriteFile (FilePath file, object node, ProgressMonitor monitor)
{
+ return Task.FromResult (0);
}
public List<FilePath> GetItemFiles (object obj)
{
List<FilePath> col = new List<FilePath> ();
- DotNetProject mp = obj as DotNetProject;
+ var mp = obj as MakefileProject;
if (mp != null) {
- MonoSolutionItemHandler handler = ProjectExtensionUtil.GetItemHandler (mp) as MonoSolutionItemHandler;
- if (handler != null && File.Exists (handler.SourcesFile)) {
+ if (File.Exists (mp.SourcesFile)) {
col.Add (mp.FileName);
- col.Add (handler.SourcesFile);
+ col.Add (mp.SourcesFile);
}
}
return col;
}
- public object ReadFile (FilePath fileName, Type expectedType, IProgressMonitor monitor)
+ public Task<object> ReadFile (FilePath fileName, Type expectedType, ProgressMonitor monitor)
{
return ReadFile (fileName, false, monitor);
}
- public object ReadFile (FilePath fileName, bool hasParentSolution, IProgressMonitor monitor)
- {
- FilePath basePath = fileName.ParentDirectory;
- MonoMakefile mkfile = new MonoMakefile (fileName);
- string aname = mkfile.GetVariable ("LIBRARY");
- if (aname == null) aname = mkfile.GetVariable ("PROGRAM");
+ public Task<object> ReadFile (FilePath fileName, bool hasParentSolution, ProgressMonitor monitor)
+ {
+ return Task<object>.Factory.StartNew (delegate {
+ FilePath basePath = fileName.ParentDirectory;
+ MonoMakefile mkfile = new MonoMakefile (fileName);
+ string aname = mkfile.GetVariable ("LIBRARY");
+ if (aname == null)
+ aname = mkfile.GetVariable ("PROGRAM");
- try {
- ProjectExtensionUtil.BeginLoadOperation ();
- if (aname != null) {
- // It is a project
- monitor.BeginTask ("Loading '" + fileName + "'", 0);
- DotNetAssemblyProject project = new DotNetAssemblyProject ("C#");
- MonoSolutionItemHandler handler = new MonoSolutionItemHandler (project);
- ProjectExtensionUtil.InstallHandler (handler, project);
- project.Name = Path.GetFileName (basePath);
- handler.Read (mkfile);
- monitor.EndTask ();
- return project;
- } else {
- string subdirs;
- StringBuilder subdirsBuilder = new StringBuilder ();
- subdirsBuilder.Append (mkfile.GetVariable ("common_dirs"));
- if (subdirsBuilder.Length != 0) {
- subdirsBuilder.Append ("\t");
- subdirsBuilder.Append (mkfile.GetVariable ("net_2_0_dirs"));
- }
- if (subdirsBuilder.Length == 0)
- subdirsBuilder.Append (mkfile.GetVariable ("SUBDIRS"));
+ try {
+ ProjectExtensionUtil.BeginLoadOperation ();
+ if (aname != null) {
+ // It is a project
+ monitor.BeginTask ("Loading '" + fileName + "'", 0);
+ MakefileProject project = new MakefileProject ("C#");
+ project.Name = Path.GetFileName (basePath);
+ project.Read (mkfile);
+ monitor.EndTask ();
+ return project;
+ } else {
+ string subdirs;
+ StringBuilder subdirsBuilder = new StringBuilder ();
+ subdirsBuilder.Append (mkfile.GetVariable ("common_dirs"));
+ if (subdirsBuilder.Length != 0) {
+ subdirsBuilder.Append ("\t");
+ subdirsBuilder.Append (mkfile.GetVariable ("net_2_0_dirs"));
+ }
+ if (subdirsBuilder.Length == 0)
+ subdirsBuilder.Append (mkfile.GetVariable ("SUBDIRS"));
- subdirs = subdirsBuilder.ToString ();
- if (subdirs != null && (subdirs = subdirs.Trim (' ','\t')) != "")
- {
- object retObject;
- SolutionFolder folder;
- if (!hasParentSolution) {
- Solution sol = new Solution ();
- sol.ConvertToFormat (Services.ProjectService.FileFormats.GetFileFormat ("MonoMakefile"), false);
- sol.FileName = fileName;
- folder = sol.RootFolder;
- retObject = sol;
+ subdirs = subdirsBuilder.ToString ();
+ if (subdirs != null && (subdirs = subdirs.Trim (' ', '\t')) != "") {
+ object retObject;
+ SolutionFolder folder;
+ if (!hasParentSolution) {
+ Solution sol = new Solution ();
+ sol.ConvertToFormat (Services.ProjectService.FileFormats.GetFileFormat ("MonoMakefile"), false);
+ sol.FileName = fileName;
+ folder = sol.RootFolder;
+ retObject = sol;
- foreach (string conf in MonoMakefileFormat.Configurations) {
- SolutionConfiguration sc = new SolutionConfiguration (conf);
- sol.Configurations.Add (sc);
+ foreach (string conf in MonoMakefileFormat.Configurations) {
+ SolutionConfiguration sc = new SolutionConfiguration (conf);
+ sol.Configurations.Add (sc);
+ }
+ } else {
+ folder = new SolutionFolder ();
+ folder.Name = Path.GetFileName (Path.GetDirectoryName (fileName));
+ retObject = folder;
}
- } else {
- folder = new SolutionFolder ();
- folder.Name = Path.GetFileName (Path.GetDirectoryName (fileName));
- retObject = folder;
- }
- subdirs = subdirs.Replace ('\t',' ');
- string[] dirs = subdirs.Split (' ');
+ subdirs = subdirs.Replace ('\t', ' ');
+ string[] dirs = subdirs.Split (' ');
- monitor.BeginTask ("Loading '" + fileName + "'", dirs.Length);
- Hashtable added = new Hashtable ();
- foreach (string dir in dirs) {
- if (added.Contains (dir)) continue;
- added.Add (dir, dir);
- monitor.Step (1);
- if (dir == null) continue;
- string tdir = dir.Trim ();
- if (tdir == "") continue;
- string mfile = Path.Combine (Path.Combine (basePath, tdir), "Makefile");
- if (File.Exists (mfile) && CanReadFile (mfile, typeof(SolutionItem))) {
- SolutionItem it = (SolutionItem) ReadFile (mfile, true, monitor);
- folder.Items.Add (it);
+ monitor.BeginTask ("Loading '" + fileName + "'", dirs.Length);
+ Hashtable added = new Hashtable ();
+ foreach (string dir in dirs) {
+ if (added.Contains (dir))
+ continue;
+ added.Add (dir, dir);
+ monitor.Step (1);
+ if (dir == null)
+ continue;
+ string tdir = dir.Trim ();
+ if (tdir == "")
+ continue;
+ string mfile = Path.Combine (Path.Combine (basePath, tdir), "Makefile");
+ if (File.Exists (mfile) && CanReadFile (mfile, typeof(SolutionFolderItem))) {
+ SolutionFolderItem it = (SolutionFolderItem)ReadFile (mfile, true, monitor).Result;
+ folder.Items.Add (it);
+ }
}
+ monitor.EndTask ();
+ return retObject;
}
- monitor.EndTask ();
- return retObject;
}
+ } finally {
+ ProjectExtensionUtil.EndLoadOperation ();
}
- } finally {
- ProjectExtensionUtil.EndLoadOperation ();
- }
- return null;
+ return null;
+ });
}
- public static bool IsMonoProject (object obj)
- {
- DotNetProject p = obj as DotNetProject;
- return p != null && (ProjectExtensionUtil.GetItemHandler (p) is MonoSolutionItemHandler);
- }
-
- public void ConvertToFormat (object obj)
+ public Task ConvertToFormat (object obj)
{
- // Nothing can be converted to this format.
+ return Task.FromResult (0);
}
public bool SupportsMixedFormats {
diff --git a/main/src/addins/MonoDeveloperExtensions/MonoSolutionItemHandler.cs b/main/src/addins/MonoDeveloperExtensions/MonoSolutionItemHandler.cs
index d43e15eb86..9636ac7e1c 100644
--- a/main/src/addins/MonoDeveloperExtensions/MonoSolutionItemHandler.cs
+++ b/main/src/addins/MonoDeveloperExtensions/MonoSolutionItemHandler.cs
@@ -36,6 +36,7 @@ using MonoDevelop.Core.ProgressMonitoring;
using MonoDevelop.Ide;
using MonoDevelop.Projects;
using MonoDevelop.Projects.Extensions;
+using System.Threading.Tasks;
namespace MonoDeveloper
{
@@ -73,8 +74,9 @@ namespace MonoDeveloper
}
}
- public void Save (MonoDevelop.Core.IProgressMonitor monitor)
+ public Task Save (MonoDevelop.Core.ProgressMonitor monitor)
{
+ return Task.FromResult (0);
}
internal void Read (MonoMakefile mkfile)
@@ -171,7 +173,7 @@ namespace MonoDeveloper
static Regex regexError = new Regex (@"^(\s*(?<file>.*)\((?<line>\d*)(,(?<column>\d*[\+]*))?\)(:|)\s+)*(?<level>\w+)\s*(?<number>.*):\s(?<message>.*)",
RegexOptions.Compiled | RegexOptions.ExplicitCapture);
- public BuildResult RunTarget (MonoDevelop.Core.IProgressMonitor monitor, string target, ConfigurationSelector configuration)
+ public Task<BuildResult> RunTarget (MonoDevelop.Core.ProgressMonitor monitor, string target, ConfigurationSelector configuration)
{
if (target == ProjectService.BuildTarget)
target = "all";
@@ -180,28 +182,30 @@ namespace MonoDeveloper
DotNetProjectConfiguration conf = (DotNetProjectConfiguration) project.GetConfiguration (configuration);
- using (var output = new StringWriter ()) {
- using (var tw = new LogTextWriter ()) {
- tw.ChainWriter (output);
- tw.ChainWriter (monitor.Log);
+ return Task<BuildResult>.Factory.StartNew (delegate {
+ using (var output = new StringWriter ()) {
+ using (var tw = new LogTextWriter ()) {
+ tw.ChainWriter (output);
+ tw.ChainWriter (monitor.Log);
- using (ProcessWrapper proc = Runtime.ProcessService.StartProcess ("make", "PROFILE=" + conf.Id + " " + target, conf.OutputDirectory, monitor.Log, tw, null))
- proc.WaitForOutput ();
+ using (ProcessWrapper proc = Runtime.ProcessService.StartProcess ("make", "PROFILE=" + conf.Id + " " + target, conf.OutputDirectory, monitor.Log, tw, null))
+ proc.WaitForOutput ();
- tw.UnchainWriter (output);
- tw.UnchainWriter (monitor.Log);
+ tw.UnchainWriter (output);
+ tw.UnchainWriter (monitor.Log);
- CompilerResults cr = new CompilerResults (null);
- string[] lines = output.ToString().Split ('\n');
- foreach (string line in lines) {
- CompilerError err = CreateErrorFromString (line);
- if (err != null) cr.Errors.Add (err);
- }
+ CompilerResults cr = new CompilerResults (null);
+ string[] lines = output.ToString ().Split ('\n');
+ foreach (string line in lines) {
+ CompilerError err = CreateErrorFromString (line);
+ if (err != null)
+ cr.Errors.Add (err);
+ }
- return new BuildResult (cr, output.ToString());
+ return new BuildResult (cr, output.ToString ());
+ }
}
- }
-
+ });
}
private CompilerError CreateErrorFromString (string error_string)
diff --git a/main/src/addins/MonoDeveloperExtensions/NUnit/MonoTestProvider.cs b/main/src/addins/MonoDeveloperExtensions/NUnit/MonoTestProvider.cs
index 026631b786..8d38969172 100644
--- a/main/src/addins/MonoDeveloperExtensions/NUnit/MonoTestProvider.cs
+++ b/main/src/addins/MonoDeveloperExtensions/NUnit/MonoTestProvider.cs
@@ -36,19 +36,16 @@ namespace MonoDeveloper
{
class MonoTestProvider: ITestProvider
{
- public UnitTest CreateUnitTest (IWorkspaceObject entry)
+ public UnitTest CreateUnitTest (WorkspaceObject entry)
{
- if (entry is DotNetProject) {
- DotNetProject project = (DotNetProject) entry;
- MonoSolutionItemHandler handler = ProjectExtensionUtil.GetItemHandler (project) as MonoSolutionItemHandler;
- if (handler != null) {
- if (handler.UnitTest != null)
- return (UnitTest) handler.UnitTest;
- string testFileBase = handler.GetTestFileBase ();
- UnitTest testSuite = new MonoTestSuite (project, project.Name, testFileBase);
- handler.UnitTest = testSuite;
- return testSuite;
- }
+ if (entry is MakefileProject) {
+ var project = (MakefileProject) entry;
+ if (project.UnitTest != null)
+ return (UnitTest) project.UnitTest;
+ string testFileBase = project.GetTestFileBase ();
+ UnitTest testSuite = new MonoTestSuite (project, project.Name, testFileBase);
+ project.UnitTest = testSuite;
+ return testSuite;
}
return null;
}
@@ -63,7 +60,7 @@ namespace MonoDeveloper
{
string basePath;
- public MonoTestSuite (Project p, string name, string basePath): base (name, p)
+ public MonoTestSuite (MakefileProject p, string name, string basePath): base (name, p)
{
this.basePath = basePath;
}