public void WriteFile (string file, object obj, MSBuildFileFormat format, bool saveProjects, IProgressMonitor monitor) { Solution sol = (Solution) obj; string tmpfilename = String.Empty; try { monitor.BeginTask (GettextCatalog.GetString ("Saving solution: {0}", file), 1); try { if (File.Exists (file)) tmpfilename = Path.GetTempFileName (); } catch (IOException) { } string baseDir = Path.GetDirectoryName (file); if (tmpfilename == String.Empty) { WriteFileInternal (file, sol, baseDir, format, saveProjects, monitor); } else { WriteFileInternal (tmpfilename, sol, baseDir, format, saveProjects, monitor); FileService.SystemRename (tmpfilename, file); } } catch (Exception ex) { monitor.ReportError (GettextCatalog.GetString ("Could not save solution: {0}", file), ex); LoggingService.LogError (GettextCatalog.GetString ("Could not save solution: {0}", file), ex); if (!String.IsNullOrEmpty (tmpfilename) && File.Exists (tmpfilename)) File.Delete (tmpfilename); throw; } finally { monitor.EndTask (); } }
public bool CanReadFile (string file, MSBuildFileFormat format) { if (String.Compare (Path.GetExtension (file), ".sln", true) == 0) { string tmp; string version = GetSlnFileVersion (file, out tmp); return version == format.SlnVersion; } return false; }
public bool CanReadFile (string file, MSBuildFileFormat format) { if (String.Compare (Path.GetExtension (file), ".sln", StringComparison.OrdinalIgnoreCase) == 0) { string tmp; string version = GetSlnFileVersion (file, out tmp); return format.SupportsSlnVersion (version); } return false; }
public static SolutionEntityItem LoadItem (IProgressMonitor monitor, string fileName, MSBuildFileFormat expectedFormat, string typeGuid, string itemGuid) { foreach (ItemTypeNode node in GetItemTypeNodes ()) { if (node.CanHandleFile (fileName, typeGuid)) return node.LoadSolutionItem (monitor, fileName, expectedFormat, itemGuid); } if (string.IsNullOrEmpty (typeGuid) && IsProjectSubtypeFile (fileName)) { typeGuid = LoadProjectTypeGuids (fileName); foreach (ItemTypeNode node in GetItemTypeNodes ()) { if (node.CanHandleFile (fileName, typeGuid)) return node.LoadSolutionItem (monitor, fileName, expectedFormat, itemGuid); } } return null; }
public override SolutionEntityItem LoadSolutionItem (IProgressMonitor monitor, string fileName, MSBuildFileFormat expectedFormat, string itemGuid) { return DubFileManager.Instance.LoadProject (fileName, Ide.IdeApp.Workspace.GetAllSolutions () [0], monitor); }
public override SolutionEntityItem LoadSolutionItem(IProgressMonitor monitor, string fileName, MSBuildFileFormat expectedFormat, string itemGuid) { MSBuildProjectHandler handler = new MSBuildProjectHandler(Guid, Import, itemGuid); return(handler.Load(monitor, fileName, expectedFormat, null, null)); }
public override SolutionEntityItem LoadSolutionItem (IProgressMonitor monitor, string fileName, MSBuildFileFormat expectedFormat, string itemGuid) { MSBuildProjectHandler handler = CreateHandler<MSBuildProjectHandler> (fileName, itemGuid); return handler.Load (monitor, fileName, expectedFormat, null, ItemType); }
//Reader public object ReadFile (string fileName, MSBuildFileFormat format, IProgressMonitor monitor) { if (fileName == null || monitor == null) return null; Solution sol; try { ProjectExtensionUtil.BeginLoadOperation (); sol = new Solution (); monitor.BeginTask (string.Format (GettextCatalog.GetString ("Loading solution: {0}"), fileName), 1); var projectLoadMonitor = monitor as IProjectLoadProgressMonitor; if (projectLoadMonitor != null) projectLoadMonitor.CurrentSolution = sol; LoadSolution (sol, fileName, format, monitor); } catch (Exception ex) { monitor.ReportError (GettextCatalog.GetString ("Could not load solution: {0}", fileName), ex); throw; } finally { ProjectExtensionUtil.EndLoadOperation (); monitor.EndTask (); } return sol; }
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"); } }
public static SolutionEntityItem LoadItem(IProgressMonitor monitor, string fileName, MSBuildFileFormat expectedFormat, string typeGuid, string itemGuid) { foreach (ItemTypeNode node in GetItemTypeNodes()) { if (node.CanHandleFile(fileName, typeGuid)) { return(node.LoadSolutionItem(monitor, fileName, expectedFormat, itemGuid)); } } if (string.IsNullOrEmpty(typeGuid) && IsProjectSubtypeFile(fileName)) { typeGuid = LoadProjectTypeGuids(fileName); foreach (ItemTypeNode node in GetItemTypeNodes()) { if (node.CanHandleFile(fileName, typeGuid)) { return(node.LoadSolutionItem(monitor, fileName, expectedFormat, itemGuid)); } } } // If it is a known unsupported project, load it as UnknownProject var projectInfo = MSBuildProjectService.GetUnknownProjectTypeInfo(typeGuid != null ? new [] { typeGuid } : new string[0], fileName); if (projectInfo != null && projectInfo.LoadFiles) { if (typeGuid == null) { typeGuid = projectInfo.Guid; } var h = new MSBuildProjectHandler(typeGuid, "", itemGuid); h.SetUnsupportedType(projectInfo); return(h.Load(monitor, fileName, expectedFormat, "", null)); } return(null); }
public void UpdateVersion (MSBuildFileFormat format) { VersionString = format.SlnVersion; headerComment = "# " + format.ProductDescription; }
internal void SetTargetFormat(MSBuildFileFormat targetFormat) { this.targetFormat = targetFormat; }
public override SolutionEntityItem LoadSolutionItem (IProgressMonitor monitor, string fileName, MSBuildFileFormat expectedFormat, string itemGuid) { MSBuildProjectHandler handler = CreateHandler<MSBuildProjectHandler> (fileName, itemGuid); handler.SetCustomResourceHandler (GetResourceHandler ()); return handler.Load (monitor, fileName, expectedFormat, language, null); }
internal virtual void SetSolutionFormat(MSBuildFileFormat format, bool converting) { SolutionFormat = format; }
public override SolutionEntityItem LoadSolutionItem(IProgressMonitor monitor, string fileName, MSBuildFileFormat expectedFormat, string itemGuid) { return PackageJsonParser.ReadPackageInformation(new FilePath(fileName), monitor); }
public static SolutionEntityItem LoadItem (IProgressMonitor monitor, string fileName, MSBuildFileFormat expectedFormat, string typeGuid, string itemGuid) { foreach (ItemTypeNode node in GetItemTypeNodes ()) { if (node.CanHandleFile (fileName, typeGuid)) return node.LoadSolutionItem (monitor, fileName, expectedFormat, itemGuid); } if (string.IsNullOrEmpty (typeGuid) && IsProjectSubtypeFile (fileName)) { typeGuid = LoadProjectTypeGuids (fileName); foreach (ItemTypeNode node in GetItemTypeNodes ()) { if (node.CanHandleFile (fileName, typeGuid)) return node.LoadSolutionItem (monitor, fileName, expectedFormat, itemGuid); } } // If it is a known unsupported project, load it as UnknownProject var projectInfo = MSBuildProjectService.GetUnknownProjectTypeInfo (typeGuid != null ? new [] { typeGuid } : new string[0], fileName); if (projectInfo != null && projectInfo.LoadFiles) { if (typeGuid == null) typeGuid = projectInfo.Guid; var h = new MSBuildProjectHandler (typeGuid, "", itemGuid); h.SetUnsupportedType (projectInfo); return h.Load (monitor, fileName, expectedFormat, "", null); } return null; }
public override SolutionEntityItem LoadSolutionItem (IProgressMonitor monitor, string fileName, MSBuildFileFormat expectedFormat, string itemGuid) { MSBuildProjectHandler handler = new MSBuildProjectHandler (Guid, Import, itemGuid); return handler.Load (monitor, fileName, expectedFormat, null, null); }
//ExtendedProperties // Per config // Platform : Eg. Any CPU // SolutionConfigurationPlatforms // SolutionFolder LoadSolution (Solution sol, string fileName, MSBuildFileFormat format, IProgressMonitor monitor) { string headerComment; string version = GetSlnFileVersion (fileName, out headerComment); ListDictionary globals = null; SolutionFolder folder = null; SlnData data = null; List<Section> projectSections = null; List<string> lines = null; FileFormat projectFormat = Services.ProjectService.FileFormats.GetFileFormat (format); monitor.BeginTask (GettextCatalog.GetString ("Loading solution: {0}", fileName), 1); //Parse the .sln file using (StreamReader reader = new StreamReader(fileName)) { sol.FileName = fileName; sol.ConvertToFormat (projectFormat, false); folder = sol.RootFolder; sol.Version = "0.1"; //FIXME: data = new SlnData (); folder.ExtendedProperties [typeof (SlnFileFormat)] = data; data.VersionString = version; data.HeaderComment = headerComment; string s = null; projectSections = new List<Section> (); lines = new List<string> (); globals = new ListDictionary (); //Parse while (reader.Peek () >= 0) { s = GetNextLine (reader, lines).Trim (); if (String.Compare (s, "Global", true) == 0) { ParseGlobal (reader, lines, globals); continue; } if (s.StartsWith ("Project")) { Section sec = new Section (); projectSections.Add (sec); sec.Start = lines.Count - 1; int e = ReadUntil ("EndProject", reader, lines); sec.Count = (e < 0) ? 1 : (e - sec.Start + 1); continue; } } } monitor.BeginTask("Loading projects ..", projectSections.Count + 1); Dictionary<string, SolutionItem> items = new Dictionary<string, SolutionItem> (); List<SolutionItem> sortedList = new List<SolutionItem> (); foreach (Section sec in projectSections) { monitor.Step (1); Match match = ProjectRegex.Match (lines [sec.Start]); if (!match.Success) { LoggingService.LogDebug (GettextCatalog.GetString ( "Invalid Project definition on line number #{0} in file '{1}'. Ignoring.", sec.Start + 1, fileName)); continue; } try { // Valid guid? new Guid (match.Groups [1].Value); } catch (FormatException) { //Use default guid as projectGuid LoggingService.LogDebug (GettextCatalog.GetString ( "Invalid Project type guid '{0}' on line #{1}. Ignoring.", match.Groups [1].Value, sec.Start + 1)); continue; } string projTypeGuid = match.Groups [1].Value.ToUpper (); string projectName = match.Groups [2].Value; string projectPath = match.Groups [3].Value; string projectGuid = match.Groups [4].Value; if (projTypeGuid == MSBuildProjectService.FolderTypeGuid) { //Solution folder SolutionFolder sfolder = new SolutionFolder (); sfolder.Name = projectName; MSBuildProjectService.InitializeItemHandler (sfolder); MSBuildProjectService.SetId (sfolder, projectGuid); List<string> projLines = lines.GetRange (sec.Start + 1, sec.Count - 2); DeserializeSolutionItem (sol, sfolder, projLines); foreach (string f in ReadFolderFiles (projLines)) sfolder.Files.Add (MSBuildProjectService.FromMSBuildPath (Path.GetDirectoryName (fileName), f)); SlnData slnData = new SlnData (); slnData.Extra = projLines.ToArray (); sfolder.ExtendedProperties [typeof (SlnFileFormat)] = slnData; items.Add (projectGuid, sfolder); sortedList.Add (sfolder); continue; } if (projectPath.StartsWith("http://")) { monitor.ReportWarning (GettextCatalog.GetString ( "{0}({1}): Projects with non-local source (http://...) not supported. '{2}'.", fileName, sec.Start + 1, projectPath)); data.UnknownProjects.AddRange (lines.GetRange (sec.Start, sec.Count)); continue; } string path = MSBuildProjectService.FromMSBuildPath (Path.GetDirectoryName (fileName), projectPath); if (String.IsNullOrEmpty (path)) { monitor.ReportWarning (GettextCatalog.GetString ( "Invalid project path found in {0} : {1}", fileName, projectPath)); LoggingService.LogWarning (GettextCatalog.GetString ( "Invalid project path found in {0} : {1}", fileName, projectPath)); continue; } projectPath = Path.GetFullPath (path); SolutionEntityItem item = null; try { item = ProjectExtensionUtil.LoadSolutionItem (monitor, projectPath, delegate { return MSBuildProjectService.LoadItem (monitor, projectPath, projTypeGuid, projectGuid); }); if (item == null) { LoggingService.LogWarning (GettextCatalog.GetString ( "Unknown project type guid '{0}' on line #{1}. Ignoring.", projTypeGuid, sec.Start + 1)); monitor.ReportWarning (GettextCatalog.GetString ( "{0}({1}): Unsupported or unrecognized project : '{2}'.", fileName, sec.Start + 1, projectPath)); continue; } MSBuildProjectHandler handler = (MSBuildProjectHandler) item.ItemHandler; List<string> projLines = lines.GetRange (sec.Start + 1, sec.Count - 2); DataItem it = GetSolutionItemData (projLines); handler.SlnProjectContent = projLines.ToArray (); handler.ReadSlnData (it); } catch (Exception e) { if (e is UnknownSolutionItemTypeException) { var name = ((UnknownSolutionItemTypeException)e).TypeName; LoggingService.LogWarning (!string.IsNullOrEmpty (name)? string.Format ("Could not load project '{0}' with unknown item type '{1}'", projectPath, name) : string.Format ("Could not load project '{0}' with unknown item type", projectPath)); monitor.ReportWarning (!string.IsNullOrEmpty (name)? GettextCatalog.GetString ("Could not load project '{0}' with unknown item type '{1}'", projectPath, name) : GettextCatalog.GetString ("Could not load project '{0}' with unknown item type", projectPath)); } else { LoggingService.LogError (string.Format ("Error while trying to load the project {0}", projectPath), e); monitor.ReportWarning (GettextCatalog.GetString ( "Error while trying to load the project '{0}': {1}", projectPath, e.Message)); } var uitem = new UnknownSolutionItem () { FileName = projectPath, LoadError = e.Message, }; var h = new MSBuildHandler (projTypeGuid, projectGuid) { Item = uitem, }; uitem.SetItemHandler (h); item = uitem; } if (!items.ContainsKey (projectGuid)) { items.Add (projectGuid, item); sortedList.Add (item); data.ItemsByGuid [projectGuid] = item; } else { monitor.ReportError (GettextCatalog.GetString ("Invalid solution file. There are two projects with the same GUID. The project {0} will be ignored.", projectPath), null); } } monitor.EndTask (); if (globals != null && globals.Contains ("NestedProjects")) { LoadNestedProjects (globals ["NestedProjects"] as Section, lines, items, monitor); globals.Remove ("NestedProjects"); } //Add top level folders and projects to the main folder foreach (SolutionItem ce in sortedList) { if (ce.ParentFolder == null) folder.Items.Add (ce); } //FIXME: This can be just SolutionConfiguration also! if (globals != null) { if (globals.Contains ("SolutionConfigurationPlatforms")) { LoadSolutionConfigurations (globals ["SolutionConfigurationPlatforms"] as Section, lines, sol, monitor); globals.Remove ("SolutionConfigurationPlatforms"); } if (globals.Contains ("ProjectConfigurationPlatforms")) { LoadProjectConfigurationMappings (globals ["ProjectConfigurationPlatforms"] as Section, lines, sol, monitor); globals.Remove ("ProjectConfigurationPlatforms"); } if (globals.Contains ("MonoDevelopProperties")) { LoadMonoDevelopProperties (globals ["MonoDevelopProperties"] as Section, lines, sol, monitor); globals.Remove ("MonoDevelopProperties"); } ArrayList toRemove = new ArrayList (); foreach (DictionaryEntry e in globals) { string name = (string) e.Key; if (name.StartsWith ("MonoDevelopProperties.")) { int i = name.IndexOf ('.'); LoadMonoDevelopConfigurationProperties (name.Substring (i+1), (Section)e.Value, lines, sol, monitor); toRemove.Add (e.Key); } } foreach (object key in toRemove) globals.Remove (key); } //Save the global sections that we dont use List<string> globalLines = new List<string> (); foreach (Section sec in globals.Values) globalLines.InsertRange (globalLines.Count, lines.GetRange (sec.Start, sec.Count)); data.GlobalExtra = globalLines; monitor.EndTask (); return folder; }
public string GetValidFormatName (object obj, string fileName, MSBuildFileFormat format) { return Path.ChangeExtension (fileName, ".sln"); }
internal void SetTargetFormat (MSBuildFileFormat targetFormat) { this.targetFormat = targetFormat; }
public bool CanWriteFile (object obj, MSBuildFileFormat format) { return obj is Solution; }
public void UpdateVersion(MSBuildFileFormat format) { VersionString = format.SlnVersion; headerComment = "# " + format.ProductDescription; }
//ExtendedProperties // Per config // Platform : Eg. Any CPU // SolutionConfigurationPlatforms // SolutionFolder LoadSolution (Solution sol, string fileName, MSBuildFileFormat format, IProgressMonitor monitor) { string headerComment; string version = GetSlnFileVersion (fileName, out headerComment); ListDictionary globals = null; SolutionFolder folder = null; SlnData data = null; List<Section> projectSections = null; List<string> lines = null; FileFormat projectFormat = Services.ProjectService.FileFormats.GetFileFormat (format); monitor.BeginTask (GettextCatalog.GetString ("Loading solution: {0}", fileName), 1); //Parse the .sln file using (StreamReader reader = new StreamReader(fileName)) { sol.FileName = fileName; sol.ConvertToFormat (projectFormat, false); folder = sol.RootFolder; sol.Version = "0.1"; //FIXME: data = new SlnData (); folder.ExtendedProperties [typeof (SlnFileFormat)] = data; data.VersionString = version; data.HeaderComment = headerComment; string s = null; projectSections = new List<Section> (); lines = new List<string> (); globals = new ListDictionary (); //Parse while (reader.Peek () >= 0) { s = GetNextLine (reader, lines).Trim (); if (String.Compare (s, "Global", StringComparison.OrdinalIgnoreCase) == 0) { ParseGlobal (reader, lines, globals); continue; } if (s.StartsWith ("Project", StringComparison.Ordinal)) { Section sec = new Section (); projectSections.Add (sec); sec.Start = lines.Count - 1; int e = ReadUntil ("EndProject", reader, lines); sec.Count = (e < 0) ? 1 : (e - sec.Start + 1); continue; } if (s.StartsWith ("VisualStudioVersion = ", StringComparison.Ordinal)) { Version v; if (Version.TryParse (s.Substring ("VisualStudioVersion = ".Length), out v)) data.VisualStudioVersion = v; else monitor.Log.WriteLine ("Ignoring unparseable VisualStudioVersion value in sln file"); } if (s.StartsWith ("MinimumVisualStudioVersion = ", StringComparison.Ordinal)) { Version v; if (Version.TryParse (s.Substring ("MinimumVisualStudioVersion = ".Length), out v)) data.MinimumVisualStudioVersion = v; else monitor.Log.WriteLine ("Ignoring unparseable MinimumVisualStudioVersion value in sln file"); } } } monitor.BeginTask("Loading projects ..", projectSections.Count + 1); Dictionary<string, SolutionItem> items = new Dictionary<string, SolutionItem> (); List<SolutionItem> sortedList = new List<SolutionItem> (); foreach (Section sec in projectSections) { monitor.Step (1); Match match = ProjectRegex.Match (lines [sec.Start]); if (!match.Success) { LoggingService.LogDebug (GettextCatalog.GetString ( "Invalid Project definition on line number #{0} in file '{1}'. Ignoring.", sec.Start + 1, fileName)); continue; } try { // Valid guid? new Guid (match.Groups [1].Value); } catch (FormatException) { //Use default guid as projectGuid LoggingService.LogDebug (GettextCatalog.GetString ( "Invalid Project type guid '{0}' on line #{1}. Ignoring.", match.Groups [1].Value, sec.Start + 1)); continue; } string projTypeGuid = match.Groups [1].Value.ToUpper (); string projectName = match.Groups [2].Value; string projectPath = match.Groups [3].Value; string projectGuid = match.Groups [4].Value.ToUpper (); List<string> projLines; if (projTypeGuid == MSBuildProjectService.FolderTypeGuid) { //Solution folder SolutionFolder sfolder = new SolutionFolder (); sfolder.Name = projectName; MSBuildProjectService.InitializeItemHandler (sfolder); MSBuildProjectService.SetId (sfolder, projectGuid); projLines = lines.GetRange (sec.Start + 1, sec.Count - 2); DeserializeSolutionItem (sol, sfolder, projLines); foreach (string f in ReadFolderFiles (projLines)) sfolder.Files.Add (MSBuildProjectService.FromMSBuildPath (Path.GetDirectoryName (fileName), f)); SlnData slnData = new SlnData (); slnData.Extra = projLines.ToArray (); sfolder.ExtendedProperties [typeof (SlnFileFormat)] = slnData; items.Add (projectGuid, sfolder); sortedList.Add (sfolder); continue; } if (projectPath.StartsWith("http://")) { monitor.ReportWarning (GettextCatalog.GetString ( "{0}({1}): Projects with non-local source (http://...) not supported. '{2}'.", fileName, sec.Start + 1, projectPath)); data.UnknownProjects.AddRange (lines.GetRange (sec.Start, sec.Count)); continue; } string path = MSBuildProjectService.FromMSBuildPath (Path.GetDirectoryName (fileName), projectPath); if (String.IsNullOrEmpty (path)) { monitor.ReportWarning (GettextCatalog.GetString ( "Invalid project path found in {0} : {1}", fileName, projectPath)); LoggingService.LogWarning (GettextCatalog.GetString ( "Invalid project path found in {0} : {1}", fileName, projectPath)); continue; } projectPath = Path.GetFullPath (path); SolutionEntityItem item = null; try { if (sol.IsSolutionItemEnabled (projectPath)) { item = ProjectExtensionUtil.LoadSolutionItem (monitor, projectPath, delegate { return MSBuildProjectService.LoadItem (monitor, projectPath, format, projTypeGuid, projectGuid); }); if (item == null) { throw new UnknownSolutionItemTypeException (projTypeGuid); } } else { var uitem = new UnloadedSolutionItem () { FileName = projectPath }; var h = new MSBuildHandler (projTypeGuid, projectGuid) { Item = uitem, }; uitem.SetItemHandler (h); item = uitem; } } catch (Exception e) { // If we get a TargetInvocationException from using Activator.CreateInstance we // need to unwrap the real exception while (e is TargetInvocationException) e = ((TargetInvocationException) e).InnerException; bool loadAsProject = false; if (e is UnknownSolutionItemTypeException) { var name = ((UnknownSolutionItemTypeException)e).TypeName; var relPath = new FilePath (path).ToRelative (sol.BaseDirectory); if (!string.IsNullOrEmpty (name)) { var guids = name.Split (';'); var projectInfo = MSBuildProjectService.GetUnknownProjectTypeInfo (guids, fileName); if (projectInfo != null) { loadAsProject = projectInfo.LoadFiles; LoggingService.LogWarning (string.Format ("Could not load {0} project '{1}'. {2}", projectInfo.Name, relPath, projectInfo.GetInstructions ())); monitor.ReportWarning (GettextCatalog.GetString ("Could not load {0} project '{1}'. {2}", projectInfo.Name, relPath, projectInfo.GetInstructions ())); } else { LoggingService.LogWarning (string.Format ("Could not load project '{0}' with unknown item type '{1}'", relPath, name)); monitor.ReportWarning (GettextCatalog.GetString ("Could not load project '{0}' with unknown item type '{1}'", relPath, name)); } } else { LoggingService.LogWarning (string.Format ("Could not load project '{0}' with unknown item type", relPath)); monitor.ReportWarning (GettextCatalog.GetString ("Could not load project '{0}' with unknown item type", relPath)); } } else if (e is UserException) { var ex = (UserException) e; LoggingService.LogError ("{0}: {1}", ex.Message, ex.Details); monitor.ReportError (string.Format ("{0}{1}{1}{2}", ex.Message, Environment.NewLine, ex.Details), null); } else { LoggingService.LogError (string.Format ("Error while trying to load the project {0}", projectPath), e); monitor.ReportWarning (GettextCatalog.GetString ( "Error while trying to load the project '{0}': {1}", projectPath, e.Message)); } SolutionEntityItem uitem; if (loadAsProject) { uitem = new UnknownProject () { FileName = projectPath, LoadError = e.Message, }; } else { uitem = new UnknownSolutionItem () { FileName = projectPath, LoadError = e.Message, }; } var h = new MSBuildHandler (projTypeGuid, projectGuid) { Item = uitem, }; uitem.SetItemHandler (h); item = uitem; } MSBuildHandler handler = (MSBuildHandler) item.ItemHandler; projLines = lines.GetRange (sec.Start + 1, sec.Count - 2); DataItem it = GetSolutionItemData (projLines); handler.UnresolvedProjectDependencies = ReadSolutionItemDependencies (projLines); handler.SlnProjectContent = projLines.ToArray (); handler.ReadSlnData (it); if (!items.ContainsKey (projectGuid)) { items.Add (projectGuid, item); sortedList.Add (item); data.ItemsByGuid [projectGuid] = item; } else { monitor.ReportError (GettextCatalog.GetString ("Invalid solution file. There are two projects with the same GUID. The project {0} will be ignored.", projectPath), null); } } monitor.EndTask (); if (globals != null && globals.Contains ("NestedProjects")) { LoadNestedProjects (globals ["NestedProjects"] as Section, lines, items, monitor); globals.Remove ("NestedProjects"); } // Resolve project dependencies foreach (var it in items.Values.OfType<SolutionEntityItem> ()) { MSBuildHandler handler = (MSBuildHandler) it.ItemHandler; if (handler.UnresolvedProjectDependencies != null) { foreach (var id in handler.UnresolvedProjectDependencies.ToArray ()) { SolutionItem dep; if (items.TryGetValue (id, out dep) && dep is SolutionEntityItem) { handler.UnresolvedProjectDependencies.Remove (id); it.ItemDependencies.Add ((SolutionEntityItem)dep); } } if (handler.UnresolvedProjectDependencies.Count == 0) handler.UnresolvedProjectDependencies = null; } } //Add top level folders and projects to the main folder foreach (SolutionItem ce in sortedList) { if (ce.ParentFolder == null) folder.Items.Add (ce); } //FIXME: This can be just SolutionConfiguration also! if (globals != null) { if (globals.Contains ("SolutionConfigurationPlatforms")) { LoadSolutionConfigurations (globals ["SolutionConfigurationPlatforms"] as Section, lines, sol, monitor); globals.Remove ("SolutionConfigurationPlatforms"); } if (globals.Contains ("ProjectConfigurationPlatforms")) { LoadProjectConfigurationMappings (globals ["ProjectConfigurationPlatforms"] as Section, lines, sol, monitor); globals.Remove ("ProjectConfigurationPlatforms"); } if (globals.Contains ("MonoDevelopProperties")) { LoadMonoDevelopProperties (globals ["MonoDevelopProperties"] as Section, lines, sol, monitor); globals.Remove ("MonoDevelopProperties"); } ArrayList toRemove = new ArrayList (); foreach (DictionaryEntry e in globals) { string name = (string) e.Key; if (name.StartsWith ("MonoDevelopProperties.")) { int i = name.IndexOf ('.'); LoadMonoDevelopConfigurationProperties (name.Substring (i+1), (Section)e.Value, lines, sol, monitor); toRemove.Add (e.Key); } } foreach (object key in toRemove) globals.Remove (key); } //Save the global sections that we dont use List<string> globalLines = new List<string> (); foreach (Section sec in globals.Values) globalLines.InsertRange (globalLines.Count, lines.GetRange (sec.Start, sec.Count)); data.GlobalExtra = globalLines; monitor.EndTask (); // When reloading a project, keep the solution data and item id sol.SolutionItemAdded += delegate(object sender, SolutionItemChangeEventArgs e) { if (e.Reloading) { ItemSlnData.TransferData (e.ReplacedItem, e.SolutionItem); var ih = e.SolutionItem.ItemHandler as MSBuildHandler; if (ih != null) ih.ItemId = e.ReplacedItem.ItemId; } }; return folder; }
public static SolutionEntityItem LoadItem(IProgressMonitor monitor, string fileName, MSBuildFileFormat expectedFormat, string typeGuid, string itemGuid) { foreach (ItemTypeNode node in GetItemTypeNodes()) { if (node.CanHandleFile(fileName, typeGuid)) { return(node.LoadSolutionItem(monitor, fileName, expectedFormat, itemGuid)); } } if (string.IsNullOrEmpty(typeGuid) && IsProjectSubtypeFile(fileName)) { typeGuid = LoadProjectTypeGuids(fileName); foreach (ItemTypeNode node in GetItemTypeNodes()) { if (node.CanHandleFile(fileName, typeGuid)) { return(node.LoadSolutionItem(monitor, fileName, expectedFormat, itemGuid)); } } } return(null); }
internal virtual void SetSolutionFormat (MSBuildFileFormat format, bool converting) { SolutionFormat = format; }
public override SolutionEntityItem LoadSolutionItem(IProgressMonitor monitor, string fileName, MSBuildFileFormat expectedFormat, string itemGuid) { throw new NotImplementedException (); }