Browse Source

Fixed SD2-403: Find references does not find indexer calls.

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@328 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Daniel Grunwald 20 years ago
parent
commit
3c3f2e3190
  1. BIN
      data/resources/StringResources.de.resources
  2. 20
      src/AddIns/BackendBindings/CSharpBinding/Project/Src/Parser/ExpressionFinder.cs
  3. 17
      src/AddIns/BackendBindings/VBNetBinding/Project/Src/Parser/ExpressionFinder.cs
  4. 26
      src/AddIns/Misc/HtmlHelp2/Project/Resources/HtmlHelp2Options.xfrm
  5. 20
      src/AddIns/Misc/HtmlHelp2/Project/src/Service/HtmlHelp2Options.cs
  6. 10
      src/Main/Base/Project/Src/Dom/IExpressionFinder.cs
  7. 2
      src/Main/Base/Project/Src/Dom/NRefactoryResolver/NRefactoryResolver.cs
  8. 43
      src/Main/Base/Project/Src/Dom/NRefactoryResolver/TypeVisitor.cs
  9. 15
      src/Main/Base/Project/Src/Dom/ResolveResult.cs
  10. 13
      src/Main/Base/Project/Src/Services/Debugger/DebuggerService.cs
  11. 28
      src/Main/Base/Project/Src/Services/RefactoringService/RefactoringService.cs
  12. BIN
      src/Main/StartUp/Project/Resources/StringResources.resources
  13. 2
      src/Tools/Help/plugins.xml
  14. 2
      src/Tools/Help/register.xml

BIN
data/resources/StringResources.de.resources

Binary file not shown.

20
src/AddIns/BackendBindings/CSharpBinding/Project/Src/Parser/ExpressionFinder.cs

@ -134,6 +134,26 @@ namespace CSharpBinding.Parser @@ -134,6 +134,26 @@ namespace CSharpBinding.Parser
}
#endregion
#region RemoveLastPart
/// <summary>
/// Removed the last part of the expression.
/// </summary>
/// <example>
/// "arr[i]" => "arr"
/// "obj.Field" => "obj"
/// "obj.Method(args,...)" => "obj.Method"
/// </example>
public string RemoveLastPart(string expression)
{
text = expression;
offset = text.Length - 1;
ReadNextToken();
if (curTokenType == Ident && Peek() == '.')
GetNext();
return text.Substring(0, offset + 1);
}
#endregion
#region Find Expression
public ExpressionResult FindExpression(string inText, int offset)
{

17
src/AddIns/BackendBindings/VBNetBinding/Project/Src/Parser/ExpressionFinder.cs

@ -122,6 +122,23 @@ namespace VBNetBinding.Parser @@ -122,6 +122,23 @@ namespace VBNetBinding.Parser
return -1;
}
/// <summary>
/// Removed the last part of the expression.
/// </summary>
/// <example>
/// "obj.Field" => "obj"
/// "obj.Method(args,...)" => "obj.Method"
/// </example>
public string RemoveLastPart(string expression)
{
text = expression;
offset = text.Length - 1;
ReadNextToken();
if (curTokenType == Ident && Peek() == '.')
GetNext();
return text.Substring(0, offset + 1);
}
#region Comment Filter and 'inside string watcher'
int initialOffset;
public string FilterComments(string text, ref int offset)

26
src/AddIns/Misc/HtmlHelp2/Project/Resources/HtmlHelp2Options.xfrm

