Browse Source

Fixed NullReferenceException when opening C# file without opening a solution.

newNRvisualizers
Daniel Grunwald 14 years ago
parent
commit
04a7aaa59b
  1. 37
      src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/QuickClassBrowser.cs
  2. 20
      src/Main/Base/Project/Src/Services/ParserService/ParserService.cs
  3. 13
      src/Main/Base/Project/Src/Services/ParserService/SharpDevelopSolutionSnapshot.cs
  4. 21
      src/Main/Base/Project/Src/Util/ExtensionMethods.cs

37
src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/QuickClassBrowser.cs

@ -242,28 +242,21 @@ namespace ICSharpCode.AvalonEdit.AddIn @@ -242,28 +242,21 @@ namespace ICSharpCode.AvalonEdit.AddIn
IUnresolvedTypeDefinition selectedClass = item != null ? item.Entity as IUnresolvedTypeDefinition : null;
memberItems = new List<EntityItem>();
if (selectedClass != null) {
var project = ProjectService.OpenSolution.FindProjectContainingFile(FileName.Create(selectedClass.ParsedFile.FileName));
if (project != null) {
ICompilation c = ParserService.GetCompilation(project);
// HACK: Resolving an IUnresolvedTypeDefinition currently does strange things in NR5 if the unresolved typedef
// is not part of the compilation (e.g. replaced with newer version), so we need this hack to ensure we
// use it only as a type name:
var typeRef = ReflectionHelper.ParseReflectionName(selectedClass.ReflectionName);
var context = new SimpleTypeResolveContext(c.MainAssembly);
ITypeDefinition compoundClass = typeRef.Resolve(context).GetDefinition();
if (compoundClass != null) {
var ambience = project.GetAmbience();
foreach (var member in compoundClass.Members) {
if (member.IsSynthetic)
continue;
bool isInSamePart = string.Equals(member.UnresolvedMember.ParsedFile.FileName, selectedClass.ParsedFile.FileName, StringComparison.OrdinalIgnoreCase);
memberItems.Add(new EntityItem(member, ambience) { IsInSamePart = isInSamePart });
}
memberItems.Sort();
if (jumpOnSelectionChange) {
AnalyticsMonitorService.TrackFeature(GetType(), "JumpToClass");
JumpTo(item, selectedClass.Region);
}
ICompilation compilation = ParserService.GetCompilationForFile(FileName.Create(selectedClass.ParsedFile.FileName));
var context = new SimpleTypeResolveContext(compilation.MainAssembly);
ITypeDefinition compoundClass = selectedClass.Resolve(context).GetDefinition();
if (compoundClass != null) {
var ambience = compilation.GetAmbience();
foreach (var member in compoundClass.Members) {
if (member.IsSynthetic)
continue;
bool isInSamePart = string.Equals(member.UnresolvedMember.ParsedFile.FileName, selectedClass.ParsedFile.FileName, StringComparison.OrdinalIgnoreCase);
memberItems.Add(new EntityItem(member, ambience) { IsInSamePart = isInSamePart });
}
memberItems.Sort();
if (jumpOnSelectionChange) {
AnalyticsMonitorService.TrackFeature(GetType(), "JumpToClass");
JumpTo(item, selectedClass.Region);
}
}
}

20
src/Main/Base/Project/Src/Services/ParserService/ParserService.cs

@ -48,7 +48,8 @@ namespace ICSharpCode.SharpDevelop.Parser @@ -48,7 +48,8 @@ namespace ICSharpCode.SharpDevelop.Parser
/// </summary>
public static ICompilation GetCompilationForFile(FileName fileName)
{
return GetCurrentSolutionSnapshot().GetCompilation(ProjectService.OpenSolution.FindProjectContainingFile(fileName));
Solution solution = ProjectService.OpenSolution;
return GetCurrentSolutionSnapshot().GetCompilation(solution != null ? solution.FindProjectContainingFile(fileName) : null);
}
/// <summary>
@ -65,23 +66,6 @@ namespace ICSharpCode.SharpDevelop.Parser @@ -65,23 +66,6 @@ namespace ICSharpCode.SharpDevelop.Parser
{
return project.ProjectContent;
}
/// <summary>
/// Gets the project that owns the specified project content.
/// Returns null for referenced assemblies.
/// </summary>
public static IProject GetProject(IProjectContent projectContent)
{
if (projectContent == null)
return null;
if (ProjectService.OpenSolution != null) {
foreach (var project in ProjectService.OpenSolution.Projects) {
if (project.ProjectContent == projectContent)
return project;
}
}
return null;
}
#endregion
#region Initialization + ParserThread

13
src/Main/Base/Project/Src/Services/ParserService/SharpDevelopSolutionSnapshot.cs

@ -35,7 +35,7 @@ namespace ICSharpCode.SharpDevelop.Parser @@ -35,7 +35,7 @@ namespace ICSharpCode.SharpDevelop.Parser
public IProjectContent GetProjectContent(IProject project)
{
if (project == null)
throw new ArgumentNullException("project");
return null;
IProjectContent pc;
if (projectContentSnapshots.TryGetValue(project, out pc))
return pc;
@ -43,6 +43,17 @@ namespace ICSharpCode.SharpDevelop.Parser @@ -43,6 +43,17 @@ namespace ICSharpCode.SharpDevelop.Parser
return null;
}
public IProject GetProject(IProjectContent projectContent)
{
if (projectContent == null)
return null;
foreach (var pair in projectContentSnapshots) {
if (pair.Value == projectContent)
return pair.Key;
}
return null;
}
public ICompilation GetCompilation(IProject project)
{
IProjectContent pc;

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

@ -127,6 +127,21 @@ namespace ICSharpCode.SharpDevelop @@ -127,6 +127,21 @@ namespace ICSharpCode.SharpDevelop
return ICSharpCode.NRefactory.Utils.TreeTraversal.PreOrder(input, recursion);
}
/// <summary>
/// Gets the project for which the specified compilation was created.
/// Returns null if the compilation was not created using the SharpDevelop project system.
/// </summary>
public static IProject GetProject(this ICompilation compilation)
{
if (compilation == null)
throw new ArgumentNullException("compilation");
var snapshot = compilation.SolutionSnapshot as SharpDevelopSolutionSnapshot;
if (snapshot != null)
return snapshot.GetProject(compilation.MainAssembly.UnresolvedAssembly as IProjectContent);
else
return null;
}
/// <summary>
/// Creates an array containing a part of the array (similar to string.Substring).
/// </summary>
@ -549,12 +564,12 @@ namespace ICSharpCode.SharpDevelop @@ -549,12 +564,12 @@ namespace ICSharpCode.SharpDevelop
}
/// <summary>
/// Gets the ambience for the specified project content.
/// Gets the ambience for the specified compilation.
/// Never returns null.
/// </summary>
public static IAmbience GetAmbience(this IProjectContent pc)
public static IAmbience GetAmbience(this ICompilation compilation)
{
IProject p = ParserService.GetProject(pc);
IProject p = compilation.GetProject();
if (p != null)
return p.GetAmbience();
else

Loading…
Cancel
Save