Browse Source

- added ClassInheritanceTreeClassesOnly to IClass

- LocalizeExtension does not crash if resource is not found
- added PositionChanged to ITextEditorCaret

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@4382 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Siegfried Pammer 17 years ago
parent
commit
73360cb6cd
  1. 6
      src/AddIns/Misc/UnitTesting/Test/Utils/MockClass.cs
  2. 5
      src/Main/Base/Project/Src/Editor/AvalonEdit/AvalonEditTextEditorAdapter.cs
  3. 5
      src/Main/Base/Project/Src/Editor/ITextEditor.cs
  4. 5
      src/Main/Base/Project/Src/TextEditor/Gui/TextEditorAdapter.cs
  5. 6
      src/Main/Base/Test/Utils/MockClass.cs
  6. 12
      src/Main/ICSharpCode.Core.Presentation/LocalizeExtension.cs
  7. 4
      src/Main/ICSharpCode.SharpDevelop.Dom/Project/ICSharpCode.SharpDevelop.Dom.csproj
  8. 46
      src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/Implementations/DefaultClass.cs
  9. 4
      src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/Interfaces/IClass.cs

6
src/AddIns/Misc/UnitTesting/Test/Utils/MockClass.cs

@ -179,6 +179,12 @@ namespace UnitTesting.Tests.Utils
} }
} }
public IEnumerable<IClass> ClassInheritanceTreeClassesOnly {
get {
throw new NotImplementedException();
}
}
public IReturnType BaseType { public IReturnType BaseType {
get { get {
throw new NotImplementedException(); throw new NotImplementedException();

5
src/Main/Base/Project/Src/Editor/AvalonEdit/AvalonEditTextEditorAdapter.cs

@ -103,6 +103,11 @@ namespace ICSharpCode.SharpDevelop.Editor
get { return AvalonEditDocumentAdapter.ToLocation(caret.Location); } get { return AvalonEditDocumentAdapter.ToLocation(caret.Location); }
set { caret.Location = AvalonEditDocumentAdapter.ToPosition(value); } set { caret.Location = AvalonEditDocumentAdapter.ToPosition(value); }
} }
public event EventHandler PositionChanged {
add { caret.PositionChanged += value; }
remove { caret.PositionChanged -= value; }
}
} }
sealed class OptionsAdapter : ITextEditorOptions sealed class OptionsAdapter : ITextEditorOptions

5
src/Main/Base/Project/Src/Editor/ITextEditor.cs

@ -141,5 +141,10 @@ namespace ICSharpCode.SharpDevelop.Editor
/// Gets/sets the caret position. /// Gets/sets the caret position.
/// </summary> /// </summary>
Location Position { get; set; } Location Position { get; set; }
/// <summary>
/// Is raised whenever the position of the caret has changed.
/// </summary>
event EventHandler PositionChanged;
} }
} }

5
src/Main/Base/Project/Src/TextEditor/Gui/TextEditorAdapter.cs

@ -72,6 +72,11 @@ namespace ICSharpCode.SharpDevelop
caret.Position = ToPosition(value); caret.Position = ToPosition(value);
} }
} }
public event EventHandler PositionChanged {
add { caret.PositionChanged += value; }
remove { caret.PositionChanged -= value; }
}
} }
sealed class OptionsAdapter : ITextEditorOptions sealed class OptionsAdapter : ITextEditorOptions

6
src/Main/Base/Test/Utils/MockClass.cs

@ -127,6 +127,12 @@ namespace ICSharpCode.SharpDevelop.Tests.Utils
} }
} }
public IEnumerable<IClass> ClassInheritanceTreeClassesOnly {
get {
throw new NotImplementedException();
}
}
public IClass BaseClass { public IClass BaseClass {
get { get {
return BaseType.GetUnderlyingClass(); return BaseType.GetUnderlyingClass();

12
src/Main/ICSharpCode.Core.Presentation/LocalizeExtension.cs

@ -31,10 +31,14 @@ namespace ICSharpCode.Core.Presentation
public override object ProvideValue(IServiceProvider serviceProvider) public override object ProvideValue(IServiceProvider serviceProvider)
{ {
string result = ResourceService.GetString(key); try {
if (UsesAccessors) string result = ResourceService.GetString(key);
result = MenuService.ConvertLabel(result); if (UsesAccessors)
return result; result = MenuService.ConvertLabel(result);
return result;
} catch (ResourceNotFoundException) {
return "{Localize:" + key + "}";
}
} }
} }
} }

4
src/Main/ICSharpCode.SharpDevelop.Dom/Project/ICSharpCode.SharpDevelop.Dom.csproj

