in vsintegration/src/FSharp.LanguageService.Base/ExpansionProvider.cs [653:715]
public string GetArgument(int index) {
if (args == null || args.Length == 0 || index > args.Length) return null;
string arg = args[index];
if (arg == null) return null;
int i = arg.IndexOf('$');
if (i >= 0) {
StringBuilder sb = new StringBuilder();
int len = arg.Length;
int start = 0;
while (i >= 0 && i + 1 < len) {
sb.Append(arg.Substring(start, i - start));
start = i;
i++;
if (arg[i] == '$') {
sb.Append('$');
start = i + 1; // $$ is resolved to $.
} else {
// parse name of variable.
int j = i;
for (; j < len; j++) {
if (!Char.IsLetterOrDigit(arg[j]))
break;
}
if (j == len) {
// terminating '$' not found.
sb.Append('$');
start = i;
break;
} else if (arg[j] == '$') {
string name = arg.Substring(i, j - i);
string value;
if (GetFieldValue(name, out value)) {
sb.Append(value);
} else {
// just return the unresolved variable.
sb.Append('$');
sb.Append(name);
sb.Append('$');
}
start = j + 1;
} else {
// invalid syntax, e.g. "$US 23.45" or some such thing
sb.Append('$');
sb.Append(arg.Substring(i, j - i));
start = j;
}
}
i = arg.IndexOf('$', start);
}
if (start < len) {
sb.Append(arg.Substring(start, len - start));
}
arg = sb.ToString();
}
// remove quotes around string literals.
if (arg.Length > 2 && arg[0] == '"' && arg[arg.Length - 1] == '"') {
arg = arg.Substring(1, arg.Length - 2);
} else if (arg.Length > 2 && arg[0] == '\'' && arg[arg.Length - 1] == '\'') {
arg = arg.Substring(1, arg.Length - 2);
}
return arg;
}