Ejemplo n.º 1
0
        protected override void LoadProject(IProgressMonitor monitor, MSBuildProject 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
            ((SharedAssetsProject)EntityItem).LanguageName = "C#";

            projitemsFile = Path.Combine(Path.GetDirectoryName(msproject.FileName), projitemsFile);

            MSBuildProject p = new MSBuildProject();

            p.Load(projitemsFile);

            MSBuildSerializer ser = CreateSerializer();

            ser.SerializationContext.BaseFile        = EntityItem.FileName;
            ser.SerializationContext.ProgressMonitor = monitor;

            ((SharedAssetsProject)Item).ProjItemsPath = projitemsFile;
            Item.SetItemHandler(this);

            var cp = p.PropertyGroups.FirstOrDefault(g => g.Label == "Configuration");

            if (cp != null)
            {
                ((SharedAssetsProject)EntityItem).DefaultNamespace = cp.GetPropertyValue("Import_RootNamespace");
            }

            LoadProjectItems(p, ser, ProjectItemFlags.None);
        }
        public override void LoadProject(IProgressMonitor monitor, SolutionEntityItem item, MSBuildProject msproject)
        {
            base.LoadProject(monitor, item, msproject);

            var dnp = item as DotNetProject;

            if (dnp == null)
            {
                return;
            }

            // Convert .projitems imports into project references

            foreach (var sp in msproject.Imports.Where(im => im.Label == "Shared" && im.Project.EndsWith(".projitems")))
            {
                var projitemsFile = sp.Project;
                if (!string.IsNullOrEmpty(projitemsFile))
                {
                    projitemsFile = MSBuildProjectService.FromMSBuildPath(item.ItemDirectory, projitemsFile);
                    projitemsFile = Path.Combine(Path.GetDirectoryName(msproject.FileName), projitemsFile);
                    if (File.Exists(projitemsFile))
                    {
                        MSBuildSerializer iser = Handler.CreateSerializer();
                        iser.SerializationContext.BaseFile        = projitemsFile;
                        iser.SerializationContext.ProgressMonitor = monitor;
                        MSBuildProject p = new MSBuildProject();
                        p.Load(projitemsFile);
                        Handler.LoadProjectItems(p, iser, ProjectItemFlags.Hidden | ProjectItemFlags.DontPersist);
                        var r = new ProjectReference(ReferenceType.Project, Path.GetFileNameWithoutExtension(projitemsFile));
                        r.Flags = ProjectItemFlags.DontPersist;
                        r.SetItemsProjectPath(projitemsFile);
                        dnp.References.Add(r);
                    }
                }
            }
        }
Ejemplo n.º 3
0
		void DeserializeSolutionItem (Solution sln, SolutionItem item, List<string> lines)
		{
			// Deserialize the object
			DataItem it = GetSolutionItemData (lines);
			if (it == null)
				return;
			
			MSBuildSerializer ser = new MSBuildSerializer (sln.FileName);
			ser.SerializationContext.BaseFile = sln.FileName;
			ser.Deserialize (item, it);
		}
