-
Notifications
You must be signed in to change notification settings - Fork 233
Implement natvis 'na' modifier and $T substitution #1612
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from all commits
507e16f
442a1d3
3f38aef
79422c4
42fa4c9
55881f8
afe98a8
596849a
afd9128
8062cf4
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -1283,12 +1283,16 @@ private string FormatValue(string format, IVariableInformation variable, IDictio | |
| if (m.Success) | ||
| { | ||
| string rawExpr = format.Substring(i + 1, m.Length - 2); | ||
| string spec = ExtractFormatSpecifier(rawExpr); | ||
| string spec = ExtractFormatSpecifier(rawExpr, out bool hasNa); | ||
| string exprValue = GetExpressionValue(rawExpr, variable, scopedNames, intrinsics); | ||
| if (spec == "sub" || spec == "su") | ||
| if (spec == "sub") | ||
| exprValue = CleanUtf16StringValue(exprValue); | ||
| else if (spec == "sb") | ||
| exprValue = CleanAsciiStringValue(exprValue); | ||
| else if (hasNa) | ||
| { | ||
| exprValue = VariableInformation.StripLeadingAddress(exprValue); | ||
| } | ||
| value.Append(exprValue); | ||
| i += m.Length - 1; | ||
| } | ||
|
|
@@ -1502,13 +1506,31 @@ internal static string ExtractFormatSpecifier(string expression) | |
| .Replace("nvo", "").Replace("na", "").Replace("nr", "").Replace("nd", ""); | ||
| } | ||
|
|
||
| /// <summary> | ||
| /// Returns the format specifier from a NatVis expression (the part after the last | ||
| /// top-level comma), normalized the same way as | ||
| /// <see cref="VariableInformation.ProcessFormatSpecifiers"/>: modifiers "nvo", "na", | ||
| /// "nr", "nd" are stripped before returning. Returns null when no specifier is present. | ||
| /// also returns whether modifier 'na' was there via the out parameter | ||
| /// </summary> | ||
| internal static string ExtractFormatSpecifier(string expression, out bool hasNa) | ||
| { | ||
| hasNa = false; | ||
| int commaPos = FindLastTopLevelComma(expression); | ||
| if (commaPos < 0) return null; | ||
|
|
||
| string tail = expression.Substring(commaPos + 1).Trim(); | ||
| hasNa = tail.IndexOf("na", StringComparison.Ordinal) >= 0; | ||
|
|
||
| return tail | ||
| .Replace("nvo", "").Replace("na", "").Replace("nr", "").Replace("nd", ""); | ||
| } | ||
|
|
||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Am I missing something? It looks like nothing is calling your new method
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. now calls the method string spec = ExtractFormatSpecifier(rawExpr, out bool hasNa); at 1286 natvis.cs |
||
| /// <summary> | ||
| /// Cleans up the raw value that GDB/LLDB returns for a <c>const char16_t*</c> | ||
| /// expression (i.e. one evaluated with the <c>,sub</c> / <c>,su</c> format specifier). | ||
| /// GDB and LLDB both prefix the string with the pointer address, e.g. | ||
| /// <c>0x00007fff5fbff6c0 u"Hello"</c> | ||
| /// This method strips the address and the surrounding <c>u"…"</c> quotes so that | ||
| /// the NatVis DisplayString shows just the string content. | ||
| /// </summary> | ||
| internal static string CleanUtf16StringValue(string value) | ||
| { | ||
|
|
@@ -1531,9 +1553,6 @@ internal static string CleanUtf16StringValue(string value) | |
| /// (i.e. one evaluated with the <c>,sb</c> format specifier). | ||
| /// GDB and LLDB prefix the string with the pointer address, e.g. | ||
| /// <c>0x00007fff5fbff6c0 "Hello"</c> | ||
| /// This method strips the address and the surrounding <c>"…"</c> quotes so that | ||
| /// the NatVis DisplayString shows just the string content (matching VS behaviour, | ||
| /// where <c>{ptr,sb}</c> evaluates to bare text without quotes). | ||
| /// </summary> | ||
| internal static string CleanAsciiStringValue(string value) | ||
| { | ||
|
|
||
Uh oh!
There was an error while loading. Please reload this page.