Browse Source

Use ambience to format type names in the quick class browser.

newNRvisualizers
Daniel Grunwald 14 years ago
parent
commit
606d09ea8f
  1. 44
      src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/ParserFoldingStrategy.cs
  2. 29
      src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/QuickClassBrowser.cs
  3. 14
      src/Main/Base/Project/Src/Services/ParserService/ParseProjectContent.cs

44
src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/ParserFoldingStrategy.cs

@ -13,7 +13,7 @@ using ICSharpCode.SharpDevelop.Parser;
namespace ICSharpCode.AvalonEdit.AddIn namespace ICSharpCode.AvalonEdit.AddIn
{ {
/// <summary> /// <summary>
/// Uses SharpDevelop.Dom to create parsing information. /// Uses the NRefactory type system to create parsing information.
/// </summary> /// </summary>
public class ParserFoldingStrategy : IDisposable public class ParserFoldingStrategy : IDisposable
{ {
@ -84,32 +84,50 @@ namespace ICSharpCode.AvalonEdit.AddIn
return; return;
} }
DomRegion cRegion = c.BodyRegion; DomRegion cRegion = c.BodyRegion;
if (cRegion.IsEmpty) if (c.BodyRegion.BeginLine < c.BodyRegion.EndLine) {
cRegion = c.Region; newFoldMarkers.Add(new NewFolding(GetStartOffset(c.BodyRegion), GetEndOffset(c.BodyRegion)));
if (cRegion.BeginLine < cRegion.EndLine) {
newFoldMarkers.Add(new NewFolding(GetOffset(cRegion.BeginLine, cRegion.BeginColumn),
GetOffset(cRegion.EndLine, cRegion.EndColumn)));
} }
foreach (var innerClass in c.NestedTypes) { foreach (var innerClass in c.NestedTypes) {
AddClassMembers(innerClass, newFoldMarkers); AddClassMembers(innerClass, newFoldMarkers);
} }
foreach (var m in c.Members) { foreach (var m in c.Members) {
if (m.Region.EndLine < m.BodyRegion.EndLine) { if (m.BodyRegion.BeginLine < m.BodyRegion.EndLine) {
newFoldMarkers.Add(new NewFoldingDefinition(GetOffset(m.Region.EndLine, m.Region.EndColumn), newFoldMarkers.Add(new NewFoldingDefinition(GetStartOffset(m.BodyRegion), GetEndOffset(m.BodyRegion)));
GetOffset(m.BodyRegion.EndLine, m.BodyRegion.EndColumn)));
} }
} }
} }
int GetOffset(int line, int column) int GetStartOffset(DomRegion bodyRegion)
{ {
if (line < 1) var document = textArea.Document;
if (bodyRegion.BeginLine < 1)
return 0;
if (bodyRegion.BeginLine > document.LineCount)
return document.TextLength;
var line = document.GetLineByNumber(bodyRegion.BeginLine);
int lineStart = line.Offset;
int bodyStartOffset = lineStart + bodyRegion.BeginColumn - 1;
for (int i = lineStart; i < bodyStartOffset; i++) {
if (!char.IsWhiteSpace(document.GetCharAt(i))) {
// Non-whitespace in front of body start:
// Use the body start as start offset
return bodyStartOffset;
}
}
// Only whitespace in front of body start:
// Use the end of the previous line as start offset
return line.PreviousLine != null ? line.PreviousLine.EndOffset : bodyStartOffset;
}
int GetEndOffset(DomRegion region)
{
if (region.EndLine < 1)
return 0; return 0;
var document = textArea.Document; var document = textArea.Document;
if (line > document.LineCount) if (region.EndLine > document.LineCount)
return document.TextLength; return document.TextLength;
return document.GetOffset(line, column); return document.GetOffset(region.End);
} }
} }
} }

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

