From e5a82b82bc4a2d1a9c012fcc977b9f6b0f953cfe Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Fri, 15 Jul 2005 14:35:56 +0000 Subject: [PATCH] Fixed ctrl-space code completion. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@181 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Project/ICSharpCode.SharpDevelop.csproj | 3 +- src/Main/Base/Project/Src/Dom/IClass.cs | 11 ++-- src/Main/Base/Project/Src/Dom/IResolver.cs | 2 +- .../Src/Dom/Implementations/DefaultClass.cs | 23 ++------ .../NRefactoryResolver/NRefactoryResolver.cs | 59 ++++++++++++------- .../Services/ParserService/ParserService.cs | 10 +--- .../CodeCompletionDataProvider.cs | 6 +- 7 files changed, 55 insertions(+), 59 deletions(-) diff --git a/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj b/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj index 1489ee3620..676c7ceb18 100644 --- a/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj +++ b/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj @@ -200,7 +200,7 @@ Form - Component + Form Form @@ -669,6 +669,7 @@ + diff --git a/src/Main/Base/Project/Src/Dom/IClass.cs b/src/Main/Base/Project/Src/Dom/IClass.cs index 369204844a..3a4ab280ec 100644 --- a/src/Main/Base/Project/Src/Dom/IClass.cs +++ b/src/Main/Base/Project/Src/Dom/IClass.cs @@ -1,4 +1,4 @@ -// +// // // // @@ -102,14 +102,13 @@ namespace ICSharpCode.SharpDevelop.Dom } IClass GetInnermostClass(int caretLine, int caretColumn); - //List GetAccessibleTypes(IClass callingClass); - //bool IsTypeInInheritanceTree(IClass possibleBaseClass); + List GetAccessibleTypes(IClass callingClass); //IMember SearchMember(string memberName); - /* - ArrayList GetAccessibleMembers(IClass callingClass, bool showStatic); - */ + bool IsTypeInInheritanceTree(IClass possibleBaseClass); + + List GetAccessibleMembers(IClass callingClass, bool showStatic); } } diff --git a/src/Main/Base/Project/Src/Dom/IResolver.cs b/src/Main/Base/Project/Src/Dom/IResolver.cs index 188126b56b..8e1861c40e 100644 --- a/src/Main/Base/Project/Src/Dom/IResolver.cs +++ b/src/Main/Base/Project/Src/Dom/IResolver.cs @@ -30,6 +30,6 @@ namespace ICSharpCode.SharpDevelop.Dom string fileName, string fileContent); - ArrayList CtrlSpace(int caretLine, int caretColumn, string fileName); + ArrayList CtrlSpace(int caretLine, int caretColumn, string fileName, string fileContent); } } diff --git a/src/Main/Base/Project/Src/Dom/Implementations/DefaultClass.cs b/src/Main/Base/Project/Src/Dom/Implementations/DefaultClass.cs index 822588899c..c9457b342a 100644 --- a/src/Main/Base/Project/Src/Dom/Implementations/DefaultClass.cs +++ b/src/Main/Base/Project/Src/Dom/Implementations/DefaultClass.cs @@ -1,4 +1,4 @@ -// +// // // // @@ -280,7 +280,6 @@ namespace ICSharpCode.SharpDevelop.Dom } } - /* public bool IsTypeInInheritanceTree(IClass possibleBaseClass) { if (possibleBaseClass == null) { @@ -299,7 +298,7 @@ namespace ICSharpCode.SharpDevelop.Dom } return false; } - */ + /* public IMember SearchMember(string memberName) { @@ -366,7 +365,6 @@ namespace ICSharpCode.SharpDevelop.Dom return this; } - /* public List GetAccessibleTypes(IClass callingClass) { List types = new List(); @@ -385,26 +383,14 @@ namespace ICSharpCode.SharpDevelop.Dom return types; } - - public ArrayList GetAccessibleMembers(IClass callingClass, bool showStatic) + public List GetAccessibleMembers(IClass callingClass, bool showStatic) { - ArrayList members = new ArrayList(); - - DateTime now = DateTime.Now; - + List members = new List(); bool isClassInInheritanceTree = false; if (callingClass != null) isClassInInheritanceTree = callingClass.IsTypeInInheritanceTree(this); - if (showStatic) { - foreach (IClass c in InnerClasses) { - if (c.IsAccessible(callingClass, isClassInInheritanceTree)) { - members.Add(c); - } - } - } - foreach (IProperty p in Properties) { if (p.MustBeShown(callingClass, showStatic, isClassInInheritanceTree)) { members.Add(p); @@ -445,7 +431,6 @@ namespace ICSharpCode.SharpDevelop.Dom return members; } - */ public class ClassInheritanceEnumerator : IEnumerator, IEnumerable { diff --git a/src/Main/Base/Project/Src/Dom/NRefactoryResolver/NRefactoryResolver.cs b/src/Main/Base/Project/Src/Dom/NRefactoryResolver/NRefactoryResolver.cs index b8b737e73e..a011f0b734 100644 --- a/src/Main/Base/Project/Src/Dom/NRefactoryResolver/NRefactoryResolver.cs +++ b/src/Main/Base/Project/Src/Dom/NRefactoryResolver/NRefactoryResolver.cs @@ -659,7 +659,7 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver #endregion #endregion - public ArrayList CtrlSpace(int caretLine, int caretColumn, string fileName) + public ArrayList CtrlSpace(int caretLine, int caretColumn, string fileName, string fileContent) { ArrayList result; if (language == SupportedLanguages.VBNet) { @@ -671,34 +671,51 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver result = new ArrayList(TypeReference.GetPrimitiveTypes()); } ParseInformation parseInfo = ParserService.GetParseInformation(fileName); - ICSharpCode.NRefactory.Parser.AST.CompilationUnit fileCompilationUnit = parseInfo.MostRecentCompilationUnit.Tag as ICSharpCode.NRefactory.Parser.AST.CompilationUnit; - if (fileCompilationUnit == null) { + if (parseInfo == null) { return null; } + + this.caretLine = caretLine; + this.caretColumn = caretColumn; + lookupTableVisitor = new LookupTableVisitor(languageProperties.NameComparer); - lookupTableVisitor.Visit(fileCompilationUnit, null); - NRefactoryASTConvertVisitor cSharpVisitor = new NRefactoryASTConvertVisitor(parseInfo.MostRecentCompilationUnit != null ? parseInfo.MostRecentCompilationUnit.ProjectContent : null); - cu = (ICompilationUnit)cSharpVisitor.Visit(fileCompilationUnit, null); + cu = parseInfo.MostRecentCompilationUnit; + if (cu != null) { callingClass = cu.GetInnermostClass(caretLine, caretColumn); - if (callingClass != null) { - IMethod method = callingMember as IMethod; - if (method != null) { - foreach (IParameter p in method.Parameters) { - result.Add(new DefaultField(p.ReturnType, p.Name, ModifierEnum.None, method.Region, callingClass)); - } - } - result.AddRange(projectContent.GetNamespaceContents(callingClass.Namespace)); - bool inStatic = true; - if (callingMember != null) - inStatic = callingMember.IsStatic; - //result.AddRange(callingClass.GetAccessibleMembers(callingClass, inStatic).ToArray()); - //if (inStatic == false) { - // result.AddRange(callingClass.GetAccessibleMembers(callingClass, !inStatic).ToArray()); - //} + cu.FileName = fileName; + } + + callingMember = GetCurrentMember(); + if (callingMember != null) { + System.IO.TextReader content = ExtractMethod(fileContent, callingMember); + if (content != null) { + ICSharpCode.NRefactory.Parser.IParser p = ParserFactory.CreateParser(language, content); + p.Parse(); + lookupTableVisitor.Visit(p.CompilationUnit, null); } } + + IMethod method = callingMember as IMethod; + if (method != null) { + foreach (IParameter p in method.Parameters) { + result.Add(new DefaultField(p.ReturnType, p.Name, ModifierEnum.None, method.Region, callingClass)); + } + } + if (callingClass != null) { + result.AddRange(projectContent.GetNamespaceContents(callingClass.Namespace)); + } + + bool inStatic = true; + if (callingMember != null) + inStatic = callingMember.IsStatic; + + if (!inStatic) { + result.AddRange(callingClass.GetAccessibleMembers(callingClass, false)); + } + result.AddRange(callingClass.GetAccessibleMembers(callingClass, true)); + result.AddRange(callingClass.GetAccessibleTypes(callingClass)); foreach (KeyValuePair> pair in lookupTableVisitor.Variables) { if (pair.Value != null && pair.Value.Count > 0) { foreach (LocalLookupVariable v in pair.Value) { diff --git a/src/Main/Base/Project/Src/Services/ParserService/ParserService.cs b/src/Main/Base/Project/Src/Services/ParserService/ParserService.cs index be7b290c9b..dbe97790ed 100644 --- a/src/Main/Base/Project/Src/Services/ParserService/ParserService.cs +++ b/src/Main/Base/Project/Src/Services/ParserService/ParserService.cs @@ -413,11 +413,11 @@ namespace ICSharpCode.Core //////////////////////////////////// - public static ArrayList CtrlSpace(int caretLine, int caretColumn, string fileName) + public static ArrayList CtrlSpace(int caretLine, int caretColumn, string fileName, string fileContent) { IParser parser = GetParser(fileName); if (parser != null) { - return parser.CreateResolver().CtrlSpace(caretLine, caretColumn, fileName); + return parser.CreateResolver().CtrlSpace(caretLine, caretColumn, fileName, fileContent); } return null; } @@ -428,17 +428,11 @@ namespace ICSharpCode.Core string fileName, string fileContent) { - // added exception handling here to prevent silly parser exceptions from - // being thrown and corrupting the textarea control - //try { IParser parser = GetParser(fileName); if (parser != null) { return parser.CreateResolver().Resolve(expression, caretLineNumber, caretColumn, fileName, fileContent); } return null; - //} catch { -// return null; - //} } static void OnParseInformationUpdated(ParseInformationEventArgs e) diff --git a/src/Main/Base/Project/Src/TextEditor/Gui/Editor/CompletionWindow/CodeCompletionDataProvider.cs b/src/Main/Base/Project/Src/TextEditor/Gui/Editor/CompletionWindow/CodeCompletionDataProvider.cs index d0936a8511..7f9f86dc66 100644 --- a/src/Main/Base/Project/Src/TextEditor/Gui/Editor/CompletionWindow/CodeCompletionDataProvider.cs +++ b/src/Main/Base/Project/Src/TextEditor/Gui/Editor/CompletionWindow/CodeCompletionDataProvider.cs @@ -1,4 +1,4 @@ -// +// // // // @@ -83,7 +83,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor if (charTyped != '\0') { preSelection = null; } - AddResolveResults(ParserService.CtrlSpace(caretLineNumber, caretColumn, fileName)); + AddResolveResults(ParserService.CtrlSpace(caretLineNumber, caretColumn, fileName, document.TextContent)); return (ICompletionData[])completionData.ToArray(typeof(ICompletionData)); } @@ -100,7 +100,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor if (charTyped != '\0') { preSelection = null; } - AddResolveResults(ParserService.CtrlSpace(caretLineNumber, caretColumn, fileName)); + AddResolveResults(ParserService.CtrlSpace(caretLineNumber, caretColumn, fileName, document.TextContent)); return (ICompletionData[])completionData.ToArray(typeof(ICompletionData)); } }