From cf4ef6879c7620f781dcbb10a66cb5613c09de65 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Sat, 28 Jul 2012 13:36:03 +0200 Subject: [PATCH] Use conditional symbols from project settings in the C# parser. --- .../Project/Src/Parser/Parser.cs | 7 ++- .../Project/Src/Project/CSharpProject.cs | 43 ++++++++++++++++++- .../ProjectOptions/ApplicationSettings.cs | 2 +- .../Project/Src/Project/CompilableProject.cs | 6 +++ .../ParserService/ParseProjectContent.cs | 12 +++++- .../Base/Project/Src/Util/ExtensionMethods.cs | 7 +++ 6 files changed, 72 insertions(+), 5 deletions(-) diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Parser/Parser.cs b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Parser/Parser.cs index fb83fe1701..12ecfc022c 100644 --- a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Parser/Parser.cs +++ b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Parser/Parser.cs @@ -71,9 +71,12 @@ namespace CSharpBinding.Parser public ParseInformation Parse(FileName fileName, ITextSource fileContent, bool fullParseInformationRequested, IProject parentProject, CancellationToken cancellationToken) { - CSharpParser parser = new CSharpParser(); + var csharpProject = parentProject as CSharpProject; + + CSharpParser parser = new CSharpParser(csharpProject != null ? csharpProject.CompilerSettings : null); parser.GenerateTypeSystemMode = !fullParseInformationRequested; - CompilationUnit cu = parser.Parse(fileContent.CreateReader(), fileName); + + CompilationUnit cu = parser.Parse(fileContent, fileName); cu.Freeze(); CSharpParsedFile file = cu.ToTypeSystem(); diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Project/CSharpProject.cs b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Project/CSharpProject.cs index 9ff63194eb..a7d4869c15 100644 --- a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Project/CSharpProject.cs +++ b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Project/CSharpProject.cs @@ -6,7 +6,7 @@ using System.Collections.Generic; using System.ComponentModel; using System.IO; using System.Linq; - +using System.Threading; using ICSharpCode.NRefactory.CSharp; using ICSharpCode.NRefactory.TypeSystem; using ICSharpCode.SharpDevelop; @@ -46,6 +46,8 @@ namespace CSharpBinding { reparseReferencesSensitiveProperties.Add("TargetFrameworkVersion"); reparseCodeSensitiveProperties.Add("DefineConstants"); + reparseCodeSensitiveProperties.Add("AllowUnsafeBlocks"); + reparseCodeSensitiveProperties.Add("CheckForOverflowUnderflow"); } public CSharpProject(ProjectLoadInformation loadInformation) @@ -91,6 +93,45 @@ namespace CSharpBinding } } + volatile CompilerSettings compilerSettings; + + public CompilerSettings CompilerSettings { + get { + if (compilerSettings == null) + CreateCompilerSettings(); + return compilerSettings; + } + } + + protected override object CreateCompilerSettings() + { + // This method gets called when the project content is first created; + // or when any of the ReparseSensitiveProperties has changed. + CompilerSettings settings = new CompilerSettings(); + settings.AllowUnsafeBlocks = GetBoolProperty("AllowUnsafeBlocks") ?? false; + settings.CheckForOverflow = GetBoolProperty("CheckForOverflowUnderflow") ?? false; + + string symbols = GetEvaluatedProperty("DefineConstants"); + if (symbols != null) { + foreach (string symbol in symbols.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries)) { + settings.ConditionalSymbols.Add(symbol.Trim()); + } + } + settings.Freeze(); + compilerSettings = settings; + return settings; + } + + bool? GetBoolProperty(string propertyName) + { + string val = GetEvaluatedProperty(propertyName); + if ("true".Equals(val, StringComparison.OrdinalIgnoreCase)) + return true; + if ("false".Equals(val, StringComparison.OrdinalIgnoreCase)) + return false; + return null; + } + protected override ProjectBehavior CreateDefaultBehavior() { return new CSharpProjectBehavior(this, base.CreateDefaultBehavior()); diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/ApplicationSettings.cs b/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/ApplicationSettings.cs index 76eca4d24e..9e461731d3 100644 --- a/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/ApplicationSettings.cs +++ b/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/ApplicationSettings.cs @@ -197,7 +197,7 @@ namespace ICSharpCode.SharpDevelop.Gui.OptionPanels IProjectContent pc = project.ProjectContent; if (pc != null) { foreach (IUnresolvedTypeDefinition c in pc.TopLevelTypeDefinitions) { - foreach (IMethod m in c.Methods) { + foreach (var m in c.Methods) { if (m.IsStatic && m.Name == "Main") { results.Add(c); } diff --git a/src/Main/Base/Project/Src/Project/CompilableProject.cs b/src/Main/Base/Project/Src/Project/CompilableProject.cs index 4db59e74f4..bd46ce2090 100644 --- a/src/Main/Base/Project/Src/Project/CompilableProject.cs +++ b/src/Main/Base/Project/Src/Project/CompilableProject.cs @@ -347,9 +347,15 @@ namespace ICSharpCode.SharpDevelop.Project if (parseProjectContentContainer != null) throw new InvalidOperationException("Already initialized."); parseProjectContentContainer = new ParseProjectContentContainer(this, initialProjectContent); + parseProjectContentContainer.SetCompilerSettings(CreateCompilerSettings()); } } + protected virtual object CreateCompilerSettings() + { + return null; + } + public override IProjectContent ProjectContent { get { var c = parseProjectContentContainer; diff --git a/src/Main/Base/Project/Src/Services/ParserService/ParseProjectContent.cs b/src/Main/Base/Project/Src/Services/ParserService/ParseProjectContent.cs index c3ccf06918..f139991747 100644 --- a/src/Main/Base/Project/Src/Services/ParserService/ParseProjectContent.cs +++ b/src/Main/Base/Project/Src/Services/ParserService/ParseProjectContent.cs @@ -213,8 +213,18 @@ namespace ICSharpCode.SharpDevelop.Parser if (!disposed) { projectContent = projectContent.UpdateProjectContent(oldFile, newFile); serializedProjectContentIsUpToDate = false; + SD.ParserService.InvalidateCurrentSolutionSnapshot(); + } + } + } + + public void SetCompilerSettings(object compilerSettings) + { + lock (lockObj) { + if (!disposed) { + projectContent = projectContent.SetCompilerSettings(compilerSettings); + SD.ParserService.InvalidateCurrentSolutionSnapshot(); } - SD.ParserService.InvalidateCurrentSolutionSnapshot(); } } diff --git a/src/Main/Base/Project/Src/Util/ExtensionMethods.cs b/src/Main/Base/Project/Src/Util/ExtensionMethods.cs index 789142c4a7..c6b690dd83 100644 --- a/src/Main/Base/Project/Src/Util/ExtensionMethods.cs +++ b/src/Main/Base/Project/Src/Util/ExtensionMethods.cs @@ -130,6 +130,13 @@ namespace ICSharpCode.SharpDevelop return new ReadOnlyCollectionWrapper(arr); } + public static V GetOrDefault(this IReadOnlyDictionary dict, K key) + { + V ret; + dict.TryGetValue(key, out ret); + return ret; + } + public static IEnumerable GetRecursive(this WinForms.Control.ControlCollection collection) { return collection.Cast().Flatten(c => c.Controls.Cast());