diff --git a/src/AddIns/DisplayBindings/XmlEditor/Project/Src/XmlDisplayBinding.cs b/src/AddIns/DisplayBindings/XmlEditor/Project/Src/XmlDisplayBinding.cs index 7b00d17a43..aef868c2a9 100644 --- a/src/AddIns/DisplayBindings/XmlEditor/Project/Src/XmlDisplayBinding.cs +++ b/src/AddIns/DisplayBindings/XmlEditor/Project/Src/XmlDisplayBinding.cs @@ -63,7 +63,7 @@ namespace ICSharpCode.XmlEditor public static string[] GetXmlFileExtensions() { foreach (ParserDescriptor parser in AddInTree.BuildItems("/Workspace/Parser", null, false)) { - if (parser.Codon.Id == "XmlFoldingParser") { + if (parser.Language == "XmlFoldingParser") { return parser.Supportedextensions; } } diff --git a/src/Main/Base/Project/Src/Services/ParserService/Doozer/ParserDescriptor.cs b/src/Main/Base/Project/Src/Services/ParserService/Doozer/ParserDescriptor.cs index 7cc3c64d47..6ba2d2a4ad 100644 --- a/src/Main/Base/Project/Src/Services/ParserService/Doozer/ParserDescriptor.cs +++ b/src/Main/Base/Project/Src/Services/ParserService/Doozer/ParserDescriptor.cs @@ -16,35 +16,19 @@ namespace ICSharpCode.SharpDevelop public sealed class ParserDescriptor { Codon codon; + Type parserType; public IParser CreateParser() { - return (IParser)codon.AddIn.CreateObject(codon.Properties["class"]); + if (codon != null) + return (IParser)codon.AddIn.CreateObject(codon.Properties["class"]); + else + return (IParser)Activator.CreateInstance(parserType); } - public Codon Codon { - get { - return codon; - } - } + public string Language { get; private set; } - public string Language { - get { - return codon.Id; - } - } - - public string ProjectFileExtension { - get { - return codon.Properties["projectfileextension"]; - } - } - - public string[] Supportedextensions { - get { - return codon.Properties["supportedextensions"].Split(';'); - } - } + public string[] Supportedextensions { get; private set; } public bool CanParse(string fileName) { @@ -57,9 +41,26 @@ namespace ICSharpCode.SharpDevelop return false; } - public ParserDescriptor (Codon codon) + public ParserDescriptor(Codon codon) { + if (codon == null) + throw new ArgumentNullException("codon"); this.codon = codon; + this.Language = codon.Id; + this.Supportedextensions = codon.Properties["supportedextensions"].Split(';'); + } + + public ParserDescriptor(Type parserType, string language, string[] supportedExtensions) + { + if (parserType == null) + throw new ArgumentNullException("parserType"); + if (language == null) + throw new ArgumentNullException("language"); + if (supportedExtensions == null) + throw new ArgumentNullException("supportedExtensions"); + this.parserType = parserType; + this.Language = language; + this.Supportedextensions = supportedExtensions; } } } diff --git a/src/Main/Base/Project/Src/Services/ParserService/Doozer/ParserDoozer.cs b/src/Main/Base/Project/Src/Services/ParserService/Doozer/ParserDoozer.cs index d405efaf1f..3fa1788b34 100644 --- a/src/Main/Base/Project/Src/Services/ParserService/Doozer/ParserDoozer.cs +++ b/src/Main/Base/Project/Src/Services/ParserService/Doozer/ParserDoozer.cs @@ -17,9 +17,6 @@ namespace ICSharpCode.SharpDevelop /// /// Semicolon-separated list of file extensions for which the parser is used. (e.g. ".boo") /// - /// - /// File extension of project files. (e.g. ".booproj") - /// /// /// Name of the IParser class. /// diff --git a/src/Main/Base/Project/Src/Services/ParserService/ParserService.cs b/src/Main/Base/Project/Src/Services/ParserService/ParserService.cs index 9c485bc00b..ef62f95a9c 100644 --- a/src/Main/Base/Project/Src/Services/ParserService/ParserService.cs +++ b/src/Main/Base/Project/Src/Services/ParserService/ParserService.cs @@ -701,6 +701,21 @@ namespace ICSharpCode.SharpDevelop FileEntry entry = GetFileEntry(fileName, true); return entry.RegisterParseInformation(cu); } + + /// + /// Replaces the list of available parsers. + /// Causes all stored parse information to be deleted. + /// Please use this for unit tests only! + /// + public static void RegisterAvailableParsers(params ParserDescriptor[] descriptors) + { + lock (syncLock) { + parserDescriptors = new List(); + parserDescriptors.AddRange(descriptors); + ClearAllFileEntries(); + } + } + #endregion #region ParseInformationUpdated / ParserUpdateStepFinished events @@ -790,6 +805,11 @@ namespace ICSharpCode.SharpDevelop } projectContents.Clear(); } + ClearAllFileEntries(); + } + + static void ClearAllFileEntries() + { FileEntry[] entries; lock (fileEntryDict) { entries = fileEntryDict.Values.ToArray();