@ -1,32 +1,40 @@ @@ -1,32 +1,40 @@
<Components version="1.0">
<System.Windows.Forms.UserControl>
<Name value="HtmlHelp2Options" />
<DockPadding value="" />
<ClientSize value="{Width=360, Height=320}" />
<Controls>
<System.Windows.Forms.GroupBox>
<Name value="groupBox1" />
<TabIndex value="0" />
<Location value="{X=8,Y=8}" />
<Anchor value="Top, Left, Right" />
<Size value="{Width=344, Height=112}" />
<Text value="${res:AddIns.HtmlHelp2.Options.Groupbox}" />
<Size value="{Width=344, Height=144}" />
<TabIndex value="0" />
<Anchor value="Top, Left, Right" />
<Controls>
<System.Windows.Forms.Button>
<Name value="reregisterButton" />
<Location value="{X=73,Y=107}" />
<Text value="${res:AddIns.HtmlHelp2.Options.Reregister}" />
<Size value="{Width=204, Height=23}" />
<Anchor value="Top" />
<TabIndex value="2" />
</System.Windows.Forms.Button>
<System.Windows.Forms.ComboBox>
<Name value="help2Collections" />
<Anchor value="Top, Left, Right" />
<TabIndex value="1" />
<Location value="{X=16,Y=80}" />
<Anchor value="Top, Left, Right" />
<Size value="{Width=312, Height=21}" />
<FormattingEnabled value="True" />
<DropDownStyle value="DropDownList" />
<Location value="{X=16,Y=80}" />
</System.Windows.Forms.ComboBox>
<System.Windows.Forms.Label>
<Name value="label1" />
<Location value="{X=16,Y=27}" />
<Text value="${res:AddIns.HtmlHelp2.Options.Label}" />
<Anchor value="Top, Left, Right" />
<TabIndex value="0" />
<Size value="{Width=312, Height=45}" />
<Location value="{X=16,Y=27}" />
<TabIndex value="0" />
<Anchor value="Top, Left, Right" />
</System.Windows.Forms.Label>
</Controls>
</System.Windows.Forms.GroupBox>

20
src/AddIns/Misc/HtmlHelp2/Project/src/Service/HtmlHelp2Options.cs

@ -9,6 +9,7 @@ namespace HtmlHelp2Service @@ -9,6 +9,7 @@ namespace HtmlHelp2Service
{
using System;
using System.Drawing;
using System.Diagnostics;
using System.Collections;
using System.IO;
using System.Reflection;
@ -28,6 +29,7 @@ namespace HtmlHelp2Service @@ -28,6 +29,7 @@ namespace HtmlHelp2Service
public override void LoadPanelContents()
{
SetupFromXmlStream(this.GetType().Assembly.GetManifestResourceStream("HtmlHelp2.Resources.HtmlHelp2Options.xfrm"));
ControlDictionary["reregisterButton"].Click += ReregisterButtonClick;
this.InitializeComponents();
}
@ -83,5 +85,23 @@ namespace HtmlHelp2Service @@ -83,5 +85,23 @@ namespace HtmlHelp2Service
catch {
}
}
void ReregisterButtonClick(object sender, EventArgs e)
{
new MethodInvoker(DoReregister).BeginInvoke(null, null);
}
void DoReregister()
{
try {
ProcessStartInfo info = new ProcessStartInfo("cmd", "/c call echo Unregistering... & unregister.bat & echo. & echo Registering... & call register.bat & pause");
info.WorkingDirectory = Path.Combine(FileUtility.SharpDevelopRootPath, "bin\\setup\\help");
Process p = Process.Start(info);
p.WaitForExit(45000);
WorkbenchSingleton.SafeThreadAsyncCall(typeof(HtmlHelp2Environment), "ReloadNamespace");
} catch (Exception ex) {
MessageService.ShowError(ex);
}
}
}
}

10
src/Main/Base/Project/Src/Dom/IExpressionFinder.cs

@ -20,6 +20,16 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -20,6 +20,16 @@ namespace ICSharpCode.SharpDevelop.Dom
/// Finds an expression around the current offset.
/// </summary>
ExpressionResult FindFullExpression(string text, int offset);
/// <summary>
/// Removed the last part of the expression.
/// </summary>
/// <example>
/// "arr[i]" => "arr"
/// "obj.Field" => "obj"
/// "obj.Method(args,...)" => "obj.Method"
/// </example>
string RemoveLastPart(string expression);
}
/// <summary>

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

