/// <summary> /// Tries to find a resource reference in the specified expression. /// </summary> /// <param name="expressionResult">The ExpressionResult for the expression.</param> /// <param name="expr">The AST representation of the full expression.</param> /// <param name="resolveResult">SharpDevelop's ResolveResult for the expression.</param> /// <param name="caretLine">The 0-based line where the expression is located.</param> /// <param name="caretColumn">The 0-based column where the expression is located.</param> /// <param name="fileName">The name of the source file where the expression is located.</param> /// <param name="fileContent">The content of the source file where the expression is located.</param> /// <param name="expressionFinder">The ExpressionFinder for the file.</param> /// <param name="charTyped">The character that has been typed at the caret position but is not yet in the buffer (this is used when invoked from code completion), or <c>null</c>.</param> /// <returns>A ResourceResolveResult describing the referenced resource, or <c>null</c>, if this expression does not reference a resource using the ICSharpCode.Core.ResourceService class.</returns> public ResourceResolveResult Resolve(ExpressionResult expressionResult, Expression expr, ResolveResult resolveResult, int caretLine, int caretColumn, string fileName, string fileContent, IExpressionFinder expressionFinder, char?charTyped) { IMember member = null; // "ResourceService.GetString(..." may be a MemberResolveResult or // MethodResolveResult, dependent on how much of the expression // has already been typed. MemberResolveResult mrr = resolveResult as MemberResolveResult; if (mrr != null) { // If it is a MemberResolveResult, this indicates that // the complete expression is already in the buffer. // So we only assign the member if Resolve is not invoked // from code completion to prevent the code completion window // from opening when typing something like: // ResourceService.GetString(...)[ if (charTyped == null) { member = mrr.ResolvedMember; } } else { MethodGroupResolveResult methrr = resolveResult as MethodGroupResolveResult; if (methrr != null) { // If it is a MethodResolveResult, the expression is incomplete. // Accept only if '(' has been typed. if (charTyped == '(') { member = methrr.GetMethodIfSingleOverload(); } } } if (member is IMethod && LanguageProperties.CSharp.NameComparer.Equals(member.FullyQualifiedName, "ICSharpCode.Core.ResourceService.GetString") ) { #if DEBUG LoggingService.Debug("ResourceToolkit: ICSharpCodeCoreNRefactoryResourceResolver: ResourceService resource access detected"); #endif string key = GetKeyFromExpression(expr); // TODO: Add information about return type (of the resource, if present). return(new ResourceResolveResult(resolveResult.CallingClass, resolveResult.CallingMember, null, ICSharpCodeCoreResourceResolver.ResolveICSharpCodeCoreResourceSet(key, fileName), key)); } return(null); }
private static string GetText(ResolveResult result) { if (result == null) { return(null); } if (result is MixedResolveResult) { return(GetText(((MixedResolveResult)result).PrimaryResult)); } IAmbience ambience = MainForm.IsVisualBasic ? (IAmbience) new VBNetAmbience() : new CSharpAmbience(); ambience.ConversionFlags = ConversionFlags.StandardConversionFlags | ConversionFlags.ShowAccessibility; if (result is MemberResolveResult) { return(GetMemberText(ambience, ((MemberResolveResult)result).ResolvedMember)); } else if (result is LocalResolveResult) { LocalResolveResult rr = (LocalResolveResult)result; ambience.ConversionFlags = ConversionFlags.UseFullyQualifiedTypeNames | ConversionFlags.ShowReturnType; StringBuilder b = new StringBuilder(); if (rr.IsParameter) { b.Append("parameter "); } else { b.Append("local variable "); } b.Append(ambience.Convert(rr.Field)); return(b.ToString()); } else if (result is NamespaceResolveResult) { return("namespace " + ((NamespaceResolveResult)result).Name); } else if (result is TypeResolveResult) { IClass c = ((TypeResolveResult)result).ResolvedClass; if (c != null) { return(GetMemberText(ambience, c)); } else { return(ambience.Convert(result.ResolvedType)); } } else if (result is MethodGroupResolveResult) { MethodGroupResolveResult mrr = result as MethodGroupResolveResult; IMethod m = mrr.GetMethodIfSingleOverload(); if (m != null) { return(GetMemberText(ambience, m)); } else { return("Overload of " + ambience.Convert(mrr.ContainingType) + "." + mrr.Name); } } else { return(null); } }
static string GetText(ResolveResult result, string expression, 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)); } IAmbience ambience = AmbienceService.GetCurrentAmbience(); ambience.ConversionFlags = ConversionFlags.StandardConversionFlags | ConversionFlags.UseFullyQualifiedMemberNames; if (result is MemberResolveResult) { return(GetMemberText(ambience, ((MemberResolveResult)result).ResolvedMember, expression, out debuggerCanShowValue)); } else if (result is LocalResolveResult) { LocalResolveResult rr = (LocalResolveResult)result; ambience.ConversionFlags = ConversionFlags.UseFullyQualifiedTypeNames | ConversionFlags.ShowReturnType | ConversionFlags.ShowDefinitionKeyWord; StringBuilder b = new StringBuilder(); if (rr.IsParameter) { b.Append(StringParser.Parse("${res:MainWindow.Editor.Tooltip.Parameter} ")); } else { b.Append(StringParser.Parse("${res:MainWindow.Editor.Tooltip.LocalVar} ")); } b.Append(ambience.Convert(rr.Field)); if (currentDebugger != null) { string currentValue = currentDebugger.GetValueAsString(rr.VariableName); if (currentValue != null) { debuggerCanShowValue = true; b.Append(" = "); if (currentValue.Length > 256) { currentValue = currentValue.Substring(0, 256) + "..."; } b.Append(currentValue); } } return(b.ToString()); } else if (result is NamespaceResolveResult) { return(StringParser.Parse("${res:MainWindow.Editor.Tooltip.Namespace} ") + ((NamespaceResolveResult)result).Name); } else if (result is TypeResolveResult) { IClass c = ((TypeResolveResult)result).ResolvedClass; if (c != null) { return(GetMemberText(ambience, c, expression, out debuggerCanShowValue)); } else { return(ambience.Convert(result.ResolvedType)); } } 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)); } else { return(StringParser.Parse("${res:MainWindow.Editor.Tooltip.UnresolvedOverload} ") + ambience.Convert(mrr.ContainingType) + "." + mrr.Name); } } else { 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); } } }