Ejemplo n.º 4
0
		void WriteProjects (SolutionFolder folder, string baseDirectory, StreamWriter writer, bool saveProjects, IProgressMonitor monitor)
		{
			monitor.BeginStepTask (GettextCatalog.GetString ("Saving projects"), folder.Items.Count, 1); 
			foreach (SolutionItem ce in folder.Items.ToArray ())
			{
				string[] l = null;
				if (ce is SolutionEntityItem) {
					
					SolutionEntityItem item = (SolutionEntityItem) ce;
					MSBuildHandler handler = MSBuildProjectService.GetItemHandler (item);
					
					if (saveProjects) {
						try {
							handler.SavingSolution = true;
							item.Save (monitor);
						} finally {
							handler.SavingSolution = false;
						}
					}

					l = handler.SlnProjectContent;

					writer.WriteLine (@"Project(""{0}"") = ""{1}"", ""{2}"", ""{3}""",
					    handler.TypeGuid,
						item.Name, 
						FileService.NormalizeRelativePath (FileService.AbsoluteToRelativePath (
							baseDirectory, item.FileName)).Replace ('/', '\\'),
						ce.ItemId);
					DataItem data = handler.WriteSlnData ();
					if (data != null && data.HasItemData) {
						writer.WriteLine ("\tProjectSection(MonoDevelopProperties) = preProject");
						WriteDataItem (writer, data);
						writer.WriteLine ("\tEndProjectSection");
					}
					if (item.ItemDependencies.Count > 0 || handler.UnresolvedProjectDependencies != null) {
						writer.WriteLine ("\tProjectSection(ProjectDependencies) = postProject");
						foreach (var dep in item.ItemDependencies)
							writer.WriteLine ("\t\t{0} = {0}", dep.ItemId);
						if (handler.UnresolvedProjectDependencies != null) {
							foreach (var dep in handler.UnresolvedProjectDependencies)
								writer.WriteLine ("\t\t{0} = {0}", dep);
						}
						writer.WriteLine ("\tEndProjectSection");
					}
				} else if (ce is SolutionFolder) {
					//Solution
					SlnData slnData = GetSlnData (ce);
					if (slnData == null) {
						// Solution folder
						slnData = new SlnData ();
						ce.ExtendedProperties [typeof (SlnFileFormat)] = slnData;
					}

					l = slnData.Extra;
					
					writer.WriteLine (@"Project(""{0}"") = ""{1}"", ""{2}"", ""{3}""",
						MSBuildProjectService.FolderTypeGuid,
						ce.Name, 
						ce.Name,
						ce.ItemId);
					
					// Folder files
					WriteFolderFiles (writer, (SolutionFolder) ce);
					
					//Write custom properties
					MSBuildSerializer ser = new MSBuildSerializer (folder.ParentSolution.FileName);
					DataItem data = (DataItem) ser.Serialize (ce, typeof(SolutionFolder));
					if (data.HasItemData) {
						writer.WriteLine ("\tProjectSection(MonoDevelopProperties) = preProject");
						WriteDataItem (writer, data);
						writer.WriteLine ("\tEndProjectSection");
					}
				}

				if (l != null) {
					foreach (string s in l)
						writer.WriteLine (s);
				}

				writer.WriteLine ("EndProject");
				if (ce is SolutionFolder)
					WriteProjects (ce as SolutionFolder, baseDirectory, writer, saveProjects, monitor);
				monitor.Step (1);
			}
			monitor.EndTask ();
		}
Ejemplo n.º 5
0
		void LoadMonoDevelopConfigurationProperties (string configName, Section sec, List<string> lines, Solution sln, IProgressMonitor monitor)
		{
			SolutionConfiguration config = sln.Configurations [configName];
			if (config == null)
				return;
			DataItem it = ReadDataItem (sec, lines);
			MSBuildSerializer ser = new MSBuildSerializer (sln.FileName);
			ser.Deserialize (config, it);
		}
Ejemplo n.º 6
0
		void LoadMonoDevelopProperties (Section sec, List<string> lines, Solution sln, IProgressMonitor monitor)
		{
			DataItem it = ReadDataItem (sec, lines);
			MSBuildSerializer ser = new MSBuildSerializer (sln.FileName);
			ser.SerializationContext.BaseFile = sln.FileName;
			ser.Deserialize (sln, it);
		}
