Browse Source

Use conditional symbols from project settings in the C# parser.

newNRvisualizers
Daniel Grunwald 13 years ago
parent
commit
cf4ef6879c
  1. 7
      src/AddIns/BackendBindings/CSharpBinding/Project/Src/Parser/Parser.cs
  2. 43
      src/AddIns/BackendBindings/CSharpBinding/Project/Src/Project/CSharpProject.cs
  3. 2
      src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/ApplicationSettings.cs
  4. 6
      src/Main/Base/Project/Src/Project/CompilableProject.cs
  5. 12
      src/Main/Base/Project/Src/Services/ParserService/ParseProjectContent.cs
  6. 7
      src/Main/Base/Project/Src/Util/ExtensionMethods.cs

7
src/AddIns/BackendBindings/CSharpBinding/Project/Src/Parser/Parser.cs

@ -71,9 +71,12 @@ namespace CSharpBinding.Parser @@ -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();

43
src/AddIns/BackendBindings/CSharpBinding/Project/Src/Project/CSharpProject.cs

@ -6,7 +6,7 @@ using System.Collections.Generic; @@ -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 @@ -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 @@ -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());

2
src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/ApplicationSettings.cs

@ -197,7 +197,7 @@ namespace ICSharpCode.SharpDevelop.Gui.OptionPanels @@ -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);
}

6
src/Main/Base/Project/Src/Project/CompilableProject.cs

@ -347,9 +347,15 @@ namespace ICSharpCode.SharpDevelop.Project @@ -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;

12
src/Main/Base/Project/Src/Services/ParserService/ParseProjectContent.cs

@ -213,8 +213,18 @@ namespace ICSharpCode.SharpDevelop.Parser @@ -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();
}
}

7
src/Main/Base/Project/Src/Util/ExtensionMethods.cs

@ -130,6 +130,13 @@ namespace ICSharpCode.SharpDevelop @@ -130,6 +130,13 @@ namespace ICSharpCode.SharpDevelop
return new ReadOnlyCollectionWrapper<T>(arr);
}
public static V GetOrDefault<K,V>(this IReadOnlyDictionary<K, V> dict, K key)
{
V ret;
dict.TryGetValue(key, out ret);
return ret;
}
public static IEnumerable<WinForms.Control> GetRecursive(this WinForms.Control.ControlCollection collection)
{
return collection.Cast<WinForms.Control>().Flatten(c => c.Controls.Cast<WinForms.Control>());

Loading…
Cancel
Save