|
|
|
@ -4,16 +4,19 @@
@@ -4,16 +4,19 @@
|
|
|
|
|
using System; |
|
|
|
|
using System.Collections.Generic; |
|
|
|
|
using System.IO; |
|
|
|
|
using System.Linq; |
|
|
|
|
using System.Text; |
|
|
|
|
using System.Windows; |
|
|
|
|
using System.Windows.Forms; |
|
|
|
|
|
|
|
|
|
using ICSharpCode.Core; |
|
|
|
|
using ICSharpCode.Editor; |
|
|
|
|
using ICSharpCode.NRefactory; |
|
|
|
|
using ICSharpCode.NRefactory.CSharp.Resolver; |
|
|
|
|
using ICSharpCode.NRefactory.TypeSystem; |
|
|
|
|
using ICSharpCode.SharpDevelop.Bookmarks; |
|
|
|
|
using ICSharpCode.SharpDevelop.Editor; |
|
|
|
|
using ICSharpCode.SharpDevelop.Gui; |
|
|
|
|
using ICSharpCode.SharpDevelop.Parser; |
|
|
|
|
using ICSharpCode.SharpDevelop.Project; |
|
|
|
|
using Mono.Cecil; |
|
|
|
|
|
|
|
|
@ -298,70 +301,39 @@ namespace ICSharpCode.SharpDevelop.Debugging
@@ -298,70 +301,39 @@ namespace ICSharpCode.SharpDevelop.Debugging
|
|
|
|
|
/// </summary>
|
|
|
|
|
internal static void HandleToolTipRequest(ToolTipRequestEventArgs e) |
|
|
|
|
{ |
|
|
|
|
/* |
|
|
|
|
if (!e.InDocument) |
|
|
|
|
return; |
|
|
|
|
Location logicPos = e.LogicalPosition; |
|
|
|
|
var doc = e.Editor.Document; |
|
|
|
|
TextLocation logicPos = e.LogicalPosition; |
|
|
|
|
IDocument document = e.Editor.Document; |
|
|
|
|
FileName fileName = e.Editor.FileName; |
|
|
|
|
|
|
|
|
|
IExpressionFinder expressionFinder = ParserService.GetExpressionFinder(fileName); |
|
|
|
|
if (expressionFinder == null) |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
var currentLine = doc.GetLineByNumber(logicPos.Y); |
|
|
|
|
if (logicPos.X > currentLine.Length) |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
string textContent = doc.Text; |
|
|
|
|
ExpressionResult expressionResult = expressionFinder.FindFullExpression(textContent, doc.PositionToOffset(logicPos.Line, logicPos.Column)); |
|
|
|
|
string expression = (expressionResult.Expression ?? "").Trim(); |
|
|
|
|
if (expression.Length > 0) { |
|
|
|
|
// Look if it is variable
|
|
|
|
|
ResolveResult result = ParserService.Resolve(expressionResult, logicPos.Y, logicPos.X, fileName, textContent); |
|
|
|
|
bool debuggerCanShowValue; |
|
|
|
|
string toolTipText = GetText(result, expression, out debuggerCanShowValue); |
|
|
|
|
if (Control.ModifierKeys == Keys.Control) { |
|
|
|
|
toolTipText = "expr: " + expressionResult.ToString() + "\n" + toolTipText; |
|
|
|
|
debuggerCanShowValue = false; |
|
|
|
|
} |
|
|
|
|
if (toolTipText != null) { |
|
|
|
|
if (debuggerCanShowValue && currentDebugger != null) { |
|
|
|
|
object toolTip = currentDebugger.GetTooltipControl(e.LogicalPosition, expressionResult.Expression); |
|
|
|
|
if (toolTip != null) |
|
|
|
|
e.SetToolTip(toolTip); |
|
|
|
|
else |
|
|
|
|
e.SetToolTip(toolTipText); |
|
|
|
|
} else { |
|
|
|
|
// Look if it is variable
|
|
|
|
|
ResolveResult result = ParserService.Resolve(fileName, logicPos, document); |
|
|
|
|
bool debuggerCanShowValue; |
|
|
|
|
string toolTipText = GetText(e, result, out debuggerCanShowValue); |
|
|
|
|
if (toolTipText != null) { |
|
|
|
|
if (debuggerCanShowValue && currentDebugger != null) { |
|
|
|
|
object toolTip = currentDebugger.GetTooltipControl(e, result); |
|
|
|
|
if (toolTip != null) |
|
|
|
|
e.SetToolTip(toolTip); |
|
|
|
|
else |
|
|
|
|
e.SetToolTip(toolTipText); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
#if DEBUG
|
|
|
|
|
if (Control.ModifierKeys == Keys.Control) { |
|
|
|
|
e.SetToolTip("no expr: " + expressionResult.ToString()); |
|
|
|
|
} else { |
|
|
|
|
e.SetToolTip(toolTipText); |
|
|
|
|
} |
|
|
|
|
#endif
|
|
|
|
|
}*/ |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* |
|
|
|
|
static string GetText(ResolveResult result, string expression, out bool debuggerCanShowValue) |
|
|
|
|
static string GetText(ToolTipRequestEventArgs e, ResolveResult result, out bool debuggerCanShowValue) |
|
|
|
|
{ |
|
|
|
|
debuggerCanShowValue = false; |
|
|
|
|
if (result == null) { |
|
|
|
|
// when pressing control, show the expression even when it could not be resolved
|
|
|
|
|
return (Control.ModifierKeys == Keys.Control) ? "" : null; |
|
|
|
|
} |
|
|
|
|
if (result is MixedResolveResult) |
|
|
|
|
return GetText(((MixedResolveResult)result).PrimaryResult, expression, out debuggerCanShowValue); |
|
|
|
|
else if (result is DelegateCallResolveResult) |
|
|
|
|
return GetText(((DelegateCallResolveResult)result).Target, expression, out debuggerCanShowValue); |
|
|
|
|
if (result == null) |
|
|
|
|
return null; |
|
|
|
|
|
|
|
|
|
IAmbience ambience = AmbienceService.GetCurrentAmbience(); |
|
|
|
|
ambience.ConversionFlags = ConversionFlags.StandardConversionFlags | ConversionFlags.UseFullyQualifiedMemberNames; |
|
|
|
|
if (result is MemberResolveResult) { |
|
|
|
|
return GetMemberText(ambience, ((MemberResolveResult)result).ResolvedMember, expression, out debuggerCanShowValue); |
|
|
|
|
return GetMemberText(ambience, ((MemberResolveResult)result).Member, e, result, out debuggerCanShowValue); |
|
|
|
|
} else if (result is LocalResolveResult) { |
|
|
|
|
LocalResolveResult rr = (LocalResolveResult)result; |
|
|
|
|
ambience.ConversionFlags = ConversionFlags.UseFullyQualifiedTypeNames |
|
|
|
@ -371,9 +343,9 @@ namespace ICSharpCode.SharpDevelop.Debugging
@@ -371,9 +343,9 @@ namespace ICSharpCode.SharpDevelop.Debugging
|
|
|
|
|
b.Append("parameter "); |
|
|
|
|
else |
|
|
|
|
b.Append("local variable "); |
|
|
|
|
b.Append(ambience.Convert(rr.Field)); |
|
|
|
|
if (currentDebugger != null) { |
|
|
|
|
string currentValue = currentDebugger.GetValueAsString(rr.VariableName); |
|
|
|
|
b.Append(ambience.ConvertVariable(rr.Variable)); |
|
|
|
|
if (!rr.IsCompileTimeConstant && currentDebugger != null) { |
|
|
|
|
string currentValue = currentDebugger.GetValueAsString(e, rr); |
|
|
|
|
if (currentValue != null) { |
|
|
|
|
debuggerCanShowValue = true; |
|
|
|
|
b.Append(" = "); |
|
|
|
@ -384,72 +356,56 @@ namespace ICSharpCode.SharpDevelop.Debugging
@@ -384,72 +356,56 @@ namespace ICSharpCode.SharpDevelop.Debugging
|
|
|
|
|
} |
|
|
|
|
return b.ToString(); |
|
|
|
|
} else if (result is NamespaceResolveResult) { |
|
|
|
|
return "namespace " + ((NamespaceResolveResult)result).Name; |
|
|
|
|
return "namespace " + ((NamespaceResolveResult)result).NamespaceName; |
|
|
|
|
} else if (result is TypeResolveResult) { |
|
|
|
|
IClass c = ((TypeResolveResult)result).ResolvedClass; |
|
|
|
|
ITypeDefinition c = result.Type.GetDefinition(); |
|
|
|
|
if (c != null) |
|
|
|
|
return GetMemberText(ambience, c, expression, out debuggerCanShowValue); |
|
|
|
|
return GetMemberText(ambience, c, e, result, out debuggerCanShowValue); |
|
|
|
|
else |
|
|
|
|
return ambience.Convert(result.ResolvedType); |
|
|
|
|
return ambience.ConvertType(result.Type); |
|
|
|
|
} else if (result is MethodGroupResolveResult) { |
|
|
|
|
MethodGroupResolveResult mrr = result as MethodGroupResolveResult; |
|
|
|
|
IMethod m = mrr.GetMethodIfSingleOverload(); |
|
|
|
|
IMethod m2 = mrr.GetMethodWithEmptyParameterList(); |
|
|
|
|
if (m != null) |
|
|
|
|
return GetMemberText(ambience, m, expression, out debuggerCanShowValue); |
|
|
|
|
else if (ambience is VBNetAmbience && m2 != null) |
|
|
|
|
return GetMemberText(ambience, m2, expression, out debuggerCanShowValue); |
|
|
|
|
if (mrr.Methods.Count() == 1) |
|
|
|
|
return GetMemberText(ambience, mrr.Methods.Single(), e, result, out debuggerCanShowValue); |
|
|
|
|
else |
|
|
|
|
return "Overload of " + ambience.Convert(mrr.ContainingType) + "." + mrr.Name; |
|
|
|
|
return "Overload of " + ambience.ConvertType(mrr.TargetType) + "." + mrr.MethodName; |
|
|
|
|
} else { |
|
|
|
|
#if DEBUG
|
|
|
|
|
if (Control.ModifierKeys == Keys.Control) { |
|
|
|
|
if (result.ResolvedType != null) |
|
|
|
|
return "expression of type " + ambience.Convert(result.ResolvedType); |
|
|
|
|
else |
|
|
|
|
return "ResolveResult without ResolvedType"; |
|
|
|
|
} else { |
|
|
|
|
return null; |
|
|
|
|
return result.ToString(); |
|
|
|
|
} |
|
|
|
|
#endif
|
|
|
|
|
return null; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static string GetMemberText(IAmbience ambience, IEntity member, string expression, out bool debuggerCanShowValue) |
|
|
|
|
static string GetMemberText(IAmbience ambience, IEntity member, ToolTipRequestEventArgs e, ResolveResult result, out bool debuggerCanShowValue) |
|
|
|
|
{ |
|
|
|
|
bool tryDisplayValue = false; |
|
|
|
|
debuggerCanShowValue = false; |
|
|
|
|
StringBuilder text = new StringBuilder(); |
|
|
|
|
if (member is IField) { |
|
|
|
|
text.Append(ambience.Convert(member as IField)); |
|
|
|
|
tryDisplayValue = true; |
|
|
|
|
} else if (member is IProperty) { |
|
|
|
|
text.Append(ambience.Convert(member as IProperty)); |
|
|
|
|
tryDisplayValue = true; |
|
|
|
|
} else if (member is IEvent) { |
|
|
|
|
text.Append(ambience.Convert(member as IEvent)); |
|
|
|
|
} else if (member is IMethod) { |
|
|
|
|
text.Append(ambience.Convert(member as IMethod)); |
|
|
|
|
} else if (member is IClass) { |
|
|
|
|
text.Append(ambience.Convert(member as IClass)); |
|
|
|
|
} else { |
|
|
|
|
text.Append("unknown member "); |
|
|
|
|
text.Append(member.ToString()); |
|
|
|
|
} |
|
|
|
|
text.Append(ambience.ConvertEntity(member)); |
|
|
|
|
tryDisplayValue = ((member is IField && !((IField)member).IsConst) || member is IProperty); |
|
|
|
|
|
|
|
|
|
if (tryDisplayValue && currentDebugger != null) { |
|
|
|
|
LoggingService.Info("asking debugger for value of '" + expression + "'"); |
|
|
|
|
string currentValue = currentDebugger.GetValueAsString(expression); |
|
|
|
|
LoggingService.Info("asking debugger for value of '" + result + "'"); |
|
|
|
|
string currentValue = currentDebugger.GetValueAsString(e, result); |
|
|
|
|
if (currentValue != null) { |
|
|
|
|
debuggerCanShowValue = true; |
|
|
|
|
text.Append(" = "); |
|
|
|
|
if (currentValue.Length > 256) |
|
|
|
|
currentValue = currentValue.Substring(0, 256) + "..."; |
|
|
|
|
text.Append(currentValue); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
string documentation = member.Documentation; |
|
|
|
|
if (documentation != null && documentation.Length > 0) { |
|
|
|
|
text.Append('\n'); |
|
|
|
|
text.Append(ICSharpCode.SharpDevelop.Editor.CodeCompletion.CodeCompletionItem.ConvertDocumentation(documentation)); |
|
|
|
|
text.Append(documentation); |
|
|
|
|
//text.Append(ICSharpCode.SharpDevelop.Editor.CodeCompletion.CodeCompletionItem.ConvertDocumentation(documentation));
|
|
|
|
|
} |
|
|
|
|
return text.ToString(); |
|
|
|
|
}*/ |
|
|
|
|
} |
|
|
|
|
#endregion
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|