@ -34,11 +34,18 @@ namespace ICSharpCode.AvalonEdit.AddIn
get { return entity; } get { return entity; }
} }
public EntityItem(IUnresolvedTypeDefinition typeDef) public EntityItem(IUnresolvedTypeDefinition typeDef, ICompilation compilation)
{ {
this.IsInSamePart = true; this.IsInSamePart = true;
this.entity = typeDef; this.entity = typeDef;
this.text = typeDef.Name; var resolvedDefinition = typeDef.Resolve(new SimpleTypeResolveContext(compilation.MainAssembly)).GetDefinition();
if (resolvedDefinition != null) {
var ambience = compilation.GetAmbience();
ambience.ConversionFlags = ConversionFlags.ShowTypeParameterList | ConversionFlags.ShowDeclaringType;
this.text = ambience.ConvertEntity(resolvedDefinition);
} else {
this.text = typeDef.Name;
}
this.image = CompletionImage.GetImage(typeDef); this.image = CompletionImage.GetImage(typeDef);
} }
@ -46,10 +53,7 @@ namespace ICSharpCode.AvalonEdit.AddIn
{ {
this.IsInSamePart = true; this.IsInSamePart = true;
this.entity = member.UnresolvedMember; this.entity = member.UnresolvedMember;
if (entity is ITypeDefinition) ambience.ConversionFlags = ConversionFlags.ShowTypeParameterList | ConversionFlags.ShowParameterList | ConversionFlags.ShowParameterNames;
ambience.ConversionFlags = ConversionFlags.ShowTypeParameterList | ConversionFlags.ShowDeclaringType;
else
ambience.ConversionFlags = ConversionFlags.ShowTypeParameterList | ConversionFlags.ShowParameterList | ConversionFlags.ShowParameterNames;
text = ambience.ConvertEntity(member); text = ambience.ConvertEntity(member);
image = CompletionImage.GetImage(member); image = CompletionImage.GetImage(member);
} }
@ -130,11 +134,12 @@ namespace ICSharpCode.AvalonEdit.AddIn
List<EntityItem> classItems = new List<EntityItem>(); List<EntityItem> classItems = new List<EntityItem>();
List<EntityItem> memberItems = new List<EntityItem>(); List<EntityItem> memberItems = new List<EntityItem>();
void DoUpdate(IUnresolvedFile compilationUnit) void DoUpdate(IUnresolvedFile unresolvedFile)
{ {
classItems = new List<EntityItem>(); classItems = new List<EntityItem>();
if (compilationUnit != null) { if (unresolvedFile != null) {
AddClasses(compilationUnit.TopLevelTypeDefinitions); ICompilation compilation = SD.ParserService.GetCompilationForFile(FileName.Create(unresolvedFile.FileName));
AddClasses(unresolvedFile.TopLevelTypeDefinitions, compilation);
} }
classItems.Sort(); classItems.Sort();
classComboBox.ItemsSource = classItems; classComboBox.ItemsSource = classItems;
@ -163,13 +168,13 @@ namespace ICSharpCode.AvalonEdit.AddIn
} }
} }
void AddClasses(IEnumerable<IUnresolvedTypeDefinition> classes) void AddClasses(IEnumerable<IUnresolvedTypeDefinition> classes, ICompilation compilation)
{ {
foreach (var c in classes) { foreach (var c in classes) {
if (c.IsSynthetic) if (c.IsSynthetic)
continue; continue;
classItems.Add(new EntityItem(c)); classItems.Add(new EntityItem(c, compilation));
AddClasses(c.NestedTypes); AddClasses(c.NestedTypes, compilation);
} }
} }

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

@ -141,6 +141,11 @@ namespace ICSharpCode.SharpDevelop.Parser
return cacheFileName; return cacheFileName;
} }
/// <summary>
/// Magic number that identifies the SharpDevelop version used to create the cache file.
/// </summary>
const int cacheMagicNumber = 5002;
static IProjectContent TryReadFromCache(string cacheFileName) static IProjectContent TryReadFromCache(string cacheFileName)
{ {
if (cacheFileName == null || !File.Exists(cacheFileName)) if (cacheFileName == null || !File.Exists(cacheFileName))
@ -149,6 +154,10 @@ namespace ICSharpCode.SharpDevelop.Parser
try { try {
using (FileStream fs = new FileStream(cacheFileName, FileMode.Open, FileAccess.Read, FileShare.Read | FileShare.Delete, 4096, FileOptions.SequentialScan)) { using (FileStream fs = new FileStream(cacheFileName, FileMode.Open, FileAccess.Read, FileShare.Read | FileShare.Delete, 4096, FileOptions.SequentialScan)) {
using (BinaryReader reader = new BinaryReaderWith7BitEncodedInts(fs)) { using (BinaryReader reader = new BinaryReaderWith7BitEncodedInts(fs)) {
if (reader.ReadByte() != cacheMagicNumber) {
LoggingService.Warn("Incorrect magic number");
return null;
}
FastSerializer s = new FastSerializer(); FastSerializer s = new FastSerializer();
return (IProjectContent)s.Deserialize(reader); return (IProjectContent)s.Deserialize(reader);
} }
@ -165,6 +174,10 @@ namespace ICSharpCode.SharpDevelop.Parser
} catch (InvalidCastException ex) { } catch (InvalidCastException ex) {
LoggingService.Warn(ex); LoggingService.Warn(ex);
return null; return null;
} catch (FormatException ex) {
// e.g. invalid 7-bit-encoded int
LoggingService.Warn(ex);
return null;
} }
} }
@ -174,6 +187,7 @@ namespace ICSharpCode.SharpDevelop.Parser
Directory.CreateDirectory(Path.GetDirectoryName(cacheFileName)); Directory.CreateDirectory(Path.GetDirectoryName(cacheFileName));
using (FileStream fs = new FileStream(cacheFileName, FileMode.Create, FileAccess.Write)) { using (FileStream fs = new FileStream(cacheFileName, FileMode.Create, FileAccess.Write)) {
using (BinaryWriter writer = new BinaryWriterWith7BitEncodedInts(fs)) { using (BinaryWriter writer = new BinaryWriterWith7BitEncodedInts(fs)) {
writer.Write(cacheMagicNumber);
FastSerializer s = new FastSerializer(); FastSerializer s = new FastSerializer();
s.Serialize(writer, pc); s.Serialize(writer, pc);
} }

Loading…
Cancel
Save