Browse Source

[CodeDomConvertVisitor] fixed converting fully-qualified references to static members

newNRvisualizers
Daniel Grunwald 13 years ago
parent
commit
76f3da7ccf
  1. 10
      ICSharpCode.NRefactory.CSharp/OutputVisitor/CodeDomConvertVisitor.cs
  2. 26
      ICSharpCode.NRefactory.Tests/CSharp/CodeDomConvertVisitorTests.cs

10
ICSharpCode.NRefactory.CSharp/OutputVisitor/CodeDomConvertVisitor.cs

@ -38,18 +38,19 @@ namespace ICSharpCode.NRefactory.CSharp
/// </remarks> /// </remarks>
public class CodeDomConvertVisitor : IAstVisitor<CodeObject> public class CodeDomConvertVisitor : IAstVisitor<CodeObject>
{ {
//ICompilation compilation = MinimalResolveContext.Instance;
CSharpAstResolver resolver; CSharpAstResolver resolver;
/// <summary> /// <summary>
/// Gets/Sets whether the visitor should use fully-qualified type references. /// Gets/Sets whether the visitor should convert short type names into
/// fully qualified type names.
/// The default is <c>false</c>.
/// </summary> /// </summary>
public bool UseFullyQualifiedTypeNames { get; set; } public bool UseFullyQualifiedTypeNames { get; set; }
/// <summary> /// <summary>
/// Gets whether the visitor is allowed to produce snippet nodes for /// Gets whether the visitor is allowed to produce snippet nodes for
/// code that cannot be converted. /// code that cannot be converted.
/// The default is true. If this property is set to false, /// The default is <c>true</c>. If this property is set to <c>false</c>,
/// unconvertible code will throw a NotSupportedException. /// unconvertible code will throw a NotSupportedException.
/// </summary> /// </summary>
public bool AllowSnippetNodes { get; set; } public bool AllowSnippetNodes { get; set; }
@ -464,8 +465,11 @@ namespace ICSharpCode.NRefactory.CSharp
CodeExpression target = Convert(memberReferenceExpression.Target); CodeExpression target = Convert(memberReferenceExpression.Target);
ResolveResult rr = Resolve(memberReferenceExpression); ResolveResult rr = Resolve(memberReferenceExpression);
MemberResolveResult mrr = rr as MemberResolveResult; MemberResolveResult mrr = rr as MemberResolveResult;
TypeResolveResult trr = rr as TypeResolveResult;
if (mrr != null) { if (mrr != null) {
return HandleMemberReference(target, memberReferenceExpression.MemberName, memberReferenceExpression.TypeArguments, mrr); return HandleMemberReference(target, memberReferenceExpression.MemberName, memberReferenceExpression.TypeArguments, mrr);
} else if (trr != null) {
return new CodeTypeReferenceExpression(Convert(trr.Type));
} else { } else {
if (memberReferenceExpression.TypeArguments.Any() || rr is MethodGroupResolveResult) { if (memberReferenceExpression.TypeArguments.Any() || rr is MethodGroupResolveResult) {
return new CodeMethodReferenceExpression(target, memberReferenceExpression.MemberName, Convert(memberReferenceExpression.TypeArguments)); return new CodeMethodReferenceExpression(target, memberReferenceExpression.MemberName, Convert(memberReferenceExpression.TypeArguments));

26
ICSharpCode.NRefactory.Tests/CSharp/CodeDomConvertVisitorTests.cs

@ -50,6 +50,12 @@ namespace ICSharpCode.NRefactory.CSharp
} }
#region Helper methods #region Helper methods
CodeObject ConvertInContext(string program)
{
var p = PrepareResolver(program);
return convertVisitor.Convert(p.Item2, p.Item1);
}
string ConvertHelper(AstNode node, Action<CSharpCodeProvider, CodeObject, TextWriter, CodeGeneratorOptions> action) string ConvertHelper(AstNode node, Action<CSharpCodeProvider, CodeObject, TextWriter, CodeGeneratorOptions> action)
{ {
CSharpResolver resolver = new CSharpResolver(compilation); CSharpResolver resolver = new CSharpResolver(compilation);
@ -224,6 +230,26 @@ namespace ICSharpCode.NRefactory.CSharp
Assert.AreEqual("System.Environment.TickCount", ConvertExpression("Environment.TickCount")); Assert.AreEqual("System.Environment.TickCount", ConvertExpression("Environment.TickCount"));
} }
[Test]
public void FullyQualifiedEnumFieldAccess()
{
string program = "class A { object x = $System.StringComparison.Ordinal$; }";
var cfre = (CodeFieldReferenceExpression)ConvertInContext(program);
Assert.AreEqual("Ordinal", cfre.FieldName);
var ctre = ((CodeTypeReferenceExpression)cfre.TargetObject);
Assert.AreEqual("System.StringComparison", ctre.Type.BaseType);
}
[Test]
public void EnumFieldAccess()
{
string program = "using System; class A { object x = $StringComparison.Ordinal$; }";
var cfre = (CodeFieldReferenceExpression)ConvertInContext(program);
Assert.AreEqual("Ordinal", cfre.FieldName);
var ctre = ((CodeTypeReferenceExpression)cfre.TargetObject);
Assert.AreEqual("System.StringComparison", ctre.Type.BaseType);
}
[Test] [Test]
public void InstanceMethodInvocation() public void InstanceMethodInvocation()
{ {

Loading…
Cancel
Save