Browse Source

Fixed C#->VB code converter issues with casts between char and integers.

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/3.0@5221 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
pull/1/head
Daniel Grunwald 16 years ago
parent
commit
c1ca7b1e36
  1. 6
      src/Libraries/NRefactory/Test/Output/VBNet/VBNetOutputTest.cs
  2. 8
      src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/NRefactoryResolver/CSharpToVBNetConvertVisitor.cs
  3. 35
      src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/NRefactoryResolver/CodeSnippetConverter.cs
  4. 24
      src/Main/ICSharpCode.SharpDevelop.Dom/Tests/ICSharpCode.SharpDevelop.Dom.Tests/CodeSnippetConverterTests.cs

6
src/Libraries/NRefactory/Test/Output/VBNet/VBNetOutputTest.cs

@ -468,6 +468,12 @@ End Using"); @@ -468,6 +468,12 @@ End Using");
TestExpression("\".\"C");
}
[Test]
public void AddressOf()
{
TestExpression("AddressOf Abc");
}
[Test]
public void ObjectInitializer()
{

8
src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/NRefactoryResolver/CSharpToVBNetConvertVisitor.cs

@ -467,6 +467,14 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver @@ -467,6 +467,14 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver
// casts from float to int in C# truncate, but VB rounds
// we'll have to introduce a call to Math.Truncate
castExpression.Expression = ExpressionBuilder.Identifier("Math").Call("Truncate", castExpression.Expression);
} else if (sourceType != null && sourceType.FullyQualifiedName == "System.Char") {
// casts from char to int are valid in C#, but need to use AscW in VB
castExpression.Expression = ExpressionBuilder.Identifier("AscW").Call(castExpression.Expression);
if (targetType != null && targetType.FullyQualifiedName == "System.Int32") {
// AscW already returns int, so skip the cast
ReplaceCurrentNode(castExpression.Expression);
return null;
}
}
}
}

35
src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/NRefactoryResolver/CodeSnippetConverter.cs

@ -39,6 +39,7 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver @@ -39,6 +39,7 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver
List<ISpecial> specials;
CompilationUnit compilationUnit;
ParseInformation parseInfo;
bool wasExpression;
#region Parsing
INode Parse(SupportedLanguage sourceLanguage, string sourceCode, out string error)
@ -56,18 +57,20 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver @@ -56,18 +57,20 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver
if (parser.Errors.Count != 0)
return null;
wasExpression = parser.SnippetType == SnippetType.Expression;
if (wasExpression) {
// Special case 'Expression': expressions may be replaced with other statements in the AST by the ConvertVisitor,
// but we need to return a 'stable' node so that the correct transformed AST is returned.
// Thus, we wrap any expressions into a statement block.
result = MakeBlockFromExpression((Expression)result);
}
// now create a dummy compilation unit around the snippet result
switch (parser.SnippetType) {
case SnippetType.CompilationUnit:
compilationUnit = (CompilationUnit)result;
break;
case SnippetType.Expression:
compilationUnit = MakeCompilationUnitFromTypeMembers(
MakeMethodFromBlock(
MakeBlockFromExpression(
(Expression)result
)));
break;
case SnippetType.Statements:
compilationUnit = MakeCompilationUnitFromTypeMembers(
MakeMethodFromBlock(
@ -96,6 +99,22 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver @@ -96,6 +99,22 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver
return result;
}
/// <summary>
/// Unpacks the expression from a statement block; if it was wrapped earlier.
/// </summary>
INode UnpackExpression(INode node)
{
if (wasExpression) {
BlockStatement block = node as BlockStatement;
if (block != null && block.Children.Count == 1) {
ExpressionStatement es = block.Children[0] as ExpressionStatement;
if (es != null)
return es.Expression;
}
}
return node;
}
BlockStatement MakeBlockFromExpression(Expression expr)
{
return new BlockStatement {
@ -147,7 +166,7 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver @@ -147,7 +166,7 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver
},
null);
PreprocessingDirective.CSharpToVB(specials);
return CreateCode(node, new VBNetOutputVisitor());
return CreateCode(UnpackExpression(node), new VBNetOutputVisitor());
}
public string VBToCSharp(string input, out string errors)
@ -160,7 +179,7 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver @@ -160,7 +179,7 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver
new VBNetToCSharpConvertVisitor(project, parseInfo),
null);
PreprocessingDirective.VBToCSharp(specials);
return CreateCode(node, new CSharpOutputVisitor());
return CreateCode(UnpackExpression(node), new CSharpOutputVisitor());
}
string CreateCode(INode node, IOutputAstVisitor outputVisitor)

24
src/Main/ICSharpCode.SharpDevelop.Dom/Tests/ICSharpCode.SharpDevelop.Dom.Tests/CodeSnippetConverterTests.cs

@ -103,6 +103,30 @@ namespace ICSharpCode.SharpDevelop.Dom.Tests @@ -103,6 +103,30 @@ namespace ICSharpCode.SharpDevelop.Dom.Tests
Assert.AreEqual("CInt(-35L)", converter.CSharpToVB("(int)(-35L)", out errors));
}
[Test]
public void ConvertCharToInteger()
{
Assert.AreEqual("AscW(\"x\"C)", converter.CSharpToVB("(int)'x'", out errors));
}
[Test]
public void ConvertCharToByte()
{
Assert.AreEqual("CByte(AscW(\"x\"C))", converter.CSharpToVB("(byte)'x'", out errors));
}
[Test]
public void ConvertIntegerToChar()
{
Assert.AreEqual("ChrW(65)", converter.CSharpToVB("(char)65", out errors));
}
[Test]
public void ConvertByteToChar()
{
Assert.AreEqual("ChrW(CByte(65))", converter.CSharpToVB("(char)(byte)65", out errors));
}
string Normalize(string text)
{
return text.Replace("\t", " ").Replace("\r", "").Trim();

Loading…
Cancel
Save