Browse Source

Merge remote-tracking branch 'remotes/sd/master'

pull/584/head
jkuehner 11 years ago
parent
commit
5b9155e477
  1. 8
      src/AddIns/BackendBindings/CSharpBinding/Project/Src/FormattingStrategy/CSharpFormatter.cs
  2. 2
      src/AddIns/BackendBindings/CSharpBinding/Project/Src/Parser/CSharpSymbolSearch.cs
  3. 19
      src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/InsertCtorDialog.xaml.cs
  4. 12
      src/AddIns/Debugger/Debugger.Core/TypeSystemExtensions.cs
  5. 6
      src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/AvalonEditEditorUIService.cs
  6. 17
      src/AddIns/DisplayBindings/XmlEditor/Project/Src/XmlTreeViewContainerControl.cs
  7. 52
      src/AddIns/DisplayBindings/XmlEditor/Project/Src/XmlTreeViewControl.cs
  8. 2
      src/AddIns/DisplayBindings/XmlEditor/Test/Tree/DeleteTreeNodeWithDeleteKeyTestFixture.cs
  9. 4
      src/AddIns/DisplayBindings/XmlEditor/Test/Utils/DerivedXmlTreeViewContainerControl.cs
  10. 8
      src/Libraries/NRefactory/ICSharpCode.NRefactory.Cecil/CecilLoader.cs
  11. 2
      src/Libraries/NRefactory/ICSharpCode.NRefactory.Tests/Analysis/SymbolCollectorTests.cs
  12. 2
      src/Libraries/NRefactory/ICSharpCode.NRefactory.Tests/CSharp/Resolver/FindReferencesTest.cs
  13. 16
      src/Libraries/NRefactory/ICSharpCode.NRefactory/Analysis/SymbolCollector.cs
  14. 2
      src/Main/Base/Project/Editor/IEditorUIService.cs
  15. 74
      src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/ProjectBrowserControl.cs
  16. 1
      src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/SolutionItemNode.cs
  17. 1
      src/Main/SharpDevelop/Project/Build/MSBuildEngine/MSBuildEngineWorker.cs

8
src/AddIns/BackendBindings/CSharpBinding/Project/Src/FormattingStrategy/CSharpFormatter.cs

@ -31,11 +31,17 @@ namespace CSharpBinding.FormattingStrategy @@ -31,11 +31,17 @@ namespace CSharpBinding.FormattingStrategy
/// </summary>
public static void Format(ITextEditor editor, int offset, int length, CSharpFormattingOptionsContainer optionsContainer)
{
SyntaxTree syntaxTree = SyntaxTree.Parse(editor.Document);
if (syntaxTree.Errors.Count > 0) {
// Don't format files containing syntax errors!
return;
}
TextEditorOptions editorOptions = editor.ToEditorOptions();
optionsContainer.CustomizeEditorOptions(editorOptions);
var formatter = new CSharpFormatter(optionsContainer.GetEffectiveOptions(), editorOptions);
formatter.AddFormattingRegion(new DomRegion(editor.Document.GetLocation(offset), editor.Document.GetLocation(offset + length)));
var changes = formatter.AnalyzeFormatting(editor.Document, SyntaxTree.Parse(editor.Document));
var changes = formatter.AnalyzeFormatting(editor.Document, syntaxTree);
changes.ApplyChanges(offset, length);
}
}

2
src/AddIns/BackendBindings/CSharpBinding/Project/Src/Parser/CSharpSymbolSearch.cs

@ -87,7 +87,7 @@ namespace CSharpBinding @@ -87,7 +87,7 @@ namespace CSharpBinding
IEnumerable<ISymbol> GetRelatedSymbols(ISymbol entity)
{
TypeGraph typeGraph = new TypeGraph(new [] { compilation.MainAssembly });
var typeGraph = new Lazy<TypeGraph>(() => new TypeGraph(new [] { compilation.MainAssembly }));
var symbolCollector = new SymbolCollector();
return symbolCollector.GetRelatedSymbols(typeGraph, entity);
}

19
src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/InsertCtorDialog.xaml.cs