Ejemplo n.º 7
0
		void WriteFileInternal (string file, Solution solution, string baseDir, MSBuildFileFormat format, bool saveProjects, IProgressMonitor monitor)
		{
			SolutionFolder c = solution.RootFolder;
			
			using (StreamWriter sw = new StreamWriter (file, false, Encoding.UTF8)) {
				sw.NewLine = "\r\n";

				SlnData slnData = GetSlnData (c);
				if (slnData == null) {
					// If a non-msbuild project is being converted by just
					// changing the fileformat, then create the SlnData for it
					slnData = new SlnData ();
					c.ExtendedProperties [typeof (SlnFileFormat)] = slnData;
				}

				slnData.UpdateVersion (format);

				sw.WriteLine ();

				//Write Header
				sw.WriteLine ("Microsoft Visual Studio Solution File, Format Version " + slnData.VersionString);
				sw.WriteLine (slnData.HeaderComment);
				if (slnData.VisualStudioVersion != null)
					sw.WriteLine ("VisualStudioVersion = {0}", slnData.VisualStudioVersion);
				if (slnData.MinimumVisualStudioVersion != null)
					sw.WriteLine ("MinimumVisualStudioVersion = {0}", slnData.MinimumVisualStudioVersion);

				//Write the projects
				monitor.BeginTask (GettextCatalog.GetString ("Saving projects"), 1);
				WriteProjects (c, baseDir, sw, saveProjects, monitor);
				monitor.EndTask ();

				//Write the lines for unknownProjects
				foreach (string l in slnData.UnknownProjects)
					sw.WriteLine (l);

				//Write the Globals
				sw.WriteLine ("Global");

				//Write SolutionConfigurationPlatforms
				//FIXME: SolutionConfigurations?
				sw.WriteLine ("\tGlobalSection(SolutionConfigurationPlatforms) = preSolution");

				foreach (SolutionConfiguration config in solution.Configurations)
					sw.WriteLine ("\t\t{0} = {0}", ToSlnConfigurationId (config));

				sw.WriteLine ("\tEndGlobalSection");

				//Write ProjectConfigurationPlatforms
				sw.WriteLine ("\tGlobalSection(ProjectConfigurationPlatforms) = postSolution");

				List<string> list = new List<string> ();
				WriteProjectConfigurations (solution, list);

				list.Sort (StringComparer.Create (CultureInfo.InvariantCulture, true));
				foreach (string s in list)
					sw.WriteLine (s);

				//Write lines for projects we couldn't load
				if (slnData.SectionExtras.ContainsKey ("ProjectConfigurationPlatforms")) {
					foreach (string s in slnData.SectionExtras ["ProjectConfigurationPlatforms"])
						sw.WriteLine ("\t\t{0}", s);
				}

				sw.WriteLine ("\tEndGlobalSection");

				//Write Nested Projects
				ICollection<SolutionFolder> folders = solution.RootFolder.GetAllItems<SolutionFolder> ();
				if (folders.Count > 1) {
					// If folders ==1, that's the root folder
					sw.WriteLine ("\tGlobalSection(NestedProjects) = preSolution");
					foreach (SolutionFolder folder in folders) {
						if (folder.IsRoot)
							continue;
						WriteNestedProjects (folder, solution.RootFolder, sw);
					}
					sw.WriteLine ("\tEndGlobalSection");
				}
				
				//Write custom properties
				MSBuildSerializer ser = new MSBuildSerializer (solution.FileName);
				DataItem data = (DataItem) ser.Serialize (solution, typeof(Solution));
				if (data.HasItemData) {
					sw.WriteLine ("\tGlobalSection(MonoDevelopProperties) = preSolution");
					WriteDataItem (sw, data);
					sw.WriteLine ("\tEndGlobalSection");
				}
				
				// Write custom properties for configurations
				foreach (SolutionConfiguration conf in solution.Configurations) {
					data = (DataItem) ser.Serialize (conf);
					if (data.HasItemData) {
						sw.WriteLine ("\tGlobalSection(MonoDevelopProperties." + conf.Id + ") = preSolution");
						WriteDataItem (sw, data);
						sw.WriteLine ("\tEndGlobalSection");
					}
				}

				//Write 'others'
				if (slnData.GlobalExtra != null) {
					foreach (string s in slnData.GlobalExtra)
						sw.WriteLine (s);
				}
				
				sw.WriteLine ("EndGlobal");
			}
		}
Ejemplo n.º 8
0
        protected override MSBuildProject SaveProject(IProgressMonitor monitor)
        {
            MSBuildSerializer ser = CreateSerializer();

            ser.SerializationContext.BaseFile        = EntityItem.FileName;
            ser.SerializationContext.ProgressMonitor = monitor;

            MSBuildProject projitemsProject = new MSBuildProject();
            MSBuildProject msproject        = new MSBuildProject();

            var newProject = EntityItem.FileName == null || !File.Exists(EntityItem.FileName);

            if (newProject)
            {
                var grp = msproject.GetGlobalPropertyGroup();
                if (grp == null)
                {
                    grp = msproject.AddNewPropertyGroup(false);
                }
                grp.SetPropertyValue("ProjectGuid", EntityItem.ItemId, false);
                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(EntityItem.FileName.FileName, ".projitems"));
                import.Label = "Shared";
                msproject.AddNewImport(@"$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\CodeSharing\Microsoft.CodeSharing.CSharp.targets");
            }
            else
            {
                msproject.Load(EntityItem.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 = ((SharedAssetsProject)Item).ProjItemsPath;
            }
            if (File.Exists(projitemsFile))
            {
                projitemsProject.Load(projitemsFile);
            }
            else
            {
                var grp = projitemsProject.AddNewPropertyGroup(true);
                grp.SetPropertyValue("MSBuildAllProjects", "$(MSBuildAllProjects);$(MSBuildThisFileFullPath)", false);
                grp.SetPropertyValue("HasSharedItems", "true", false);
                grp.SetPropertyValue("SharedGUID", EntityItem.ItemId, false);
            }

            var configGrp = projitemsProject.PropertyGroups.FirstOrDefault(g => g.Label == "Configuration");

            if (configGrp == null)
            {
                configGrp       = projitemsProject.AddNewPropertyGroup(true);
                configGrp.Label = "Configuration";
            }
            configGrp.SetPropertyValue("Import_RootNamespace", ((SharedAssetsProject)EntityItem).DefaultNamespace, false);

            SaveProjectItems(monitor, new MSBuildFileFormatVS12(), ser, projitemsProject, "$(MSBuildThisFileDirectory)");

            projitemsProject.Save(projitemsFile);

            return(msproject);
        }