Skip to content
This repository has been archived by the owner on Sep 24, 2020. It is now read-only.

Commit

Permalink
[CodeDomConvertVisitor] fixed converting fully-qualified references t…
Browse files Browse the repository at this point in the history
…o static members
  • Loading branch information
dgrunwald committed Sep 8, 2012
1 parent 6efd3b9 commit 76f3da7
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 3 deletions.
Expand Up @@ -38,18 +38,19 @@ namespace ICSharpCode.NRefactory.CSharp
/// </remarks>
public class CodeDomConvertVisitor : IAstVisitor<CodeObject>
{
//ICompilation compilation = MinimalResolveContext.Instance;
CSharpAstResolver resolver;

/// <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>
public bool UseFullyQualifiedTypeNames { get; set; }

/// <summary>
/// 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 <c>true</c>. If this property is set to <c>false</c>,
/// unconvertible code will throw a NotSupportedException.
/// </summary>
public bool AllowSnippetNodes { get; set; }
Expand Down Expand Up @@ -464,8 +465,11 @@ CodeObject IAstVisitor<CodeObject>.VisitMemberReferenceExpression(MemberReferenc
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));
Expand Down
26 changes: 26 additions & 0 deletions ICSharpCode.NRefactory.Tests/CSharp/CodeDomConvertVisitorTests.cs
Expand Up @@ -50,6 +50,12 @@ public override void SetUp()
}

#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)
{
CSharpResolver resolver = new CSharpResolver(compilation);
Expand Down Expand Up @@ -224,6 +230,26 @@ public void StaticProperty()
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()
{
Expand Down

0 comments on commit 76f3da7

Please sign in to comment.