Author: fejj
Date: 2007-05-03 15:38:48 -0400 (Thu, 03 May 2007)
New Revision: 76644

Modified:
   trunk/monodevelop/Extras/CSharpBinding/ChangeLog
   trunk/monodevelop/Extras/CSharpBinding/Parser/CodeGenerator.cs
Log:
2007-05-03  Jeffrey Stedfast  <[EMAIL PROTECTED]>

        * Parser/CodeGenerator.cs (FindVariableNamePosition): New
        overloaded function to get the offset of a variable name.
        (FindVariableReferences): New.
        (FindParameterReferences): New.
        (Visit): Added logic for matching LocalVariable and IParameters.



Modified: trunk/monodevelop/Extras/CSharpBinding/ChangeLog
===================================================================
--- trunk/monodevelop/Extras/CSharpBinding/ChangeLog    2007-05-03 19:37:06 UTC 
(rev 76643)
+++ trunk/monodevelop/Extras/CSharpBinding/ChangeLog    2007-05-03 19:38:48 UTC 
(rev 76644)
@@ -1,3 +1,11 @@
+2007-05-03  Jeffrey Stedfast  <[EMAIL PROTECTED]>
+
+       * Parser/CodeGenerator.cs (FindVariableNamePosition): New
+       overloaded function to get the offset of a variable name.
+       (FindVariableReferences): New.
+       (FindParameterReferences): New.
+       (Visit): Added logic for matching LocalVariable and IParameters.
+
 2007-05-02  Jeffrey Stedfast  <[EMAIL PROTECTED]>
 
        * Parser/CodeGenerator.cs (RenameClass): Rename all parts of the class

Modified: trunk/monodevelop/Extras/CSharpBinding/Parser/CodeGenerator.cs
===================================================================
--- trunk/monodevelop/Extras/CSharpBinding/Parser/CodeGenerator.cs      
2007-05-03 19:37:06 UTC (rev 76643)
+++ trunk/monodevelop/Extras/CSharpBinding/Parser/CodeGenerator.cs      
2007-05-03 19:38:48 UTC (rev 76644)
@@ -103,6 +103,25 @@
                        return refs;
                }
                
+               protected override int GetVariableNamePosition 
(IEditableTextFile file, LocalVariable var)
+               {
+                       int pos1 = file.GetPositionFromLineColumn 
(var.Region.BeginLine, var.Region.BeginColumn);
+                       int pos2 = file.GetPositionFromLineColumn 
(var.Region.EndLine, var.Region.EndColumn);
+                       string txt = file.GetText (pos1, pos2);
+                       
+                       int i = txt.IndexOf ('=');
+                       if (i == -1) i = txt.Length;
+                       int p = txt.LastIndexOf (var.Name, i);
+                       if (p == -1) return -1;
+                       return pos1 + p;
+               }
+               
+               protected override int GetParameterNamePosition 
(IEditableTextFile file, IMethod method, IParameter param)
+               {
+                       // FIXME: implement me
+                       return -1;
+               }
+               
                protected override int GetMemberNamePosition (IEditableTextFile 
file, IMember member)
                {
                        int pos1 = file.GetPositionFromLineColumn 
(member.Region.BeginLine, member.Region.BeginColumn);
@@ -159,6 +178,28 @@
                        visitor.Visit (ctx.ParserContext, file);
                        return refs;
                }
+               
+               public override MemberReferenceCollection 
FindVariableReferences (RefactorerContext ctx, string fileName, LocalVariable 
var)
+               {
+                       Resolver resolver = new Resolver (ctx.ParserContext);
+                       MemberReferenceCollection refs = new 
MemberReferenceCollection ();
+                       MemberRefactoryVisitor visitor = new 
MemberRefactoryVisitor (ctx, resolver, null, var, refs);
+                       
+                       IEditableTextFile file = ctx.GetFile (fileName);
+                       visitor.Visit (ctx.ParserContext, file);
+                       return refs;
+               }
+               
+               public override MemberReferenceCollection 
FindParameterReferences (RefactorerContext ctx, string fileName, IMethod 
method, IParameter param)
+               {
+                       Resolver resolver = new Resolver (ctx.ParserContext);
+                       MemberReferenceCollection refs = new 
MemberReferenceCollection ();
+                       MemberRefactoryVisitor visitor = new 
MemberRefactoryVisitor (ctx, resolver, method.DeclaringType, param, refs);
+                       
+                       IEditableTextFile file = ctx.GetFile (fileName);
+                       visitor.Visit (ctx.ParserContext, file);
+                       return refs;
+               }
        }
        
        class MemberRefactoryVisitor: AbstractAstVisitor
@@ -206,6 +247,20 @@
                        return false;
                }
                
+               bool IsExpectedMethod (IMember m)
+               {
+                       if (!(m is IMethod))
+                               return false;
+                       
+                       IMethod actual = ((IParameter) member).DeclaringMember 
as IMethod;
+                       IMethod method = m as IMethod;
+                       
+                       if (method.FullyQualifiedName == 
actual.FullyQualifiedName)
+                               return true;
+                       
+                       return false;
+               }
+               
                public override object Visit(FieldDeclaration fieldDeclaration, 
object data)
                {
                        if (member is IClass && member.Name == 
GetNameWithoutPrefix (ReturnType.GetSystemType 
(fieldDeclaration.TypeReference.Type))) {
@@ -261,16 +316,29 @@
                                        IMember m = item as IMember;
                                        if (m != null && IsExpectedClass 
(m.DeclaringType) &&
                                                ((member is IField && item is 
IField) || (member is IMethod && item is IMethod) ||
-                                                (member is IProperty && item 
is IProperty) || (member is IEvent && item is IEvent)))
-                                       {
+                                                (member is IProperty && item 
is IProperty) || (member is IEvent && item is IEvent))) {
                                                Console.WriteLine ("adding 
IdentifierExpression member reference {0}", member.Name);
                                                references.Add (CreateReference 
(idExp.StartLocation.Y, idExp.StartLocation.X, member.Name));
                                        }
                                } else if (member is IClass && item is IClass 
&& (((IClass)member).FullyQualifiedName ==  ((IClass)item).FullyQualifiedName)) 
{
                                        Console.WriteLine ("adding 
IdentifierExpression class reference {0}", idExp.Identifier);
                                        references.Add (CreateReference 
(idExp.StartLocation.Y, idExp.StartLocation.X, idExp.Identifier));
+                               } else if (member is LocalVariable) {
+                                       LocalVariable avar = member as 
LocalVariable;
+                                       LocalVariable var = item as 
LocalVariable;
+                                       
+                                       if (var != null && var.Region.IsInside 
(avar.Region.BeginLine, avar.Region.EndColumn)) {
+                                               Console.WriteLine ("adding 
IdentifierExpression class reference {0}", idExp.Identifier);
+                                               references.Add (CreateReference 
(idExp.StartLocation.Y, idExp.StartLocation.X, idExp.Identifier));
+                                       }
+                               } else if (member is IParameter) {
+                                       IParameter param = item as IParameter;
+                                       // FIXME: might need to match more than 
this?
+                                       if (param != null && IsExpectedMethod 
(param.DeclaringMember)) {
+                                               Console.WriteLine ("adding 
IdentifierExpression param reference {0}", idExp.Identifier);
+                                               references.Add (CreateReference 
(idExp.StartLocation.Y, idExp.StartLocation.X, idExp.Identifier));
+                                       }
                                }
-                               
                        }
                        return base.Visit (idExp, data);
                }

_______________________________________________
Mono-patches maillist  -  [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches

Reply via email to