diff --git a/ICSharpCode.NRefactory.CSharp/OutputVisitor/CodeDomConvertVisitor.cs b/ICSharpCode.NRefactory.CSharp/OutputVisitor/CodeDomConvertVisitor.cs index b7db647027..406f53a264 100644 --- a/ICSharpCode.NRefactory.CSharp/OutputVisitor/CodeDomConvertVisitor.cs +++ b/ICSharpCode.NRefactory.CSharp/OutputVisitor/CodeDomConvertVisitor.cs @@ -38,18 +38,19 @@ namespace ICSharpCode.NRefactory.CSharp /// public class CodeDomConvertVisitor : IAstVisitor { - //ICompilation compilation = MinimalResolveContext.Instance; CSharpAstResolver resolver; /// - /// 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 false. /// public bool UseFullyQualifiedTypeNames { get; set; } /// /// Gets whether the visitor is allowed to produce snippet nodes for /// code that cannot be converted. - /// The default is true. If this property is set to false, + /// The default is true. If this property is set to false, /// unconvertible code will throw a NotSupportedException. /// public bool AllowSnippetNodes { get; set; } @@ -464,8 +465,11 @@ namespace ICSharpCode.NRefactory.CSharp CodeExpression target = Convert(memberReferenceExpression.Target); ResolveResult rr = Resolve(memberReferenceExpression); MemberResolveResult mrr = rr as MemberResolveResult; + TypeResolveResult trr = rr as TypeResolveResult; if (mrr != null) { return HandleMemberReference(target, memberReferenceExpression.MemberName, memberReferenceExpression.TypeArguments, mrr); + } else if (trr != null) { + return new CodeTypeReferenceExpression(Convert(trr.Type)); } else { if (memberReferenceExpression.TypeArguments.Any() || rr is MethodGroupResolveResult) { return new CodeMethodReferenceExpression(target, memberReferenceExpression.MemberName, Convert(memberReferenceExpression.TypeArguments)); diff --git a/ICSharpCode.NRefactory.Tests/CSharp/CodeDomConvertVisitorTests.cs b/ICSharpCode.NRefactory.Tests/CSharp/CodeDomConvertVisitorTests.cs index 77e7246a64..54c9ce2dc9 100644 --- a/ICSharpCode.NRefactory.Tests/CSharp/CodeDomConvertVisitorTests.cs +++ b/ICSharpCode.NRefactory.Tests/CSharp/CodeDomConvertVisitorTests.cs @@ -50,6 +50,12 @@ namespace ICSharpCode.NRefactory.CSharp } #region Helper methods + CodeObject ConvertInContext(string program) + { + var p = PrepareResolver(program); + return convertVisitor.Convert(p.Item2, p.Item1); + } + string ConvertHelper(AstNode node, Action action) { CSharpResolver resolver = new CSharpResolver(compilation); @@ -224,6 +230,26 @@ namespace ICSharpCode.NRefactory.CSharp 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] public void InstanceMethodInvocation() {