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/core/MonoDevelop.Core/MonoDevelop.Projects.SharedAssetsProjects/SharedAssetsProject.cs')
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Projects.SharedAssetsProjects/SharedAssetsProject.cs149
1 files changed, 133 insertions, 16 deletions
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.SharedAssetsProjects/SharedAssetsProject.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.SharedAssetsProjects/SharedAssetsProject.cs
index 2a98dae3cb..f3fd6487ff 100644
--- a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.SharedAssetsProjects/SharedAssetsProject.cs
+++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.SharedAssetsProjects/SharedAssetsProject.cs
@@ -1,4 +1,4 @@
-//
+//
// SharedProject.cs
//
// Author:
@@ -31,35 +31,130 @@ using MonoDevelop.Core;
using System.IO;
using System.Xml;
using MonoDevelop.Projects.Policies;
+using System.Threading.Tasks;
+using MonoDevelop.Projects.Formats.MSBuild;
namespace MonoDevelop.Projects.SharedAssetsProjects
{
+ [RegisterProjectType ("{D954291E-2A0B-460D-934E-DC6B0785DB48}", Extension="shproj", Alias="SharedAssetsProject")]
public class SharedAssetsProject: Project, IDotNetFileContainer
{
Solution currentSolution;
IDotNetLanguageBinding languageBinding;
string languageName;
+ string projitemsFile;
public SharedAssetsProject ()
{
+ Initialize (this);
}
- public SharedAssetsProject (string language)
+ public SharedAssetsProject (string language): this ()
{
languageName = language;
}
- public SharedAssetsProject (ProjectCreateInformation projectCreateInfo, XmlElement projectOptions)
+ public SharedAssetsProject (ProjectCreateInformation projectCreateInfo, XmlElement projectOptions): this ()
{
languageName = projectOptions.GetAttribute ("language");
DefaultNamespace = projectCreateInfo.ProjectName;
}
- internal protected override List<FilePath> OnGetItemFiles (bool includeReferencedFiles)
+ protected override void OnReadProject (ProgressMonitor monitor, MSBuildProject msproject)
+ {
+ base.OnReadProject (monitor, msproject);
+
+ var doc = msproject.Document;
+ projitemsFile = null;
+ foreach (var no in doc.DocumentElement.ChildNodes) {
+ var im = no as XmlElement;
+ if (im != null && im.LocalName == "Import" && im.GetAttribute ("Label") == "Shared") {
+ projitemsFile = im.GetAttribute ("Project");
+ break;
+ }
+ }
+ if (projitemsFile == null)
+ return;
+
+ // TODO: load the type from msbuild
+ LanguageName = "C#";
+
+ projitemsFile = Path.Combine (Path.GetDirectoryName (msproject.FileName), projitemsFile);
+
+ MSBuildProject p = new MSBuildProject ();
+ p.Load (projitemsFile);
+
+ var cp = p.PropertyGroups.FirstOrDefault (g => g.Label == "Configuration");
+ if (cp != null)
+ DefaultNamespace = cp.GetValue ("Import_RootNamespace");
+
+ LoadProjectItems (p, ProjectItemFlags.None);
+ }
+
+ protected override void OnWriteProject (ProgressMonitor monitor, MonoDevelop.Projects.Formats.MSBuild.MSBuildProject msproject)
+ {
+ base.OnWriteProject (monitor, msproject);
+
+ MSBuildProject projitemsProject = new MSBuildProject ();
+
+ var newProject = FileName == null || !File.Exists (FileName);
+ if (newProject) {
+ var grp = msproject.GetGlobalPropertyGroup ();
+ if (grp == null)
+ grp = msproject.AddNewPropertyGroup (false);
+ grp.SetValue ("ProjectGuid", ItemId, preserveExistingCase:true);
+ var import = msproject.AddNewImport (@"$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props");
+ import.Condition = @"Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')";
+ msproject.AddNewImport (@"$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\CodeSharing\Microsoft.CodeSharing.Common.Default.props");
+ msproject.AddNewImport (@"$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\CodeSharing\Microsoft.CodeSharing.Common.props");
+ import = msproject.AddNewImport (Path.ChangeExtension (FileName.FileName, ".projitems"));
+ import.Label = "Shared";
+ msproject.AddNewImport (@"$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\CodeSharing\Microsoft.CodeSharing.CSharp.targets");
+ } else {
+ msproject.Load (FileName);
+ }
+
+ // having no ToolsVersion is equivalent to 2.0, roundtrip that correctly
+ if (ToolsVersion != "2.0")
+ msproject.ToolsVersion = ToolsVersion;
+ else if (string.IsNullOrEmpty (msproject.ToolsVersion))
+ msproject.ToolsVersion = null;
+ else
+ msproject.ToolsVersion = "2.0";
+
+ if (projitemsFile == null)
+ projitemsFile = Path.ChangeExtension (FileName, ".projitems");
+ if (File.Exists (projitemsFile)) {
+ projitemsProject.Load (projitemsFile);
+ } else {
+ IMSBuildPropertySet grp = projitemsProject.AddNewPropertyGroup (true);
+ grp.SetValue ("MSBuildAllProjects", "$(MSBuildAllProjects);$(MSBuildThisFileFullPath)");
+ grp.SetValue ("HasSharedItems", true);
+ grp.SetValue ("SharedGUID", ItemId, preserveExistingCase:true);
+ }
+
+ IMSBuildPropertySet configGrp = projitemsProject.PropertyGroups.FirstOrDefault (g => g.Label == "Configuration");
+ if (configGrp == null) {
+ configGrp = projitemsProject.AddNewPropertyGroup (true);
+ configGrp.Label = "Configuration";
+ }
+ configGrp.SetValue ("Import_RootNamespace", DefaultNamespace);
+
+ SaveProjectItems (monitor, new MSBuildFileFormatVS12 (), projitemsProject, "$(MSBuildThisFileDirectory)");
+
+ // Remove all items of this project, since items are saved in the projitems file
+
+ foreach (var it in msproject.GetAllItems ().ToArray ())
+ msproject.RemoveItem (it);
+
+ projitemsProject.Save (projitemsFile);
+ }
+
+ protected override IEnumerable<FilePath> OnGetItemFiles (bool includeReferencedFiles)
{
- var list = base.OnGetItemFiles (includeReferencedFiles);
+ var list = base.OnGetItemFiles (includeReferencedFiles).ToList ();
if (!string.IsNullOrEmpty (FileName))
- list.Add (FileName.ChangeExtension (".projitems"));
+ list.Add (ProjItemsPath);
return list;
}
@@ -70,10 +165,19 @@ namespace MonoDevelop.Projects.SharedAssetsProjects
public string DefaultNamespace { get; set; }
- public override IEnumerable<string> GetProjectTypes ()
+ public FilePath ProjItemsPath {
+ get {
+ return projitemsFile != null ? (FilePath) projitemsFile : FileName.ChangeExtension (".projitems");
+ }
+ set {
+ projitemsFile = value;
+ }
+ }
+
+ protected override void OnGetProjectTypes (HashSet<string> types)
{
- yield return "SharedAssets";
- yield return "DotNet";
+ types.Add ("SharedAssets");
+ types.Add ("DotNet");
}
public override string[] SupportedLanguages {
@@ -95,17 +199,22 @@ namespace MonoDevelop.Projects.SharedAssetsProjects
return LanguageBinding.IsSourceCodeFile (fileName);
}
- protected override BuildResult OnBuild (MonoDevelop.Core.IProgressMonitor monitor, ConfigurationSelector configuration)
+ protected override Task<BuildResult> OnBuild (MonoDevelop.Core.ProgressMonitor monitor, ConfigurationSelector configuration)
+ {
+ return Task.FromResult (BuildResult.Success);
+ }
+
+ protected override bool OnGetSupportsTarget (string target)
{
- return new BuildResult ();
+ return false;
}
- internal protected override bool OnGetSupportsTarget (string target)
+ protected override bool OnGetSupportsExecute ()
{
return false;
}
- internal protected override bool OnGetSupportsExecute ()
+ protected override bool OnGetSupportsBuild ()
{
return false;
}
@@ -143,7 +252,7 @@ namespace MonoDevelop.Projects.SharedAssetsProjects
// Maybe there is a project that is already referencing this one. It may happen when creating a solution
// from a template
- foreach (var p in ParentSolution.GetAllSolutionItems<DotNetProject> ())
+ foreach (var p in ParentSolution.GetAllItems<DotNetProject> ())
ProcessProject (p);
}
@@ -191,6 +300,14 @@ namespace MonoDevelop.Projects.SharedAssetsProjects
void ProcessProject (DotNetProject p)
{
+ // When the projitems file name doesn't match the shproj file name, the reference we add to the referencing projects
+ // uses the projitems name, not the shproj name. Here we detect such case and re-add the references using the correct name
+ var referencesToFix = p.References.Where (r => r.GetItemsProjectPath () == ProjItemsPath && r.Reference != Name).ToList ();
+ foreach (var r in referencesToFix) {
+ p.References.Remove (r);
+ p.References.Add (new ProjectReference (this));
+ }
+
foreach (var pref in p.References.Where (r => r.ReferenceType == ReferenceType.Project && r.Reference == Name))
ProcessNewReference (pref);
}
@@ -198,7 +315,7 @@ namespace MonoDevelop.Projects.SharedAssetsProjects
void ProcessNewReference (ProjectReference pref)
{
pref.Flags = ProjectItemFlags.DontPersist;
- pref.SetItemsProjectPath (Path.ChangeExtension (FileName, ".projitems"));
+ pref.SetItemsProjectPath (ProjItemsPath);
foreach (var f in Files) {
if (pref.OwnerProject.Files.GetFile (f.FilePath) == null) {
var cf = (ProjectFile)f.Clone ();
@@ -268,7 +385,7 @@ namespace MonoDevelop.Projects.SharedAssetsProjects
if (ParentSolution == null)
return new DotNetProject[0];
- return ParentSolution.GetAllSolutionItems<DotNetProject> ().Where (p => p.References.Any (r => r.GetItemsProjectPath () != null));
+ return ParentSolution.GetAllItems<DotNetProject> ().Where (p => p.References.Any (r => r.GetItemsProjectPath () != null));
}
}