@ -63,9 +63,14 @@ namespace CSharpBinding.Refactoring @@ -63,9 +63,14 @@ namespace CSharpBinding.Refactoring
var typeResolveContext = refactoringContext.GetTypeResolveContext();
if (typeResolveContext == null) {
parameterList = EmptyList<PropertyOrFieldWrapper>.Instance;
return;
}
var resolvedCurrent = typeResolveContext.CurrentTypeDefinition;
if (resolvedCurrent == null) {
parameterList = EmptyList<PropertyOrFieldWrapper>.Instance;
return;
}
parameterList = CreateCtorParams(resolvedCurrent).ToList();
this.varList.ItemsSource = parameterList;
@ -74,23 +79,17 @@ namespace CSharpBinding.Refactoring @@ -74,23 +79,17 @@ namespace CSharpBinding.Refactoring
Visibility = System.Windows.Visibility.Visible;
}
IEnumerable<PropertyOrFieldWrapper> CreateCtorParams(IType sourceType)
IEnumerable<PropertyOrFieldWrapper> CreateCtorParams(ITypeDefinition sourceType)
{
int i = 0;
foreach (var f in sourceType.GetFields().Where(field => !field.IsConst
&& field.IsStatic == sourceType.GetDefinition().IsStatic
&& field.DeclaringType.FullName == sourceType.FullName
&& field.ReturnType != null)) {
foreach (var f in sourceType.Fields.Where(f => !f.IsStatic)) {
yield return new PropertyOrFieldWrapper(f) { Index = i };
i++;
}
foreach (var p in sourceType.GetProperties().Where(prop => prop.CanSet && !prop.IsIndexer
&& prop.IsAutoImplemented()
&& prop.IsStatic == sourceType.GetDefinition().IsStatic
&& prop.DeclaringType.FullName == sourceType.FullName
&& prop.ReturnType != null)) {
foreach (var p in sourceType.Properties.Where(prop => !prop.IsStatic && prop.CanSet
&& !prop.IsIndexer && prop.IsAutoImplemented())) {
yield return new PropertyOrFieldWrapper(p) { Index = i };
i++;
}

12
src/AddIns/Debugger/Debugger.Core/TypeSystemExtensions.cs

@ -155,6 +155,12 @@ namespace Debugger @@ -155,6 +155,12 @@ namespace Debugger
string name = corModule.GetName();
if (corModule.IsDynamic() == 1 || corModule.IsInMemory() == 1) {
var defaultUnresolvedAssembly = new DefaultUnresolvedAssembly(name);
var defaultUnresolvedTypeDefinition = new DefaultUnresolvedTypeDefinition("UnknownDynamicType");
var defaultUnresolvedMethod = new DefaultUnresolvedMethod(defaultUnresolvedTypeDefinition, "UnknownMethod");
var defaultUnresolvedField = new DefaultUnresolvedField(defaultUnresolvedTypeDefinition, "UnknownField");
defaultUnresolvedTypeDefinition.Members.Add(defaultUnresolvedMethod);
defaultUnresolvedTypeDefinition.Members.Add(defaultUnresolvedField);
defaultUnresolvedAssembly.AddTypeDefinition(defaultUnresolvedTypeDefinition);
weakTable.Add(defaultUnresolvedAssembly, new ModuleMetadataInfo(module, null));
return Task.FromResult<IUnresolvedAssembly>(defaultUnresolvedAssembly);
}
@ -527,6 +533,9 @@ namespace Debugger @@ -527,6 +533,9 @@ namespace Debugger
public static IMethod Import(this ICompilation compilation, ICorDebugFunction corFunction)
{
Module module = compilation.GetAppDomain().Process.GetModule(corFunction.GetModule());
if (module.IsDynamic || module.IsInMemory) {
return module.Assembly.GetTypeDefinition("", "UnknownDynamicType").Methods.First();
}
var info = GetInfo(module.Assembly);
uint functionToken = corFunction.GetToken();
var unresolvedMethod = info.GetMethodFromToken(functionToken);
@ -547,6 +556,9 @@ namespace Debugger @@ -547,6 +556,9 @@ namespace Debugger
public static IField ImportField(this IType declaringType, uint fieldToken)
{
var module = declaringType.GetDefinition().ParentAssembly.GetModule();
if (module.IsDynamic || module.IsInMemory) {
return module.Assembly.GetTypeDefinition("", "UnknownDynamicType").Fields.First();
}
var info = GetInfo(module.Assembly);
return declaringType.GetFields(f => info.GetMetadataToken(f) == fieldToken, GetMemberOptions.IgnoreInheritedMembers).SingleOrDefault();
}

6
src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/AvalonEditEditorUIService.cs

@ -67,8 +67,10 @@ namespace ICSharpCode.AvalonEdit.AddIn @@ -67,8 +67,10 @@ namespace ICSharpCode.AvalonEdit.AddIn
/// <inheritdoc />
public Point GetScreenPosition(int line, int column)
{
var positionInPixels = textView.PointToScreen(
textView.GetVisualPosition(new TextViewPosition(line, column), VisualYPosition.LineBottom) - textView.ScrollOffset);
var visualPosition = textView.GetVisualPosition(
new TextViewPosition(line, column), VisualYPosition.LineBottom) - textView.ScrollOffset;
var positionInPixels = textView.PointToScreen(new Point(visualPosition.X.CoerceValue(0, textView.ActualWidth),
visualPosition.Y.CoerceValue(0, textView.ActualHeight)));
return positionInPixels.TransformFromDevice(textView);
}

17
src/AddIns/DisplayBindings/XmlEditor/Project/Src/XmlTreeViewContainerControl.cs

@ -667,11 +667,20 @@ namespace ICSharpCode.XmlEditor @@ -667,11 +667,20 @@ namespace ICSharpCode.XmlEditor
}
/// <summary>
/// Deletes the selected node.
/// Handles a keyboard press event in tree view.
/// </summary>
protected void XmlElementTreeViewDeleteKeyPressed(object source, EventArgs e)
protected void XmlElementTreeViewKeyPressed(object source, XmlTreeViewKeyPressedEventArgs e)
{
Delete();
if (e.KeyData == Keys.Delete)
Delete();
else if (e.KeyData == (Keys.Control | Keys.C))
Copy();
else if (e.KeyData == (Keys.Control | Keys.X))
Cut();
else if (e.KeyData == (Keys.Control | Keys.V))
Paste();
else if (e.KeyData == (Keys.Control | Keys.A))
SelectAll();
}
#region Forms Designer generated code
@ -738,7 +747,7 @@ namespace ICSharpCode.XmlEditor @@ -738,7 +747,7 @@ namespace ICSharpCode.XmlEditor
this.xmlElementTreeView.Size = new System.Drawing.Size(185, 326);
this.xmlElementTreeView.TabIndex = 0;
this.xmlElementTreeView.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.XmlElementTreeViewAfterSelect);
this.xmlElementTreeView.DeleteKeyPressed += new System.EventHandler(this.XmlElementTreeViewDeleteKeyPressed);
this.xmlElementTreeView.TreeViewKeyPressed += this.XmlElementTreeViewKeyPressed;
//
// attributesGrid
//

52
src/AddIns/DisplayBindings/XmlEditor/Project/Src/XmlTreeViewControl.cs

@ -26,13 +26,27 @@ using ICSharpCode.SharpDevelop.Gui; @@ -26,13 +26,27 @@ using ICSharpCode.SharpDevelop.Gui;
namespace ICSharpCode.XmlEditor
{
public class XmlTreeViewKeyPressedEventArgs : EventArgs
{
public XmlTreeViewKeyPressedEventArgs(Keys keyData)
{
KeyData = keyData;
}
public Keys KeyData
{
get;
private set;
}
}
/// <summary>
/// Displays a tree of XML elements. This is a separate control so it can
/// be unit tested. It has no SharpDevelop specific parts, for example,
/// the context menus are defined in the XmlTreeViewContainerControl.
/// </summary>
public class XmlTreeViewControl : ExtTreeView
{
{
const string ViewStatePropertyName = "XmlTreeViewControl.ViewState";
XmlDocument document;
@ -43,9 +57,9 @@ namespace ICSharpCode.XmlEditor @@ -43,9 +57,9 @@ namespace ICSharpCode.XmlEditor
}
/// <summary>
/// Raised when the delete key is pressed.
/// Raised when some key in tree view is pressed.
/// </summary>
public event EventHandler DeleteKeyPressed;
public event EventHandler<XmlTreeViewKeyPressedEventArgs> TreeViewKeyPressed;
public XmlTreeViewControl()
{
@ -98,7 +112,7 @@ namespace ICSharpCode.XmlEditor @@ -98,7 +112,7 @@ namespace ICSharpCode.XmlEditor
/// Gets the selected text node in the tree.
/// </summary>
public XmlText SelectedTextNode {
get {
get {
XmlTextTreeNode xmlTextTreeNode = SelectedNode as XmlTextTreeNode;
if (xmlTextTreeNode != null) {
return xmlTextTreeNode.XmlText;
@ -106,12 +120,12 @@ namespace ICSharpCode.XmlEditor @@ -106,12 +120,12 @@ namespace ICSharpCode.XmlEditor
return null;
}
}
/// <summary>
/// Gets the selected comment node in the tree.
/// </summary>
public XmlComment SelectedComment {
get {
get {
XmlCommentTreeNode commentTreeNode = SelectedNode as XmlCommentTreeNode;
if (commentTreeNode != null) {
return commentTreeNode.XmlComment;
@ -230,7 +244,7 @@ namespace ICSharpCode.XmlEditor @@ -230,7 +244,7 @@ namespace ICSharpCode.XmlEditor
}
/// <summary>
/// Updates the corresponding tree node's text based on
/// Updates the corresponding tree node's text based on
/// the textNode's value.
/// </summary>
public void UpdateTextNode(XmlText textNode)
@ -240,9 +254,9 @@ namespace ICSharpCode.XmlEditor @@ -240,9 +254,9 @@ namespace ICSharpCode.XmlEditor
node.Update();
}
}
/// <summary>
/// Updates the corresponding tree node's text based on
/// Updates the corresponding tree node's text based on
/// the comment's value.
/// </summary>
public void UpdateComment(XmlComment comment)
@ -314,7 +328,7 @@ namespace ICSharpCode.XmlEditor @@ -314,7 +328,7 @@ namespace ICSharpCode.XmlEditor
}
/// <summary>
/// If no node is selected after a mouse click then we make
/// If no node is selected after a mouse click then we make
/// sure the AfterSelect event is fired. Standard behaviour is
/// for the AfterSelect event not to be fired when the user
/// deselects all tree nodes.
@ -332,8 +346,8 @@ namespace ICSharpCode.XmlEditor @@ -332,8 +346,8 @@ namespace ICSharpCode.XmlEditor
/// </summary>
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
if (keyData == Keys.Delete && DeleteKeyPressed != null) {
DeleteKeyPressed(this, new EventArgs());
if (/*keyData == Keys.Delete && */TreeViewKeyPressed != null) {
TreeViewKeyPressed(this, new XmlTreeViewKeyPressedEventArgs(keyData));
}
return base.ProcessCmdKey(ref msg, keyData);
}
@ -370,7 +384,7 @@ namespace ICSharpCode.XmlEditor @@ -370,7 +384,7 @@ namespace ICSharpCode.XmlEditor
}
/// <summary>
/// Inserts a new element node either before or after the
/// Inserts a new element node either before or after the
/// currently selected element node.
/// </summary>
void InsertElement(XmlElement element, InsertionMode insertionMode)
@ -388,7 +402,7 @@ namespace ICSharpCode.XmlEditor @@ -388,7 +402,7 @@ namespace ICSharpCode.XmlEditor
}
/// <summary>
/// Inserts a new text node either before or after the
/// Inserts a new text node either before or after the
/// currently selected node.
/// </summary>
void InsertTextNode(XmlText textNode, InsertionMode insertionMode)
@ -406,7 +420,7 @@ namespace ICSharpCode.XmlEditor @@ -406,7 +420,7 @@ namespace ICSharpCode.XmlEditor
}
/// <summary>
/// Inserts a new comment node either before or after the
/// Inserts a new comment node either before or after the
/// currently selected node.
/// </summary>
void InsertComment(XmlComment comment, InsertionMode insertionMode)
@ -541,7 +555,7 @@ namespace ICSharpCode.XmlEditor @@ -541,7 +555,7 @@ namespace ICSharpCode.XmlEditor
}
/// <summary>
/// Shows the corresponding tree node with the ghosted image
/// Shows the corresponding tree node with the ghosted image
/// that indicates it is being cut.
/// </summary>
void ShowCutElement(XmlElement element, bool showGhostImage)
@ -551,7 +565,7 @@ namespace ICSharpCode.XmlEditor @@ -551,7 +565,7 @@ namespace ICSharpCode.XmlEditor
}
/// <summary>
/// Shows the corresponding tree node with the ghosted image
/// Shows the corresponding tree node with the ghosted image
/// that indicates it is being cut.
/// </summary>
void ShowCutTextNode(XmlText textNode, bool showGhostImage)
@ -559,9 +573,9 @@ namespace ICSharpCode.XmlEditor @@ -559,9 +573,9 @@ namespace ICSharpCode.XmlEditor
XmlTextTreeNode node = FindTextNode(textNode);
node.ShowGhostImage = showGhostImage;
}
/// <summary>
/// Shows the corresponding tree node with the ghosted image
/// Shows the corresponding tree node with the ghosted image
/// that indicates it is being cut.
/// </summary>
void ShowCutComment(XmlComment comment, bool showGhostImage)

2
src/AddIns/DisplayBindings/XmlEditor/Test/Tree/DeleteTreeNodeWithDeleteKeyTestFixture.cs

@ -36,7 +36,7 @@ namespace XmlEditor.Tests.Tree @@ -36,7 +36,7 @@ namespace XmlEditor.Tests.Tree
public void DeleteKeyPressed()
{
using (DerivedXmlTreeViewControl treeView = new DerivedXmlTreeViewControl()) {
treeView.DeleteKeyPressed += TreeViewDeleteKeyPressed;
treeView.TreeViewKeyPressed += TreeViewDeleteKeyPressed;
treeView.CallProcessCmdKey(Keys.Delete);
}
Assert.IsTrue(deleteKeyPressEventFired);

4
src/AddIns/DisplayBindings/XmlEditor/Test/Utils/DerivedXmlTreeViewContainerControl.cs

@ -81,12 +81,12 @@ namespace XmlEditor.Tests.Utils @@ -81,12 +81,12 @@ namespace XmlEditor.Tests.Utils
/// <summary>
/// Allows us to call the XmlTreeViewContainer's
/// XmlElementTreeViewDeleteKeyPressed method to fake the user
/// XmlElementTreeViewKeyPressed method to fake the user
/// pressing the delete key in the xml tree view control.
/// </summary>
public void CallXmlElementTreeViewDeleteKeyPressed()
{
base.XmlElementTreeViewDeleteKeyPressed(this, new EventArgs());
base.XmlElementTreeViewKeyPressed(this, new XmlTreeViewKeyPressedEventArgs(Keys.Delete));
}
/// <summary>

8
src/Libraries/NRefactory/ICSharpCode.NRefactory.Cecil/CecilLoader.cs

@ -824,7 +824,13 @@ namespace ICSharpCode.NRefactory.TypeSystem @@ -824,7 +824,13 @@ namespace ICSharpCode.NRefactory.TypeSystem
void AddSecurityAttributes(SecurityDeclaration secDecl, IList<IUnresolvedAttribute> targetCollection)
{
var blobSecDecl = new UnresolvedSecurityDeclarationBlob((int)secDecl.Action, secDecl.GetBlob());
byte[] blob;
try {
blob = secDecl.GetBlob();
} catch (NotSupportedException) {
return; // https://github.com/icsharpcode/SharpDevelop/issues/284
}
var blobSecDecl = new UnresolvedSecurityDeclarationBlob((int)secDecl.Action, blob);
targetCollection.AddRange(blobSecDecl.UnresolvedAttributes);
}
#endregion

2
src/Libraries/NRefactory/ICSharpCode.NRefactory.Tests/Analysis/SymbolCollectorTests.cs

@ -60,7 +60,7 @@ namespace ICSharpCode.NRefactory.Analysis @@ -60,7 +60,7 @@ namespace ICSharpCode.NRefactory.Analysis
col.IncludeOverloads = includeOverloads;
col.GroupForRenaming = true;
var result = col.GetRelatedSymbols (new TypeGraph (compilation.Assemblies),
var result = col.GetRelatedSymbols (new Lazy<TypeGraph>(() => new TypeGraph (compilation.Assemblies)),
symbol);
if (offsets.Count != result.Count()) {
foreach (var a in result)

2
src/Libraries/NRefactory/ICSharpCode.NRefactory.Tests/CSharp/Resolver/FindReferencesTest.cs

@ -469,7 +469,7 @@ namespace Foo @@ -469,7 +469,7 @@ namespace Foo
{
var sym = GetSymbol(compilation, fullyQualifiedName);
Assert.NotNull(sym);
var graph = new TypeGraph(compilation.Assemblies);
var graph = new Lazy<TypeGraph>(() => new TypeGraph(compilation.Assemblies));
var col = new SymbolCollector();
col.IncludeOverloads = includeOverloads;
col.GroupForRenaming = true;

16
src/Libraries/NRefactory/ICSharpCode.NRefactory/Analysis/SymbolCollector.cs

@ -52,7 +52,7 @@ namespace ICSharpCode.NRefactory.Analysis @@ -52,7 +52,7 @@ namespace ICSharpCode.NRefactory.Analysis
}
}
static IEnumerable<ISymbol> CollectOverloads (TypeGraph g, IMethod method)
static IEnumerable<ISymbol> CollectOverloads (IMethod method)
{
return method.DeclaringType
.GetMethods (m => m.Name == method.Name)
@ -85,7 +85,7 @@ namespace ICSharpCode.NRefactory.Analysis @@ -85,7 +85,7 @@ namespace ICSharpCode.NRefactory.Analysis
/// <returns>The related symbols.</returns>
/// <param name="g">The type graph.</param>
/// <param name="m">The symbol to search</param>
public IEnumerable<ISymbol> GetRelatedSymbols(TypeGraph g, ISymbol m)
public IEnumerable<ISymbol> GetRelatedSymbols(Lazy<TypeGraph> g, ISymbol m)
{
switch (m.SymbolKind) {
case SymbolKind.TypeDefinition:
@ -103,7 +103,7 @@ namespace ICSharpCode.NRefactory.Analysis @@ -103,7 +103,7 @@ namespace ICSharpCode.NRefactory.Analysis
return GetRelatedSymbols (g, ((IMethod)m).DeclaringTypeDefinition);
List<ISymbol> constructorSymbols = new List<ISymbol> ();
if (IncludeOverloads) {
foreach (var m3 in CollectOverloads (g, (IMethod)m)) {
foreach (var m3 in CollectOverloads ((IMethod)m)) {
constructorSymbols.Add (m3);
}
}
@ -120,16 +120,18 @@ namespace ICSharpCode.NRefactory.Analysis @@ -120,16 +120,18 @@ namespace ICSharpCode.NRefactory.Analysis
case SymbolKind.Method: {
var member = (IMember)m;
List<ISymbol> symbols = new List<ISymbol> ();
if (member.ImplementedInterfaceMembers.Count > 0) {
if (!member.IsExplicitInterfaceImplementation)
symbols.Add (member);
if (GroupForRenaming) {
foreach (var m2 in member.ImplementedInterfaceMembers) {
symbols.AddRange (GetRelatedSymbols (g, m2));
}
} else {
symbols.Add (member);
symbols.AddRange(member.ImplementedInterfaceMembers);
}
if (member.DeclaringType.Kind == TypeKind.Interface) {
var declaringTypeNode = g.GetNode(member.DeclaringTypeDefinition);
var declaringTypeNode = g.Value.GetNode(member.DeclaringTypeDefinition);
if (declaringTypeNode != null) {
foreach (var derivedType in declaringTypeNode.DerivedTypes) {
var mem = SearchMember (derivedType.TypeDefinition, member);
@ -143,7 +145,7 @@ namespace ICSharpCode.NRefactory.Analysis @@ -143,7 +145,7 @@ namespace ICSharpCode.NRefactory.Analysis
if (IncludeOverloads) {
IncludeOverloads = false;
if (member is IMethod) {
foreach (var m3 in CollectOverloads (g, (IMethod)member)) {
foreach (var m3 in CollectOverloads ((IMethod)member)) {
symbols.AddRange (GetRelatedSymbols (g, m3));
}
} else if (member.SymbolKind == SymbolKind.Indexer) {

2
src/Main/Base/Project/Editor/IEditorUIService.cs

@ -37,6 +37,8 @@ namespace ICSharpCode.SharpDevelop.Editor @@ -37,6 +37,8 @@ namespace ICSharpCode.SharpDevelop.Editor
/// <summary>
/// Gets the absolute screen position of given position in the document.
/// If the position is outside of the currently visible portion of the document,
/// the value is forced into the viewport bounds.
/// </summary>
Point GetScreenPosition(int line, int column);

74
src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/ProjectBrowserControl.cs

@ -17,8 +17,11 @@ @@ -17,8 +17,11 @@
// DEALINGS IN THE SOFTWARE.
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Windows.Forms;
using ICSharpCode.Core;
@ -249,37 +252,58 @@ namespace ICSharpCode.SharpDevelop.Project @@ -249,37 +252,58 @@ namespace ICSharpCode.SharpDevelop.Project
try {
inSelectFile = true;
lastSelectionTarget = fileName;
TreeNode node = FindFileNode(fileName);
if (node != null) {
// Expand to node
TreeNode parent = node.Parent;
while (parent != null) {
parent.Expand();
parent = parent.Parent;
}
//node = FindFileNode(fileName);
treeView.SelectedNode = node;
} else {
// Node for this file does not exist yet (the tree view is lazy loaded)
SelectDeepestOpenNodeForPath(fileName);
}
LoadAndExpandToNode(new FileName(fileName));
} finally {
inSelectFile = false;
}
}
#region SelectDeepestOpenNode internals
//
// SolutionNode RootSolutionNode {
// get {
// if (treeView.Nodes != null && treeView.Nodes.Count>0) {
// return treeView.Nodes[0] as SolutionNode;
// }
// return null;
// }
// }
//
void LoadAndExpandToNode(FileName fileName)
{
IProject project = null;
if (!SD.ProjectService.IsSolutionOrProjectFile(fileName)) {
project = SD.ProjectService.FindProjectContainingFile(fileName);
}
Stack<ISolutionItem> itemsToExpand = new Stack<ISolutionItem>();
ISolutionItem item = project;
if (project == null) {
item = SD.ProjectService.CurrentSolution.AllItems
.OfType<ISolutionFileItem>().FirstOrDefault(i => i.FileName.Equals(fileName));
}
while (item != null) {
itemsToExpand.Push(item);
item = item.ParentFolder;
}
AbstractProjectBrowserTreeNode current = null;
var currentChildren = treeView.Nodes;
while (itemsToExpand.Any()) {
var currentItem = itemsToExpand.Pop();
current = currentChildren.OfType<AbstractProjectBrowserTreeNode>().FirstOrDefault(n => n.Tag == currentItem);
if (current == null) break;
current.Expand();
currentChildren = current.Nodes;
}
if (project != null) {
var fileItem = project.FindFile(fileName);
var virtualPath = fileItem.VirtualName;
if (!string.IsNullOrWhiteSpace(fileItem.DependentUpon)) {
int index = virtualPath.LastIndexOf('\\') + 1;
virtualPath = virtualPath.Insert(index, fileItem.DependentUpon + "\\");
}
string[] relativePath = virtualPath.Split('\\');
for (int i = 0; i < relativePath.Length; i++) {
current = currentChildren.OfType<AbstractProjectBrowserTreeNode>()
.FirstOrDefault(n => n.Text.Equals(relativePath[i], StringComparison.OrdinalIgnoreCase));
if (current == null) break;
current.Expand();
currentChildren = current.Nodes;
}
}
treeView.SelectedNode = current;
}
void SelectDeepestOpenNodeForPath(string fileName)
{
TreeNode node = FindDeepestOpenNodeForPath(fileName);

1
src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/SolutionItemNode.cs

@ -51,6 +51,7 @@ namespace ICSharpCode.SharpDevelop.Project @@ -51,6 +51,7 @@ namespace ICSharpCode.SharpDevelop.Project
this.solution = item.ParentSolution;
this.item = item;
this.Text = Path.GetFileName(FileName);
this.Tag = item;
SetIcon(IconService.GetImageForFile(FileName));
}

1
src/Main/SharpDevelop/Project/Build/MSBuildEngine/MSBuildEngineWorker.cs

@ -313,6 +313,7 @@ namespace ICSharpCode.SharpDevelop.Project @@ -313,6 +313,7 @@ namespace ICSharpCode.SharpDevelop.Project
error.IsWarning = isWarning;
error.Subcategory = subcategory;
error.HelpKeyword = helpKeyword;
error.ParentProject = engine.Project;
engine.loggerChain.HandleError(error);
}

Loading…
Cancel
Save