diff --git a/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Service/SetCurrentStatementCommand.cs b/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Service/SetCurrentStatementCommand.cs index 15032202af..ca1a76dcab 100644 --- a/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Service/SetCurrentStatementCommand.cs +++ b/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Service/SetCurrentStatementCommand.cs @@ -1,9 +1,9 @@ -/* - * Created by SharpDevelop. - * User: Daniel Grunwald - * Date: 11.11.2005 - * Time: 23:48 - */ +// +// 2002-2005 AlphaSierraPapa +// GNU General Public License +// +// $Revision$ +// using System; using ICSharpCode.Core; diff --git a/src/Main/Base/Project/Src/Dom/Implementations/DefaultReturnType.cs b/src/Main/Base/Project/Src/Dom/Implementations/DefaultReturnType.cs index c868762a52..8c3dc935ee 100644 --- a/src/Main/Base/Project/Src/Dom/Implementations/DefaultReturnType.cs +++ b/src/Main/Base/Project/Src/Dom/Implementations/DefaultReturnType.cs @@ -27,6 +27,11 @@ namespace ICSharpCode.SharpDevelop.Dom this.c = c; } + public override string ToString() + { + return c.FullyQualifiedName; + } + public override int TypeParameterCount { get { return c.TypeParameters.Count; diff --git a/src/Main/Base/Project/Src/Dom/MemberLookupHelper.cs b/src/Main/Base/Project/Src/Dom/MemberLookupHelper.cs index 8d5b8c8b03..93415dd5f8 100644 --- a/src/Main/Base/Project/Src/Dom/MemberLookupHelper.cs +++ b/src/Main/Base/Project/Src/Dom/MemberLookupHelper.cs @@ -389,7 +389,7 @@ namespace ICSharpCode.SharpDevelop.Dom return null; } - static bool InferTypeArgument(IReturnType expectedArgument, IReturnType passedArgument, IReturnType[] outputArray) + public static bool InferTypeArgument(IReturnType expectedArgument, IReturnType passedArgument, IReturnType[] outputArray) { if (passedArgument == null) return true; // TODO: NullTypeReference if (expectedArgument != null && expectedArgument.ArrayDimensions > 0) { @@ -559,6 +559,24 @@ namespace ICSharpCode.SharpDevelop.Dom // from array to other array type return ConversionExists(from.ArrayElementType, to.ArrayElementType); } + IList fromTypeArguments = from.TypeArguments; + IList toTypeArguments = to.TypeArguments; + if (fromTypeArguments != null && toTypeArguments != null) { + if (from.FullyQualifiedName == to.FullyQualifiedName) { + if (fromTypeArguments.Count == toTypeArguments.Count) { + for (int i = 0; i < fromTypeArguments.Count; i++) { + if (fromTypeArguments[i] == toTypeArguments[i]) + continue; + if (object.Equals(fromTypeArguments[i], toTypeArguments[i])) + continue; + if (!(toTypeArguments[i] is GenericReturnType)) + return false; + } + return true; + } + } + } + return false; } #endregion diff --git a/src/Main/Base/Project/Src/Dom/NRefactoryResolver/NRefactoryResolver.cs b/src/Main/Base/Project/Src/Dom/NRefactoryResolver/NRefactoryResolver.cs index a4ab915e39..b474ffb1d8 100644 --- a/src/Main/Base/Project/Src/Dom/NRefactoryResolver/NRefactoryResolver.cs +++ b/src/Main/Base/Project/Src/Dom/NRefactoryResolver/NRefactoryResolver.cs @@ -594,6 +594,15 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver if (IsSameName(identifier, method.Name)) return new MethodResolveResult(callingClass, callingMember, type, identifier); } + if (languageProperties.SupportsExtensionMethods && callingClass != null) { + ArrayList list = new ArrayList(); + ResolveResult.AddExtensions(languageProperties, list, callingClass, type); + foreach (IMethodOrProperty mp in list) { + if (mp is IMethod && IsSameName(mp.Name, identifier)) { + return new MethodResolveResult(callingClass, callingMember, type, identifier); + } + } + } return null; } #endregion @@ -761,6 +770,18 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver methods.Add(m); } } + if (methods.Count == 0) { + if (languageProperties.SupportsExtensionMethods && callingClass != null) { + ArrayList list = new ArrayList(); + ResolveResult.AddExtensions(languageProperties, list, callingClass, type); + foreach (IMethodOrProperty mp in list) { + if (mp is IMethod && IsSameName(mp.Name, memberName)) { + methods.Add((IMethod)mp); + } + } + } + } + return methods; } #endregion diff --git a/src/Main/Base/Project/Src/Dom/ReflectionLayer/ReflectionMethod.cs b/src/Main/Base/Project/Src/Dom/ReflectionLayer/ReflectionMethod.cs index 3f363c22f2..603d6f8735 100644 --- a/src/Main/Base/Project/Src/Dom/ReflectionLayer/ReflectionMethod.cs +++ b/src/Main/Base/Project/Src/Dom/ReflectionLayer/ReflectionMethod.cs @@ -36,6 +36,16 @@ namespace ICSharpCode.SharpDevelop.Dom } } + if (methodBase.IsStatic) { + foreach (CustomAttributeData data in CustomAttributeData.GetCustomAttributes(methodBase)) { + string attributeName = data.Constructor.DeclaringType.FullName; + if (attributeName == "System.Runtime.CompilerServices.ExtensionAttribute" + || attributeName == "Boo.Lang.ExtensionAttribute") + { + this.IsExtensionMethod = true; + } + } + } ModifierEnum modifiers = ModifierEnum.None; if (methodBase.IsStatic) { modifiers |= ModifierEnum.Static; diff --git a/src/Main/Base/Project/Src/Dom/ResolveResult.cs b/src/Main/Base/Project/Src/Dom/ResolveResult.cs index 43c32c1dc8..1ef366ee91 100644 --- a/src/Main/Base/Project/Src/Dom/ResolveResult.cs +++ b/src/Main/Base/Project/Src/Dom/ResolveResult.cs @@ -130,6 +130,7 @@ namespace ICSharpCode.SharpDevelop.Dom ArrayList list = new ArrayList(); IMethod dummyMethod = new DefaultMethod("dummy", ReflectionReturnType.Void, ModifierEnum.Static, DomRegion.Empty, DomRegion.Empty, callingClass); NRefactoryResolver.NRefactoryResolver.AddContentsFromCalling(list, callingClass, dummyMethod); + NRefactoryResolver.NRefactoryResolver.AddImportedNamespaceContents(list, callingClass.CompilationUnit, callingClass); bool searchExtensionsInClasses = language.SearchExtensionsInClasses; foreach (object o in list) { @@ -138,12 +139,12 @@ namespace ICSharpCode.SharpDevelop.Dom } else if (searchExtensionsInClasses && o is IClass) { IClass c = o as IClass; if (c.HasExtensionMethods) { - if (supportsExtensionMethods) { + if (supportsExtensionProperties) { foreach (IProperty p in c.Properties) { TryAddExtension(language, res, p, resolvedType); } } - if (supportsExtensionProperties) { + if (supportsExtensionMethods) { foreach (IMethod m in c.Methods) { TryAddExtension(language, res, m, resolvedType); } @@ -171,6 +172,21 @@ namespace ICSharpCode.SharpDevelop.Dom } // now add the extension method if it fits the type if (MemberLookupHelper.ConversionExists(resolvedType, ext.Parameters[0].ReturnType)) { + IMethod method = ext as IMethod; + if (method != null && method.TypeParameters.Count > 0) { + IReturnType[] typeArguments = new IReturnType[method.TypeParameters.Count]; + MemberLookupHelper.InferTypeArgument(method.Parameters[0].ReturnType, resolvedType, typeArguments); + for (int i = 0; i < typeArguments.Length; i++) { + if (typeArguments[i] != null) { + ext = (IMethod)ext.Clone(); + ext.ReturnType = ConstructedReturnType.TranslateType(ext.ReturnType, typeArguments, true); + for (int j = 0; j < ext.Parameters.Count; ++j) { + ext.Parameters[j].ReturnType = ConstructedReturnType.TranslateType(ext.Parameters[j].ReturnType, typeArguments, true); + } + break; + } + } + } res.Add(ext); } } diff --git a/src/Main/Base/Project/Src/Services/ParserService/ParserService.cs b/src/Main/Base/Project/Src/Services/ParserService/ParserService.cs index 89ec57f14a..3512200b18 100644 --- a/src/Main/Base/Project/Src/Services/ParserService/ParserService.cs +++ b/src/Main/Base/Project/Src/Services/ParserService/ParserService.cs @@ -258,6 +258,11 @@ namespace ICSharpCode.Core return new object[] { activeViewContent, activeWorkbenchWindow.ViewContent }; } + public static void ParseCurrentViewContent() + { + ParserUpdateStep(); + } + static void ParserUpdateStep() { object[] workbench = (object[])WorkbenchSingleton.SafeThreadCall(typeof(ParserService), "GetWorkbench"); diff --git a/src/Main/Base/Project/Src/TextEditor/Commands/ClassBookmarkMenuBuilder.cs b/src/Main/Base/Project/Src/TextEditor/Commands/ClassBookmarkMenuBuilder.cs index 1f69f0f278..b617d4d954 100644 --- a/src/Main/Base/Project/Src/TextEditor/Commands/ClassBookmarkMenuBuilder.cs +++ b/src/Main/Base/Project/Src/TextEditor/Commands/ClassBookmarkMenuBuilder.cs @@ -39,6 +39,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands ClassBookmark bookmark = (ClassBookmark)owner; c = bookmark.Class; } + List list = new List(); if (!FindReferencesAndRenameHelper.IsReadOnly(c)) { @@ -68,37 +69,34 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands return list.ToArray(); } - void AddImplementInterfaceCommands(IClass c, List list) + void AddImplementInterfaceCommandItems(List subItems, IClass c, bool explicitImpl) { CodeGenerator codeGen = c.ProjectContent.Language.CodeGenerator; - if (codeGen == null) return; - List subItems = new List(); foreach (IReturnType rt in c.BaseTypes) { IClass interf = rt.GetUnderlyingClass(); if (interf != null && interf.ClassType == ClassType.Interface) { EventHandler eh = delegate { IDocument d = GetDocument(c); if (d != null) - codeGen.ImplementInterface(rt, d, false, c); + codeGen.ImplementInterface(rt, d, explicitImpl, c); + ParserService.ParseCurrentViewContent(); }; subItems.Add(new MenuCommand(interf.Name, eh)); } } + } + + void AddImplementInterfaceCommands(IClass c, List list) + { + CodeGenerator codeGen = c.ProjectContent.Language.CodeGenerator; + if (codeGen == null) return; + List subItems = new List(); + AddImplementInterfaceCommandItems(subItems, c, false); if (subItems.Count > 0) { list.Add(new ICSharpCode.Core.Menu("${res:SharpDevelop.Refactoring.ImplementInterfaceImplicit}", subItems.ToArray())); subItems = new List(); } - foreach (IReturnType rt in c.BaseTypes) { - IClass interf = rt.GetUnderlyingClass(); - if (interf != null && interf.ClassType == ClassType.Interface) { - EventHandler eh = delegate { - IDocument d = GetDocument(c); - if (d != null) - codeGen.ImplementInterface(rt, d, true, c); - }; - subItems.Add(new MenuCommand(interf.Name, eh)); - } - } + AddImplementInterfaceCommandItems(subItems, c, true); if (subItems.Count > 0) { list.Add(new ICSharpCode.Core.Menu("${res:SharpDevelop.Refactoring.ImplementInterfaceExplicit}", subItems.ToArray())); } diff --git a/src/Main/Base/Project/Src/TextEditor/Commands/ClassMemberMenuBuilder.cs b/src/Main/Base/Project/Src/TextEditor/Commands/ClassMemberMenuBuilder.cs index a424e12668..7898b0c81c 100644 --- a/src/Main/Base/Project/Src/TextEditor/Commands/ClassMemberMenuBuilder.cs +++ b/src/Main/Base/Project/Src/TextEditor/Commands/ClassMemberMenuBuilder.cs @@ -134,6 +134,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands TextEditorControl textEditor = FindReferencesAndRenameHelper.JumpBehindDefinition(member); member.DeclaringType.ProjectContent.Language.CodeGenerator.CreateProperty(member, textEditor.Document, true, includeSetter); + ParserService.ParseCurrentViewContent(); } void CreateChangedEvent(object sender, EventArgs e) @@ -142,6 +143,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands IProperty member = (IProperty)item.Tag; TextEditorControl textEditor = FindReferencesAndRenameHelper.JumpBehindDefinition(member); member.DeclaringType.ProjectContent.Language.CodeGenerator.CreateChangedEvent(member, textEditor.Document); + ParserService.ParseCurrentViewContent(); } void CreateOnEventMethod(object sender, EventArgs e) @@ -150,6 +152,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands IEvent member = (IEvent)item.Tag; TextEditorControl textEditor = FindReferencesAndRenameHelper.JumpBehindDefinition(member); member.DeclaringType.ProjectContent.Language.CodeGenerator.CreateOnEventMethod(member, textEditor.Document); + ParserService.ParseCurrentViewContent(); } void GotoTagMember(object sender, EventArgs e)