diff --git a/AddIns/ICSharpCode.SharpDevelop.addin b/AddIns/ICSharpCode.SharpDevelop.addin index ec86b20b40..d7b5455899 100644 --- a/AddIns/ICSharpCode.SharpDevelop.addin +++ b/AddIns/ICSharpCode.SharpDevelop.addin @@ -1494,6 +1494,10 @@ label = "${res:XML.TextAreaContextMenu.Indent}" shortcut = "Control|I" class = "ICSharpCode.SharpDevelop.DefaultEditor.Commands.IndentSelection" /> + @@ -1738,6 +1742,7 @@ + diff --git a/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Debugger.AddIn.csproj b/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Debugger.AddIn.csproj index 20268ec579..dca73ce1dd 100644 --- a/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Debugger.AddIn.csproj +++ b/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Debugger.AddIn.csproj @@ -1,4 +1,4 @@ - + Debug AnyCPU @@ -45,6 +45,9 @@ Form + + ExceptionForm.cs + @@ -73,10 +76,5 @@ False - - - ExceptionForm.cs - - - + \ No newline at end of file diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Debugger.Core.csproj b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Debugger.Core.csproj index 386a0c912d..2e8c9580a7 100644 --- a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Debugger.Core.csproj +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Debugger.Core.csproj @@ -1,4 +1,4 @@ - + Debug AnyCPU @@ -9,8 +9,6 @@ Debugger.Core Debugger.Core 4 - - File diff --git a/src/AddIns/Misc/Debugger/TreeListView/Project/TreeListView.csproj b/src/AddIns/Misc/Debugger/TreeListView/Project/TreeListView.csproj index 4dabaf1521..e2f8085086 100644 --- a/src/AddIns/Misc/Debugger/TreeListView/Project/TreeListView.csproj +++ b/src/AddIns/Misc/Debugger/TreeListView/Project/TreeListView.csproj @@ -1,4 +1,4 @@ - + Debug AnyCPU diff --git a/src/Libraries/DockPanel_Src/WinFormsUI/WinFormsUI.csproj b/src/Libraries/DockPanel_Src/WinFormsUI/WinFormsUI.csproj index 1fd2b419f7..9cc9e922ac 100644 --- a/src/Libraries/DockPanel_Src/WinFormsUI/WinFormsUI.csproj +++ b/src/Libraries/DockPanel_Src/WinFormsUI/WinFormsUI.csproj @@ -1,4 +1,4 @@ - + Local 8.0.41115 @@ -6,10 +6,6 @@ {D3C782BA-178E-4235-A3BA-8C11DEBB6BEE} Debug AnyCPU - - - - WeifenLuo.WinFormsUI.Docking ..\..\..\Main\Core\Project\Resources\ICSharpCode.Core.snk JScript @@ -19,10 +15,6 @@ Library WeifenLuo.WinFormsUI OnBuildSuccess - - - - true @@ -30,15 +22,11 @@ false 285212672 false - - DEBUG;TRACE bin\Debug\CodeDoc.xml true 4096 false - - false false false @@ -50,16 +38,10 @@ false 285212672 false - - TRACE - - false 4096 false - - true false false @@ -90,12 +72,9 @@ Code - - - - - - + + + Code @@ -120,28 +99,23 @@ Code - - + Code - - - - + + Code - - + Code Code - - + Code @@ -166,8 +140,7 @@ Code - - + Code @@ -203,6 +176,11 @@ + + ICSharpCode.Core.snk + + + @@ -219,20 +197,7 @@ - - - - ICSharpCode.Core.snk - - - - - - - - - \ No newline at end of file diff --git a/src/Libraries/DockPanel_Src/WinFormsUI/WinFormsUI.csproj.user b/src/Libraries/DockPanel_Src/WinFormsUI/WinFormsUI.csproj.user index d8115b8f30..910657fe3b 100644 --- a/src/Libraries/DockPanel_Src/WinFormsUI/WinFormsUI.csproj.user +++ b/src/Libraries/DockPanel_Src/WinFormsUI/WinFormsUI.csproj.user @@ -1,14 +1,8 @@ - + 8.0.41115 Debug AnyCPU - - - - - - 0 ProjectFiles 0 @@ -19,19 +13,7 @@ false false false - - Project - - - - - - - - - - true @@ -40,19 +22,7 @@ false false false - - Project - - - - - - - - - - false \ No newline at end of file diff --git a/src/Libraries/NRefactory/Project/NRefactory.csproj b/src/Libraries/NRefactory/Project/NRefactory.csproj index 4e787f1295..3298afc55e 100644 --- a/src/Libraries/NRefactory/Project/NRefactory.csproj +++ b/src/Libraries/NRefactory/Project/NRefactory.csproj @@ -4,7 +4,7 @@ AnyCPU 8.0.41115 2.0 - {3a9ae6aa-bc07-4a2f-972c-581e3ae2f195} + {3A9AE6AA-BC07-4A2F-972C-581E3AE2F195} NewProject ICSharpCode.NRefactory Library diff --git a/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj b/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj index 06b01ae284..14e8eed2e6 100644 --- a/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj +++ b/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj @@ -19,9 +19,9 @@ False True ..\..\..\..\bin\ - True + False false - 0 + 4 False @@ -29,7 +29,8 @@ True True ..\..\..\..\bin\ - True + False + 4 @@ -617,8 +618,9 @@ - + + @@ -643,4 +645,4 @@ - + \ No newline at end of file diff --git a/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj.user b/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj.user index 87e9a3ad41..80798801bc 100644 --- a/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj.user +++ b/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj.user @@ -1,4 +1,4 @@ - + diff --git a/src/Main/Base/Project/Src/Dom/NRefactoryResolver/FilePosition.cs b/src/Main/Base/Project/Src/Dom/FilePosition.cs similarity index 67% rename from src/Main/Base/Project/Src/Dom/NRefactoryResolver/FilePosition.cs rename to src/Main/Base/Project/Src/Dom/FilePosition.cs index f79e9095d4..9473dba9b0 100644 --- a/src/Main/Base/Project/Src/Dom/NRefactoryResolver/FilePosition.cs +++ b/src/Main/Base/Project/Src/Dom/FilePosition.cs @@ -10,20 +10,32 @@ using System; using System.Drawing; -namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver +namespace ICSharpCode.SharpDevelop.Dom { /// /// Description of SearchDefinition. /// public class FilePosition { - string filename = ""; - Point position = new Point(0, 0); + string filename; + Point position; public FilePosition(string filename, Point position) { this.filename = filename; this.position = position; } + + public string Filename { + get { + return filename; + } + } + + public Point Position { + get { + return position; + } + } } } diff --git a/src/Main/Base/Project/Src/Dom/IMember.cs b/src/Main/Base/Project/Src/Dom/IMember.cs index e02a8c9f28..8f29fb1901 100644 --- a/src/Main/Base/Project/Src/Dom/IMember.cs +++ b/src/Main/Base/Project/Src/Dom/IMember.cs @@ -29,9 +29,5 @@ namespace ICSharpCode.SharpDevelop.Dom IReturnType ReturnType { get; } - - IClass DeclaringType { - get; - } } } diff --git a/src/Main/Base/Project/Src/Dom/Implementations/AbstractMember.cs b/src/Main/Base/Project/Src/Dom/Implementations/AbstractMember.cs index a1b69da2d0..1fe85ced1d 100644 --- a/src/Main/Base/Project/Src/Dom/Implementations/AbstractMember.cs +++ b/src/Main/Base/Project/Src/Dom/Implementations/AbstractMember.cs @@ -12,9 +12,8 @@ namespace ICSharpCode.SharpDevelop.Dom [Serializable] public abstract class AbstractMember : AbstractNamedEntity, IMember { - protected IClass declaringType; protected IReturnType returnType; - protected IRegion region; + protected IRegion region; public virtual IRegion Region { get { @@ -22,12 +21,6 @@ namespace ICSharpCode.SharpDevelop.Dom } } - public IClass DeclaringType { - get { - return declaringType; - } - } - public virtual IReturnType ReturnType { get { return returnType; @@ -36,9 +29,9 @@ namespace ICSharpCode.SharpDevelop.Dom returnType = value; } } + public AbstractMember(IClass declaringType) : base(declaringType) { } - } } diff --git a/src/Main/Base/Project/Src/Dom/NRefactoryResolver/NRefactoryResolver.cs b/src/Main/Base/Project/Src/Dom/NRefactoryResolver/NRefactoryResolver.cs index 6be1e485cb..ea1c868a95 100644 --- a/src/Main/Base/Project/Src/Dom/NRefactoryResolver/NRefactoryResolver.cs +++ b/src/Main/Base/Project/Src/Dom/NRefactoryResolver/NRefactoryResolver.cs @@ -208,12 +208,12 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver if (var != null) { IReturnType type = GetVariableType(var); IField field = new LocalVariableField(type, identifier, null, callingClass); - return new LocalResolveResult(callingClass, callingMember, field, false); + return new LocalResolveResult(callingMember, field, false); } IParameter para = SearchMethodParameter(identifier); if (para != null) { IField field = new LocalVariableField(para.ReturnType, para.Name, para.Region, callingClass); - return new LocalResolveResult(callingClass, callingMember, field, true); + return new LocalResolveResult(callingMember, field, true); } IMember member = GetMember(callingClass, identifier); if (member != null) { diff --git a/src/Main/Base/Project/Src/Dom/ResolveResult.cs b/src/Main/Base/Project/Src/Dom/ResolveResult.cs index 48cd4197fb..0d92e7c699 100644 --- a/src/Main/Base/Project/Src/Dom/ResolveResult.cs +++ b/src/Main/Base/Project/Src/Dom/ResolveResult.cs @@ -8,6 +8,7 @@ using System; using System.Collections; using System.Collections.Generic; +using System.Drawing; using ICSharpCode.SharpDevelop.Project; using ICSharpCode.Core; @@ -79,6 +80,12 @@ namespace ICSharpCode.SharpDevelop.Dom return null; return c.GetAccessibleMembers(callingClass, false); } + + public virtual FilePosition GetDefinitionPosition() + { + // this is only possible on some subclasses of ResolveResult + return null; + } } #endregion @@ -96,8 +103,8 @@ namespace ICSharpCode.SharpDevelop.Dom IField field; bool isParameter; - public LocalResolveResult(IClass callingClass, IMember callingMember, IField field, bool isParameter) - : base(callingClass, callingMember, field.ReturnType) + public LocalResolveResult(IMember callingMember, IField field, bool isParameter) + : base(callingMember.DeclaringType, callingMember, field.ReturnType) { if (callingMember == null) throw new ArgumentNullException("callingMember"); @@ -124,6 +131,24 @@ namespace ICSharpCode.SharpDevelop.Dom return isParameter; } } + + public override FilePosition GetDefinitionPosition() + { + ICompilationUnit cu = this.CallingClass.CompilationUnit; + if (cu == null) { + Console.WriteLine("callingClass.CompilationUnit is null"); + return null; + } + if (cu.FileName == null || cu.FileName.Length == 0) { + Console.WriteLine("callingClass.CompilationUnit.FileName is empty"); + return null; + } + IRegion reg = field.Region; + if (reg != null) + return new FilePosition(cu.FileName, new Point(reg.BeginLine, reg.BeginColumn)); + else + return new FilePosition(cu.FileName, Point.Empty); + } } #endregion @@ -203,6 +228,24 @@ namespace ICSharpCode.SharpDevelop.Dom else return resolvedClass.GetAccessibleMembers(this.CallingClass, true); } + + public override FilePosition GetDefinitionPosition() + { + ICompilationUnit cu = resolvedClass.CompilationUnit; + if (cu == null) { + Console.WriteLine("resolvedClass.CompilationUnit is null"); + return null; + } + if (cu.FileName == null || cu.FileName.Length == 0) { + Console.WriteLine("resolvedClass.CompilationUnit.FileName is empty"); + return null; + } + IRegion reg = resolvedClass.Region; + if (reg != null) + return new FilePosition(cu.FileName, new Point(reg.BeginLine, reg.BeginColumn)); + else + return new FilePosition(cu.FileName, Point.Empty); + } } #endregion @@ -243,6 +286,29 @@ namespace ICSharpCode.SharpDevelop.Dom return resolvedMember; } } + + public override FilePosition GetDefinitionPosition() + { + IClass declaringType = resolvedMember.DeclaringType; + if (declaringType == null) { + Console.WriteLine("declaringType is null"); + return null; + } + ICompilationUnit cu = declaringType.CompilationUnit; + if (cu == null) { + Console.WriteLine("declaringType.CompilationUnit is null"); + return null; + } + if (cu.FileName == null || cu.FileName.Length == 0) { + Console.WriteLine("declaringType.CompilationUnit.FileName is empty"); + return null; + } + IRegion reg = resolvedMember.Region; + if (reg != null) + return new FilePosition(cu.FileName, new Point(reg.BeginLine, reg.BeginColumn)); + else + return new FilePosition(cu.FileName, Point.Empty); + } } #endregion diff --git a/src/Main/Base/Project/Src/TextEditor/Actions.cs b/src/Main/Base/Project/Src/TextEditor/Actions.cs index ecb1dc1ddb..2abebc479d 100644 --- a/src/Main/Base/Project/Src/TextEditor/Actions.cs +++ b/src/Main/Base/Project/Src/TextEditor/Actions.cs @@ -16,6 +16,7 @@ using ICSharpCode.TextEditor.Actions; using ICSharpCode.TextEditor; using ICSharpCode.TextEditor.Gui.CompletionWindow; using ICSharpCode.SharpDevelop.Gui; +using ICSharpCode.SharpDevelop.Dom; namespace ICSharpCode.SharpDevelop.DefaultEditor.Actions { @@ -35,10 +36,45 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Actions { SharpDevelopTextAreaControl sdtac = (SharpDevelopTextAreaControl)services.MotherTextEditorControl; - sdtac.codeCompletionWindow = CodeCompletionWindow.ShowCompletionWindow(((Form)WorkbenchSingleton.Workbench), - services.MotherTextEditorControl, + sdtac.codeCompletionWindow = CodeCompletionWindow.ShowCompletionWindow(((Form)WorkbenchSingleton.Workbench), + services.MotherTextEditorControl, services.MotherTextEditorControl.FileName, sdtac.CreateCodeCompletionDataProvider(true), '\0'); } } + + public class GoToDefinition : AbstractEditAction + { + public override void Execute(TextArea textArea) + { + TextEditorControl textEditorControl = textArea.MotherTextEditorControl; + IDocument document = textEditorControl.Document; + string textContent = document.TextContent; + + int caretLineNumber = document.GetLineNumberForOffset(textEditorControl.ActiveTextAreaControl.Caret.Offset) + 1; + int caretColumn = textEditorControl.ActiveTextAreaControl.Caret.Offset - document.GetLineSegment(caretLineNumber - 1).Offset + 1; + + IExpressionFinder expressionFinder = ParserService.GetExpressionFinder(textEditorControl.FileName); + if (expressionFinder == null) + return; + string expression = expressionFinder.FindFullExpression(textContent, textEditorControl.ActiveTextAreaControl.Caret.Offset); + if (expression == null || expression.Length == 0) + return; + ResolveResult result = ParserService.Resolve(expression, caretLineNumber, caretColumn, textEditorControl.FileName, textContent); + if (result != null) { + FilePosition pos = result.GetDefinitionPosition(); + if (pos != null) { + try { + if (pos.Position.IsEmpty) + FileService.OpenFile(pos.Filename); + else + FileService.JumpToFilePosition(pos.Filename, pos.Position.X - 1, pos.Position.Y - 1); + } catch (Exception ex) { + Console.WriteLine("Error jumping to '" + pos.Filename + "':\n" + ex.ToString()); + MessageBox.Show("Error jumping to '" + pos.Filename + "':\n" + ex.ToString()); + } + } + } + } + } } diff --git a/src/Main/Base/Project/Src/TextEditor/Commands/NavigationCommands.cs b/src/Main/Base/Project/Src/TextEditor/Commands/NavigationCommands.cs new file mode 100644 index 0000000000..c37213b6b0 --- /dev/null +++ b/src/Main/Base/Project/Src/TextEditor/Commands/NavigationCommands.cs @@ -0,0 +1,32 @@ +// +// +// +// +// +// + +using System; + +using ICSharpCode.TextEditor; +using ICSharpCode.TextEditor.Actions; + +namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands +{ + public class GoToDefinition : AbstractEditActionMenuCommand + { + public override IEditAction EditAction { + get { + // TODO: use click position instead of cursor position + return new ICSharpCode.SharpDevelop.DefaultEditor.Actions.GoToDefinition(); + } + } + } + /* + IWorkbenchWindow window = WorkbenchSingleton.Workbench.ActiveWorkbenchWindow; + + if (window == null || !(window.ViewContent is ITextEditorControlProvider)) { + return; + } + TextEditorControl textEditorControl = ((ITextEditorControlProvider)window.ViewContent).TextEditorControl; + */ +} diff --git a/src/Main/Base/Test/ICSharpCode.SharpDevelop.Tests.csproj b/src/Main/Base/Test/ICSharpCode.SharpDevelop.Tests.csproj index c8b3c37b89..39bfcf518f 100644 --- a/src/Main/Base/Test/ICSharpCode.SharpDevelop.Tests.csproj +++ b/src/Main/Base/Test/ICSharpCode.SharpDevelop.Tests.csproj @@ -13,11 +13,6 @@ False OnSuccessfulBuild Library - - - - - File diff --git a/src/Main/Base/Test/NRefactoryResolverTests.cs b/src/Main/Base/Test/NRefactoryResolverTests.cs index c7fd633dc9..d9177a2551 100644 --- a/src/Main/Base/Test/NRefactoryResolverTests.cs +++ b/src/Main/Base/Test/NRefactoryResolverTests.cs @@ -237,5 +237,31 @@ interface IInterface2 { } Assert.Fail("Method2 not found"); } + + [Test] + public void InvalidMethodCallTest() + { + string program = @"class A { + void Method(string b) { + + } +} +"; + ResolveResult result = Resolve(program, "b.ThisMethodDoesNotExistOnString()", 3, 24); + Assert.IsNull(result, "result"); + } + + [Test] + public void InvalidConstructorCallTest() + { + string program = @"class A { + void Method() { + + } +} +"; + ResolveResult result = Resolve(program, "new ThisClassDoesNotExist()", 3, 24); + Assert.IsNull(result, "result"); + } } } diff --git a/src/Main/Core/Project/ICSharpCode.Core.csproj b/src/Main/Core/Project/ICSharpCode.Core.csproj index bc1571116f..7cd66d3e15 100644 --- a/src/Main/Core/Project/ICSharpCode.Core.csproj +++ b/src/Main/Core/Project/ICSharpCode.Core.csproj @@ -18,7 +18,8 @@ True True ..\..\..\..\bin\ - True + False + 4 False @@ -26,7 +27,8 @@ False False ..\..\..\..\bin\ - True + False + 4