Browse Source

improve conversion of special characters in string literals

newNRvisualizers
Siegfried Pammer 15 years ago
parent
commit
4c8a11c898
  1. 10
      ICSharpCode.NRefactory.VB/Ast/Expressions/IdentifierExpression.cs
  2. 90
      ICSharpCode.NRefactory.VB/Visitors/CSharpToVBConverterVisitor.cs

10
ICSharpCode.NRefactory.VB/Ast/Expressions/IdentifierExpression.cs

@ -7,6 +7,16 @@ namespace ICSharpCode.NRefactory.VB.Ast
{ {
public class IdentifierExpression : Expression public class IdentifierExpression : Expression
{ {
public IdentifierExpression()
{
}
public IdentifierExpression(Identifier identifier)
{
this.Identifier = identifier;
}
public Identifier Identifier { public Identifier Identifier {
get { return GetChildByRole(Roles.Identifier); } get { return GetChildByRole(Roles.Identifier); }
set { SetChildByRole(Roles.Identifier, value); } set { SetChildByRole(Roles.Identifier, value); }

90
ICSharpCode.NRefactory.VB/Visitors/CSharpToVBConverterVisitor.cs

@ -460,7 +460,7 @@ namespace ICSharpCode.NRefactory.VB.Visitors
{ {
Expression expr; Expression expr;
if ((primitiveExpression.Value is string || primitiveExpression.Value is char) && primitiveExpression.Value.ToString().IndexOfAny(new[] {'\r', '\n', '\t'}) > -1) if (!string.IsNullOrEmpty(primitiveExpression.Value as string) || primitiveExpression.Value is char)
expr = ConvertToConcat(primitiveExpression.Value.ToString()); expr = ConvertToConcat(primitiveExpression.Value.ToString());
else else
expr = new PrimitiveExpression(primitiveExpression.Value); expr = new PrimitiveExpression(primitiveExpression.Value);
@ -474,29 +474,73 @@ namespace ICSharpCode.NRefactory.VB.Visitors
int start = 0; int start = 0;
for (int i = 0; i < literal.Length; i++) { for (int i = 0; i < literal.Length; i++) {
if (literal[i] == '\r') { string part;
string part = literal.Substring(start, i - start); switch (literal[i]) {
if (!string.IsNullOrEmpty(part)) case '\0':
parts.Push(new PrimitiveExpression(part)); part = literal.Substring(start, i - start);
if (i + 1 < literal.Length && literal[i + 1] == '\n') { if (!string.IsNullOrEmpty(part))
i++; parts.Push(new PrimitiveExpression(part));
parts.Push(new IdentifierExpression() { Identifier = "vbCrLf" }); parts.Push(new IdentifierExpression("vbNullChar"));
} else start = i + 1;
parts.Push(new IdentifierExpression() { Identifier = "vbCr" }); break;
start = i + 1; case '\b':
} else if (literal[i] == '\n') { part = literal.Substring(start, i - start);
string part = literal.Substring(start, i - start); if (!string.IsNullOrEmpty(part))
if (!string.IsNullOrEmpty(part)) parts.Push(new PrimitiveExpression(part));
parts.Push(new PrimitiveExpression(part)); parts.Push(new IdentifierExpression("vbBack"));
parts.Push(new IdentifierExpression() { Identifier = "vbLf" }); start = i + 1;
start = i + 1; break;
} else if (literal[i] == '\t') { case '\f':
string part = literal.Substring(start, i - start); part = literal.Substring(start, i - start);
if (!string.IsNullOrEmpty(part)) if (!string.IsNullOrEmpty(part))
parts.Push(new PrimitiveExpression(part)); parts.Push(new PrimitiveExpression(part));
parts.Push(new IdentifierExpression() { Identifier = "vbTab" }); parts.Push(new IdentifierExpression("vbFormFeed"));
start = i + 1; start = i + 1;
break;
case '\r':
part = literal.Substring(start, i - start);
if (!string.IsNullOrEmpty(part))
parts.Push(new PrimitiveExpression(part));
if (i + 1 < literal.Length && literal[i + 1] == '\n') {
i++;
parts.Push(new IdentifierExpression("vbCrLf"));
} else
parts.Push(new IdentifierExpression("vbCr"));
start = i + 1;
break;
case '\n':
part = literal.Substring(start, i - start);
if (!string.IsNullOrEmpty(part))
parts.Push(new PrimitiveExpression(part));
parts.Push(new IdentifierExpression("vbLf"));
start = i + 1;
break;
case '\t':
part = literal.Substring(start, i - start);
if (!string.IsNullOrEmpty(part))
parts.Push(new PrimitiveExpression(part));
parts.Push(new IdentifierExpression("vbTab"));
start = i + 1;
break;
case '\v':
part = literal.Substring(start, i - start);
if (!string.IsNullOrEmpty(part))
parts.Push(new PrimitiveExpression(part));
parts.Push(new IdentifierExpression("vbVerticalTab"));
start = i + 1;
break;
default:
if ((int)literal[i] > 255) {
part = literal.Substring(start, i - start);
if (!string.IsNullOrEmpty(part))
parts.Push(new PrimitiveExpression(part));
parts.Push(new InvocationExpression(new IdentifierExpression("ChrW"), new PrimitiveExpression((int)literal[i])));
} else
continue;
start = i + 1;
break;
} }
} }
if (start < literal.Length) { if (start < literal.Length) {

Loading…
Cancel
Save