Browse Source

improve conversion of special characters in string literals

pull/254/head
Siegfried Pammer 14 years ago
parent
commit
e1a331170a
  1. 10
      NRefactory/ICSharpCode.NRefactory.VB/Ast/Expressions/IdentifierExpression.cs
  2. 90
      NRefactory/ICSharpCode.NRefactory.VB/Visitors/CSharpToVBConverterVisitor.cs

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

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

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

@ -460,7 +460,7 @@ namespace ICSharpCode.NRefactory.VB.Visitors @@ -460,7 +460,7 @@ namespace ICSharpCode.NRefactory.VB.Visitors
{
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());
else
expr = new PrimitiveExpression(primitiveExpression.Value);
@ -474,29 +474,73 @@ namespace ICSharpCode.NRefactory.VB.Visitors @@ -474,29 +474,73 @@ namespace ICSharpCode.NRefactory.VB.Visitors
int start = 0;
for (int i = 0; i < literal.Length; i++) {
if (literal[i] == '\r') {
string 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() { Identifier = "vbCrLf" });
} else
parts.Push(new IdentifierExpression() { Identifier = "vbCr" });
start = i + 1;
} else if (literal[i] == '\n') {
string part = literal.Substring(start, i - start);
if (!string.IsNullOrEmpty(part))
parts.Push(new PrimitiveExpression(part));
parts.Push(new IdentifierExpression() { Identifier = "vbLf" });
start = i + 1;
} else if (literal[i] == '\t') {
string part = literal.Substring(start, i - start);
if (!string.IsNullOrEmpty(part))
parts.Push(new PrimitiveExpression(part));
parts.Push(new IdentifierExpression() { Identifier = "vbTab" });
start = i + 1;
string part;
switch (literal[i]) {
case '\0':
part = literal.Substring(start, i - start);
if (!string.IsNullOrEmpty(part))
parts.Push(new PrimitiveExpression(part));
parts.Push(new IdentifierExpression("vbNullChar"));
start = i + 1;
break;
case '\b':
part = literal.Substring(start, i - start);
if (!string.IsNullOrEmpty(part))
parts.Push(new PrimitiveExpression(part));
parts.Push(new IdentifierExpression("vbBack"));
start = i + 1;
break;
case '\f':
part = literal.Substring(start, i - start);
if (!string.IsNullOrEmpty(part))
parts.Push(new PrimitiveExpression(part));
parts.Push(new IdentifierExpression("vbFormFeed"));
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) {

Loading…
Cancel
Save