Author: fejj
Date: 2007-05-25 14:44:34 -0400 (Fri, 25 May 2007)
New Revision: 77964
Modified:
trunk/monodevelop/Core/src/MonoDevelop.Projects/ChangeLog
trunk/monodevelop/Core/src/MonoDevelop.Projects/MonoDevelop.Projects.CodeGeneration/BaseRefactorer.cs
trunk/monodevelop/Core/src/MonoDevelop.Projects/MonoDevelop.Projects.CodeGeneration/CodeRefactorer.cs
trunk/monodevelop/Core/src/MonoDevelop.Projects/MonoDevelop.Projects.CodeGeneration/IRefactorer.cs
Log:
2007-05-25 Jeffrey Stedfast <[EMAIL PROTECTED]>
* MonoDevelop.Projects.CodeGeneration/CodeRefactorer.cs
(ImplementMember): New method like AddMember(), but takes an
IMember argument instead.
(ImplementInterface): New method to implement an interface in
the specified class.
* MonoDevelop.Projects.CodeGeneration/IRefactorer.cs: Added an
ImplementMember() method.
* MonoDevelop.Projects.CodeGeneration/BaseRefactorer.cs
(GenerateCodeFromMember): Fix up methods to have a space before
the open paran of the argument list.
(ImplementMember): Implemented.
Modified: trunk/monodevelop/Core/src/MonoDevelop.Projects/ChangeLog
===================================================================
--- trunk/monodevelop/Core/src/MonoDevelop.Projects/ChangeLog 2007-05-25
18:33:29 UTC (rev 77963)
+++ trunk/monodevelop/Core/src/MonoDevelop.Projects/ChangeLog 2007-05-25
18:44:34 UTC (rev 77964)
@@ -1,3 +1,19 @@
+2007-05-25 Jeffrey Stedfast <[EMAIL PROTECTED]>
+
+ * MonoDevelop.Projects.CodeGeneration/CodeRefactorer.cs
+ (ImplementMember): New method like AddMember(), but takes an
+ IMember argument instead.
+ (ImplementInterface): New method to implement an interface in
+ the specified class.
+
+ * MonoDevelop.Projects.CodeGeneration/IRefactorer.cs: Added an
+ ImplementMember() method.
+
+ * MonoDevelop.Projects.CodeGeneration/BaseRefactorer.cs
+ (GenerateCodeFromMember): Fix up methods to have a space before
+ the open paran of the argument list.
+ (ImplementMember): Implemented.
+
2007-05-25 Lluis Sanchez Gual <[EMAIL PROTECTED]>
* MonoDevelop.Projects/ProjectService.cs,
Modified:
trunk/monodevelop/Core/src/MonoDevelop.Projects/MonoDevelop.Projects.CodeGeneration/BaseRefactorer.cs
===================================================================
---
trunk/monodevelop/Core/src/MonoDevelop.Projects/MonoDevelop.Projects.CodeGeneration/BaseRefactorer.cs
2007-05-25 18:33:29 UTC (rev 77963)
+++
trunk/monodevelop/Core/src/MonoDevelop.Projects/MonoDevelop.Projects.CodeGeneration/BaseRefactorer.cs
2007-05-25 18:44:34 UTC (rev 77964)
@@ -98,6 +98,78 @@
return FindGeneratedMember (ctx, buffer, cls, member);
}
+ protected CodeTypeReference ReturnTypeToDom (IReturnType rtype)
+ {
+ CodeTypeReference [] argTypes = null;
+ CodeTypeReference typeRef = null;
+ int i;
+
+ ReturnTypeList genericArgs = rtype.GenericArguments;
+ if (genericArgs != null && genericArgs.Count > 0) {
+ argTypes = new CodeTypeReference
[genericArgs.Count];
+ for (i = 0; i < genericArgs.Count; i++)
+ argTypes[i] = ReturnTypeToDom
(genericArgs[i]);
+ }
+
+ if (argTypes != null)
+ typeRef = new CodeTypeReference
(rtype.FullyQualifiedName, argTypes);
+ else
+ typeRef = new CodeTypeReference
(rtype.FullyQualifiedName);
+
+ if (rtype.ArrayCount == 0)
+ return typeRef;
+
+ int [] dim = rtype.ArrayDimensions;
+ for (i = 0; i < dim.Length; i++)
+ typeRef = new CodeTypeReference (typeRef,
dim[i]);
+
+ return typeRef;
+ }
+
+ public virtual IMember ImplementMember (RefactorerContext ctx,
IClass cls, string prefix, IMember member)
+ {
+ CodeTypeMember m;
+
+ if (member is IEvent) {
+ CodeMemberEvent mEvent = new CodeMemberEvent ();
+ m = (CodeTypeMember) mEvent;
+
+ mEvent.Type = ReturnTypeToDom
(member.ReturnType);
+ } else if (member is IMethod) {
+ CodeMemberMethod mMethod = new CodeMemberMethod
();
+ IMethod method = (IMethod) member;
+ m = (CodeMemberMethod) mMethod;
+
+ mMethod.ReturnType = ReturnTypeToDom
(member.ReturnType);
+
+ foreach (IParameter param in method.Parameters)
{
+ CodeParameterDeclarationExpression par;
+ par = new
CodeParameterDeclarationExpression (ReturnTypeToDom (param.ReturnType),
param.Name);
+ mMethod.Parameters.Add (par);
+ }
+ } else if (member is IProperty) {
+ CodeMemberProperty mProperty = new
CodeMemberProperty ();
+ IProperty property = (IProperty) member;
+ m = (CodeMemberProperty) mProperty;
+
+ mProperty.HasGet = property.CanGet;
+ mProperty.HasSet = property.CanSet;
+
+ mProperty.Type = ReturnTypeToDom
(member.ReturnType);
+ } else {
+ return null;
+ }
+
+ if (prefix != null)
+ m.Name = prefix + member.Name;
+ else
+ m.Name = member.Name;
+
+ m.Attributes = MemberAttributes.Public;
+
+ return AddMember (ctx, cls, m);
+ }
+
public virtual void RemoveMember (RefactorerContext ctx, IClass
cls, IMember member)
{
IEditableTextFile buffer = null;
@@ -448,6 +520,9 @@
int i = code.IndexOf ('{');
int j = code.LastIndexOf ('}');
code = code.Substring (i+1, j-i-1);
+ if (member is CodeMemberMethod)
+ if ((i = code.IndexOf ('(')) != -1)
+ code = code.Insert (i, " ");
return RemoveIndent (code);
}
Modified:
trunk/monodevelop/Core/src/MonoDevelop.Projects/MonoDevelop.Projects.CodeGeneration/CodeRefactorer.cs
===================================================================
---
trunk/monodevelop/Core/src/MonoDevelop.Projects/MonoDevelop.Projects.CodeGeneration/CodeRefactorer.cs
2007-05-25 18:33:29 UTC (rev 77963)
+++
trunk/monodevelop/Core/src/MonoDevelop.Projects/MonoDevelop.Projects.CodeGeneration/CodeRefactorer.cs
2007-05-25 18:44:34 UTC (rev 77964)
@@ -104,6 +104,132 @@
return m;
}
+ public IMember ImplementMember (IClass cls, string prefix,
IMember member)
+ {
+ RefactorerContext gctx = GetGeneratorContext (cls);
+ IRefactorer gen = GetGeneratorForClass (cls);
+ IMember m = gen.ImplementMember (gctx, cls, prefix,
member);
+ gctx.Save ();
+ return m;
+ }
+
+ string ExplicitNamePrefix (IParseInformation pinfo, IClass
klass, IClass iface)
+ {
+ if (iface.Namespace == klass.Namespace)
+ return iface.Name + ".";
+
+ string name = iface.FullyQualifiedName;
+ int maxLen = name.LastIndexOf ('.') - 1;
+
+ if (maxLen < 0)
+ return iface.Name + ".";
+
+ string longestMatch = null;
+
+ if (name.StartsWith (klass.Namespace + "."))
+ longestMatch = klass.Namespace;
+
+ if (pinfo != null && pinfo.BestCompilationUnit != null)
{
+ ICompilationUnit compilationUnit =
(ICompilationUnit) pinfo.BestCompilationUnit;
+ bool found = false;
+ string prefix;
+ IUsing use;
+ int i, j;
+
+ for (i = 0; i < compilationUnit.Usings.Count &&
!found; i++) {
+ if ((use = compilationUnit.Usings[i])
== null)
+ continue;
+
+ for (j = 0; j < use.Usings.Count; j++) {
+ prefix = use.Usings[j];
+ if (name.StartsWith (prefix +
".")) {
+ if (longestMatch ==
null || prefix.Length > longestMatch.Length) {
+ longestMatch =
prefix;
+ if
(longestMatch.Length == maxLen) {
+ found =
true;
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ if (longestMatch != null)
+ return name.Substring (longestMatch.Length + 1)
+ ".";
+
+ return name + ".";
+ }
+
+ public void ImplementInterface (IParseInformation pinfo, IClass
klass, IClass iface, bool explicitly)
+ {
+ RefactorerContext gctx = GetGeneratorContext (klass);
+ IRefactorer gen = GetGeneratorForClass (klass);
+ bool alreadyImplemented;
+ string prefix = null;
+ IMember newMember;
+ int i, j;
+
+ if (explicitly)
+ prefix = ExplicitNamePrefix (pinfo, klass,
iface);
+
+ // Stub out non-implemented events defined by @iface
+ for (i = 0; i < iface.Events.Count; i++) {
+ IEvent ev = iface.Events[i];
+
+ for (j = 0, alreadyImplemented = false; j <
klass.Events.Count; j++) {
+ if (klass.Events[j].FullyQualifiedName
== ev.FullyQualifiedName) {
+ alreadyImplemented = true;
+ break;
+ }
+ }
+
+ if (alreadyImplemented)
+ continue;
+
+ if ((newMember = gen.ImplementMember (gctx,
klass, prefix, ev)) != null)
+ klass = newMember.DeclaringType;
+ }
+
+ // Stub out non-implemented methods defined by @iface
+ for (i = 0; i < iface.Methods.Count; i++) {
+ IMethod method = iface.Methods[i];
+
+ for (j = 0, alreadyImplemented = false; j <
klass.Methods.Count; j++) {
+ if (klass.Methods[j].FullyQualifiedName
== method.FullyQualifiedName) {
+ alreadyImplemented = true;
+ break;
+ }
+ }
+
+ if (alreadyImplemented)
+ continue;
+
+ if ((newMember = gen.ImplementMember (gctx,
klass, prefix, method)) != null)
+ klass = newMember.DeclaringType;
+ }
+
+ // Stub out non-implemented properties defined by @iface
+ for (i = 0; i < iface.Properties.Count; i++) {
+ IProperty prop = iface.Properties[i];
+
+ for (j = 0, alreadyImplemented = false; j <
klass.Properties.Count; j++) {
+ if
(klass.Properties[j].FullyQualifiedName == prop.FullyQualifiedName) {
+ alreadyImplemented = true;
+ break;
+ }
+ }
+
+ if (alreadyImplemented)
+ continue;
+
+ if ((newMember = gen.ImplementMember (gctx,
klass, prefix, prop)) != null)
+ klass = newMember.DeclaringType;
+ }
+
+ gctx.Save ();
+ }
+
public void RemoveMember (IClass cls, IMember member)
{
RefactorerContext gctx = GetGeneratorContext (cls);
Modified:
trunk/monodevelop/Core/src/MonoDevelop.Projects/MonoDevelop.Projects.CodeGeneration/IRefactorer.cs
===================================================================
---
trunk/monodevelop/Core/src/MonoDevelop.Projects/MonoDevelop.Projects.CodeGeneration/IRefactorer.cs
2007-05-25 18:33:29 UTC (rev 77963)
+++
trunk/monodevelop/Core/src/MonoDevelop.Projects/MonoDevelop.Projects.CodeGeneration/IRefactorer.cs
2007-05-25 18:44:34 UTC (rev 77964)
@@ -43,6 +43,7 @@
MemberReferenceCollection FindClassReferences
(RefactorerContext ctx, string fileName, IClass cls);
IMember AddMember (RefactorerContext ctx, IClass cls,
CodeTypeMember memberInfo);
+ IMember ImplementMember (RefactorerContext ctx, IClass cls,
string prefix, IMember member);
void RemoveMember (RefactorerContext ctx, IClass cls, IMember
member);
IMember RenameMember (RefactorerContext ctx, IClass cls,
IMember member, string newName);
IMember ReplaceMember (RefactorerContext ctx, IClass cls,
IMember oldMember, CodeTypeMember memberInfo);
_______________________________________________
Mono-patches maillist - [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches