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

Reply via email to