Browse Source

Improved code completion for extension methods (currently only enabled for Boo).

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@739 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Daniel Grunwald 20 years ago
parent
commit
b100ff1fb0
  1. 12
      src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Service/SetCurrentStatementCommand.cs
  2. 5
      src/Main/Base/Project/Src/Dom/Implementations/DefaultReturnType.cs
  3. 20
      src/Main/Base/Project/Src/Dom/MemberLookupHelper.cs
  4. 21
      src/Main/Base/Project/Src/Dom/NRefactoryResolver/NRefactoryResolver.cs
  5. 10
      src/Main/Base/Project/Src/Dom/ReflectionLayer/ReflectionMethod.cs
  6. 20
      src/Main/Base/Project/Src/Dom/ResolveResult.cs
  7. 5
      src/Main/Base/Project/Src/Services/ParserService/ParserService.cs
  8. 28
      src/Main/Base/Project/Src/TextEditor/Commands/ClassBookmarkMenuBuilder.cs
  9. 3
      src/Main/Base/Project/Src/TextEditor/Commands/ClassMemberMenuBuilder.cs

12
src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Service/SetCurrentStatementCommand.cs

@ -1,9 +1,9 @@ @@ -1,9 +1,9 @@
/*
* Created by SharpDevelop.
* User: Daniel Grunwald
* Date: 11.11.2005
* Time: 23:48
*/
// <file>
// <copyright see="prj:///doc/copyright.txt">2002-2005 AlphaSierraPapa</copyright>
// <license see="prj:///doc/license.txt">GNU General Public License</license>
// <owner name="Daniel Grunwald" email="daniel@danielgrunwald.de"/>
// <version>$Revision$</version>
// </file>
using System;
using ICSharpCode.Core;

5
src/Main/Base/Project/Src/Dom/Implementations/DefaultReturnType.cs

@ -27,6 +27,11 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -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;

20
src/Main/Base/Project/Src/Dom/MemberLookupHelper.cs

@ -389,7 +389,7 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -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 @@ -559,6 +559,24 @@ namespace ICSharpCode.SharpDevelop.Dom
// from array to other array type
return ConversionExists(from.ArrayElementType, to.ArrayElementType);
}
IList<IReturnType> fromTypeArguments = from.TypeArguments;
IList<IReturnType> 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

21
src/Main/Base/Project/Src/Dom/NRefactoryResolver/NRefactoryResolver.cs

@ -594,6 +594,15 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver @@ -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 @@ -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

10
src/Main/Base/Project/Src/Dom/ReflectionLayer/ReflectionMethod.cs

@ -36,6 +36,16 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -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;

20
src/Main/Base/Project/Src/Dom/ResolveResult.cs

@ -130,6 +130,7 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -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 @@ -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 @@ -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);
}
}

5
src/Main/Base/Project/Src/Services/ParserService/ParserService.cs

@ -258,6 +258,11 @@ namespace ICSharpCode.Core @@ -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");

28
src/Main/Base/Project/Src/TextEditor/Commands/ClassBookmarkMenuBuilder.cs

@ -39,6 +39,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands @@ -39,6 +39,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands
ClassBookmark bookmark = (ClassBookmark)owner;
c = bookmark.Class;
}
List<ToolStripItem> list = new List<ToolStripItem>();
if (!FindReferencesAndRenameHelper.IsReadOnly(c)) {
@ -68,37 +69,34 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands @@ -68,37 +69,34 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands
return list.ToArray();
}
void AddImplementInterfaceCommands(IClass c, List<ToolStripItem> list)
void AddImplementInterfaceCommandItems(List<ToolStripItem> subItems, IClass c, bool explicitImpl)
{
CodeGenerator codeGen = c.ProjectContent.Language.CodeGenerator;
if (codeGen == null) return;
List<ToolStripItem> subItems = new List<ToolStripItem>();
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<ToolStripItem> list)
{
CodeGenerator codeGen = c.ProjectContent.Language.CodeGenerator;
if (codeGen == null) return;
List<ToolStripItem> subItems = new List<ToolStripItem>();
AddImplementInterfaceCommandItems(subItems, c, false);
if (subItems.Count > 0) {
list.Add(new ICSharpCode.Core.Menu("${res:SharpDevelop.Refactoring.ImplementInterfaceImplicit}", subItems.ToArray()));
subItems = new List<ToolStripItem>();
}
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()));
}

3
src/Main/Base/Project/Src/TextEditor/Commands/ClassMemberMenuBuilder.cs

@ -134,6 +134,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands @@ -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 @@ -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 @@ -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)

Loading…
Cancel
Save