diff --git a/src/Main/Base/Project/Dom/ConcatModelCollection.cs b/src/Main/Base/Project/Dom/ConcatModelCollection.cs index 9e4c4218d1..eeb5b7d013 100644 --- a/src/Main/Base/Project/Dom/ConcatModelCollection.cs +++ b/src/Main/Base/Project/Dom/ConcatModelCollection.cs @@ -16,6 +16,9 @@ namespace ICSharpCode.SharpDevelop.Dom /// public sealed class ConcatModelCollection : IModelCollection { + // TODO: do we still need this class? maybe we should remove it? + // the indirection through this collection wrapper makes the weak reference/weak event stuff too complicated... + sealed class InputCollection : Collection> { readonly ConcatModelCollection owner; diff --git a/src/Main/Base/Project/Dom/IModelFactory.cs b/src/Main/Base/Project/Dom/IModelFactory.cs new file mode 100644 index 0000000000..357cb18906 --- /dev/null +++ b/src/Main/Base/Project/Dom/IModelFactory.cs @@ -0,0 +1,24 @@ +// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) +// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) + +using System; +using ICSharpCode.Core; +using ICSharpCode.NRefactory.TypeSystem; + +namespace ICSharpCode.SharpDevelop.Dom +{ + /// + /// Allows creating models using the default implementation in SharpDevelop.exe. + /// + [SDService] + public interface IModelFactory + { + /// + /// Creates an empty type definition collection that holds the top-level types for a project. + /// + IMutableTypeDefinitionModelCollection CreateTopLevelTypeDefinitionCollection(IEntityModelContext context); + + ITypeDefinitionModel CreateTypeDefinitionModel(IEntityModelContext context, params IUnresolvedTypeDefinition[] parts); + IMemberModel CreateMemberModel(IEntityModelContext context, IUnresolvedMember member); + } +} diff --git a/src/Main/Base/Project/Dom/IModelService.cs b/src/Main/Base/Project/Dom/IModelService.cs deleted file mode 100644 index 5a9e125bb9..0000000000 --- a/src/Main/Base/Project/Dom/IModelService.cs +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) -// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) - -using System; -using ICSharpCode.NRefactory.TypeSystem; - -namespace ICSharpCode.SharpDevelop.Dom -{ - /// - /// Service that enables lookup of model objects from NRefactory objects. - /// - public interface IModelService - { - } -} diff --git a/src/Main/Base/Project/Dom/ITypeDefinitionModelCollection.cs b/src/Main/Base/Project/Dom/ITypeDefinitionModelCollection.cs index 4b4dba61d2..94e9ee0c84 100644 --- a/src/Main/Base/Project/Dom/ITypeDefinitionModelCollection.cs +++ b/src/Main/Base/Project/Dom/ITypeDefinitionModelCollection.cs @@ -29,6 +29,14 @@ namespace ICSharpCode.SharpDevelop.Dom ITypeDefinitionModel this[TopLevelTypeName topLevelTypeName] { get; } } + public interface IMutableTypeDefinitionModelCollection : ITypeDefinitionModelCollection, IList + { + /// + /// Updates the collection when the parse information has changed. + /// + void Update(IUnresolvedFile oldFile, IUnresolvedFile newFile); + } + public sealed class EmptyTypeDefinitionModelCollection : ITypeDefinitionModelCollection { public static readonly EmptyTypeDefinitionModelCollection Instance = new EmptyTypeDefinitionModelCollection(); diff --git a/src/Main/Base/Project/ICSharpCode.SharpDevelop.addin b/src/Main/Base/Project/ICSharpCode.SharpDevelop.addin index b2550799e2..881619ee29 100755 --- a/src/Main/Base/Project/ICSharpCode.SharpDevelop.addin +++ b/src/Main/Base/Project/ICSharpCode.SharpDevelop.addin @@ -66,6 +66,8 @@ class="ICSharpCode.SharpDevelop.Workbench.ShutdownService"/> + diff --git a/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj b/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj index afb123a8ae..0476f61dba 100644 --- a/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj +++ b/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj @@ -98,7 +98,7 @@ - + @@ -114,6 +114,15 @@ + + + + + + + + + @@ -443,13 +452,6 @@ - - - - - - - @@ -595,7 +597,6 @@ - @@ -703,7 +704,6 @@ - @@ -858,6 +858,7 @@ + diff --git a/src/Main/Base/Project/Src/Services/ParserService/DomAssemblyName.cs b/src/Main/Base/Project/Parser/DomAssemblyName.cs similarity index 100% rename from src/Main/Base/Project/Src/Services/ParserService/DomAssemblyName.cs rename to src/Main/Base/Project/Parser/DomAssemblyName.cs diff --git a/src/Main/Base/Project/Src/Services/ParserService/IAssemblyParserService.cs b/src/Main/Base/Project/Parser/IAssemblyParserService.cs similarity index 100% rename from src/Main/Base/Project/Src/Services/ParserService/IAssemblyParserService.cs rename to src/Main/Base/Project/Parser/IAssemblyParserService.cs diff --git a/src/Main/Base/Project/Src/Services/ParserService/IGlobalAssemblyCacheService.cs b/src/Main/Base/Project/Parser/IGlobalAssemblyCacheService.cs similarity index 100% rename from src/Main/Base/Project/Src/Services/ParserService/IGlobalAssemblyCacheService.cs rename to src/Main/Base/Project/Parser/IGlobalAssemblyCacheService.cs diff --git a/src/Main/Base/Project/Src/Services/ParserService/IParser.cs b/src/Main/Base/Project/Parser/IParser.cs similarity index 100% rename from src/Main/Base/Project/Src/Services/ParserService/IParser.cs rename to src/Main/Base/Project/Parser/IParser.cs diff --git a/src/Main/Base/Project/Src/Services/ParserService/IParserService.cs b/src/Main/Base/Project/Parser/IParserService.cs similarity index 100% rename from src/Main/Base/Project/Src/Services/ParserService/IParserService.cs rename to src/Main/Base/Project/Parser/IParserService.cs diff --git a/src/Main/Base/Project/Parser/ISolutionSnapshotWithProjectMapping.cs b/src/Main/Base/Project/Parser/ISolutionSnapshotWithProjectMapping.cs new file mode 100644 index 0000000000..d573b02a3b --- /dev/null +++ b/src/Main/Base/Project/Parser/ISolutionSnapshotWithProjectMapping.cs @@ -0,0 +1,22 @@ +// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) +// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) + +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using ICSharpCode.NRefactory.TypeSystem; +using ICSharpCode.NRefactory.TypeSystem.Implementation; +using ICSharpCode.SharpDevelop.Project; + +namespace ICSharpCode.SharpDevelop.Parser +{ + /// + /// ISolutionSnapshot implementation that supports the IAssembly.GetProject() extension method. + /// + public interface ISolutionSnapshotWithProjectMapping : ISolutionSnapshot + { + IProject GetProject(IAssembly assembly); + IProjectContent GetProjectContent(IProject project); + ICompilation GetCompilation(IProject project); + } +} diff --git a/src/Main/Base/Project/Src/Services/ParserService/ParseInformation.cs b/src/Main/Base/Project/Parser/ParseInformation.cs similarity index 100% rename from src/Main/Base/Project/Src/Services/ParserService/ParseInformation.cs rename to src/Main/Base/Project/Parser/ParseInformation.cs diff --git a/src/Main/Base/Project/Src/Services/ParserService/ParseInformationEventArgs.cs b/src/Main/Base/Project/Parser/ParseInformationEventArgs.cs similarity index 100% rename from src/Main/Base/Project/Src/Services/ParserService/ParseInformationEventArgs.cs rename to src/Main/Base/Project/Parser/ParseInformationEventArgs.cs diff --git a/src/Main/Base/Project/Src/Services/ParserService/ParseProjectContent.cs b/src/Main/Base/Project/Parser/ProjectContentContainer.cs similarity index 97% rename from src/Main/Base/Project/Src/Services/ParserService/ParseProjectContent.cs rename to src/Main/Base/Project/Parser/ProjectContentContainer.cs index 327001fc05..e8d4b9538d 100644 --- a/src/Main/Base/Project/Src/Services/ParserService/ParseProjectContent.cs +++ b/src/Main/Base/Project/Parser/ProjectContentContainer.cs @@ -19,9 +19,10 @@ using ICSharpCode.SharpDevelop.Util; namespace ICSharpCode.SharpDevelop.Parser { - public class ParseProjectContentContainer : IDisposable + sealed class ProjectContentContainer : IDisposable { - readonly MSBuildBasedProject project; + readonly IProject project; + readonly IParserService parserService = SD.ParserService; /// /// Lock for accessing mutable fields of this class. @@ -47,7 +48,7 @@ namespace ICSharpCode.SharpDevelop.Parser string cacheFileName; #region Constructor + Dispose - public ParseProjectContentContainer(MSBuildBasedProject project, IProjectContent initialProjectContent) + public ProjectContentContainer(MSBuildBasedProject project, IProjectContent initialProjectContent) { if (project == null) throw new ArgumentNullException("project"); @@ -88,7 +89,7 @@ namespace ICSharpCode.SharpDevelop.Parser serializeOnDispose = !this.serializedProjectContentIsUpToDate; } foreach (var unresolvedFile in pc.Files) { - SD.ParserService.RemoveOwnerProject(FileName.Create(unresolvedFile.FileName), project); + parserService.RemoveOwnerProject(FileName.Create(unresolvedFile.FileName), project); } if (serializeOnDispose) SerializeAsync(cacheFileName, pc).FireAndForget(); @@ -139,7 +140,7 @@ namespace ICSharpCode.SharpDevelop.Parser string cacheFileName = Path.GetFileNameWithoutExtension(projectFileName); if (cacheFileName.Length > 32) cacheFileName = cacheFileName.Substring(cacheFileName.Length - 32); // use 32 last characters - cacheFileName = Path.Combine(persistencePath, cacheFileName + "." + projectFileName.GetHashCode().ToString("x8") + ".prj"); + cacheFileName = Path.Combine(persistencePath, cacheFileName + "." + projectFileName.ToString().GetStableHashCode().ToString("x8") + ".prj"); return cacheFileName; } diff --git a/src/Main/Base/Project/Src/Project/AbstractProject.cs b/src/Main/Base/Project/Src/Project/AbstractProject.cs index 516169fce7..5722e71f5c 100644 --- a/src/Main/Base/Project/Src/Project/AbstractProject.cs +++ b/src/Main/Base/Project/Src/Project/AbstractProject.cs @@ -471,17 +471,12 @@ namespace ICSharpCode.SharpDevelop.Project get { return Solution.SolutionVersionVS2005; } } - public virtual void ResolveAssemblyReferences() - { - } - /// /// Resolves assembly references for this project. /// The resulting list of resolved references will include project references. /// public virtual IEnumerable ResolveAssemblyReferences(CancellationToken cancellationToken) { - ResolveAssemblyReferences(); List referenceItems = new List(); bool mscorlib = false; foreach (ProjectItem item in this.Items) { @@ -672,6 +667,7 @@ namespace ICSharpCode.SharpDevelop.Project } } + [Browsable(false)] public virtual ICSharpCode.SharpDevelop.Dom.ITypeDefinitionModelCollection TypeDefinitionModels { get { return EmptyTypeDefinitionModelCollection.Instance; diff --git a/src/Main/Base/Project/Src/Project/CompilableProject.cs b/src/Main/Base/Project/Src/Project/CompilableProject.cs index 57527fc50d..679f032473 100644 --- a/src/Main/Base/Project/Src/Project/CompilableProject.cs +++ b/src/Main/Base/Project/Src/Project/CompilableProject.cs @@ -9,9 +9,11 @@ using System.IO; using System.Linq; using System.Runtime.InteropServices.ComTypes; using System.Xml.Linq; + using ICSharpCode.Core; using ICSharpCode.NRefactory.TypeSystem; using ICSharpCode.NRefactory.TypeSystem.Implementation; +using ICSharpCode.SharpDevelop.Dom; using ICSharpCode.SharpDevelop.Parser; using ICSharpCode.SharpDevelop.Project.Converter; using ICSharpCode.SharpDevelop.Util; @@ -233,16 +235,16 @@ namespace ICSharpCode.SharpDevelop.Project void Reparse(bool references, bool code) { lock (SyncRoot) { - if (parseProjectContentContainer == null) + if (projectContentContainer == null) return; // parsing hasn't started yet; no need to re-parse - parseProjectContentContainer.SetAssemblyName(this.AssemblyName); - parseProjectContentContainer.SetLocation(this.OutputAssemblyFullPath); + projectContentContainer.SetAssemblyName(this.AssemblyName); + projectContentContainer.SetLocation(this.OutputAssemblyFullPath); if (references) { - parseProjectContentContainer.ReparseReferences(); + projectContentContainer.ReparseReferences(); } if (code) { - parseProjectContentContainer.SetCompilerSettings(CreateCompilerSettings()); - parseProjectContentContainer.ReparseCode(); + projectContentContainer.SetCompilerSettings(CreateCompilerSettings()); + projectContentContainer.ReparseCode(); } } } @@ -279,8 +281,8 @@ namespace ICSharpCode.SharpDevelop.Project public override void Dispose() { lock (SyncRoot) { - if (parseProjectContentContainer != null) - parseProjectContentContainer.Dispose(); + if (projectContentContainer != null) + projectContentContainer.Dispose(); } base.Dispose(); } @@ -343,15 +345,16 @@ namespace ICSharpCode.SharpDevelop.Project #endregion #region Type System - volatile ParseProjectContentContainer parseProjectContentContainer; + volatile ProjectContentContainer projectContentContainer; + IMutableTypeDefinitionModelCollection typeDefinitionModels; protected void InitializeProjectContent(IProjectContent initialProjectContent) { lock (SyncRoot) { - if (parseProjectContentContainer != null) + if (projectContentContainer != null) throw new InvalidOperationException("Already initialized."); - parseProjectContentContainer = new ParseProjectContentContainer(this, initialProjectContent); - parseProjectContentContainer.SetCompilerSettings(CreateCompilerSettings()); + projectContentContainer = new ProjectContentContainer(this, initialProjectContent); + projectContentContainer.SetCompilerSettings(CreateCompilerSettings()); } } @@ -362,20 +365,31 @@ namespace ICSharpCode.SharpDevelop.Project public override IProjectContent ProjectContent { get { - var c = parseProjectContentContainer; + var c = projectContentContainer; return c != null ? c.ProjectContent : null; } } + public override ITypeDefinitionModelCollection TypeDefinitionModels { + get { + SD.MainThread.VerifyAccess(); + if (typeDefinitionModels == null) + typeDefinitionModels = SD.GetRequiredService().CreateTopLevelTypeDefinitionCollection(new ProjectEntityModelContext(this, ".cs")); + return typeDefinitionModels; + } + } + public override void OnParseInformationUpdated(ParseInformationEventArgs args) { - var c = parseProjectContentContainer; + var c = projectContentContainer; if (c != null) c.ParseInformationUpdated(args.OldUnresolvedFile, args.NewUnresolvedFile); // OnParseInformationUpdated is called inside a lock, but we don't want to raise the event inside that lock. // To ensure events are raised in the same order, we always invoke on the main thread. SD.MainThread.InvokeAsync( delegate { + if (typeDefinitionModels != null) + typeDefinitionModels.Update(args.OldUnresolvedFile, args.NewUnresolvedFile); ParseInformationUpdated(null, args); }).FireAndForget(); } diff --git a/src/Main/Base/Project/Src/Project/IProject.cs b/src/Main/Base/Project/Src/Project/IProject.cs index b19dfa3d3c..30058708c1 100644 --- a/src/Main/Base/Project/Src/Project/IProject.cs +++ b/src/Main/Base/Project/Src/Project/IProject.cs @@ -7,6 +7,7 @@ using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel; using System.IO; +using System.Threading; using System.Xml; using System.Xml.Linq; @@ -238,10 +239,10 @@ namespace ICSharpCode.SharpDevelop.Project int MinimumSolutionVersion { get; } /// - /// Retrieve the fully qualified assembly names and file location of referenced assemblies. - /// This method is thread safe. + /// Resolves assembly references for this project. + /// The resulting list of resolved references will include project references. /// - void ResolveAssemblyReferences(); + IEnumerable ResolveAssemblyReferences(CancellationToken cancellationToken); /// /// Notifies the project that it was succesfully created from a project template. diff --git a/src/Main/Base/Project/Src/Project/Items/ProjectReferenceProjectItem.cs b/src/Main/Base/Project/Src/Project/Items/ProjectReferenceProjectItem.cs index c592dceafd..02ac994d5c 100644 --- a/src/Main/Base/Project/Src/Project/Items/ProjectReferenceProjectItem.cs +++ b/src/Main/Base/Project/Src/Project/Items/ProjectReferenceProjectItem.cs @@ -102,7 +102,7 @@ namespace ICSharpCode.SharpDevelop.Project IProject p = this.ReferencedProject; if (p == null) return null; - var snapshot = context.Compilation.SolutionSnapshot as SharpDevelopSolutionSnapshot; + var snapshot = context.Compilation.SolutionSnapshot as ISolutionSnapshotWithProjectMapping; IProjectContent pc = (snapshot != null) ? snapshot.GetProjectContent(p) : p.ProjectContent; return (pc != null) ? pc.Resolve(context) : null; } diff --git a/src/Main/Base/Project/Src/Project/MSBuildBasedProject.cs b/src/Main/Base/Project/Src/Project/MSBuildBasedProject.cs index 7870c5793e..ab65dbf18b 100644 --- a/src/Main/Base/Project/Src/Project/MSBuildBasedProject.cs +++ b/src/Main/Base/Project/Src/Project/MSBuildBasedProject.cs @@ -143,11 +143,6 @@ namespace ICSharpCode.SharpDevelop.Project } } - public override void ResolveAssemblyReferences() - { - MSBuildInternals.ResolveAssemblyReferences(this); - } - public override IEnumerable ResolveAssemblyReferences(CancellationToken cancellationToken) { ReferenceProjectItem[] additionalItems = { diff --git a/src/Main/Base/Test/Dom/CSharpModelTests.cs b/src/Main/Base/Test/Dom/CSharpModelTests.cs index a40290e965..9b6d5bc071 100644 --- a/src/Main/Base/Test/Dom/CSharpModelTests.cs +++ b/src/Main/Base/Test/Dom/CSharpModelTests.cs @@ -45,7 +45,7 @@ namespace ICSharpCode.SharpDevelop.Dom Assert.IsNull(oldFile); var newFile = Parse(fileName, code); projectContent = projectContent.AddOrUpdateFiles(newFile); - topLevelTypeModels.NotifyParseInformationChanged(oldFile, newFile); + topLevelTypeModels.Update(oldFile, newFile); } IUnresolvedFile Parse(string fileName, string code) @@ -62,14 +62,14 @@ namespace ICSharpCode.SharpDevelop.Dom Assert.IsNotNull(oldFile); var newFile = Parse(fileName, code); projectContent = projectContent.AddOrUpdateFiles(newFile); - topLevelTypeModels.NotifyParseInformationChanged(oldFile, newFile); + topLevelTypeModels.Update(oldFile, newFile); } protected void RemoveCodeFile(string fileName) { var oldFile = projectContent.GetFile(fileName); projectContent = projectContent.RemoveFiles(fileName); - topLevelTypeModels.NotifyParseInformationChanged(oldFile, null); + topLevelTypeModels.Update(oldFile, null); } #endregion diff --git a/src/Main/SharpDevelop/Dom/ModelFactory.cs b/src/Main/SharpDevelop/Dom/ModelFactory.cs new file mode 100644 index 0000000000..1a9d892f14 --- /dev/null +++ b/src/Main/SharpDevelop/Dom/ModelFactory.cs @@ -0,0 +1,26 @@ +// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) +// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) + +using System; +using ICSharpCode.NRefactory.TypeSystem; + +namespace ICSharpCode.SharpDevelop.Dom +{ + sealed class ModelFactory : IModelFactory + { + public IMutableTypeDefinitionModelCollection CreateTopLevelTypeDefinitionCollection(IEntityModelContext context) + { + return new TopLevelTypeDefinitionModelCollection(context); + } + + public ITypeDefinitionModel CreateTypeDefinitionModel(IEntityModelContext context, params IUnresolvedTypeDefinition[] parts) + { + return new TypeDefinitionModel(context, parts); + } + + public IMemberModel CreateMemberModel(IEntityModelContext context, IUnresolvedMember member) + { + return new MemberModel(context, member); + } + } +} diff --git a/src/Main/SharpDevelop/Dom/TopLevelTypeDefinitionModelCollection.cs b/src/Main/SharpDevelop/Dom/TopLevelTypeDefinitionModelCollection.cs index 06598219cf..d6ab8ed6f0 100644 --- a/src/Main/SharpDevelop/Dom/TopLevelTypeDefinitionModelCollection.cs +++ b/src/Main/SharpDevelop/Dom/TopLevelTypeDefinitionModelCollection.cs @@ -13,7 +13,7 @@ namespace ICSharpCode.SharpDevelop.Dom /// /// A TypeDefinitionModel-collection that holds models for all top-level types in a project content. /// - sealed class TopLevelTypeDefinitionModelCollection : KeyedModelCollection + sealed class TopLevelTypeDefinitionModelCollection : KeyedModelCollection, IMutableTypeDefinitionModelCollection { readonly IEntityModelContext context; @@ -24,9 +24,9 @@ namespace ICSharpCode.SharpDevelop.Dom this.context = context; } - public TypeDefinitionModel this[FullTypeName fullTypeName] { + public ITypeDefinitionModel this[FullTypeName fullTypeName] { get { - TypeDefinitionModel model = base[fullTypeName.TopLevelTypeName]; + ITypeDefinitionModel model = base[fullTypeName.TopLevelTypeName]; for (int i = 0; i < fullTypeName.NestingLevel; i++) { throw new NotImplementedException(); } @@ -37,14 +37,15 @@ namespace ICSharpCode.SharpDevelop.Dom /// /// Updates the parse information. /// - public void NotifyParseInformationChanged(IUnresolvedFile oldFile, IUnresolvedFile newFile) + public void Update(IUnresolvedFile oldFile, IUnresolvedFile newFile) { if (oldFile != null) { } + throw new NotImplementedException(); } - protected override TopLevelTypeName GetKeyForItem(TypeDefinitionModel item) + protected override TopLevelTypeName GetKeyForItem(ITypeDefinitionModel item) { return item.FullTypeName.TopLevelTypeName; } diff --git a/src/Main/Base/Project/Src/Services/ParserService/SharpDevelopSolutionSnapshot.cs b/src/Main/SharpDevelop/Parser/SharpDevelopSolutionSnapshot.cs similarity index 83% rename from src/Main/Base/Project/Src/Services/ParserService/SharpDevelopSolutionSnapshot.cs rename to src/Main/SharpDevelop/Parser/SharpDevelopSolutionSnapshot.cs index 776f87787a..b7c7f716e3 100644 --- a/src/Main/Base/Project/Src/Services/ParserService/SharpDevelopSolutionSnapshot.cs +++ b/src/Main/SharpDevelop/Parser/SharpDevelopSolutionSnapshot.cs @@ -10,17 +10,7 @@ using ICSharpCode.SharpDevelop.Project; namespace ICSharpCode.SharpDevelop.Parser { - /// - /// ISolutionSnapshot implementation that supports the IAssembly.GetProject() extension method. - /// - public interface ISolutionSnapshotWithProjectMapping : ISolutionSnapshot - { - IProject GetProject(IAssembly assembly); - - ICompilation GetCompilation(IProject project); - } - - public class SharpDevelopSolutionSnapshot : DefaultSolutionSnapshot, ISolutionSnapshotWithProjectMapping + sealed class SharpDevelopSolutionSnapshot : DefaultSolutionSnapshot, ISolutionSnapshotWithProjectMapping { Dictionary projectContentSnapshots = new Dictionary(); Lazy dummyCompilation; diff --git a/src/Main/SharpDevelop/SharpDevelop.csproj b/src/Main/SharpDevelop/SharpDevelop.csproj index 8bcc91b28c..66bfd4b9da 100644 --- a/src/Main/SharpDevelop/SharpDevelop.csproj +++ b/src/Main/SharpDevelop/SharpDevelop.csproj @@ -81,6 +81,7 @@ + @@ -91,6 +92,7 @@ +