Browse Source

Fixed crash in CSharpAmbience on delegate declarations.

newNRvisualizers
Daniel Grunwald 14 years ago
parent
commit
e52e57e20a
  1. 85
      ICSharpCode.NRefactory.CSharp/OutputVisitor/CSharpAmbience.cs
  2. 8
      ICSharpCode.NRefactory.CSharp/Refactoring/TypeSystemAstBuilder.cs
  3. 19
      ICSharpCode.NRefactory.Tests/CSharp/CSharpAmbienceTests.cs

85
ICSharpCode.NRefactory.CSharp/OutputVisitor/CSharpAmbience.cs

@ -35,37 +35,49 @@ namespace ICSharpCode.NRefactory.CSharp @@ -35,37 +35,49 @@ namespace ICSharpCode.NRefactory.CSharp
public string ConvertEntity(IEntity e)
{
StringWriter writer = new StringWriter();
if (e.EntityType == EntityType.TypeDefinition) {
ConvertTypeDeclaration((ITypeDefinition)e, writer);
} else {
ConvertMember((IMember)e, writer);
}
return writer.ToString().TrimEnd();
}
void ConvertMember(IMember member, StringWriter writer)
{
TypeSystemAstBuilder astBuilder = CreateAstBuilder();
astBuilder.ShowParameterNames = (ConversionFlags & ConversionFlags.ShowParameterNames) == ConversionFlags.ShowParameterNames;
AttributedNode node = (AttributedNode)astBuilder.ConvertEntity(member);
AttributedNode node = astBuilder.ConvertEntity(e);
PrintModifiers(node.Modifiers, writer);
if ((ConversionFlags & ConversionFlags.ShowDefinitionKeyWord) == ConversionFlags.ShowDefinitionKeyWord) {
if (node is TypeDeclaration) {
switch (((TypeDeclaration)node).ClassType) {
case ClassType.Class:
writer.Write("class");
break;
case ClassType.Struct:
writer.Write("struct");
break;
case ClassType.Interface:
writer.Write("interface");
break;
case ClassType.Enum:
writer.Write("enum");
break;
default:
throw new Exception("Invalid value for ClassType");
}
writer.Write(' ');
} else if (node is DelegateDeclaration) {
writer.Write("delegate ");
}
}
if ((ConversionFlags & ConversionFlags.ShowReturnType) == ConversionFlags.ShowReturnType) {
var rt = node.GetChildByRole(AstNode.Roles.Type);
if (rt != AstNode.Roles.Type.NullObject) {
if (!rt.IsNull) {
writer.Write(rt.AcceptVisitor(CreatePrinter(writer), null));
writer.Write(' ');
}
}
WriteMemberDeclarationName(member, writer);
if (e is ITypeDefinition)
WriteTypeDeclarationName((ITypeDefinition)e, writer);
else
WriteMemberDeclarationName((IMember)e, writer);
if ((ConversionFlags & ConversionFlags.ShowParameterList) == ConversionFlags.ShowParameterList
&& member is IParameterizedMember && member.EntityType != EntityType.Property) {
writer.Write((node is IndexerDeclaration) ? '[' : '(');
if ((ConversionFlags & ConversionFlags.ShowParameterList) == ConversionFlags.ShowParameterList && HasParameters(e)) {
writer.Write(e.EntityType == EntityType.Indexer ? '[' : '(');
bool first = true;
foreach (var param in node.GetChildrenByRole(AstNode.Roles.Parameter)) {
if (first)
@ -74,10 +86,11 @@ namespace ICSharpCode.NRefactory.CSharp @@ -74,10 +86,11 @@ namespace ICSharpCode.NRefactory.CSharp
writer.Write(", ");
param.AcceptVisitor(CreatePrinter(writer), null);
}
writer.Write((node is IndexerDeclaration) ? ']' : ')');
writer.Write(e.EntityType == EntityType.Indexer ? ']' : ')');
}
if ((ConversionFlags & ConversionFlags.ShowBody) == ConversionFlags.ShowBody) {
IProperty property = member as IProperty;
if ((ConversionFlags & ConversionFlags.ShowBody) == ConversionFlags.ShowBody && !(node is TypeDeclaration)) {
IProperty property = e as IProperty;
if (property != null) {
writer.Write(" { ");
if (property.CanGet)
@ -89,21 +102,41 @@ namespace ICSharpCode.NRefactory.CSharp @@ -89,21 +102,41 @@ namespace ICSharpCode.NRefactory.CSharp
writer.Write(';');
}
}
return writer.ToString().TrimEnd();
}
bool HasParameters(IEntity e)
{
switch (e.EntityType) {
case EntityType.TypeDefinition:
return ((ITypeDefinition)e).Kind == TypeKind.Delegate;
case EntityType.Indexer:
case EntityType.Method:
case EntityType.Operator:
case EntityType.Constructor:
case EntityType.Destructor:
return true;
default:
return false;
}
}
TypeSystemAstBuilder CreateAstBuilder()
{
TypeSystemAstBuilder astBuilder = new TypeSystemAstBuilder();
astBuilder.ShowModifiers = (ConversionFlags & ConversionFlags.ShowModifiers) == ConversionFlags.ShowModifiers;
astBuilder.ShowAccessibility = (ConversionFlags & ConversionFlags.ShowAccessibility) == ConversionFlags.ShowAccessibility;
astBuilder.AlwaysUseShortTypeNames = (ConversionFlags & ConversionFlags.UseFullyQualifiedTypeNames) != ConversionFlags.UseFullyQualifiedTypeNames;
astBuilder.ShowParameterNames = (ConversionFlags & ConversionFlags.ShowParameterNames) == ConversionFlags.ShowParameterNames;
return astBuilder;
}
void ConvertTypeDeclaration(ITypeDefinition typeDef, StringWriter writer)
{
TypeSystemAstBuilder astBuilder = CreateAstBuilder();
TypeDeclaration typeDeclaration = (TypeDeclaration)astBuilder.ConvertEntity(typeDef);
var declaration = astBuilder.ConvertEntity(typeDef);
TypeDeclaration typeDeclaration = (TypeDeclaration)declaration;
PrintModifiers(typeDeclaration.Modifiers, writer);
if ((ConversionFlags & ConversionFlags.ShowDefinitionKeyWord) == ConversionFlags.ShowDefinitionKeyWord) {
switch (typeDeclaration.ClassType) {
@ -139,7 +172,7 @@ namespace ICSharpCode.NRefactory.CSharp @@ -139,7 +172,7 @@ namespace ICSharpCode.NRefactory.CSharp
}
writer.Write(typeDef.Name);
if ((ConversionFlags & ConversionFlags.ShowTypeParameterList) == ConversionFlags.ShowTypeParameterList) {
CreatePrinter(writer).WriteTypeParameters(((TypeDeclaration)astBuilder.ConvertEntity(typeDef)).TypeParameters);
CreatePrinter(writer).WriteTypeParameters(astBuilder.ConvertEntity(typeDef).GetChildrenByRole(AstNode.Roles.TypeParameter));
}
}

8
ICSharpCode.NRefactory.CSharp/Refactoring/TypeSystemAstBuilder.cs

@ -367,7 +367,7 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring @@ -367,7 +367,7 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
#endregion
#region Convert Entity
public AstNode ConvertEntity(IEntity entity)
public AttributedNode ConvertEntity(IEntity entity)
{
if (entity == null)
throw new ArgumentNullException("entity");
@ -467,7 +467,7 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring @@ -467,7 +467,7 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
ITypeDefinition d = invokeMethod.DeclaringTypeDefinition;
DelegateDeclaration decl = new DelegateDeclaration();
decl.Modifiers = modifiers;
decl.Modifiers = modifiers & ~Modifiers.Sealed;
decl.ReturnType = ConvertType(invokeMethod.ReturnType);
decl.Name = d.Name;
@ -491,7 +491,7 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring @@ -491,7 +491,7 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
return decl;
}
AstNode ConvertField(IField field)
FieldDeclaration ConvertField(IField field)
{
FieldDeclaration decl = new FieldDeclaration();
if (ShowModifiers) {
@ -583,7 +583,7 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring @@ -583,7 +583,7 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
return decl;
}
AstNode ConvertOperator(IMethod op)
AttributedNode ConvertOperator(IMethod op)
{
OperatorType? opType = OperatorDeclaration.GetOperatorType(op.Name);
if (opType == null)

19
ICSharpCode.NRefactory.Tests/CSharp/CSharpAmbienceTests.cs

@ -135,6 +135,25 @@ namespace ICSharpCode.NRefactory.CSharp @@ -135,6 +135,25 @@ namespace ICSharpCode.NRefactory.CSharp
}
#endregion
#region Delegate tests
[Test]
public void DelegateName()
{
var func = compilation.FindType(typeof(Func<,>)).GetDefinition();
ambience.ConversionFlags = ConversionFlags.ShowTypeParameterList;
Assert.AreEqual("Func<in T, out TResult>", ambience.ConvertEntity(func));
}
[Test]
public void FullDelegate()
{
var func = compilation.FindType(typeof(Func<,>)).GetDefinition();
ambience.ConversionFlags = ConversionFlags.All;
Assert.AreEqual("public delegate TResult System.Func<in T, out TResult>(T arg);", ambience.ConvertEntity(func));
}
#endregion
#region IField tests
[Test]
public void SimpleField()

Loading…
Cancel
Save