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)