@ -259,6 +259,8 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver @@ -259,6 +259,8 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver
return invocationTarget;
}
} else if (expr is IndexerExpression) {
return CreateMemberResolveResult(typeVisitor.GetIndexer(expr as IndexerExpression, null));
} else if (expr is FieldReferenceExpression) {
FieldReferenceExpression fieldReferenceExpression = (FieldReferenceExpression)expr;
if (fieldReferenceExpression.FieldName == null || fieldReferenceExpression.FieldName.Length == 0) {

43
src/Main/Base/Project/Src/Dom/NRefactoryResolver/TypeVisitor.cs

@ -88,6 +88,15 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver @@ -88,6 +88,15 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver
return null;
}
public override object Visit(IndexerExpression indexerExpression, object data)
{
IIndexer i = GetIndexer(indexerExpression, data);
if (i != null)
return i.ReturnType;
else
return null;
}
public IMethod FindOverload(List<IMethod> methods, ArrayList arguments, object data)
{
if (methods.Count <= 0) {
@ -201,6 +210,27 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver @@ -201,6 +210,27 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver
return null;
}
public IIndexer GetIndexer(IndexerExpression indexerExpression, object data)
{
IReturnType type = (IReturnType)indexerExpression.TargetObject.AcceptVisitor(this, data);
if (type == null) {
return null;
}
List<IIndexer> indexers = type.GetIndexers();
IReturnType[] parameters = new IReturnType[indexerExpression.Indices.Count];
for (int i = 0; i < parameters.Length; i++) {
Expression expr = indexerExpression.Indices[i] as Expression;
if (expr != null)
parameters[i] = (IReturnType)expr.AcceptVisitor(this, data);
}
bool tmp;
int num = FindOverload(new List<IMethodOrIndexer>(indexers.ToArray()), parameters, true, out tmp);
if (num < 0)
return null;
else
return indexers[num];
}
void InjectMethodTypeParameters(List<IMethod> methods, InvocationExpression invocationExpression)
{
if (invocationExpression.TypeParameters == null) return;
@ -375,19 +405,6 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver @@ -375,19 +405,6 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver
return null;
}
public override object Visit(IndexerExpression indexerExpression, object data)
{
IReturnType type = (IReturnType)indexerExpression.TargetObject.AcceptVisitor(this, data);
if (type == null) {
return null;
}
List<IIndexer> indexers = type.GetIndexers();
if (indexers.Count > 0)
return indexers[0].ReturnType;
else
return null;
}
public override object Visit(ClassReferenceExpression classReferenceExpression, object data)
{
if (resolver.CallingClass == null) {

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

@ -443,13 +443,22 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -443,13 +443,22 @@ namespace ICSharpCode.SharpDevelop.Dom
}
}
public override FilePosition GetDefinitionPosition()
public IMethod GetMethodIfSingleOverload()
{
List<IMethod> methods = containingType.GetMethods();
methods = methods.FindAll(delegate(IMethod m) { return m.Name == this.Name; });
if (methods.Count == 1) {
return MemberResolveResult.GetDefinitionPosition(methods[0]);
if (methods.Count == 1)
return methods[0];
else
return null;
}
public override FilePosition GetDefinitionPosition()
{
IMethod m = GetMethodIfSingleOverload();
if (m != null)
return MemberResolveResult.GetDefinitionPosition(m);
else
return base.GetDefinitionPosition();
}
}

13
src/Main/Base/Project/Src/Services/Debugger/DebuggerService.cs

@ -363,15 +363,12 @@ namespace ICSharpCode.Core @@ -363,15 +363,12 @@ namespace ICSharpCode.Core
else
return ambience.Convert(result.ResolvedType);
} else if (result is MethodResolveResult) {
IReturnType container = ((MethodResolveResult)result).ContainingType;
List<IMethod> methods = container.GetMethods();
methods = methods.FindAll(delegate(IMethod m) {
return m.Name == ((MethodResolveResult)result).Name;
});
if (methods.Count == 1)
return GetText(ambience, methods[0]);
MethodResolveResult mrr = result as MethodResolveResult;
IMethod m = mrr.GetMethodIfSingleOverload();
if (m != null)
return GetText(ambience, m);
else
return "Overload of " + ambience.Convert(container) + "." + ((MethodResolveResult)result).Name;
return "Overload of " + ambience.Convert(mrr.ContainingType) + "." + mrr.Name;
} else {
// if (result.ResolvedType != null)
// return "expression of type " + ambience.Convert(result.ResolvedType);

28
src/Main/Base/Project/Src/Services/RefactoringService/RefactoringService.cs

@ -96,6 +96,11 @@ namespace ICSharpCode.Core @@ -96,6 +96,11 @@ namespace ICSharpCode.Core
if (progressMonitor != null) {
progressMonitor.BeginTask("${res:SharpDevelop.Refactoring.FindingReferences}", files.Count);
}
#if DEBUG
if (System.Windows.Forms.Control.ModifierKeys == System.Windows.Forms.Keys.Control) {
System.Diagnostics.Debugger.Break();
}
#endif
while (enumerator.MoveNext()) {
if (progressMonitor != null) {
progressMonitor.WorkDone = enumerator.Index;
@ -144,17 +149,28 @@ namespace ICSharpCode.Core @@ -144,17 +149,28 @@ namespace ICSharpCode.Core
if (expressionFinder == null) {
expressionFinder = ParserService.GetExpressionFinder(fileName);
}
ExpressionResult expr = expressionFinder.FindFullExpression(fileContent, pos + 1);
ExpressionResult expr = expressionFinder.FindFullExpression(fileContent, pos);
if (expr.Expression != null) {
Point position = GetPosition(fileContent, pos);
repeatResolve:
// TODO: Optimize by re-using the same resolver if multiple expressions were
// found in this file (the resolver should parse all methods at once)
ResolveResult rr = ParserService.Resolve(expr, position.Y, position.X, fileName, fileContent);
if (member != null) {
// find reference to member
if (IsReferenceToMember(member, rr)) {
list.Add(new Reference(fileName, pos, searchedText.Length, expr.Expression, rr));
} else if (rr is MemberResolveResult && (rr as MemberResolveResult).ResolvedMember is IIndexer) {
// we got an indexer call as expression ("objectList[0].ToString()[2]")
// strip the index from the expression to resolve the underlying expression
string newExpr = expressionFinder.RemoveLastPart(expr.Expression);
if (newExpr.Length >= expr.Expression.Length)
throw new ApplicationException("new expression must be shorter than old expression");
expr.Expression = newExpr;
goto repeatResolve;
}
} else {
// find reference to class
MemberResolveResult mrr = rr as MemberResolveResult;
if (mrr != null) {
if (mrr.ResolvedMember is IMethod && ((IMethod)mrr.ResolvedMember).IsConstructor) {
@ -270,7 +286,7 @@ namespace ICSharpCode.Core @@ -270,7 +286,7 @@ namespace ICSharpCode.Core
continue;
}
if (!pc.HasReferenceTo(ownerProjectContent)) {
// unreferences project contents cannot reference the class
// project contents that do not reference the owner's content cannot reference the member
continue;
}
}
@ -286,11 +302,14 @@ namespace ICSharpCode.Core @@ -286,11 +302,14 @@ namespace ICSharpCode.Core
public static bool IsReferenceToMember(IMember member, ResolveResult rr)
{
MemberResolveResult mrr = rr as MemberResolveResult;
if (mrr != null)
if (mrr != null) {
return IsSimilarMember(mrr.ResolvedMember, member);
else
} else if (rr is MethodResolveResult) {
return IsSimilarMember((rr as MethodResolveResult).GetMethodIfSingleOverload(), member);
} else {
return false;
}
}
/// <summary>
/// Gets if member1 is the same as member2 or if member1 overrides member2.
@ -363,6 +382,7 @@ namespace ICSharpCode.Core @@ -363,6 +382,7 @@ namespace ICSharpCode.Core
public static IMember FindBaseMember(IMember member)
{
if (member == null) return null;
IClass parentClass = member.DeclaringType;
IClass baseClass = parentClass.BaseClass;
if (baseClass == null) return null;

BIN
src/Main/StartUp/Project/Resources/StringResources.resources

Binary file not shown.

2
src/Tools/Help/plugins.xml

@ -1,6 +1,6 @@ @@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<register>
<plugin parent="Corsavy">
<child name="MS.NETFrameworkSDKv1.1.DE"/>
<child name="MS.NETFrameworkSDKv2*"/>
</plugin>
</register>

2
src/Tools/Help/register.xml

@ -5,7 +5,7 @@ @@ -5,7 +5,7 @@
<file Id="SharpZipLib" HxS="..\..\..\doc\help\3rdparty\ICSharpCode.SharpZipLib.HxS" HxI="..\..\..\doc\help\3rdparty\ICSharpCode.SharpZipLib.HxI" LangId="1033"/>
<filter name="(no filter)"/>
<plugin>
<child name="MS.NETFrameworkSDKv1.1*"/>
<child name="MS.NETFrameworkSDKv2*"/>
</plugin>
</namespace>
</register>
Loading…
Cancel
Save