Browse Source

implement CSharpAmbience for ITypeDefinition

newNRvisualizers
Siegfried Pammer 14 years ago
parent
commit
b003c042d0
  1. 19
      SharpDevelop.sln
  2. 3
      src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Ast/Modifiers.cs
  3. 8
      src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/OutputVisitor/OutputVisitor.cs
  4. 4
      src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Refactoring/TypeSystemAstBuilder.cs
  5. 108
      src/Main/Base/Project/Src/Services/AmbienceService/CSharpAmbience.cs
  6. 12
      src/Main/Base/Project/Src/Services/AmbienceService/IAmbience.cs

19
SharpDevelop.sln

@ -50,6 +50,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StartUp", "src\Main\StartUp @@ -50,6 +50,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StartUp", "src\Main\StartUp
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.SharpDevelop.Tests", "src\Main\Base\Test\ICSharpCode.SharpDevelop.Tests.csproj", "{4980B743-B32F-4aba-AABD-45E2CAD3568D}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.Core.Tests", "src\Main\Core\Test\ICSharpCode.Core.Tests.csproj", "{AD6FAA08-D6F5-4DBA-AF85-F4DA9F40C3B5}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Libraries", "Libraries", "{2A232EF1-EB95-41C6-B63A-C106E0C95D3C}"
ProjectSection(SolutionItems) = postProject
EndProjectSection
@ -343,6 +345,22 @@ Global @@ -343,6 +345,22 @@ Global
{4980B743-B32F-4ABA-AABD-45E2CAD3568D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{4980B743-B32F-4ABA-AABD-45E2CAD3568D}.Release|Any CPU.Build.0 = Release|Any CPU
{4980B743-B32F-4ABA-AABD-45E2CAD3568D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{AD6FAA08-D6F5-4DBA-AF85-F4DA9F40C3B5}.Debug|Any CPU.Build.0 = Debug|Any CPU
{AD6FAA08-D6F5-4DBA-AF85-F4DA9F40C3B5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{AD6FAA08-D6F5-4DBA-AF85-F4DA9F40C3B5}.Debug|Win32.Build.0 = Debug|Any CPU
{AD6FAA08-D6F5-4DBA-AF85-F4DA9F40C3B5}.Debug|Win32.ActiveCfg = Debug|Any CPU
{AD6FAA08-D6F5-4DBA-AF85-F4DA9F40C3B5}.Debug|x86.Build.0 = Debug|Any CPU
{AD6FAA08-D6F5-4DBA-AF85-F4DA9F40C3B5}.Debug|x86.ActiveCfg = Debug|Any CPU
{AD6FAA08-D6F5-4DBA-AF85-F4DA9F40C3B5}.Debug|Debug.Build.0 = Debug|Any CPU
{AD6FAA08-D6F5-4DBA-AF85-F4DA9F40C3B5}.Debug|Debug.ActiveCfg = Debug|Any CPU
{AD6FAA08-D6F5-4DBA-AF85-F4DA9F40C3B5}.Release|Any CPU.Build.0 = Debug|Any CPU
{AD6FAA08-D6F5-4DBA-AF85-F4DA9F40C3B5}.Release|Any CPU.ActiveCfg = Debug|Any CPU
{AD6FAA08-D6F5-4DBA-AF85-F4DA9F40C3B5}.Release|Win32.Build.0 = Debug|Any CPU
{AD6FAA08-D6F5-4DBA-AF85-F4DA9F40C3B5}.Release|Win32.ActiveCfg = Debug|Any CPU
{AD6FAA08-D6F5-4DBA-AF85-F4DA9F40C3B5}.Release|x86.Build.0 = Debug|Any CPU
{AD6FAA08-D6F5-4DBA-AF85-F4DA9F40C3B5}.Release|x86.ActiveCfg = Debug|Any CPU
{AD6FAA08-D6F5-4DBA-AF85-F4DA9F40C3B5}.Release|Debug.Build.0 = Debug|Any CPU
{AD6FAA08-D6F5-4DBA-AF85-F4DA9F40C3B5}.Release|Debug.ActiveCfg = Debug|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@ -358,6 +376,7 @@ Global @@ -358,6 +376,7 @@ Global
{8035765F-D51F-4A0C-A746-2FD100E19419} = {256F5C28-532C-44C0-8AB8-D8EC5E492E01}
{1152B71B-3C05-4598-B20D-823B5D40559E} = {256F5C28-532C-44C0-8AB8-D8EC5E492E01}
{4980B743-B32F-4aba-AABD-45E2CAD3568D} = {256F5C28-532C-44C0-8AB8-D8EC5E492E01}
{AD6FAA08-D6F5-4DBA-AF85-F4DA9F40C3B5} = {256F5C28-532C-44C0-8AB8-D8EC5E492E01}
{D68133BD-1E63-496E-9EDE-4FBDBF77B486} = {2A232EF1-EB95-41C6-B63A-C106E0C95D3C}
{E5A0F4D8-37FD-4A30-BEB0-4409DC4E0865} = {2A232EF1-EB95-41C6-B63A-C106E0C95D3C}
{2FF700C2-A38A-48BD-A637-8CAFD4FE6237} = {2A232EF1-EB95-41C6-B63A-C106E0C95D3C}

3
src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Ast/Modifiers.cs

@ -71,4 +71,5 @@ namespace ICSharpCode.NRefactory.CSharp @@ -71,4 +71,5 @@ namespace ICSharpCode.NRefactory.CSharp
/// Special value used to match any modifiers during pattern matching.
/// </summary>
Any = unchecked((int)0x80000000)
}}
}
}

