From da478ba25fd675463db5c5fc103f0d2baacd5280 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Mon, 9 May 2005 18:49:11 +0000 Subject: [PATCH] Fixed assertion when parsing method declaration with an unnamed parameter (when the user is still typing): use name '?' instead. Double-Clicking on the definition view pad now jumps to the location clicked on in the main view. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@137 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- src/Libraries/NRefactory/NRefactory.sln | 4 +-- .../NRefactory/Project/NRefactory.csproj | 5 ++-- .../Output/CodeDOM/CodeDOMOutputVisitor.cs | 17 +----------- .../ParameterDeclarationExpression.cs | 11 +++++--- .../NRefactory/Test/NRefactoryTests.csproj | 5 +--- .../Test/NRefactoryTests.csproj.user | 2 +- .../NRefactory/Test/Parser/ParseUtilCSharp.cs | 17 ++++++++++-- .../TypeLevel/MethodDeclarationTests.cs | 15 ++++++++--- .../Project/Src/Gui/Pads/DefinitionViewPad.cs | 26 ++++++++++++++++--- 9 files changed, 63 insertions(+), 39 deletions(-) diff --git a/src/Libraries/NRefactory/NRefactory.sln b/src/Libraries/NRefactory/NRefactory.sln index d3cd2469c7..504ce46d46 100644 --- a/src/Libraries/NRefactory/NRefactory.sln +++ b/src/Libraries/NRefactory/NRefactory.sln @@ -1,8 +1,8 @@ Microsoft Visual Studio Solution File, Format Version 9.00 # SharpDevelop 2.0.0.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.NRefactory.Tests", "Test\NRefactoryTests.csproj", "{870115dd-960a-4406-a6b9-600bcdc36a03}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.NRefactory", "Project\NRefactory.csproj", "{3a9ae6aa-bc07-4a2f-972c-581e3ae2f195}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.NRefactory.Tests", "Test\NRefactoryTests.csproj", "{870115dd-960a-4406-a6b9-600bcdc36a03}" +EndProject Global EndGlobal diff --git a/src/Libraries/NRefactory/Project/NRefactory.csproj b/src/Libraries/NRefactory/Project/NRefactory.csproj index 3129b5bdd8..11b0202654 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} ICSharpCode.NRefactory ICSharpCode.NRefactory Library @@ -37,7 +37,6 @@ - @@ -198,4 +197,4 @@ - \ No newline at end of file + diff --git a/src/Libraries/NRefactory/Project/Src/Output/CodeDOM/CodeDOMOutputVisitor.cs b/src/Libraries/NRefactory/Project/Src/Output/CodeDOM/CodeDOMOutputVisitor.cs index b5734529f6..102b10a6f0 100644 --- a/src/Libraries/NRefactory/Project/Src/Output/CodeDOM/CodeDOMOutputVisitor.cs +++ b/src/Libraries/NRefactory/Project/Src/Output/CodeDOM/CodeDOMOutputVisitor.cs @@ -817,23 +817,8 @@ namespace ICSharpCode.NRefactory.Parser bool IsField(string type, string fieldName) { Type t = null; - Assembly asm = null; - t = this.GetType(type); - if (t == null) { - asm = typeof(System.Drawing.Point).Assembly; - t = asm.GetType(type); - } - - if (t == null) { - asm = typeof(System.Windows.Forms.Control).Assembly; - t = asm.GetType(type); - } - - if (t == null) { - asm = typeof(System.String).Assembly; - t = asm.GetType(type); - } + t = this.GetType(type); // search in all currently loaded assemblies bool isField = t != null && (t.IsEnum || t.GetField(fieldName) != null); if (!isField) { diff --git a/src/Libraries/NRefactory/Project/Src/Parser/AST/General/TypeLevel/ParameterDeclarationExpression.cs b/src/Libraries/NRefactory/Project/Src/Parser/AST/General/TypeLevel/ParameterDeclarationExpression.cs index 8237a52b7e..59b5af46ff 100644 --- a/src/Libraries/NRefactory/Project/Src/Parser/AST/General/TypeLevel/ParameterDeclarationExpression.cs +++ b/src/Libraries/NRefactory/Project/Src/Parser/AST/General/TypeLevel/ParameterDeclarationExpression.cs @@ -5,7 +5,7 @@ using System.Diagnostics; using System.Collections; namespace ICSharpCode.NRefactory.Parser.AST -{ +{ public class ParameterDeclarationExpression : Expression { TypeReference typeReference = TypeReference.Null; @@ -64,7 +64,8 @@ namespace ICSharpCode.NRefactory.Parser.AST public ParameterDeclarationExpression(TypeReference typeReference, string parameterName) { this.typeReference = typeReference; - Debug.Assert(parameterName != null); + if (parameterName == null || parameterName.Length == 0) + parameterName = "?"; this.parameterName = parameterName; this.paramModifier = ParamModifier.In; } @@ -72,7 +73,8 @@ namespace ICSharpCode.NRefactory.Parser.AST public ParameterDeclarationExpression(TypeReference typeReference, string parameterName, ParamModifier paramModifier) { this.typeReference = typeReference; - Debug.Assert(parameterName != null); + if (parameterName == null || parameterName.Length == 0) + parameterName = "?"; this.parameterName = parameterName; this.paramModifier = paramModifier; } @@ -80,7 +82,8 @@ namespace ICSharpCode.NRefactory.Parser.AST public ParameterDeclarationExpression(TypeReference typeReference, string parameterName, ParamModifier paramModifier, Expression defaultValue) { this.typeReference = typeReference; - Debug.Assert(parameterName != null); + if (parameterName == null || parameterName.Length == 0) + parameterName = "?"; this.parameterName = parameterName; this.paramModifier = paramModifier; this.DefaultValue = defaultValue; diff --git a/src/Libraries/NRefactory/Test/NRefactoryTests.csproj b/src/Libraries/NRefactory/Test/NRefactoryTests.csproj index be3d28f772..2c1c80a1b5 100644 --- a/src/Libraries/NRefactory/Test/NRefactoryTests.csproj +++ b/src/Libraries/NRefactory/Test/NRefactoryTests.csproj @@ -1,4 +1,4 @@ - + Debug AnyCPU @@ -32,10 +32,7 @@ - - - diff --git a/src/Libraries/NRefactory/Test/NRefactoryTests.csproj.user b/src/Libraries/NRefactory/Test/NRefactoryTests.csproj.user index c818d818c8..ef111b3b5e 100644 --- a/src/Libraries/NRefactory/Test/NRefactoryTests.csproj.user +++ b/src/Libraries/NRefactory/Test/NRefactoryTests.csproj.user @@ -1,4 +1,4 @@ - + \ No newline at end of file diff --git a/src/Libraries/NRefactory/Test/Parser/ParseUtilCSharp.cs b/src/Libraries/NRefactory/Test/Parser/ParseUtilCSharp.cs index 6b439e0a2e..7939443d68 100644 --- a/src/Libraries/NRefactory/Test/Parser/ParseUtilCSharp.cs +++ b/src/Libraries/NRefactory/Test/Parser/ParseUtilCSharp.cs @@ -21,11 +21,19 @@ namespace ICSharpCode.NRefactory.Tests.AST public class ParseUtilCSharp { public static object ParseGlobal(string program, Type type) + { + return ParseGlobal(program, type, false); + } + + public static object ParseGlobal(string program, Type type, bool expectError) { IParser parser = ParserFactory.CreateParser(SupportedLanguages.CSharp, new StringReader(program)); parser.Parse(); Assert.IsNotNull(parser.Errors); - Assert.AreEqual("", parser.Errors.ErrorOutput); + if (expectError) + Assert.IsTrue(parser.Errors.ErrorOutput.Length > 0, "There were errors expected, but parser finished without errors."); + else + Assert.AreEqual("", parser.Errors.ErrorOutput); Assert.IsNotNull(parser.CompilationUnit); Assert.IsNotNull(parser.CompilationUnit.Children); Assert.IsNotNull(parser.CompilationUnit.Children[0]); @@ -36,7 +44,12 @@ namespace ICSharpCode.NRefactory.Tests.AST public static object ParseTypeMember(string typeMember, Type type) { - TypeDeclaration td = (TypeDeclaration)ParseGlobal("class MyClass {" + typeMember + "}", typeof(TypeDeclaration)); + return ParseTypeMember(typeMember, type, false); + } + + public static object ParseTypeMember(string typeMember, Type type, bool expectError) + { + TypeDeclaration td = (TypeDeclaration)ParseGlobal("class MyClass {" + typeMember + "}", typeof(TypeDeclaration), expectError); Assert.IsTrue(td.Children.Count > 0); Assert.IsTrue(type.IsAssignableFrom(td.Children[0].GetType()), String.Format("Parsed expression was {0} instead of {1} ({2})", td.GetType(), type, td)); return td.Children[0]; diff --git a/src/Libraries/NRefactory/Test/Parser/TypeLevel/MethodDeclarationTests.cs b/src/Libraries/NRefactory/Test/Parser/TypeLevel/MethodDeclarationTests.cs index 941c968bc6..30ed1d89fe 100644 --- a/src/Libraries/NRefactory/Test/Parser/TypeLevel/MethodDeclarationTests.cs +++ b/src/Libraries/NRefactory/Test/Parser/TypeLevel/MethodDeclarationTests.cs @@ -3,7 +3,7 @@ * User: Omnibrain * Date: 13.09.2004 * Time: 19:54 - * + * * To change this template use Tools | Options | Coding | Edit Standard Headers. */ using System; @@ -28,10 +28,19 @@ namespace ICSharpCode.NRefactory.Tests.AST Assert.AreEqual("void", md.TypeReference.Type); Assert.AreEqual(0, md.Parameters.Count); } + + [Test] + public void CSharpMethodWithUnnamedParameterDeclarationTest() + { + MethodDeclaration md = (MethodDeclaration)ParseUtilCSharp.ParseTypeMember("void MyMethod(int) {} ", typeof(MethodDeclaration), true); + Assert.AreEqual("void", md.TypeReference.Type); + Assert.AreEqual(1, md.Parameters.Count); + Assert.AreEqual("?", ((ParameterDeclarationExpression)md.Parameters[0]).ParameterName); + } #endregion #region VB.NET - // TODO - #endregion + // TODO + #endregion } } diff --git a/src/Main/Base/Project/Src/Gui/Pads/DefinitionViewPad.cs b/src/Main/Base/Project/Src/Gui/Pads/DefinitionViewPad.cs index 6d3b68f542..f667b15281 100644 --- a/src/Main/Base/Project/Src/Gui/Pads/DefinitionViewPad.cs +++ b/src/Main/Base/Project/Src/Gui/Pads/DefinitionViewPad.cs @@ -38,9 +38,22 @@ namespace ICSharpCode.SharpDevelop.Gui ctl = new TextEditorControl(); ctl.Document.ReadOnly = true; ctl.TextEditorProperties = new SharpDevelopTextEditorProperties(); + ctl.ActiveTextAreaControl.TextArea.DoubleClick += OnDoubleClick; ParserService.ParserUpdateStepFinished += UpdateTick; } + void OnDoubleClick(object sender, EventArgs e) + { + string fileName = ctl.FileName; + if (fileName != null) { + Caret caret = ctl.ActiveTextAreaControl.Caret; + FileService.JumpToFilePosition(fileName, caret.Line, caret.Column); + + // refresh DefinitionView to show the definition of the expression that was double-clicked + UpdateTick(null, null); + } + } + void UpdateTick(object sender, ParserUpdateStepEventArgs e) { if (!this.IsVisible) return; @@ -58,13 +71,17 @@ namespace ICSharpCode.SharpDevelop.Gui ITextEditorControlProvider provider = window.ActiveViewContent as ITextEditorControlProvider; if (provider == null) return null; TextEditorControl ctl = provider.TextEditorControl; - if (ctl.FileName != e.FileName) return null; - IExpressionFinder expressionFinder = ParserService.GetExpressionFinder(e.FileName); + + // e might be null when this is a manually triggered update + string fileName = (e == null) ? ctl.FileName : e.FileName; + if (ctl.FileName != fileName) return null; + IExpressionFinder expressionFinder = ParserService.GetExpressionFinder(fileName); if (expressionFinder == null) return null; Caret caret = ctl.ActiveTextAreaControl.Caret; - string expr = expressionFinder.FindFullExpression(e.Content, caret.Offset); + string content = (e == null) ? ctl.Text : e.Content; + string expr = expressionFinder.FindFullExpression(content, caret.Offset); if (expr == null) return null; - return ParserService.Resolve(expr, caret.Line, caret.Column, e.FileName, e.Content); + return ParserService.Resolve(expr, caret.Line, caret.Column, fileName, content); } delegate void OpenFileDelegate(FilePosition pos); @@ -97,6 +114,7 @@ namespace ICSharpCode.SharpDevelop.Gui { ParserService.ParserUpdateStepFinished -= UpdateTick; ctl.Dispose(); + base.Dispose(); } } }