@ -203,5 +203,9 @@
<Folder Include="Src\CSharp" /> <Folder Include="Src\CSharp" />
<Folder Include="Src\VBNet" /> <Folder Include="Src\VBNet" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<Content Include="ProfilingSessions\Session20090702_124951.sdps" />
<Content Include="ProfilingSessions\Session20090702_131909.sdps" />
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.Targets" /> <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.Targets" />
</Project> </Project>

46
src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/Implementations/DefaultClass.cs

@ -369,6 +369,7 @@ namespace ICSharpCode.SharpDevelop.Dom
} }
volatile IClass[] inheritanceTreeCache; volatile IClass[] inheritanceTreeCache;
volatile IClass[] inheritanceTreeClassesOnlyCache;
public IEnumerable<IClass> ClassInheritanceTree { public IEnumerable<IClass> ClassInheritanceTree {
get { get {
@ -398,7 +399,7 @@ namespace ICSharpCode.SharpDevelop.Dom
return inheritanceTree; return inheritanceTree;
} }
inheritanceTree = CalculateClassInheritanceTree(); inheritanceTree = CalculateClassInheritanceTree(false);
this.inheritanceTreeCache = inheritanceTree; this.inheritanceTreeCache = inheritanceTree;
if (!KeepInheritanceTree) if (!KeepInheritanceTree)
@ -408,12 +409,51 @@ namespace ICSharpCode.SharpDevelop.Dom
} }
} }
public IEnumerable<IClass> ClassInheritanceTreeClassesOnly {
get {
// Notes:
// the ClassInheritanceTree must work even if the following things happen:
// - cyclic inheritance
// - multithreaded calls
// Recursive calls are possible if the SearchType request done by GetUnderlyingClass()
// uses ClassInheritanceTree.
// Such recursive calls are tricky, they have caused incorrect behavior (SD2-1474)
// or performance problems (SD2-1510) in the past.
// As of revision 3769, NRefactoryAstConvertVisitor sets up the SearchClassReturnType
// used for base types so that it does not look up inner classes in the class itself,
// so the ClassInheritanceTree is not used created in those cases.
// However, other language bindings might not set up base types correctly, so it's
// still possible that ClassInheritanceTree is called recursivly.
// In that case, we'll return an invalid inheritance tree because of
// ProxyReturnType's automatic stack overflow prevention.
// We do not use locks to protect against multithreaded calls because
// resolving one class's base types can cause getting the inheritance tree
// of another class -> beware of deadlocks
IClass[] inheritanceTreeClassesOnly = this.inheritanceTreeClassesOnlyCache;
if (inheritanceTreeClassesOnly != null) {
return inheritanceTreeClassesOnly;
}
inheritanceTreeClassesOnly = CalculateClassInheritanceTree(true);
this.inheritanceTreeClassesOnlyCache = inheritanceTreeClassesOnly;
if (!KeepInheritanceTree)
DomCache.RegisterForClear(ClearCachedInheritanceTree);
return inheritanceTreeClassesOnly;
}
}
void ClearCachedInheritanceTree() void ClearCachedInheritanceTree()
{ {
inheritanceTreeClassesOnlyCache = null;
inheritanceTreeCache = null; inheritanceTreeCache = null;
} }
IClass[] CalculateClassInheritanceTree() IClass[] CalculateClassInheritanceTree(bool ignoreInterfaces)
{ {
List<IClass> visitedList = new List<IClass>(); List<IClass> visitedList = new List<IClass>();
Queue<IReturnType> typesToVisit = new Queue<IReturnType>(); Queue<IReturnType> typesToVisit = new Queue<IReturnType>();
@ -422,7 +462,7 @@ namespace ICSharpCode.SharpDevelop.Dom
IReturnType nextType; IReturnType nextType;
do { do {
if (currentClass != null) { if (currentClass != null) {
if (!visitedList.Contains(currentClass)) { if ((!ignoreInterfaces || currentClass.ClassType != ClassType.Interface) && !visitedList.Contains(currentClass)) {
visitedList.Add(currentClass); visitedList.Add(currentClass);
foreach (IReturnType type in currentClass.BaseTypes) { foreach (IReturnType type in currentClass.BaseTypes) {
typesToVisit.Enqueue(type); typesToVisit.Enqueue(type);

4
src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/Interfaces/IClass.cs

@ -74,6 +74,10 @@ namespace ICSharpCode.SharpDevelop.Dom
get; get;
} }
IEnumerable<IClass> ClassInheritanceTreeClassesOnly {
get;
}
IClass BaseClass { IClass BaseClass {
get; get;
} }

Loading…
Cancel
Save