8
src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/OutputVisitor/OutputVisitor.cs

@ -154,6 +154,8 @@ namespace ICSharpCode.NRefactory.CSharp @@ -154,6 +154,8 @@ namespace ICSharpCode.NRefactory.CSharp
/// </summary>
void WriteSpecialsUpToRole (Role role)
{
if (positionStack.Count == 0)
return;
for (AstNode pos = positionStack.Peek(); pos != null; pos = pos.NextSibling) {
if (pos.Role == role) {
WriteSpecials (positionStack.Pop (), pos);
@ -169,6 +171,8 @@ namespace ICSharpCode.NRefactory.CSharp @@ -169,6 +171,8 @@ namespace ICSharpCode.NRefactory.CSharp
/// </summary>
void WriteSpecialsUpToNode (AstNode node)
{
if (positionStack.Count == 0)
return;
for (AstNode pos = positionStack.Peek(); pos != null; pos = pos.NextSibling) {
if (pos == node) {
WriteSpecials (positionStack.Pop (), pos);
@ -180,6 +184,8 @@ namespace ICSharpCode.NRefactory.CSharp @@ -180,6 +184,8 @@ namespace ICSharpCode.NRefactory.CSharp
void WriteSpecialsUpToRole (Role role, AstNode nextNode)
{
if (positionStack.Count == 0)
return;
// Look for the role between the current position and the nextNode.
for (AstNode pos = positionStack.Peek(); pos != null && pos != nextNode; pos = pos.NextSibling) {
if (pos.Role == AstNode.Roles.Comma) {
@ -433,7 +439,7 @@ namespace ICSharpCode.NRefactory.CSharp @@ -433,7 +439,7 @@ namespace ICSharpCode.NRefactory.CSharp
}
}
void WriteTypeParameters (IEnumerable<TypeParameterDeclaration> typeParameters)
public void WriteTypeParameters (IEnumerable<TypeParameterDeclaration> typeParameters)
{
if (typeParameters.Any ()) {
WriteToken ("<", AstNode.Roles.LChevron);

4
src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Refactoring/TypeSystemAstBuilder.cs

@ -462,8 +462,10 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring @@ -462,8 +462,10 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
decl.ClassType = classType;
decl.Name = typeDefinition.Name;
int outerTypeParameterCount = (typeDefinition.DeclaringTypeDefinition == null) ? 0 : typeDefinition.DeclaringTypeDefinition.TypeParameterCount;
if (this.ShowTypeParameters) {
foreach (ITypeParameter tp in typeDefinition.TypeParameters) {
foreach (ITypeParameter tp in typeDefinition.TypeParameters.Skip(outerTypeParameterCount)) {
decl.TypeParameters.Add(ConvertTypeParameter(tp));
}
}

108
src/Main/Base/Project/Src/Services/AmbienceService/CSharpAmbience.cs

@ -2,7 +2,9 @@ @@ -2,7 +2,9 @@
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using ICSharpCode.NRefactory.CSharp;
using ICSharpCode.NRefactory.CSharp.Refactoring;
@ -18,18 +20,116 @@ namespace ICSharpCode.SharpDevelop @@ -18,18 +20,116 @@ namespace ICSharpCode.SharpDevelop
{
public ConversionFlags ConversionFlags { get; set; }
#region ConvertEntity
public string ConvertEntity(IEntity e)
{
using (var ctx = ParserService.CurrentTypeResolveContext.Synchronize()) {
TypeSystemAstBuilder astBuilder = new TypeSystemAstBuilder(ctx);
var astNode = astBuilder.ConvertEntity(e);
CSharpFormattingOptions formatting = new CSharpFormattingOptions();
StringWriter writer = new StringWriter();
astNode.AcceptVisitor(new OutputVisitor(writer, formatting), null);
switch (e.EntityType) {
case EntityType.None:
break;
case EntityType.TypeDefinition:
ConvertTypeDeclaration((ITypeDefinition)e, ctx, writer);
break;
case EntityType.Field:
break;
case EntityType.Property:
break;
case EntityType.Indexer:
break;
case EntityType.Event:
break;
case EntityType.Method:
break;
case EntityType.Operator:
break;
case EntityType.Constructor:
break;
case EntityType.Destructor:
break;
default:
throw new Exception("Invalid value for EntityType");
}
return writer.ToString().TrimEnd();
}
}
void ConvertTypeDeclaration(ITypeDefinition typeDef, ITypeResolveContext ctx, StringWriter writer)
{
TypeSystemAstBuilder astBuilder = new TypeSystemAstBuilder(ctx);
astBuilder.ShowModifiers = (ConversionFlags & ConversionFlags.ShowModifiers) == ConversionFlags.ShowModifiers;
astBuilder.ShowAccessibility = (ConversionFlags & ConversionFlags.ShowAccessibility) == ConversionFlags.ShowAccessibility;
TypeDeclaration typeDeclaration = (TypeDeclaration)astBuilder.ConvertEntity(typeDef);
PrintModifiers(typeDeclaration.Modifiers, writer);
if ((ConversionFlags & ConversionFlags.ShowDefinitionKeyWord) == ConversionFlags.ShowDefinitionKeyWord) {
switch (typeDeclaration.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(" ");
}
WriteTypeDeclarationName(typeDef, ctx, writer);
}
void WriteTypeDeclarationName(ITypeDefinition typeDef, ITypeResolveContext ctx, StringWriter writer)
{
TypeSystemAstBuilder astBuilder = new TypeSystemAstBuilder(ctx);
if (typeDef.DeclaringTypeDefinition != null) {
WriteTypeDeclarationName(typeDef.DeclaringTypeDefinition, ctx, writer);
writer.Write('.');
} else if ((ConversionFlags & ConversionFlags.UseFullyQualifiedMemberNames) == ConversionFlags.UseFullyQualifiedMemberNames) {
writer.Write(typeDef.Namespace);
writer.Write('.');
}
writer.Write(typeDef.Name);
if ((ConversionFlags & ConversionFlags.ShowTypeParameterList) == ConversionFlags.ShowTypeParameterList) {
CreatePrinter(writer).WriteTypeParameters(((TypeDeclaration)astBuilder.ConvertEntity(typeDef)).TypeParameters);
}
}
void PrintNode(AstNode node, StringWriter writer)
{
node.AcceptVisitor(CreatePrinter(writer), null);
}
OutputVisitor CreatePrinter(StringWriter writer)
{
return new OutputVisitor(writer, new CSharpFormattingOptions());
}
void PrintModifiers(Modifiers modifiers, StringWriter writer)
{
foreach (var m in CSharpModifierToken.AllModifiers) {
if ((modifiers & m) == m) {
writer.Write(CSharpModifierToken.GetModifierName(m));
writer.Write(" ");
}
}
}
#endregion
public string ConvertVariable(IVariable v)
{
using (var ctx = ParserService.CurrentTypeResolveContext.Synchronize()) {

12
src/Main/Base/Project/Src/Services/AmbienceService/IAmbience.cs

@ -38,12 +38,6 @@ namespace ICSharpCode.SharpDevelop @@ -38,12 +38,6 @@ namespace ICSharpCode.SharpDevelop
/// </summary>
ShowModifiers = 0x20,
/// <summary>
/// Show the inheritance declaration
/// </summary>
ShowInheritanceList = 0x40,
IncludeHtmlMarkup = 0x80,
/// <summary>
/// Show the return type
/// </summary>
ShowReturnType = 0x100,
@ -52,12 +46,6 @@ namespace ICSharpCode.SharpDevelop @@ -52,12 +46,6 @@ namespace ICSharpCode.SharpDevelop
/// </summary>
UseFullyQualifiedTypeNames = 0x200,
/// <summary>
/// Include opening brace (or equivalent) for methods or classes;
/// or semicolon (or equivalent) for field, events.
/// For properties, a block indicating if there is a getter/setter is included.
/// </summary>
IncludeBody = 0x400,
/// <summary>
/// Show the list of type parameters on method and class declarations.
/// Type arguments for parameter/return types are always shown.
/// </summary>

Loading…
Cancel
Save