public override string GenerateInterfaceForClass(string newInterfaceName, string existingCode, IList<IMember> membersToKeep, IClass sourceClass, bool preserveComments)
{
Modifiers modifiers = CodeGenerator.ConvertModifier(sourceClass.Modifiers, new ClassFinder(membersToKeep[0]));
// keep only visibility modifiers and 'unsafe' modifier
// -> remove abstract,sealed,static
modifiers &= Modifiers.Visibility | Modifiers.Unsafe;
TypeDeclaration interfaceDef = new TypeDeclaration(modifiers, new List<AttributeSection>());
interfaceDef.Name = newInterfaceName;
interfaceDef.Type = NR.Ast.ClassType.Interface;
interfaceDef.Templates = CodeGenerator.ConvertTemplates(sourceClass.TypeParameters, new ClassFinder(membersToKeep[0]));
foreach (IMember member in membersToKeep) {
AttributedNode an = CodeGenerator.ConvertMember(member, new ClassFinder(member));
INode node = null;
if (an is MethodDeclaration) {
MethodDeclaration m = an as MethodDeclaration;
m.Body = BlockStatement.Null;
m.Modifier = Modifiers.None;
node = m;
} else {
if (an is PropertyDeclaration) {
PropertyDeclaration p = an as PropertyDeclaration;
p.GetRegion.Block = BlockStatement.Null;
p.SetRegion.Block= BlockStatement.Null;
p.Modifier = Modifiers.None;
node = p;
} else {
if (an is EventDeclaration) {
EventDeclaration e = an as EventDeclaration;
e.Modifier = Modifiers.None;
node = e;
}
}
}
if (node == null)
throw new NotSupportedException();
interfaceDef.AddChild(node);
}
IOutputAstVisitor printer = this.GetOutputVisitor();
interfaceDef.AcceptVisitor(printer, null);
string codeForNewInterface = printer.Text;
// wrap the new code in the same comments/usings/namespace as the the original class file.
string newFileContent = CreateNewFileLikeExisting(existingCode, codeForNewInterface);
return newFileContent;
}