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. 10
      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
public ParseInformation Parse(FileName fileName, ITextSource fileContent, bool fullParseInformationRequested, public ParseInformation Parse(FileName fileName, ITextSource fileContent, bool fullParseInformationRequested,
IProject parentProject, CancellationToken cancellationToken) 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; parser.GenerateTypeSystemMode = !fullParseInformationRequested;
CompilationUnit cu = parser.Parse(fileContent.CreateReader(), fileName);
CompilationUnit cu = parser.Parse(fileContent, fileName);
cu.Freeze(); cu.Freeze();
CSharpParsedFile file = cu.ToTypeSystem(); CSharpParsedFile file = cu.ToTypeSystem();

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

@ -6,7 +6,7 @@ using System.Collections.Generic;
using System.ComponentModel; using System.ComponentModel;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Threading;
using ICSharpCode.NRefactory.CSharp; using ICSharpCode.NRefactory.CSharp;
using ICSharpCode.NRefactory.TypeSystem; using ICSharpCode.NRefactory.TypeSystem;
using ICSharpCode.SharpDevelop; using ICSharpCode.SharpDevelop;
@ -46,6 +46,8 @@ namespace CSharpBinding
{ {
reparseReferencesSensitiveProperties.Add("TargetFrameworkVersion"); reparseReferencesSensitiveProperties.Add("TargetFrameworkVersion");
reparseCodeSensitiveProperties.Add("DefineConstants"); reparseCodeSensitiveProperties.Add("DefineConstants");
reparseCodeSensitiveProperties.Add("AllowUnsafeBlocks");
reparseCodeSensitiveProperties.Add("CheckForOverflowUnderflow");
} }
public CSharpProject(ProjectLoadInformation loadInformation) 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() protected override ProjectBehavior CreateDefaultBehavior()
{ {
return new CSharpProjectBehavior(this, base.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
IProjectContent pc = project.ProjectContent; IProjectContent pc = project.ProjectContent;
if (pc != null) { if (pc != null) {
foreach (IUnresolvedTypeDefinition c in pc.TopLevelTypeDefinitions) { foreach (IUnresolvedTypeDefinition c in pc.TopLevelTypeDefinitions) {
foreach (IMethod m in c.Methods) { foreach (var m in c.Methods) {
if (m.IsStatic && m.Name == "Main") { if (m.IsStatic && m.Name == "Main") {
results.Add(c); results.Add(c);
} }

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

@ -347,9 +347,15 @@ namespace ICSharpCode.SharpDevelop.Project
if (parseProjectContentContainer != null) if (parseProjectContentContainer != null)
throw new InvalidOperationException("Already initialized."); throw new InvalidOperationException("Already initialized.");
parseProjectContentContainer = new ParseProjectContentContainer(this, initialProjectContent); parseProjectContentContainer = new ParseProjectContentContainer(this, initialProjectContent);
parseProjectContentContainer.SetCompilerSettings(CreateCompilerSettings());
} }
} }
protected virtual object CreateCompilerSettings()
{
return null;
}
public override IProjectContent ProjectContent { public override IProjectContent ProjectContent {
get { get {
var c = parseProjectContentContainer; var c = parseProjectContentContainer;

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

@ -213,10 +213,20 @@ namespace ICSharpCode.SharpDevelop.Parser
if (!disposed) { if (!disposed) {
projectContent = projectContent.UpdateProjectContent(oldFile, newFile); projectContent = projectContent.UpdateProjectContent(oldFile, newFile);
serializedProjectContentIsUpToDate = false; serializedProjectContentIsUpToDate = false;
SD.ParserService.InvalidateCurrentSolutionSnapshot();
}
} }
}
public void SetCompilerSettings(object compilerSettings)
{
lock (lockObj) {
if (!disposed) {
projectContent = projectContent.SetCompilerSettings(compilerSettings);
SD.ParserService.InvalidateCurrentSolutionSnapshot(); SD.ParserService.InvalidateCurrentSolutionSnapshot();
} }
} }
}
bool IsParseableFile(FileProjectItem projectItem) bool IsParseableFile(FileProjectItem projectItem)
{ {

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

@ -130,6 +130,13 @@ namespace ICSharpCode.SharpDevelop
return new ReadOnlyCollectionWrapper<T>(arr); 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) public static IEnumerable<WinForms.Control> GetRecursive(this WinForms.Control.ControlCollection collection)
{ {
return collection.Cast<WinForms.Control>().Flatten(c => c.Controls.Cast<WinForms.Control>()); return collection.Cast<WinForms.Control>().Flatten(c => c.Controls.Cast<WinForms.Control>());

Loading…
Cancel
Save