aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/Prebuild/src/Core/Targets
diff options
context:
space:
mode:
Diffstat (limited to 'Prebuild/src/Core/Targets')
-rw-r--r--Prebuild/src/Core/Targets/VSGenericTarget.cs1768
1 files changed, 884 insertions, 884 deletions
diff --git a/Prebuild/src/Core/Targets/VSGenericTarget.cs b/Prebuild/src/Core/Targets/VSGenericTarget.cs
index a05f6b3..60cc803 100644
--- a/Prebuild/src/Core/Targets/VSGenericTarget.cs
+++ b/Prebuild/src/Core/Targets/VSGenericTarget.cs
@@ -1,884 +1,884 @@
1#region BSD License 1#region BSD License
2/* 2/*
3Copyright (c) 2008 Matthew Holmes (matthew@wildfiregames.com), John Anderson (sontek@gmail.com) 3Copyright (c) 2008 Matthew Holmes (matthew@wildfiregames.com), John Anderson (sontek@gmail.com)
4 4
5Redistribution and use in source and binary forms, with or without modification, are permitted 5Redistribution and use in source and binary forms, with or without modification, are permitted
6provided that the following conditions are met: 6provided that the following conditions are met:
7 7
8* Redistributions of source code must retain the above copyright notice, this list of conditions 8* Redistributions of source code must retain the above copyright notice, this list of conditions
9 and the following disclaimer. 9 and the following disclaimer.
10* Redistributions in binary form must reproduce the above copyright notice, this list of conditions 10* Redistributions in binary form must reproduce the above copyright notice, this list of conditions
11 and the following disclaimer in the documentation and/or other materials provided with the 11 and the following disclaimer in the documentation and/or other materials provided with the
12 distribution. 12 distribution.
13* The name of the author may not be used to endorse or promote products derived from this software 13* The name of the author may not be used to endorse or promote products derived from this software
14 without specific prior written permission. 14 without specific prior written permission.
15 15
16THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, 16THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
17BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 19EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 20OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 21OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
22IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 22IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23*/ 23*/
24#endregion 24#endregion
25 25
26using System; 26using System;
27using System.Collections; 27using System.Collections;
28using System.Collections.Generic; 28using System.Collections.Generic;
29using System.Collections.Specialized; 29using System.Collections.Specialized;
30using System.IO; 30using System.IO;
31using System.Text; 31using System.Text;
32 32
33using Prebuild.Core.Attributes; 33using Prebuild.Core.Attributes;
34using Prebuild.Core.Interfaces; 34using Prebuild.Core.Interfaces;
35using Prebuild.Core.Nodes; 35using Prebuild.Core.Nodes;
36using Prebuild.Core.Utilities; 36using Prebuild.Core.Utilities;
37using System.CodeDom.Compiler; 37using System.CodeDom.Compiler;
38 38
39namespace Prebuild.Core.Targets 39namespace Prebuild.Core.Targets
40{ 40{
41 41
42 /// <summary> 42 /// <summary>
43 /// 43 ///
44 /// </summary> 44 /// </summary>
45 public abstract class VSGenericTarget : ITarget 45 public abstract class VSGenericTarget : ITarget
46 { 46 {
47 #region Fields 47 #region Fields
48 48
49 readonly Hashtable tools = new Hashtable(); 49 readonly Hashtable tools = new Hashtable();
50 Kernel kernel; 50 Kernel kernel;
51 #endregion 51 #endregion
52 52
53 #region Properties 53 #region Properties
54 /// <summary> 54 /// <summary>
55 /// Gets or sets the solution version. 55 /// Gets or sets the solution version.
56 /// </summary> 56 /// </summary>
57 /// <value>The solution version.</value> 57 /// <value>The solution version.</value>
58 public abstract string SolutionVersion { get; } 58 public abstract string SolutionVersion { get; }
59 /// <summary> 59 /// <summary>
60 /// Gets or sets the product version. 60 /// Gets or sets the product version.
61 /// </summary> 61 /// </summary>
62 /// <value>The product version.</value> 62 /// <value>The product version.</value>
63 public abstract string ProductVersion { get; } 63 public abstract string ProductVersion { get; }
64 /// <summary> 64 /// <summary>
65 /// Gets or sets the schema version. 65 /// Gets or sets the schema version.
66 /// </summary> 66 /// </summary>
67 /// <value>The schema version.</value> 67 /// <value>The schema version.</value>
68 public abstract string SchemaVersion { get; } 68 public abstract string SchemaVersion { get; }
69 /// <summary> 69 /// <summary>
70 /// Gets or sets the name of the version. 70 /// Gets or sets the name of the version.
71 /// </summary> 71 /// </summary>
72 /// <value>The name of the version.</value> 72 /// <value>The name of the version.</value>
73 public abstract string VersionName { get; } 73 public abstract string VersionName { get; }
74 /// <summary> 74 /// <summary>
75 /// Gets or sets the version. 75 /// Gets or sets the version.
76 /// </summary> 76 /// </summary>
77 /// <value>The version.</value> 77 /// <value>The version.</value>
78 public abstract VSVersion Version { get; } 78 public abstract VSVersion Version { get; }
79 /// <summary> 79 /// <summary>
80 /// Gets the name. 80 /// Gets the name.
81 /// </summary> 81 /// </summary>
82 /// <value>The name.</value> 82 /// <value>The name.</value>
83 public abstract string Name { get; } 83 public abstract string Name { get; }
84 84
85 protected abstract string GetToolsVersionXml(FrameworkVersion version); 85 protected abstract string GetToolsVersionXml(FrameworkVersion version);
86 public abstract string SolutionTag { get; } 86 public abstract string SolutionTag { get; }
87 87
88 #endregion 88 #endregion
89 89
90 #region Constructors 90 #region Constructors
91 91
92 /// <summary> 92 /// <summary>
93 /// Initializes a new instance of the <see cref="VSGenericTarget"/> class. 93 /// Initializes a new instance of the <see cref="VSGenericTarget"/> class.
94 /// </summary> 94 /// </summary>
95 protected VSGenericTarget() 95 protected VSGenericTarget()
96 { 96 {
97 this.tools["C#"] = new ToolInfo("C#", "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}", "csproj", "CSHARP", "$(MSBuildBinPath)\\Microsoft.CSHARP.Targets"); 97 this.tools["C#"] = new ToolInfo("C#", "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}", "csproj", "CSHARP", "$(MSBuildBinPath)\\Microsoft.CSHARP.Targets");
98 this.tools["Database"] = new ToolInfo("Database", "{4F174C21-8C12-11D0-8340-0000F80270F8}", "dbp", "UNKNOWN"); 98 this.tools["Database"] = new ToolInfo("Database", "{4F174C21-8C12-11D0-8340-0000F80270F8}", "dbp", "UNKNOWN");
99 this.tools["Boo"] = new ToolInfo("Boo", "{45CEA7DC-C2ED-48A6-ACE0-E16144C02365}", "booproj", "Boo", "$(BooBinPath)\\Boo.Microsoft.Build.targets"); 99 this.tools["Boo"] = new ToolInfo("Boo", "{45CEA7DC-C2ED-48A6-ACE0-E16144C02365}", "booproj", "Boo", "$(BooBinPath)\\Boo.Microsoft.Build.targets");
100 this.tools["VisualBasic"] = new ToolInfo("VisualBasic", "{F184B08F-C81C-45F6-A57F-5ABD9991F28F}", "vbproj", "VisualBasic", "$(MSBuildBinPath)\\Microsoft.VisualBasic.Targets"); 100 this.tools["VisualBasic"] = new ToolInfo("VisualBasic", "{F184B08F-C81C-45F6-A57F-5ABD9991F28F}", "vbproj", "VisualBasic", "$(MSBuildBinPath)\\Microsoft.VisualBasic.Targets");
101 this.tools["Folder"] = new ToolInfo("Folder", "{2150E333-8FDC-42A3-9474-1A3956D46DE8}", null, null); 101 this.tools["Folder"] = new ToolInfo("Folder", "{2150E333-8FDC-42A3-9474-1A3956D46DE8}", null, null);
102 } 102 }
103 103
104 #endregion 104 #endregion
105 105
106 #region Private Methods 106 #region Private Methods
107 107
108 private string MakeRefPath(ProjectNode project) 108 private string MakeRefPath(ProjectNode project)
109 { 109 {
110 string ret = ""; 110 string ret = "";
111 foreach (ReferencePathNode node in project.ReferencePaths) 111 foreach (ReferencePathNode node in project.ReferencePaths)
112 { 112 {
113 try 113 try
114 { 114 {
115 string fullPath = Helper.ResolvePath(node.Path); 115 string fullPath = Helper.ResolvePath(node.Path);
116 if (ret.Length < 1) 116 if (ret.Length < 1)
117 { 117 {
118 ret = fullPath; 118 ret = fullPath;
119 } 119 }
120 else 120 else
121 { 121 {
122 ret += ";" + fullPath; 122 ret += ";" + fullPath;
123 } 123 }
124 } 124 }
125 catch (ArgumentException) 125 catch (ArgumentException)
126 { 126 {
127 this.kernel.Log.Write(LogType.Warning, "Could not resolve reference path: {0}", node.Path); 127 this.kernel.Log.Write(LogType.Warning, "Could not resolve reference path: {0}", node.Path);
128 } 128 }
129 } 129 }
130 130
131 return ret; 131 return ret;
132 } 132 }
133 133
134 private static ProjectNode FindProjectInSolution(string name, SolutionNode solution) 134 private static ProjectNode FindProjectInSolution(string name, SolutionNode solution)
135 { 135 {
136 SolutionNode node = solution; 136 SolutionNode node = solution;
137 137
138 while (node.Parent is SolutionNode) 138 while (node.Parent is SolutionNode)
139 node = node.Parent as SolutionNode; 139 node = node.Parent as SolutionNode;
140 140
141 return FindProjectInSolutionRecursively(name, node); 141 return FindProjectInSolutionRecursively(name, node);
142 } 142 }
143 143
144 private static ProjectNode FindProjectInSolutionRecursively(string name, SolutionNode solution) 144 private static ProjectNode FindProjectInSolutionRecursively(string name, SolutionNode solution)
145 { 145 {
146 if (solution.ProjectsTable.ContainsKey(name)) 146 if (solution.ProjectsTable.ContainsKey(name))
147 return (ProjectNode)solution.ProjectsTable[name]; 147 return (ProjectNode)solution.ProjectsTable[name];
148 148
149 foreach (SolutionNode child in solution.Solutions) 149 foreach (SolutionNode child in solution.Solutions)
150 { 150 {
151 ProjectNode node = FindProjectInSolutionRecursively(name, child); 151 ProjectNode node = FindProjectInSolutionRecursively(name, child);
152 if (node != null) 152 if (node != null)
153 return node; 153 return node;
154 } 154 }
155 155
156 return null; 156 return null;
157 } 157 }
158 158
159 private void WriteProject(SolutionNode solution, ProjectNode project) 159 private void WriteProject(SolutionNode solution, ProjectNode project)
160 { 160 {
161 if (!tools.ContainsKey(project.Language)) 161 if (!tools.ContainsKey(project.Language))
162 { 162 {
163 throw new UnknownLanguageException("Unknown .NET language: " + project.Language); 163 throw new UnknownLanguageException("Unknown .NET language: " + project.Language);
164 } 164 }
165 165
166 ToolInfo toolInfo = (ToolInfo)tools[project.Language]; 166 ToolInfo toolInfo = (ToolInfo)tools[project.Language];
167 string projectFile = Helper.MakeFilePath(project.FullPath, project.Name, toolInfo.FileExtension); 167 string projectFile = Helper.MakeFilePath(project.FullPath, project.Name, toolInfo.FileExtension);
168 StreamWriter ps = new StreamWriter(projectFile); 168 StreamWriter ps = new StreamWriter(projectFile);
169 169
170 kernel.CurrentWorkingDirectory.Push(); 170 kernel.CurrentWorkingDirectory.Push();
171 Helper.SetCurrentDir(Path.GetDirectoryName(projectFile)); 171 Helper.SetCurrentDir(Path.GetDirectoryName(projectFile));
172 172
173 #region Project File 173 #region Project File
174 using (ps) 174 using (ps)
175 { 175 {
176 ps.WriteLine("<Project DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\" {0}>", GetToolsVersionXml(project.FrameworkVersion)); 176 ps.WriteLine("<Project DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\" {0}>", GetToolsVersionXml(project.FrameworkVersion));
177 ps.WriteLine(" <PropertyGroup>"); 177 ps.WriteLine(" <PropertyGroup>");
178 ps.WriteLine(" <ProjectType>Local</ProjectType>"); 178 ps.WriteLine(" <ProjectType>Local</ProjectType>");
179 ps.WriteLine(" <ProductVersion>{0}</ProductVersion>", this.ProductVersion); 179 ps.WriteLine(" <ProductVersion>{0}</ProductVersion>", this.ProductVersion);
180 ps.WriteLine(" <SchemaVersion>{0}</SchemaVersion>", this.SchemaVersion); 180 ps.WriteLine(" <SchemaVersion>{0}</SchemaVersion>", this.SchemaVersion);
181 ps.WriteLine(" <ProjectGuid>{{{0}}}</ProjectGuid>", project.Guid.ToString().ToUpper()); 181 ps.WriteLine(" <ProjectGuid>{{{0}}}</ProjectGuid>", project.Guid.ToString().ToUpper());
182 182
183 // Visual Studio has a hard coded guid for the project type 183 // Visual Studio has a hard coded guid for the project type
184 if (project.Type == ProjectType.Web) 184 if (project.Type == ProjectType.Web)
185 ps.WriteLine(" <ProjectTypeGuids>{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>"); 185 ps.WriteLine(" <ProjectTypeGuids>{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>");
186 ps.WriteLine(" <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>"); 186 ps.WriteLine(" <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>");
187 ps.WriteLine(" <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>"); 187 ps.WriteLine(" <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>");
188 ps.WriteLine(" <ApplicationIcon>{0}</ApplicationIcon>", project.AppIcon); 188 ps.WriteLine(" <ApplicationIcon>{0}</ApplicationIcon>", project.AppIcon);
189 ps.WriteLine(" <AssemblyKeyContainerName>"); 189 ps.WriteLine(" <AssemblyKeyContainerName>");
190 ps.WriteLine(" </AssemblyKeyContainerName>"); 190 ps.WriteLine(" </AssemblyKeyContainerName>");
191 ps.WriteLine(" <AssemblyName>{0}</AssemblyName>", project.AssemblyName); 191 ps.WriteLine(" <AssemblyName>{0}</AssemblyName>", project.AssemblyName);
192 foreach (ConfigurationNode conf in project.Configurations) 192 foreach (ConfigurationNode conf in project.Configurations)
193 { 193 {
194 if (conf.Options.KeyFile != "") 194 if (conf.Options.KeyFile != "")
195 { 195 {
196 ps.WriteLine(" <AssemblyOriginatorKeyFile>{0}</AssemblyOriginatorKeyFile>", conf.Options.KeyFile); 196 ps.WriteLine(" <AssemblyOriginatorKeyFile>{0}</AssemblyOriginatorKeyFile>", conf.Options.KeyFile);
197 ps.WriteLine(" <SignAssembly>true</SignAssembly>"); 197 ps.WriteLine(" <SignAssembly>true</SignAssembly>");
198 break; 198 break;
199 } 199 }
200 } 200 }
201 ps.WriteLine(" <DefaultClientScript>JScript</DefaultClientScript>"); 201 ps.WriteLine(" <DefaultClientScript>JScript</DefaultClientScript>");
202 ps.WriteLine(" <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>"); 202 ps.WriteLine(" <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>");
203 ps.WriteLine(" <DefaultTargetSchema>IE50</DefaultTargetSchema>"); 203 ps.WriteLine(" <DefaultTargetSchema>IE50</DefaultTargetSchema>");
204 ps.WriteLine(" <DelaySign>false</DelaySign>"); 204 ps.WriteLine(" <DelaySign>false</DelaySign>");
205 ps.WriteLine(" <TargetFrameworkVersion>{0}</TargetFrameworkVersion>", project.FrameworkVersion.ToString().Replace("_", ".")); 205 ps.WriteLine(" <TargetFrameworkVersion>{0}</TargetFrameworkVersion>", project.FrameworkVersion.ToString().Replace("_", "."));
206 206
207 ps.WriteLine(" <OutputType>{0}</OutputType>", project.Type == ProjectType.Web ? ProjectType.Library.ToString() : project.Type.ToString()); 207 ps.WriteLine(" <OutputType>{0}</OutputType>", project.Type == ProjectType.Web ? ProjectType.Library.ToString() : project.Type.ToString());
208 ps.WriteLine(" <AppDesignerFolder>{0}</AppDesignerFolder>", project.DesignerFolder); 208 ps.WriteLine(" <AppDesignerFolder>{0}</AppDesignerFolder>", project.DesignerFolder);
209 ps.WriteLine(" <RootNamespace>{0}</RootNamespace>", project.RootNamespace); 209 ps.WriteLine(" <RootNamespace>{0}</RootNamespace>", project.RootNamespace);
210 ps.WriteLine(" <StartupObject>{0}</StartupObject>", project.StartupObject); 210 ps.WriteLine(" <StartupObject>{0}</StartupObject>", project.StartupObject);
211 if (string.IsNullOrEmpty(project.DebugStartParameters)) 211 if (string.IsNullOrEmpty(project.DebugStartParameters))
212 { 212 {
213 ps.WriteLine(" <StartArguments>{0}</StartArguments>", project.DebugStartParameters); 213 ps.WriteLine(" <StartArguments>{0}</StartArguments>", project.DebugStartParameters);
214 } 214 }
215 ps.WriteLine(" <FileUpgradeFlags>"); 215 ps.WriteLine(" <FileUpgradeFlags>");
216 ps.WriteLine(" </FileUpgradeFlags>"); 216 ps.WriteLine(" </FileUpgradeFlags>");
217 217
218 ps.WriteLine(" </PropertyGroup>"); 218 ps.WriteLine(" </PropertyGroup>");
219 219
220 foreach (ConfigurationNode conf in project.Configurations) 220 foreach (ConfigurationNode conf in project.Configurations)
221 { 221 {
222 ps.Write(" <PropertyGroup "); 222 ps.Write(" <PropertyGroup ");
223 ps.WriteLine("Condition=\" '$(Configuration)|$(Platform)' == '{0}|AnyCPU' \">", conf.Name); 223 ps.WriteLine("Condition=\" '$(Configuration)|$(Platform)' == '{0}|AnyCPU' \">", conf.Name);
224 ps.WriteLine(" <AllowUnsafeBlocks>{0}</AllowUnsafeBlocks>", conf.Options["AllowUnsafe"]); 224 ps.WriteLine(" <AllowUnsafeBlocks>{0}</AllowUnsafeBlocks>", conf.Options["AllowUnsafe"]);
225 ps.WriteLine(" <BaseAddress>{0}</BaseAddress>", conf.Options["BaseAddress"]); 225 ps.WriteLine(" <BaseAddress>{0}</BaseAddress>", conf.Options["BaseAddress"]);
226 ps.WriteLine(" <CheckForOverflowUnderflow>{0}</CheckForOverflowUnderflow>", conf.Options["CheckUnderflowOverflow"]); 226 ps.WriteLine(" <CheckForOverflowUnderflow>{0}</CheckForOverflowUnderflow>", conf.Options["CheckUnderflowOverflow"]);
227 ps.WriteLine(" <ConfigurationOverrideFile>"); 227 ps.WriteLine(" <ConfigurationOverrideFile>");
228 ps.WriteLine(" </ConfigurationOverrideFile>"); 228 ps.WriteLine(" </ConfigurationOverrideFile>");
229 ps.WriteLine(" <DefineConstants>{0}</DefineConstants>", conf.Options["CompilerDefines"]); 229 ps.WriteLine(" <DefineConstants>{0}</DefineConstants>", conf.Options["CompilerDefines"]);
230 ps.WriteLine(" <DocumentationFile>{0}</DocumentationFile>", Helper.NormalizePath(conf.Options["XmlDocFile"].ToString())); 230 ps.WriteLine(" <DocumentationFile>{0}</DocumentationFile>", Helper.NormalizePath(conf.Options["XmlDocFile"].ToString()));
231 ps.WriteLine(" <DebugSymbols>{0}</DebugSymbols>", conf.Options["DebugInformation"]); 231 ps.WriteLine(" <DebugSymbols>{0}</DebugSymbols>", conf.Options["DebugInformation"]);
232 ps.WriteLine(" <FileAlignment>{0}</FileAlignment>", conf.Options["FileAlignment"]); 232 ps.WriteLine(" <FileAlignment>{0}</FileAlignment>", conf.Options["FileAlignment"]);
233 ps.WriteLine(" <Optimize>{0}</Optimize>", conf.Options["OptimizeCode"]); 233 ps.WriteLine(" <Optimize>{0}</Optimize>", conf.Options["OptimizeCode"]);
234 if (project.Type != ProjectType.Web) 234 if (project.Type != ProjectType.Web)
235 ps.WriteLine(" <OutputPath>{0}</OutputPath>", 235 ps.WriteLine(" <OutputPath>{0}</OutputPath>",
236 Helper.EndPath(Helper.NormalizePath(conf.Options["OutputPath"].ToString()))); 236 Helper.EndPath(Helper.NormalizePath(conf.Options["OutputPath"].ToString())));
237 else 237 else
238 ps.WriteLine(" <OutputPath>{0}</OutputPath>", 238 ps.WriteLine(" <OutputPath>{0}</OutputPath>",
239 Helper.EndPath(Helper.NormalizePath("bin\\"))); 239 Helper.EndPath(Helper.NormalizePath("bin\\")));
240 240
241 ps.WriteLine(" <RegisterForComInterop>{0}</RegisterForComInterop>", conf.Options["RegisterComInterop"]); 241 ps.WriteLine(" <RegisterForComInterop>{0}</RegisterForComInterop>", conf.Options["RegisterComInterop"]);
242 ps.WriteLine(" <RemoveIntegerChecks>{0}</RemoveIntegerChecks>", conf.Options["RemoveIntegerChecks"]); 242 ps.WriteLine(" <RemoveIntegerChecks>{0}</RemoveIntegerChecks>", conf.Options["RemoveIntegerChecks"]);
243 ps.WriteLine(" <TreatWarningsAsErrors>{0}</TreatWarningsAsErrors>", conf.Options["WarningsAsErrors"]); 243 ps.WriteLine(" <TreatWarningsAsErrors>{0}</TreatWarningsAsErrors>", conf.Options["WarningsAsErrors"]);
244 ps.WriteLine(" <WarningLevel>{0}</WarningLevel>", conf.Options["WarningLevel"]); 244 ps.WriteLine(" <WarningLevel>{0}</WarningLevel>", conf.Options["WarningLevel"]);
245 ps.WriteLine(" <NoStdLib>{0}</NoStdLib>", conf.Options["NoStdLib"]); 245 ps.WriteLine(" <NoStdLib>{0}</NoStdLib>", conf.Options["NoStdLib"]);
246 ps.WriteLine(" <NoWarn>{0}</NoWarn>", conf.Options["SuppressWarnings"]); 246 ps.WriteLine(" <NoWarn>{0}</NoWarn>", conf.Options["SuppressWarnings"]);
247 ps.WriteLine(" </PropertyGroup>"); 247 ps.WriteLine(" </PropertyGroup>");
248 } 248 }
249 249
250 //ps.WriteLine(" </Settings>"); 250 //ps.WriteLine(" </Settings>");
251 251
252 List<ProjectNode> projectReferences = new List<ProjectNode>(); 252 List<ProjectNode> projectReferences = new List<ProjectNode>();
253 List<ReferenceNode> otherReferences = new List<ReferenceNode>(); 253 List<ReferenceNode> otherReferences = new List<ReferenceNode>();
254 254
255 foreach (ReferenceNode refr in project.References) 255 foreach (ReferenceNode refr in project.References)
256 { 256 {
257 ProjectNode projectNode = FindProjectInSolution(refr.Name, solution); 257 ProjectNode projectNode = FindProjectInSolution(refr.Name, solution);
258 258
259 if (projectNode == null) 259 if (projectNode == null)
260 otherReferences.Add(refr); 260 otherReferences.Add(refr);
261 else 261 else
262 projectReferences.Add(projectNode); 262 projectReferences.Add(projectNode);
263 } 263 }
264 // Assembly References 264 // Assembly References
265 ps.WriteLine(" <ItemGroup>"); 265 ps.WriteLine(" <ItemGroup>");
266 266
267 foreach (ReferenceNode refr in otherReferences) 267 foreach (ReferenceNode refr in otherReferences)
268 { 268 {
269 ps.Write(" <Reference"); 269 ps.Write(" <Reference");
270 ps.Write(" Include=\""); 270 ps.Write(" Include=\"");
271 ps.Write(refr.Name); 271 ps.Write(refr.Name);
272 ps.WriteLine("\" >"); 272 ps.WriteLine("\" >");
273 ps.Write(" <Name>"); 273 ps.Write(" <Name>");
274 ps.Write(refr.Name); 274 ps.Write(refr.Name);
275 ps.WriteLine("</Name>"); 275 ps.WriteLine("</Name>");
276 // TODO: Allow reference to *.exe files 276 // TODO: Allow reference to *.exe files
277 ps.WriteLine(" <Private>{0}</Private>", refr.LocalCopy); 277 ps.WriteLine(" <Private>{0}</Private>", refr.LocalCopy);
278 ps.WriteLine(" </Reference>"); 278 ps.WriteLine(" </Reference>");
279 } 279 }
280 ps.WriteLine(" </ItemGroup>"); 280 ps.WriteLine(" </ItemGroup>");
281 281
282 //Project References 282 //Project References
283 ps.WriteLine(" <ItemGroup>"); 283 ps.WriteLine(" <ItemGroup>");
284 foreach (ProjectNode projectReference in projectReferences) 284 foreach (ProjectNode projectReference in projectReferences)
285 { 285 {
286 ToolInfo tool = (ToolInfo)tools[projectReference.Language]; 286 ToolInfo tool = (ToolInfo)tools[projectReference.Language];
287 if (tools == null) 287 if (tools == null)
288 throw new UnknownLanguageException(); 288 throw new UnknownLanguageException();
289 289
290 string path = 290 string path =
291 Helper.MakePathRelativeTo(project.FullPath, 291 Helper.MakePathRelativeTo(project.FullPath,
292 Helper.MakeFilePath(projectReference.FullPath, projectReference.Name, tool.FileExtension)); 292 Helper.MakeFilePath(projectReference.FullPath, projectReference.Name, tool.FileExtension));
293 ps.WriteLine(" <ProjectReference Include=\"{0}\">", path); 293 ps.WriteLine(" <ProjectReference Include=\"{0}\">", path);
294 294
295 // TODO: Allow reference to visual basic projects 295 // TODO: Allow reference to visual basic projects
296 ps.WriteLine(" <Name>{0}</Name>", projectReference.Name); 296 ps.WriteLine(" <Name>{0}</Name>", projectReference.Name);
297 ps.WriteLine(" <Project>{0}</Project>", projectReference.Guid.ToString("B").ToUpper()); 297 ps.WriteLine(" <Project>{0}</Project>", projectReference.Guid.ToString("B").ToUpper());
298 ps.WriteLine(" <Package>{0}</Package>", tool.Guid.ToUpper()); 298 ps.WriteLine(" <Package>{0}</Package>", tool.Guid.ToUpper());
299 299
300 ps.WriteLine(" <Private>False</Private>" ); 300 ps.WriteLine(" <Private>False</Private>" );
301 301
302 ps.WriteLine(" </ProjectReference>"); 302 ps.WriteLine(" </ProjectReference>");
303 } 303 }
304 ps.WriteLine(" </ItemGroup>"); 304 ps.WriteLine(" </ItemGroup>");
305 305
306 // ps.WriteLine(" </Build>"); 306 // ps.WriteLine(" </Build>");
307 ps.WriteLine(" <ItemGroup>"); 307 ps.WriteLine(" <ItemGroup>");
308 308
309 // ps.WriteLine(" <Include>"); 309 // ps.WriteLine(" <Include>");
310 List<string> list = new List<string>(); 310 List<string> list = new List<string>();
311 311
312 foreach (string path in project.Files) 312 foreach (string path in project.Files)
313 { 313 {
314 string lower = path.ToLower(); 314 string lower = path.ToLower();
315 if (lower.EndsWith(".resx")) 315 if (lower.EndsWith(".resx"))
316 { 316 {
317 string codebehind = String.Format("{0}.Designer{1}", path.Substring(0, path.LastIndexOf('.')), toolInfo.LanguageExtension); 317 string codebehind = String.Format("{0}.Designer{1}", path.Substring(0, path.LastIndexOf('.')), toolInfo.LanguageExtension);
318 if (!list.Contains(codebehind)) 318 if (!list.Contains(codebehind))
319 list.Add(codebehind); 319 list.Add(codebehind);
320 } 320 }
321 } 321 }
322 322
323 foreach (string file in project.Files) 323 foreach (string file in project.Files)
324 { 324 {
325 // if (file == "Properties\\Bind.Designer.cs") 325 // if (file == "Properties\\Bind.Designer.cs")
326 // { 326 // {
327 // Console.WriteLine("Wait a minute!"); 327 // Console.WriteLine("Wait a minute!");
328 // Console.WriteLine(project.Files.GetSubType(file).ToString()); 328 // Console.WriteLine(project.Files.GetSubType(file).ToString());
329 // } 329 // }
330 330
331 SubType subType = project.Files.GetSubType(file); 331 SubType subType = project.Files.GetSubType(file);
332 332
333 if (subType != SubType.Code && subType != SubType.Settings && subType != SubType.Designer 333 if (subType != SubType.Code && subType != SubType.Settings && subType != SubType.Designer
334 && subType != SubType.CodeBehind) 334 && subType != SubType.CodeBehind)
335 { 335 {
336 ps.WriteLine(" <EmbeddedResource Include=\"{0}\">", file.Substring(0, file.LastIndexOf('.')) + ".resx"); 336 ps.WriteLine(" <EmbeddedResource Include=\"{0}\">", file.Substring(0, file.LastIndexOf('.')) + ".resx");
337 ps.WriteLine(" <DependentUpon>{0}</DependentUpon>", Path.GetFileName(file)); 337 ps.WriteLine(" <DependentUpon>{0}</DependentUpon>", Path.GetFileName(file));
338 ps.WriteLine(" <SubType>Designer</SubType>"); 338 ps.WriteLine(" <SubType>Designer</SubType>");
339 ps.WriteLine(" </EmbeddedResource>"); 339 ps.WriteLine(" </EmbeddedResource>");
340 // 340 //
341 } 341 }
342 342
343 if (subType == SubType.Designer) 343 if (subType == SubType.Designer)
344 { 344 {
345 ps.WriteLine(" <EmbeddedResource Include=\"{0}\">", file); 345 ps.WriteLine(" <EmbeddedResource Include=\"{0}\">", file);
346 ps.WriteLine(" <SubType>" + subType + "</SubType>"); 346 ps.WriteLine(" <SubType>" + subType + "</SubType>");
347 ps.WriteLine(" <Generator>ResXFileCodeGenerator</Generator>"); 347 ps.WriteLine(" <Generator>ResXFileCodeGenerator</Generator>");
348 348
349 string autogen_name = file.Substring(0, file.LastIndexOf('.')) + ".Designer.cs"; 349 string autogen_name = file.Substring(0, file.LastIndexOf('.')) + ".Designer.cs";
350 string dependent_name = file.Substring(0, file.LastIndexOf('.')) + ".cs"; 350 string dependent_name = file.Substring(0, file.LastIndexOf('.')) + ".cs";
351 351
352 ps.WriteLine(" <LastGenOutput>{0}</LastGenOutput>", autogen_name); 352 ps.WriteLine(" <LastGenOutput>{0}</LastGenOutput>", autogen_name);
353 353
354 // Check for a parent .cs file with the same name as this designer file 354 // Check for a parent .cs file with the same name as this designer file
355 if (File.Exists(dependent_name)) 355 if (File.Exists(dependent_name))
356 ps.WriteLine(" <DependentUpon>{0}</DependentUpon>", Path.GetFileName(dependent_name)); 356 ps.WriteLine(" <DependentUpon>{0}</DependentUpon>", Path.GetFileName(dependent_name));
357 357
358 ps.WriteLine(" </EmbeddedResource>"); 358 ps.WriteLine(" </EmbeddedResource>");
359 if (File.Exists(autogen_name)) 359 if (File.Exists(autogen_name))
360 { 360 {
361 ps.WriteLine(" <Compile Include=\"{0}\">", autogen_name); 361 ps.WriteLine(" <Compile Include=\"{0}\">", autogen_name);
362 ps.WriteLine(" <AutoGen>True</AutoGen>"); 362 ps.WriteLine(" <AutoGen>True</AutoGen>");
363 ps.WriteLine(" <DesignTime>True</DesignTime>"); 363 ps.WriteLine(" <DesignTime>True</DesignTime>");
364 364
365 // If a parent .cs file exists, link this autogen file to it. Otherwise link 365 // If a parent .cs file exists, link this autogen file to it. Otherwise link
366 // to the designer file 366 // to the designer file
367 if (File.Exists(dependent_name)) 367 if (File.Exists(dependent_name))
368 ps.WriteLine(" <DependentUpon>{0}</DependentUpon>", Path.GetFileName(dependent_name)); 368 ps.WriteLine(" <DependentUpon>{0}</DependentUpon>", Path.GetFileName(dependent_name));
369 else 369 else
370 ps.WriteLine(" <DependentUpon>{0}</DependentUpon>", Path.GetFileName(file)); 370 ps.WriteLine(" <DependentUpon>{0}</DependentUpon>", Path.GetFileName(file));
371 371
372 ps.WriteLine(" </Compile>"); 372 ps.WriteLine(" </Compile>");
373 } 373 }
374 list.Add(autogen_name); 374 list.Add(autogen_name);
375 } 375 }
376 if (subType == SubType.Settings) 376 if (subType == SubType.Settings)
377 { 377 {
378 ps.Write(" <{0} ", project.Files.GetBuildAction(file)); 378 ps.Write(" <{0} ", project.Files.GetBuildAction(file));
379 ps.WriteLine("Include=\"{0}\">", file); 379 ps.WriteLine("Include=\"{0}\">", file);
380 string fileName = Path.GetFileName(file); 380 string fileName = Path.GetFileName(file);
381 if (project.Files.GetBuildAction(file) == BuildAction.None) 381 if (project.Files.GetBuildAction(file) == BuildAction.None)
382 { 382 {
383 ps.WriteLine(" <Generator>SettingsSingleFileGenerator</Generator>"); 383 ps.WriteLine(" <Generator>SettingsSingleFileGenerator</Generator>");
384 ps.WriteLine(" <LastGenOutput>{0}</LastGenOutput>", fileName.Substring(0, fileName.LastIndexOf('.')) + ".Designer.cs"); 384 ps.WriteLine(" <LastGenOutput>{0}</LastGenOutput>", fileName.Substring(0, fileName.LastIndexOf('.')) + ".Designer.cs");
385 } 385 }
386 else 386 else
387 { 387 {
388 ps.WriteLine(" <SubType>Code</SubType>"); 388 ps.WriteLine(" <SubType>Code</SubType>");
389 ps.WriteLine(" <AutoGen>True</AutoGen>"); 389 ps.WriteLine(" <AutoGen>True</AutoGen>");
390 ps.WriteLine(" <DesignTimeSharedInput>True</DesignTimeSharedInput>"); 390 ps.WriteLine(" <DesignTimeSharedInput>True</DesignTimeSharedInput>");
391 string fileNameShort = fileName.Substring(0, fileName.LastIndexOf('.')); 391 string fileNameShort = fileName.Substring(0, fileName.LastIndexOf('.'));
392 string fileNameShorter = fileNameShort.Substring(0, fileNameShort.LastIndexOf('.')); 392 string fileNameShorter = fileNameShort.Substring(0, fileNameShort.LastIndexOf('.'));
393 ps.WriteLine(" <DependentUpon>{0}</DependentUpon>", Path.GetFileName(fileNameShorter + ".settings")); 393 ps.WriteLine(" <DependentUpon>{0}</DependentUpon>", Path.GetFileName(fileNameShorter + ".settings"));
394 } 394 }
395 ps.WriteLine(" </{0}>", project.Files.GetBuildAction(file)); 395 ps.WriteLine(" </{0}>", project.Files.GetBuildAction(file));
396 } 396 }
397 else if (subType != SubType.Designer) 397 else if (subType != SubType.Designer)
398 { 398 {
399 string path = Helper.NormalizePath(file); 399 string path = Helper.NormalizePath(file);
400 string path_lower = path.ToLower(); 400 string path_lower = path.ToLower();
401 401
402 if (!list.Contains(file)) 402 if (!list.Contains(file))
403 { 403 {
404 ps.Write(" <{0} ", project.Files.GetBuildAction(path)); 404 ps.Write(" <{0} ", project.Files.GetBuildAction(path));
405 405
406 int startPos = 0; 406 int startPos = 0;
407 if (project.Files.GetPreservePath(file)) 407 if (project.Files.GetPreservePath(file))
408 { 408 {
409 while ((@"./\").IndexOf(file.Substring(startPos, 1)) != -1) 409 while ((@"./\").IndexOf(file.Substring(startPos, 1)) != -1)
410 startPos++; 410 startPos++;
411 411
412 } 412 }
413 else 413 else
414 { 414 {
415 startPos = file.LastIndexOf(Path.GetFileName(path)); 415 startPos = file.LastIndexOf(Path.GetFileName(path));
416 } 416 }
417 417
418 ps.WriteLine("Include=\"{0}\">", path); 418 ps.WriteLine("Include=\"{0}\">", path);
419 419
420 int last_period_index = file.LastIndexOf('.'); 420 int last_period_index = file.LastIndexOf('.');
421 string short_file_name = file.Substring(0, last_period_index); 421 string short_file_name = file.Substring(0, last_period_index);
422 string extension = Path.GetExtension(path); 422 string extension = Path.GetExtension(path);
423 string designer_format = string.Format(".designer{0}", extension); 423 string designer_format = string.Format(".designer{0}", extension);
424 424
425 if (path_lower.EndsWith(designer_format)) 425 if (path_lower.EndsWith(designer_format))
426 { 426 {
427 int designer_index = path_lower.IndexOf(designer_format); 427 int designer_index = path_lower.IndexOf(designer_format);
428 string file_name = path.Substring(0, designer_index); 428 string file_name = path.Substring(0, designer_index);
429 429
430 if (File.Exists(file_name)) 430 if (File.Exists(file_name))
431 ps.WriteLine(" <DependentUpon>{0}</DependentUpon>", Path.GetFileName(file_name)); 431 ps.WriteLine(" <DependentUpon>{0}</DependentUpon>", Path.GetFileName(file_name));
432 else if (File.Exists(file_name + ".resx")) 432 else if (File.Exists(file_name + ".resx"))
433 ps.WriteLine(" <DependentUpon>{0}</DependentUpon>", Path.GetFileName(file_name + ".resx")); 433 ps.WriteLine(" <DependentUpon>{0}</DependentUpon>", Path.GetFileName(file_name + ".resx"));
434 } 434 }
435 else if (subType == SubType.CodeBehind) 435 else if (subType == SubType.CodeBehind)
436 { 436 {
437 ps.WriteLine(" <DependentUpon>{0}</DependentUpon>", Path.GetFileName(short_file_name)); 437 ps.WriteLine(" <DependentUpon>{0}</DependentUpon>", Path.GetFileName(short_file_name));
438 } 438 }
439 if (project.Files.GetIsLink(file)) 439 if (project.Files.GetIsLink(file))
440 { 440 {
441 string alias = project.Files.GetLinkPath(file); 441 string alias = project.Files.GetLinkPath(file);
442 alias += file.Substring(startPos); 442 alias += file.Substring(startPos);
443 alias = Helper.NormalizePath(alias); 443 alias = Helper.NormalizePath(alias);
444 ps.WriteLine(" <Link>{0}</Link>", alias); 444 ps.WriteLine(" <Link>{0}</Link>", alias);
445 } 445 }
446 else if (project.Files.GetBuildAction(file) != BuildAction.None) 446 else if (project.Files.GetBuildAction(file) != BuildAction.None)
447 { 447 {
448 if (project.Files.GetBuildAction(file) != BuildAction.EmbeddedResource) 448 if (project.Files.GetBuildAction(file) != BuildAction.EmbeddedResource)
449 { 449 {
450 ps.WriteLine(" <SubType>{0}</SubType>", subType); 450 ps.WriteLine(" <SubType>{0}</SubType>", subType);
451 } 451 }
452 } 452 }
453 453
454 if (project.Files.GetCopyToOutput(file) != CopyToOutput.Never) 454 if (project.Files.GetCopyToOutput(file) != CopyToOutput.Never)
455 { 455 {
456 ps.WriteLine(" <CopyToOutputDirectory>{0}</CopyToOutputDirectory>", project.Files.GetCopyToOutput(file)); 456 ps.WriteLine(" <CopyToOutputDirectory>{0}</CopyToOutputDirectory>", project.Files.GetCopyToOutput(file));
457 } 457 }
458 458
459 ps.WriteLine(" </{0}>", project.Files.GetBuildAction(file)); 459 ps.WriteLine(" </{0}>", project.Files.GetBuildAction(file));
460 } 460 }
461 } 461 }
462 } 462 }
463 463
464 ps.WriteLine(" </ItemGroup>"); 464 ps.WriteLine(" </ItemGroup>");
465 ps.WriteLine(" <Import Project=\"" + toolInfo.ImportProject + "\" />"); 465 ps.WriteLine(" <Import Project=\"" + toolInfo.ImportProject + "\" />");
466 ps.WriteLine(" <PropertyGroup>"); 466 ps.WriteLine(" <PropertyGroup>");
467 ps.WriteLine(" <PreBuildEvent>"); 467 ps.WriteLine(" <PreBuildEvent>");
468 ps.WriteLine(" </PreBuildEvent>"); 468 ps.WriteLine(" </PreBuildEvent>");
469 ps.WriteLine(" <PostBuildEvent>"); 469 ps.WriteLine(" <PostBuildEvent>");
470 ps.WriteLine(" </PostBuildEvent>"); 470 ps.WriteLine(" </PostBuildEvent>");
471 ps.WriteLine(" </PropertyGroup>"); 471 ps.WriteLine(" </PropertyGroup>");
472 ps.WriteLine("</Project>"); 472 ps.WriteLine("</Project>");
473 } 473 }
474 #endregion 474 #endregion
475 475
476 #region User File 476 #region User File
477 477
478 ps = new StreamWriter(projectFile + ".user"); 478 ps = new StreamWriter(projectFile + ".user");
479 using (ps) 479 using (ps)
480 { 480 {
481 ps.WriteLine("<Project xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">"); 481 ps.WriteLine("<Project xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">");
482 //ps.WriteLine( "<VisualStudioProject>" ); 482 //ps.WriteLine( "<VisualStudioProject>" );
483 //ps.WriteLine(" <{0}>", toolInfo.XMLTag); 483 //ps.WriteLine(" <{0}>", toolInfo.XMLTag);
484 //ps.WriteLine(" <Build>"); 484 //ps.WriteLine(" <Build>");
485 ps.WriteLine(" <PropertyGroup>"); 485 ps.WriteLine(" <PropertyGroup>");
486 //ps.WriteLine(" <Settings ReferencePath=\"{0}\">", MakeRefPath(project)); 486 //ps.WriteLine(" <Settings ReferencePath=\"{0}\">", MakeRefPath(project));
487 ps.WriteLine(" <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>"); 487 ps.WriteLine(" <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>");
488 ps.WriteLine(" <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>"); 488 ps.WriteLine(" <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>");
489 ps.WriteLine(" <ReferencePath>{0}</ReferencePath>", MakeRefPath(project)); 489 ps.WriteLine(" <ReferencePath>{0}</ReferencePath>", MakeRefPath(project));
490 ps.WriteLine(" <LastOpenVersion>{0}</LastOpenVersion>", this.ProductVersion); 490 ps.WriteLine(" <LastOpenVersion>{0}</LastOpenVersion>", this.ProductVersion);
491 ps.WriteLine(" <ProjectView>ProjectFiles</ProjectView>"); 491 ps.WriteLine(" <ProjectView>ProjectFiles</ProjectView>");
492 ps.WriteLine(" <ProjectTrust>0</ProjectTrust>"); 492 ps.WriteLine(" <ProjectTrust>0</ProjectTrust>");
493 ps.WriteLine(" </PropertyGroup>"); 493 ps.WriteLine(" </PropertyGroup>");
494 foreach (ConfigurationNode conf in project.Configurations) 494 foreach (ConfigurationNode conf in project.Configurations)
495 { 495 {
496 ps.Write(" <PropertyGroup"); 496 ps.Write(" <PropertyGroup");
497 ps.Write(" Condition = \" '$(Configuration)|$(Platform)' == '{0}|AnyCPU' \"", conf.Name); 497 ps.Write(" Condition = \" '$(Configuration)|$(Platform)' == '{0}|AnyCPU' \"", conf.Name);
498 ps.WriteLine(" />"); 498 ps.WriteLine(" />");
499 } 499 }
500 ps.WriteLine("</Project>"); 500 ps.WriteLine("</Project>");
501 } 501 }
502 #endregion 502 #endregion
503 503
504 kernel.CurrentWorkingDirectory.Pop(); 504 kernel.CurrentWorkingDirectory.Pop();
505 } 505 }
506 506
507 private void WriteSolution(SolutionNode solution, bool writeSolutionToDisk) 507 private void WriteSolution(SolutionNode solution, bool writeSolutionToDisk)
508 { 508 {
509 kernel.Log.Write("Creating {0} solution and project files", this.VersionName); 509 kernel.Log.Write("Creating {0} solution and project files", this.VersionName);
510 510
511 foreach (SolutionNode child in solution.Solutions) 511 foreach (SolutionNode child in solution.Solutions)
512 { 512 {
513 kernel.Log.Write("...Creating folder: {0}", child.Name); 513 kernel.Log.Write("...Creating folder: {0}", child.Name);
514 WriteSolution(child, false); 514 WriteSolution(child, false);
515 } 515 }
516 516
517 foreach (ProjectNode project in solution.Projects) 517 foreach (ProjectNode project in solution.Projects)
518 { 518 {
519 kernel.Log.Write("...Creating project: {0}", project.Name); 519 kernel.Log.Write("...Creating project: {0}", project.Name);
520 WriteProject(solution, project); 520 WriteProject(solution, project);
521 } 521 }
522 522
523 foreach (DatabaseProjectNode project in solution.DatabaseProjects) 523 foreach (DatabaseProjectNode project in solution.DatabaseProjects)
524 { 524 {
525 kernel.Log.Write("...Creating database project: {0}", project.Name); 525 kernel.Log.Write("...Creating database project: {0}", project.Name);
526 WriteDatabaseProject(solution, project); 526 WriteDatabaseProject(solution, project);
527 } 527 }
528 528
529 if (writeSolutionToDisk) // only write main solution 529 if (writeSolutionToDisk) // only write main solution
530 { 530 {
531 kernel.Log.Write(""); 531 kernel.Log.Write("");
532 string solutionFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "sln"); 532 string solutionFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "sln");
533 533
534 using (StreamWriter ss = new StreamWriter(solutionFile)) 534 using (StreamWriter ss = new StreamWriter(solutionFile))
535 { 535 {
536 kernel.CurrentWorkingDirectory.Push(); 536 kernel.CurrentWorkingDirectory.Push();
537 Helper.SetCurrentDir(Path.GetDirectoryName(solutionFile)); 537 Helper.SetCurrentDir(Path.GetDirectoryName(solutionFile));
538 538
539 ss.WriteLine("Microsoft Visual Studio Solution File, Format Version {0}", this.SolutionVersion); 539 ss.WriteLine("Microsoft Visual Studio Solution File, Format Version {0}", this.SolutionVersion);
540 ss.WriteLine(SolutionTag); 540 ss.WriteLine(SolutionTag);
541 541
542 WriteProjectDeclarations(ss, solution, solution); 542 WriteProjectDeclarations(ss, solution, solution);
543 543
544 ss.WriteLine("Global"); 544 ss.WriteLine("Global");
545 545
546 ss.WriteLine("\tGlobalSection(SolutionConfigurationPlatforms) = preSolution"); 546 ss.WriteLine("\tGlobalSection(SolutionConfigurationPlatforms) = preSolution");
547 foreach (ConfigurationNode conf in solution.Configurations) 547 foreach (ConfigurationNode conf in solution.Configurations)
548 { 548 {
549 ss.WriteLine("\t\t{0}|Any CPU = {0}|Any CPU", conf.Name); 549 ss.WriteLine("\t\t{0}|Any CPU = {0}|Any CPU", conf.Name);
550 } 550 }
551 ss.WriteLine("\tEndGlobalSection"); 551 ss.WriteLine("\tEndGlobalSection");
552 552
553 ss.WriteLine("\tGlobalSection(ProjectConfigurationPlatforms) = postSolution"); 553 ss.WriteLine("\tGlobalSection(ProjectConfigurationPlatforms) = postSolution");
554 WriteConfigurationLines(solution.Configurations, solution, ss); 554 WriteConfigurationLines(solution.Configurations, solution, ss);
555 ss.WriteLine("\tEndGlobalSection"); 555 ss.WriteLine("\tEndGlobalSection");
556 556
557 if (solution.Solutions.Count > 0) 557 if (solution.Solutions.Count > 0)
558 { 558 {
559 ss.WriteLine("\tGlobalSection(NestedProjects) = preSolution"); 559 ss.WriteLine("\tGlobalSection(NestedProjects) = preSolution");
560 foreach (SolutionNode embeddedSolution in solution.Solutions) 560 foreach (SolutionNode embeddedSolution in solution.Solutions)
561 { 561 {
562 WriteNestedProjectMap(ss, embeddedSolution); 562 WriteNestedProjectMap(ss, embeddedSolution);
563 } 563 }
564 ss.WriteLine("\tEndGlobalSection"); 564 ss.WriteLine("\tEndGlobalSection");
565 } 565 }
566 566
567 ss.WriteLine("EndGlobal"); 567 ss.WriteLine("EndGlobal");
568 } 568 }
569 569
570 kernel.CurrentWorkingDirectory.Pop(); 570 kernel.CurrentWorkingDirectory.Pop();
571 } 571 }
572 } 572 }
573 573
574 private void WriteProjectDeclarations(StreamWriter writer, SolutionNode actualSolution, SolutionNode embeddedSolution) 574 private void WriteProjectDeclarations(StreamWriter writer, SolutionNode actualSolution, SolutionNode embeddedSolution)
575 { 575 {
576 foreach (SolutionNode childSolution in embeddedSolution.Solutions) 576 foreach (SolutionNode childSolution in embeddedSolution.Solutions)
577 { 577 {
578 WriteEmbeddedSolution(writer, childSolution); 578 WriteEmbeddedSolution(writer, childSolution);
579 WriteProjectDeclarations(writer, actualSolution, childSolution); 579 WriteProjectDeclarations(writer, actualSolution, childSolution);
580 } 580 }
581 581
582 foreach (ProjectNode project in embeddedSolution.Projects) 582 foreach (ProjectNode project in embeddedSolution.Projects)
583 { 583 {
584 WriteProject(actualSolution, writer, project); 584 WriteProject(actualSolution, writer, project);
585 } 585 }
586 586
587 foreach (DatabaseProjectNode dbProject in embeddedSolution.DatabaseProjects) 587 foreach (DatabaseProjectNode dbProject in embeddedSolution.DatabaseProjects)
588 { 588 {
589 WriteProject(actualSolution, writer, dbProject); 589 WriteProject(actualSolution, writer, dbProject);
590 } 590 }
591 591
592 if (actualSolution.Guid == embeddedSolution.Guid) 592 if (actualSolution.Guid == embeddedSolution.Guid)
593 { 593 {
594 WriteSolutionFiles(actualSolution, writer); 594 WriteSolutionFiles(actualSolution, writer);
595 } 595 }
596 } 596 }
597 597
598 private static void WriteNestedProjectMap(StreamWriter writer, SolutionNode embeddedSolution) 598 private static void WriteNestedProjectMap(StreamWriter writer, SolutionNode embeddedSolution)
599 { 599 {
600 foreach (ProjectNode project in embeddedSolution.Projects) 600 foreach (ProjectNode project in embeddedSolution.Projects)
601 { 601 {
602 WriteNestedProject(writer, embeddedSolution, project.Guid); 602 WriteNestedProject(writer, embeddedSolution, project.Guid);
603 } 603 }
604 604
605 foreach (DatabaseProjectNode dbProject in embeddedSolution.DatabaseProjects) 605 foreach (DatabaseProjectNode dbProject in embeddedSolution.DatabaseProjects)
606 { 606 {
607 WriteNestedProject(writer, embeddedSolution, dbProject.Guid); 607 WriteNestedProject(writer, embeddedSolution, dbProject.Guid);
608 } 608 }
609 609
610 foreach (SolutionNode child in embeddedSolution.Solutions) 610 foreach (SolutionNode child in embeddedSolution.Solutions)
611 { 611 {
612 WriteNestedProject(writer, embeddedSolution, child.Guid); 612 WriteNestedProject(writer, embeddedSolution, child.Guid);
613 WriteNestedProjectMap(writer, child); 613 WriteNestedProjectMap(writer, child);
614 } 614 }
615 } 615 }
616 616
617 private static void WriteNestedProject(StreamWriter writer, SolutionNode solution, Guid projectGuid) 617 private static void WriteNestedProject(StreamWriter writer, SolutionNode solution, Guid projectGuid)
618 { 618 {
619 WriteNestedFolder(writer, solution.Guid, projectGuid); 619 WriteNestedFolder(writer, solution.Guid, projectGuid);
620 } 620 }
621 621
622 private static void WriteNestedFolder(StreamWriter writer, Guid parentGuid, Guid childGuid) 622 private static void WriteNestedFolder(StreamWriter writer, Guid parentGuid, Guid childGuid)
623 { 623 {
624 writer.WriteLine("\t\t{0} = {1}", 624 writer.WriteLine("\t\t{0} = {1}",
625 childGuid.ToString("B").ToUpper(), 625 childGuid.ToString("B").ToUpper(),
626 parentGuid.ToString("B").ToUpper()); 626 parentGuid.ToString("B").ToUpper());
627 } 627 }
628 628
629 private static void WriteConfigurationLines(ICollection configurations, SolutionNode solution, StreamWriter ss) 629 private static void WriteConfigurationLines(ICollection configurations, SolutionNode solution, StreamWriter ss)
630 { 630 {
631 foreach (ProjectNode project in solution.Projects) 631 foreach (ProjectNode project in solution.Projects)
632 { 632 {
633 foreach (ConfigurationNode conf in configurations) 633 foreach (ConfigurationNode conf in configurations)
634 { 634 {
635 ss.WriteLine("\t\t{0}.{1}|Any CPU.ActiveCfg = {1}|Any CPU", 635 ss.WriteLine("\t\t{0}.{1}|Any CPU.ActiveCfg = {1}|Any CPU",
636 project.Guid.ToString("B").ToUpper(), 636 project.Guid.ToString("B").ToUpper(),
637 conf.Name); 637 conf.Name);
638 638
639 ss.WriteLine("\t\t{0}.{1}|Any CPU.Build.0 = {1}|Any CPU", 639 ss.WriteLine("\t\t{0}.{1}|Any CPU.Build.0 = {1}|Any CPU",
640 project.Guid.ToString("B").ToUpper(), 640 project.Guid.ToString("B").ToUpper(),
641 conf.Name); 641 conf.Name);
642 } 642 }
643 } 643 }
644 644
645 foreach (SolutionNode child in solution.Solutions) 645 foreach (SolutionNode child in solution.Solutions)
646 { 646 {
647 WriteConfigurationLines(configurations, child, ss); 647 WriteConfigurationLines(configurations, child, ss);
648 } 648 }
649 } 649 }
650 650
651 private void WriteSolutionFiles(SolutionNode solution, StreamWriter ss) 651 private void WriteSolutionFiles(SolutionNode solution, StreamWriter ss)
652 { 652 {
653 WriteProject(ss, "Folder", solution.Guid, "Solution Files", "Solution Files", solution.Files); 653 WriteProject(ss, "Folder", solution.Guid, "Solution Files", "Solution Files", solution.Files);
654 } 654 }
655 655
656 private void WriteEmbeddedSolution(StreamWriter writer, SolutionNode embeddedSolution) 656 private void WriteEmbeddedSolution(StreamWriter writer, SolutionNode embeddedSolution)
657 { 657 {
658 WriteProject(writer, "Folder", embeddedSolution.Guid, embeddedSolution.Name, embeddedSolution.Name, embeddedSolution.Files); 658 WriteProject(writer, "Folder", embeddedSolution.Guid, embeddedSolution.Name, embeddedSolution.Name, embeddedSolution.Files);
659 } 659 }
660 660
661 private void WriteProject(SolutionNode solution, StreamWriter ss, ProjectNode project) 661 private void WriteProject(SolutionNode solution, StreamWriter ss, ProjectNode project)
662 { 662 {
663 WriteProject(ss, solution, project.Language, project.Guid, project.Name, project.FullPath); 663 WriteProject(ss, solution, project.Language, project.Guid, project.Name, project.FullPath);
664 } 664 }
665 665
666 private void WriteProject(SolutionNode solution, StreamWriter ss, DatabaseProjectNode dbProject) 666 private void WriteProject(SolutionNode solution, StreamWriter ss, DatabaseProjectNode dbProject)
667 { 667 {
668 if (solution.Files != null && solution.Files.Count > 0) 668 if (solution.Files != null && solution.Files.Count > 0)
669 WriteProject(ss, solution, "Database", dbProject.Guid, dbProject.Name, dbProject.FullPath); 669 WriteProject(ss, solution, "Database", dbProject.Guid, dbProject.Name, dbProject.FullPath);
670 } 670 }
671 671
672 private static bool ExtensionSpecified(string refName) 672 private static bool ExtensionSpecified(string refName)
673 { 673 {
674 return refName.EndsWith(".dll") || refName.EndsWith(".exe"); 674 return refName.EndsWith(".dll") || refName.EndsWith(".exe");
675 } 675 }
676 676
677 private static string GetProjectExtension(ProjectNode project) 677 private static string GetProjectExtension(ProjectNode project)
678 { 678 {
679 string extension = ".dll"; 679 string extension = ".dll";
680 if (project.Type == ProjectType.Exe) 680 if (project.Type == ProjectType.Exe)
681 { 681 {
682 extension = ".exe"; 682 extension = ".exe";
683 } 683 }
684 return extension; 684 return extension;
685 } 685 }
686 686
687 const string ProjectDeclarationBeginFormat = "Project(\"{0}\") = \"{1}\", \"{2}\", \"{3}\""; 687 const string ProjectDeclarationBeginFormat = "Project(\"{0}\") = \"{1}\", \"{2}\", \"{3}\"";
688 const string ProjectDeclarationEndFormat = "EndProject"; 688 const string ProjectDeclarationEndFormat = "EndProject";
689 689
690 private void WriteProject(StreamWriter ss, SolutionNode solution, string language, Guid guid, string name, string projectFullPath) 690 private void WriteProject(StreamWriter ss, SolutionNode solution, string language, Guid guid, string name, string projectFullPath)
691 { 691 {
692 if (!tools.ContainsKey(language)) 692 if (!tools.ContainsKey(language))
693 throw new UnknownLanguageException("Unknown .NET language: " + language); 693 throw new UnknownLanguageException("Unknown .NET language: " + language);
694 694
695 ToolInfo toolInfo = (ToolInfo)tools[language]; 695 ToolInfo toolInfo = (ToolInfo)tools[language];
696 696
697 string path = Helper.MakePathRelativeTo(solution.FullPath, projectFullPath); 697 string path = Helper.MakePathRelativeTo(solution.FullPath, projectFullPath);
698 698
699 path = Helper.MakeFilePath(path, name, toolInfo.FileExtension); 699 path = Helper.MakeFilePath(path, name, toolInfo.FileExtension);
700 700
701 WriteProject(ss, language, guid, name, path); 701 WriteProject(ss, language, guid, name, path);
702 } 702 }
703 703
704 private void WriteProject(StreamWriter writer, string language, Guid projectGuid, string name, string location) 704 private void WriteProject(StreamWriter writer, string language, Guid projectGuid, string name, string location)
705 { 705 {
706 WriteProject(writer, language, projectGuid, name, location, null); 706 WriteProject(writer, language, projectGuid, name, location, null);
707 } 707 }
708 708
709 private void WriteProject(StreamWriter writer, string language, Guid projectGuid, string name, string location, FilesNode files) 709 private void WriteProject(StreamWriter writer, string language, Guid projectGuid, string name, string location, FilesNode files)
710 { 710 {
711 if (!tools.ContainsKey(language)) 711 if (!tools.ContainsKey(language))
712 throw new UnknownLanguageException("Unknown .NET language: " + language); 712 throw new UnknownLanguageException("Unknown .NET language: " + language);
713 713
714 ToolInfo toolInfo = (ToolInfo)tools[language]; 714 ToolInfo toolInfo = (ToolInfo)tools[language];
715 715
716 writer.WriteLine(ProjectDeclarationBeginFormat, 716 writer.WriteLine(ProjectDeclarationBeginFormat,
717 toolInfo.Guid, 717 toolInfo.Guid,
718 name, 718 name,
719 location, 719 location,
720 projectGuid.ToString("B").ToUpper()); 720 projectGuid.ToString("B").ToUpper());
721 721
722 if (files != null) 722 if (files != null)
723 { 723 {
724 writer.WriteLine("\tProjectSection(SolutionItems) = preProject"); 724 writer.WriteLine("\tProjectSection(SolutionItems) = preProject");
725 725
726 foreach (string file in files) 726 foreach (string file in files)
727 writer.WriteLine("\t\t{0} = {0}", file); 727 writer.WriteLine("\t\t{0} = {0}", file);
728 728
729 writer.WriteLine("\tEndProjectSection"); 729 writer.WriteLine("\tEndProjectSection");
730 } 730 }
731 731
732 writer.WriteLine(ProjectDeclarationEndFormat); 732 writer.WriteLine(ProjectDeclarationEndFormat);
733 } 733 }
734 734
735 private void WriteDatabaseProject(SolutionNode solution, DatabaseProjectNode project) 735 private void WriteDatabaseProject(SolutionNode solution, DatabaseProjectNode project)
736 { 736 {
737 string projectFile = Helper.MakeFilePath(project.FullPath, project.Name, "dbp"); 737 string projectFile = Helper.MakeFilePath(project.FullPath, project.Name, "dbp");
738 IndentedTextWriter ps = new IndentedTextWriter(new StreamWriter(projectFile), " "); 738 IndentedTextWriter ps = new IndentedTextWriter(new StreamWriter(projectFile), " ");
739 739
740 kernel.CurrentWorkingDirectory.Push(); 740 kernel.CurrentWorkingDirectory.Push();
741 741
742 Helper.SetCurrentDir(Path.GetDirectoryName(projectFile)); 742 Helper.SetCurrentDir(Path.GetDirectoryName(projectFile));
743 743
744 using (ps) 744 using (ps)
745 { 745 {
746 ps.WriteLine("# Microsoft Developer Studio Project File - Database Project"); 746 ps.WriteLine("# Microsoft Developer Studio Project File - Database Project");
747 ps.WriteLine("Begin DataProject = \"{0}\"", project.Name); 747 ps.WriteLine("Begin DataProject = \"{0}\"", project.Name);
748 ps.Indent++; 748 ps.Indent++;
749 ps.WriteLine("MSDTVersion = \"80\""); 749 ps.WriteLine("MSDTVersion = \"80\"");
750 // TODO: Use the project.Files property 750 // TODO: Use the project.Files property
751 if (ContainsSqlFiles(Path.GetDirectoryName(projectFile))) 751 if (ContainsSqlFiles(Path.GetDirectoryName(projectFile)))
752 WriteDatabaseFoldersAndFiles(ps, Path.GetDirectoryName(projectFile)); 752 WriteDatabaseFoldersAndFiles(ps, Path.GetDirectoryName(projectFile));
753 753
754 ps.WriteLine("Begin DBRefFolder = \"Database References\""); 754 ps.WriteLine("Begin DBRefFolder = \"Database References\"");
755 ps.Indent++; 755 ps.Indent++;
756 foreach (DatabaseReferenceNode reference in project.References) 756 foreach (DatabaseReferenceNode reference in project.References)
757 { 757 {
758 ps.WriteLine("Begin DBRefNode = \"{0}\"", reference.Name); 758 ps.WriteLine("Begin DBRefNode = \"{0}\"", reference.Name);
759 ps.Indent++; 759 ps.Indent++;
760 ps.WriteLine("ConnectStr = \"{0}\"", reference.ConnectionString); 760 ps.WriteLine("ConnectStr = \"{0}\"", reference.ConnectionString);
761 ps.WriteLine("Provider = \"{0}\"", reference.ProviderId.ToString("B").ToUpper()); 761 ps.WriteLine("Provider = \"{0}\"", reference.ProviderId.ToString("B").ToUpper());
762 //ps.WriteLine("Colorizer = 5"); 762 //ps.WriteLine("Colorizer = 5");
763 ps.Indent--; 763 ps.Indent--;
764 ps.WriteLine("End"); 764 ps.WriteLine("End");
765 } 765 }
766 ps.Indent--; 766 ps.Indent--;
767 ps.WriteLine("End"); 767 ps.WriteLine("End");
768 ps.Indent--; 768 ps.Indent--;
769 ps.WriteLine("End"); 769 ps.WriteLine("End");
770 770
771 ps.Flush(); 771 ps.Flush();
772 } 772 }
773 773
774 kernel.CurrentWorkingDirectory.Pop(); 774 kernel.CurrentWorkingDirectory.Pop();
775 } 775 }
776 776
777 private bool ContainsSqlFiles(string folder) 777 private bool ContainsSqlFiles(string folder)
778 { 778 {
779 foreach (string file in Directory.GetFiles(folder, "*.sql")) 779 foreach (string file in Directory.GetFiles(folder, "*.sql"))
780 { 780 {
781 return true; // if the folder contains 1 .sql file, that's good enough 781 return true; // if the folder contains 1 .sql file, that's good enough
782 } 782 }
783 783
784 foreach (string child in Directory.GetDirectories(folder)) 784 foreach (string child in Directory.GetDirectories(folder))
785 { 785 {
786 if (ContainsSqlFiles(child)) 786 if (ContainsSqlFiles(child))
787 return true; // if 1 child folder contains a .sql file, still good enough 787 return true; // if 1 child folder contains a .sql file, still good enough
788 } 788 }
789 789
790 return false; 790 return false;
791 } 791 }
792 792
793 private void WriteDatabaseFoldersAndFiles(IndentedTextWriter writer, string folder) 793 private void WriteDatabaseFoldersAndFiles(IndentedTextWriter writer, string folder)
794 { 794 {
795 foreach (string child in Directory.GetDirectories(folder)) 795 foreach (string child in Directory.GetDirectories(folder))
796 { 796 {
797 if (ContainsSqlFiles(child)) 797 if (ContainsSqlFiles(child))
798 { 798 {
799 writer.WriteLine("Begin Folder = \"{0}\"", Path.GetFileName(child)); 799 writer.WriteLine("Begin Folder = \"{0}\"", Path.GetFileName(child));
800 writer.Indent++; 800 writer.Indent++;
801 WriteDatabaseFoldersAndFiles(writer, child); 801 WriteDatabaseFoldersAndFiles(writer, child);
802 writer.Indent--; 802 writer.Indent--;
803 writer.WriteLine("End"); 803 writer.WriteLine("End");
804 } 804 }
805 } 805 }
806 foreach (string file in Directory.GetFiles(folder, "*.sql")) 806 foreach (string file in Directory.GetFiles(folder, "*.sql"))
807 { 807 {
808 writer.WriteLine("Script = \"{0}\"", Path.GetFileName(file)); 808 writer.WriteLine("Script = \"{0}\"", Path.GetFileName(file));
809 } 809 }
810 } 810 }
811 811
812 private void CleanProject(ProjectNode project) 812 private void CleanProject(ProjectNode project)
813 { 813 {
814 kernel.Log.Write("...Cleaning project: {0}", project.Name); 814 kernel.Log.Write("...Cleaning project: {0}", project.Name);
815 815
816 ToolInfo toolInfo = (ToolInfo)tools[project.Language]; 816 ToolInfo toolInfo = (ToolInfo)tools[project.Language];
817 string projectFile = Helper.MakeFilePath(project.FullPath, project.Name, toolInfo.FileExtension); 817 string projectFile = Helper.MakeFilePath(project.FullPath, project.Name, toolInfo.FileExtension);
818 string userFile = projectFile + ".user"; 818 string userFile = projectFile + ".user";
819 819
820 Helper.DeleteIfExists(projectFile); 820 Helper.DeleteIfExists(projectFile);
821 Helper.DeleteIfExists(userFile); 821 Helper.DeleteIfExists(userFile);
822 } 822 }
823 823
824 private void CleanSolution(SolutionNode solution) 824 private void CleanSolution(SolutionNode solution)
825 { 825 {
826 kernel.Log.Write("Cleaning {0} solution and project files", this.VersionName, solution.Name); 826 kernel.Log.Write("Cleaning {0} solution and project files", this.VersionName, solution.Name);
827 827
828 string slnFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "sln"); 828 string slnFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "sln");
829 string suoFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "suo"); 829 string suoFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "suo");
830 830
831 Helper.DeleteIfExists(slnFile); 831 Helper.DeleteIfExists(slnFile);
832 Helper.DeleteIfExists(suoFile); 832 Helper.DeleteIfExists(suoFile);
833 833
834 foreach (ProjectNode project in solution.Projects) 834 foreach (ProjectNode project in solution.Projects)
835 { 835 {
836 CleanProject(project); 836 CleanProject(project);
837 } 837 }
838 838
839 kernel.Log.Write(""); 839 kernel.Log.Write("");
840 } 840 }
841 841
842 #endregion 842 #endregion
843 843
844 #region ITarget Members 844 #region ITarget Members
845 845
846 /// <summary> 846 /// <summary>
847 /// Writes the specified kern. 847 /// Writes the specified kern.
848 /// </summary> 848 /// </summary>
849 /// <param name="kern">The kern.</param> 849 /// <param name="kern">The kern.</param>
850 public virtual void Write(Kernel kern) 850 public virtual void Write(Kernel kern)
851 { 851 {
852 if (kern == null) 852 if (kern == null)
853 { 853 {
854 throw new ArgumentNullException("kern"); 854 throw new ArgumentNullException("kern");
855 } 855 }
856 kernel = kern; 856 kernel = kern;
857 foreach (SolutionNode sol in kernel.Solutions) 857 foreach (SolutionNode sol in kernel.Solutions)
858 { 858 {
859 WriteSolution(sol, true); 859 WriteSolution(sol, true);
860 } 860 }
861 kernel = null; 861 kernel = null;
862 } 862 }
863 863
864 /// <summary> 864 /// <summary>
865 /// Cleans the specified kern. 865 /// Cleans the specified kern.
866 /// </summary> 866 /// </summary>
867 /// <param name="kern">The kern.</param> 867 /// <param name="kern">The kern.</param>
868 public virtual void Clean(Kernel kern) 868 public virtual void Clean(Kernel kern)
869 { 869 {
870 if (kern == null) 870 if (kern == null)
871 { 871 {
872 throw new ArgumentNullException("kern"); 872 throw new ArgumentNullException("kern");
873 } 873 }
874 kernel = kern; 874 kernel = kern;
875 foreach (SolutionNode sol in kernel.Solutions) 875 foreach (SolutionNode sol in kernel.Solutions)
876 { 876 {
877 CleanSolution(sol); 877 CleanSolution(sol);
878 } 878 }
879 kernel = null; 879 kernel = null;
880 } 880 }
881 881
882 #endregion 882 #endregion
883 } 883 }
884} 884}