aboutsummaryrefslogtreecommitdiffstatsci
path: root/Samples/CrowIDE/src/Project.cs
diff options
context:
space:
mode:
authorJean-Philippe Bruyère <jp_bruyere@hotmail.com>2020-05-13 10:09:01 +0200
committerJean-Philippe Bruyère <jp_bruyere@hotmail.com>2020-05-13 10:09:01 +0200
commit74d1288c9990bb251b7097b225891bafdc6758af (patch)
tree8173afa55887a46e9ef44076498be725c5b33ad1 /Samples/CrowIDE/src/Project.cs
parenta73c8383e6ea636672a3bdb07e084260538fc68a (diff)
removed splitted CrowIDE
Diffstat (limited to 'Samples/CrowIDE/src/Project.cs')
-rw-r--r--Samples/CrowIDE/src/Project.cs519
1 files changed, 0 insertions, 519 deletions
diff --git a/Samples/CrowIDE/src/Project.cs b/Samples/CrowIDE/src/Project.cs
deleted file mode 100644
index a3ffa636..00000000
--- a/Samples/CrowIDE/src/Project.cs
+++ /dev/null
@@ -1,519 +0,0 @@
-//
-// Project.cs
-//
-// Author:
-// jp <>
-//
-// Copyright (c) 2013-2017 Jean-Philippe Bruyère
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-// THE SOFTWARE.
-using System;
-using System.Xml;
-using System.IO;
-using System.Collections.Generic;
-using System.Linq;
-using Microsoft.CSharp;
-using System.CodeDom.Compiler;
-using Crow;
-using System.Text.RegularExpressions;
-
-namespace Crow.Coding {
- public class Project : IValueChange {
- #region IValueChange implementation
- public event EventHandler<ValueChangeEventArgs> ValueChanged;
- public virtual void NotifyValueChanged (string MemberName, object _value) {
- ValueChanged.Raise (this, new ValueChangeEventArgs (MemberName, _value));
- }
- #endregion
-
- bool isLoaded = false;
- bool isExpanded;
- XmlDocument xmlDoc;
- XmlNode nodeProject;
- XmlNode nodeProps;
- XmlNodeList nodesItems;
- SolutionProject solutionProject;
- Crow.Command cmdSave, cmdOpen, cmdCompile, cmdSetAsStartProj, cmdNewFile;
-
- #region CTOR
- public Project (Solution sol, SolutionProject sp) {
- solutionProject = sp;
-
- solution = sol;
-
- cmdSave = new Crow.Command (new Action (() => Save ())) { Caption = "Save", Icon = new SvgPicture ("#CrowIDE.icons.save.svg"), CanExecute = true };
- cmdOpen = new Crow.Command (new Action (() => Load ())) { Caption = "Open", Icon = new SvgPicture ("#CrowIDE.icons.open.svg"), CanExecute = false };
- cmdCompile = new Crow.Command (new Action (() => Compile ())) {
- Caption = "Compile",
- Icon = "#CrowIDE.icons.compile.svg"
- };
- cmdSetAsStartProj = new Crow.Command (new Action (() => setAsStartupProject ())) {
- Caption = "Set as Startup Project"
- };
- cmdNewFile = new Crow.Command (new Action (() => AddNewFile ())) {
- Caption = "Add New File",
- Icon = new SvgPicture ("#CrowIDE.icons.blank-file.svg"),
- CanExecute = true
- };
-
- Commands = new List<Crow.Command> (new Crow.Command[] { cmdOpen, cmdSave, cmdSetAsStartProj, cmdCompile, cmdNewFile });
-
- Load ();
- }
- #endregion
-
- public Solution solution;
- public List<Crow.Command> Commands;
- public CompilerResults CompilationResults;
- public List<Project> dependantProjects = new List<Project> ();
- public Project ParentProject = null;
- List<ProjectNode> rootItems;
- List<ProjectNode> flattenNodes;
-
- public string Name {
- get { return solutionProject.ProjectName; }
- }
- public bool IsLoaded {
- get { return isLoaded; }
- set {
- if (isLoaded == value)
- return;
- isLoaded = value;
- NotifyValueChanged ("IsLoaded", isLoaded);
- }
- }
- public bool IsExpanded {
- get { return isExpanded; }
- set {
- if (value == isExpanded)
- return;
- isExpanded = value;
- NotifyValueChanged ("IsExpanded", isExpanded);
- }
- }
- public bool IsStartupProject {
- get { return solution.StartupProject == this; }
- }
- public string Path {
- get { return System.IO.Path.Combine (solution.SolutionFolder, solutionProject.RelativePath.Replace ('\\', '/')); }
- }
- public string RootDir {
- get { return System.IO.Path.GetDirectoryName (Path); }
- }
-
-
-
- public List<ProjectNode> RootItems {
- get { return rootItems; }
- }
-
- void buildTreeNodes () {
- ProjectNode root = new ProjectNode (this, ItemType.VirtualGroup, RootNamespace);
- List<ProjectItem> items = new List<ProjectItem> ();
- foreach (XmlNode i in nodesItems) {
- foreach (XmlNode f in i.ChildNodes) {
- items.Add (new ProjectItem (this, f));
- }
- }
-
- flattenNodes = new List<ProjectNode> ();
-
- ProjectNode refs = new ProjectNode (this, ItemType.ReferenceGroup, "References");
- root.AddChild (refs);
-
- foreach (ProjectItem pn in items) {
- switch (pn.Type) {
- case ItemType.Reference:
- refs.AddChild (pn);
- flattenNodes.Add (pn);
- break;
- case ItemType.ProjectReference:
- ProjectReference pr = new ProjectReference (pn);
- refs.AddChild (pr);
- flattenNodes.Add (pr);
- break;
- case ItemType.Compile:
- case ItemType.None:
- case ItemType.EmbeddedResource:
- ProjectNode curNode = root;
- string[] folds = pn.Path.Split ('/');
- for (int i = 0; i < folds.Length - 1; i++) {
- ProjectNode nextNode = curNode.ChildNodes.FirstOrDefault (n => n.DisplayName == folds[i] && n.Type == ItemType.VirtualGroup);
- if (nextNode == null) {
- nextNode = new ProjectNode (this, ItemType.VirtualGroup, folds[i]);
- curNode.AddChild (nextNode);
- }
- curNode = nextNode;
- }
- ProjectNode f = null;
- switch (pn.Extension) {
- /*case ".cs":
- f = new CSProjectFile (pn);
- break;*/
- case ".crow":
- case ".template":
- case ".goml":
- case ".itemp":
- case ".imtl":
- f = new ImlProjectItem (pn);
- break;
- case ".style":
- f = new StyleProjectItem (pn);
- break;
- default:
- f = new ProjectFile (pn);
- break;
- }
- curNode.AddChild (f);
- flattenNodes.Add (f);
- break;
- }
- }
- root.SortChilds ();
-
- rootItems = root.ChildNodes;
- }
-
- #region Project properties
- public string ToolsVersion {
- get { return nodeProject?.Attributes["ToolsVersion"]?.Value; }
- }
- public string DefaultTargets {
- get { return nodeProject?.Attributes["DefaultTargets"]?.Value; }
- }
- public string ProjectGuid {
- get { return solutionProject.ProjectGuid; }
- }
- public string AssemblyName {
- get { return nodeProps["AssemblyName"]?.InnerText; }
- }
- public string OutputType {
- get { return nodeProps["OutputType"]?.InnerText; }
- }
- public string RootNamespace {
- get { return nodeProps["RootNamespace"]?.InnerText; }
- }
- public bool AllowUnsafeBlocks {
- get {
- return nodeProps["AllowUnsafeBlocks"] == null ? false :
- bool.Parse (nodeProps["AllowUnsafeBlocks"]?.InnerText);
- }
- }
- public bool NoStdLib {
- get {
- return nodeProps["NoStdLib"] == null ? false :
- bool.Parse (nodeProps["NoStdLib"]?.InnerText);
- }
- }
- public bool TreatWarningsAsErrors {
- get {
- return nodeProps["TreatWarningsAsErrors"] == null ? false :
- bool.Parse (nodeProps["TreatWarningsAsErrors"]?.InnerText);
- }
- }
- public bool SignAssembly {
- get { return bool.Parse (nodeProps["SignAssembly"]?.InnerText); }
- }
- public string TargetFrameworkVersion {
- get { return nodeProps["TargetFrameworkVersion"]?.InnerText; }
- }
- public string Description {
- get { return nodeProps["Description"]?.InnerText; }
- }
- public string OutputPath {
- get { return nodeProps["OutputPath"]?.InnerText; }
- }
- public string IntermediateOutputPath {
- get { return nodeProps["IntermediateOutputPath"]?.InnerText; }
- }
- public string StartupObject {
- get { return nodeProps["StartupObject"]?.InnerText; }
- }
- public bool DebugSymbols {
- get { return nodeProps["DebugSymbols"] == null ? false : bool.Parse (nodeProps["DebugSymbols"]?.InnerText); }
- }
- public int WarningLevel {
- get { return nodeProps["WarningLevel"] == null ? 0 : int.Parse (nodeProps["WarningLevel"]?.InnerText); }
- }
-
- #endregion
-
-
- public void AddNewFile () {
- Window.Show (CrowIDE.MainIFace, "#CrowIDE.ui.NewFile.crow", true).DataSource = this;
- }
-
- public void Load () {
-
- xmlDoc = new XmlDocument ();
- using (Stream ins = new FileStream (this.Path, FileMode.Open)) {
- xmlDoc.Load (new XmlTextReader (ins) { Namespaces = false });
- }
-
- nodeProject = xmlDoc.SelectSingleNode ("Project");
- XmlNodeList nodesProps = xmlDoc.SelectNodes ("/Project/PropertyGroup");
-
- foreach (XmlNode n in nodesProps) {
- if (n.Attributes["Condition"] == null)
- nodeProps = n;
- }
- nodesItems = xmlDoc.SelectNodes ("/Project/ItemGroup");
-
- if (ProjectGuid != solutionProject.ProjectGuid)
- throw new Exception ("Project GUID not matching with solution");
-
- buildTreeNodes ();
-
- IsLoaded = true;
- }
-
- public void Save () {
-
- }
-
- void setAsStartupProject () {
- solution.StartupProject = this;
- }
- static Regex regexDirTokens = new Regex (@"\$\(([^\)]*)\)|([^\$]*)");
-
- string getDirectoryWithTokens (string dir) {
- Match m = regexDirTokens.Match (dir);
- string tmp = "";
- while (m.Success) {
- if (m.Value == @"$(SolutionDir)")
- tmp = System.IO.Path.Combine (tmp, solution.SolutionFolder);
- else if (m.Value == @"$(Configuration)")
- tmp = System.IO.Path.Combine (tmp, "Debug");
- else
- tmp = System.IO.Path.Combine (tmp, m.Value);
-
- if (tmp.EndsWith (@"\") || tmp.EndsWith (@"/"))
- tmp = tmp.Remove (tmp.Length - 1);
-
- m = m.NextMatch ();
- }
- return tmp;
- }
- public string Compile () {
- if (ParentProject != null)
- ParentProject.Compile ();
-
- CSharpCodeProvider cp = new CSharpCodeProvider ();
- CompilerParameters parameters = new CompilerParameters ();
-
- foreach (ProjectReference pr in flattenNodes.OfType<ProjectReference> ()) {
- Project p = solution.Projects.FirstOrDefault (pp => pp.ProjectGuid == pr.ProjectGUID);
- if (p == null)
- throw new Exception ("referenced project not found");
- parameters.ReferencedAssemblies.Add (p.Compile ());
- }
-
- string outputDir = getDirectoryWithTokens (this.OutputPath);
- string objDir = getDirectoryWithTokens (this.IntermediateOutputPath);
-
- Directory.CreateDirectory (outputDir);
- Directory.CreateDirectory (objDir);
-
- parameters.OutputAssembly = System.IO.Path.Combine (outputDir, this.AssemblyName);
-
- // True - exe file generation, false - dll file generation
- if (this.OutputType == "Library") {
- parameters.GenerateExecutable = false;
- parameters.CompilerOptions += " /target:library";
- parameters.OutputAssembly += ".dll";
- } else {
- parameters.GenerateExecutable = true;
- parameters.CompilerOptions += " /target:exe";
- parameters.OutputAssembly += ".exe";
- parameters.MainClass = this.StartupObject;
- }
-
- parameters.GenerateInMemory = false;
- parameters.IncludeDebugInformation = this.DebugSymbols;
- parameters.TreatWarningsAsErrors = this.TreatWarningsAsErrors;
- parameters.WarningLevel = this.WarningLevel;
- parameters.CompilerOptions += " /noconfig";
- if (this.AllowUnsafeBlocks)
- parameters.CompilerOptions += " /unsafe";
- parameters.CompilerOptions += " /delaysign+";
- parameters.CompilerOptions += " /debug:full /debug+";
- parameters.CompilerOptions += " /optimize-";
- parameters.CompilerOptions += " /define:\"DEBUG;TRACE\"";
- parameters.CompilerOptions += " /nostdlib";
-
-
-
- foreach (ProjectItem pi in flattenNodes.Where (p => p.Type == ItemType.Reference)) {
-
- if (string.IsNullOrEmpty (pi.HintPath)) {
- parameters.CompilerOptions += " /reference:/usr/lib/mono/4.5/" + pi.Path + ".dll";
- continue;
- }
- parameters.ReferencedAssemblies.Add (pi.Path);
- string fullHintPath = System.IO.Path.GetFullPath (System.IO.Path.Combine (RootDir, pi.HintPath.Replace ('\\', '/')));
- if (File.Exists (fullHintPath)) {
- string outPath = System.IO.Path.Combine (outputDir, System.IO.Path.GetFileName (fullHintPath));
- if (!File.Exists (outPath))
- File.Copy (fullHintPath, outPath);
- }
- }
- parameters.CompilerOptions += " /reference:/usr/lib/mono/4.5/System.Core.dll";
- parameters.CompilerOptions += " /reference:/usr/lib/mono/4.5/mscorlib.dll";
- //parameters.ReferencedAssemblies.Add ("System.Core");
- //parameters.ReferencedAssemblies.Add ("mscorlib.dll");
-
-
- IEnumerable<ProjectFile> pfs = flattenNodes.OfType<ProjectFile> ();
-
- foreach (ProjectFile pi in pfs.Where (p => p.Type == ItemType.EmbeddedResource)) {
-
- string absPath = pi.AbsolutePath;
- string logicName = pi.LogicalName;
- if (string.IsNullOrEmpty (logicName))
- parameters.CompilerOptions += string.Format (" /resource:{0},{1}", absPath, this.Name + "." + pi.Path.Replace ('/', '.'));
- else
- parameters.CompilerOptions += string.Format (" /resource:{0},{1}", absPath, logicName);
- }
- foreach (ProjectFile pi in pfs.Where (p => p.Type == ItemType.None)) {
- if (pi.CopyToOutputDirectory == CopyToOutputState.Never)
- continue;
- string source = pi.AbsolutePath;
- string target = System.IO.Path.Combine (outputDir, pi.Path);
- Directory.CreateDirectory (System.IO.Path.GetDirectoryName (target));
-
- if (File.Exists (target)) {
- if (pi.CopyToOutputDirectory == CopyToOutputState.PreserveNewest) {
- if (DateTime.Compare (
- System.IO.File.GetLastWriteTime (source),
- System.IO.File.GetLastWriteTime (target)) < 0)
- continue;
- }
- File.Delete (target);
- }
- System.Diagnostics.Debug.WriteLine ("copy " + source + " to " + target);
- File.Copy (source, target);
- }
- string[] files = pfs.Where (p => p.Type == ItemType.Compile).Select (p => p.AbsolutePath).ToArray ();
-
- System.Diagnostics.Debug.WriteLine ("---- start compilation of :" + parameters.OutputAssembly);
- System.Diagnostics.Debug.WriteLine (parameters.CompilerOptions);
-
- CompilationResults = cp.CompileAssemblyFromFile (parameters, files);
-
- solution.UpdateErrorList ();
-
- return parameters.OutputAssembly;
- }
-
- public bool TryGetProjectFileFromAbsolutePath (string absolutePath, out ProjectFile pi) {
- pi = flattenNodes.OfType<ProjectFile> ().FirstOrDefault
- (pp => pp.AbsolutePath == absolutePath);
- return pi != null;
- }
- public bool TryGetProjectFileFromPath (string path, out ProjectFile pi) {
- if (path.StartsWith ("#", StringComparison.Ordinal))
- pi = flattenNodes.OfType<ProjectFile> ().FirstOrDefault
- (pp => pp.Type == ItemType.EmbeddedResource && pp.ResourceID == path.Substring (1));
- else
- pi = flattenNodes.OfType<ProjectFile> ().FirstOrDefault (pp => pp.Path == path);
-
- if (pi != null)
- return true;
-
- foreach (ProjectReference pr in flattenNodes.OfType<ProjectReference> ()) {
- Project p = solution.Projects.FirstOrDefault (pp => pp.ProjectGuid == pr.ProjectGUID);
- if (p == null)
- throw new Exception ("referenced project not found");
- if (p.TryGetProjectFileFromPath (path, out pi))
- return true;
- }
- //TODO: search referenced assemblies
- return false;
- }
-
- public void GetDefaultTemplates () {
- IEnumerable<ProjectFile> tmpFiles =
- flattenNodes.OfType<ProjectFile> ().Where (pp => pp.Extension == ".template");
-
- foreach (ProjectFile pi in tmpFiles.Where (
- pp => pp.Type == ItemType.None && pp.CopyToOutputDirectory != CopyToOutputState.Never)) {
-
- string clsName = System.IO.Path.GetFileNameWithoutExtension (pi.Path);
- if (solution.DefaultTemplates.ContainsKey (clsName))
- continue;
- solution.DefaultTemplates[clsName] = pi.AbsolutePath;
- }
- foreach (ProjectFile pi in tmpFiles.Where (pp => pp.Type == ItemType.EmbeddedResource)) {
- string resId = pi.ResourceID;
- string clsName = resId.Substring (0, resId.Length - 9);
- if (solution.DefaultTemplates.ContainsKey (clsName))
- continue;
- solution.DefaultTemplates[clsName] = pi.Path;
- }
-
- foreach (Project p in ReferencedProjects)
- p.GetDefaultTemplates ();
- }
- // void searchTemplatesIn(Assembly assembly){
- // if (assembly == null)
- // return;
- // foreach (string resId in assembly
- // .GetManifestResourceNames ()
- // .Where (r => r.EndsWith (".template", StringComparison.OrdinalIgnoreCase))) {
- // string clsName = resId.Substring (0, resId.Length - 9);
- // if (DefaultTemplates.ContainsKey (clsName))
- // continue;
- // DefaultTemplates[clsName] = "#" + resId;
- // }
- // }
-
- public List<Project> ReferencedProjects {
- get {
- List<Project> tmp = new List<Project> ();
- foreach (ProjectReference pr in flattenNodes.OfType<ProjectReference> ()) {
- Project p = solution.Projects.FirstOrDefault (pp => pp.ProjectGuid == pr.ProjectGUID);
- if (p != null)
- tmp.Add (p);
- }
- return tmp;
- }
- }
-
- public void GetStyling () {
- try {
- foreach (ProjectFile pi in flattenNodes.OfType<ProjectFile> ().Where (pp => pp.Type == ItemType.EmbeddedResource && pp.Extension == ".style")) {
- using (Stream s = new MemoryStream (System.Text.Encoding.UTF8.GetBytes (pi.Source))) {
- new StyleReader (solution.Styling, s, pi.ResourceID);
- }
- }
- } catch (Exception ex) {
- Console.WriteLine (ex.ToString ());
- }
- foreach (ProjectReference pr in flattenNodes.OfType<ProjectReference> ()) {
- Project p = solution.Projects.FirstOrDefault (pp => pp.ProjectGuid == pr.ProjectGUID);
- if (p == null)
- throw new Exception ("referenced project not found");
- p.GetStyling ();
- }
-
- //TODO:get styling from referenced assemblies
- }
- }
-}
-