Browse Source

Fixed BOO-628 - Alt+Ins code generation only works for C# and VB.

Alt+Ins code generators now use ICSharpCode.SharpDevelop.Refactoring.CodeGenerator.

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@946 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Daniel Grunwald 20 years ago
parent
commit
e1e7877a49
  1. 25
      AddIns/ICSharpCode.SharpDevelop.addin
  2. 2
      src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/ConvertVisitor.cs
  3. 8
      src/AddIns/BackendBindings/Boo/NRefactoryToBooConverter/Project/ConvertVisitorStatements.cs
  4. 18
      src/AddIns/BackendBindings/Boo/NRefactoryToBooConverter/Test/StatementTests.cs
  5. 86
      src/Main/Base/Project/Src/Services/RefactoringService/CodeGenerator.cs
  6. 9
      src/Main/Base/Project/Src/TextEditor/Commands/ClassMemberMenuBuilder.cs
  7. 32
      src/Main/Base/Project/Src/TextEditor/Commands/CodeGenerators/AbstractClassImplementorCodeGenerator.cs
  8. 8
      src/Main/Base/Project/Src/TextEditor/Commands/CodeGenerators/AbstractFieldCodeGenerator.cs
  9. 139
      src/Main/Base/Project/Src/TextEditor/Commands/CodeGenerators/AbstractPropertyCodeGenerator.cs
  10. 121
      src/Main/Base/Project/Src/TextEditor/Commands/CodeGenerators/CodeGenerator.cs
  11. 75
      src/Main/Base/Project/Src/TextEditor/Commands/CodeGenerators/ConstructorCodeGenerator.cs
  12. 137
      src/Main/Base/Project/Src/TextEditor/Commands/CodeGenerators/EqualsCodeGenerator.cs
  13. 12
      src/Main/Base/Project/Src/TextEditor/Commands/CodeGenerators/GetterAndSetterCodeGenerator.cs
  14. 12
      src/Main/Base/Project/Src/TextEditor/Commands/CodeGenerators/GetterCodeGenerator.cs
  15. 237
      src/Main/Base/Project/Src/TextEditor/Commands/CodeGenerators/InterfaceImplementorCodeGenerator.cs
  16. 48
      src/Main/Base/Project/Src/TextEditor/Commands/CodeGenerators/OnXXXMethodsCodeGenerator.cs
  17. 113
      src/Main/Base/Project/Src/TextEditor/Commands/CodeGenerators/OverrideMethodsCodeGenerator.cs
  18. 127
      src/Main/Base/Project/Src/TextEditor/Commands/CodeGenerators/OverridePropertiesCodeGenerator.cs
  19. 11
      src/Main/Base/Project/Src/TextEditor/Commands/CodeGenerators/SetterCodeGenerator.cs
  20. 108
      src/Main/Base/Project/Src/TextEditor/Commands/CodeGenerators/ToStringCodeGenerator.cs
  21. 29
      src/Main/Base/Project/Src/TextEditor/Commands/GenerateCodeCommand.cs
  22. 53
      src/Main/Base/Project/Src/TextEditor/Gui/Editor/CompletionWindow/OverrideCompletionDataProvider.cs
  23. 21
      src/Main/Core/Project/Src/Services/ResourceService/ResourceService.cs

25
AddIns/ICSharpCode.SharpDevelop.addin

@ -1936,4 +1936,29 @@
<Class id = "DefaultBuilder" <Class id = "DefaultBuilder"
class = "ICSharpCode.SharpDevelop.Project.DefaultDotNetNodeBuilder"/> class = "ICSharpCode.SharpDevelop.Project.DefaultDotNetNodeBuilder"/>
</Path> </Path>
<Path name = "/AddIns/DefaultTextEditor/CodeGenerator">
<Class id="ConstructorCodeGenerator"
class="ICSharpCode.SharpDevelop.DefaultEditor.Commands.ConstructorCodeGenerator"/>
<Class id="GetterCodeGenerator"
class="ICSharpCode.SharpDevelop.DefaultEditor.Commands.GetterCodeGenerator"/>
<Class id="SetterCodeGenerator"
class="ICSharpCode.SharpDevelop.DefaultEditor.Commands.SetterCodeGenerator"/>
<Class id="GetterAndSetterCodeGenerator"
class="ICSharpCode.SharpDevelop.DefaultEditor.Commands.GetterAndSetterCodeGenerator"/>
<Class id="OnXXXMethodsCodeGenerator"
class="ICSharpCode.SharpDevelop.DefaultEditor.Commands.OnXXXMethodsCodeGenerator"/>
<Class id="OverrideMethodsCodeGenerator"
class="ICSharpCode.SharpDevelop.DefaultEditor.Commands.OverrideMethodsCodeGenerator"/>
<Class id="OverridePropertiesCodeGenerator"
class="ICSharpCode.SharpDevelop.DefaultEditor.Commands.OverridePropertiesCodeGenerator"/>
<Class id="InterfaceImplementorCodeGenerator"
class="ICSharpCode.SharpDevelop.DefaultEditor.Commands.InterfaceImplementorCodeGenerator"/>
<Class id="AbstractClassImplementorCodeGenerator"
class="ICSharpCode.SharpDevelop.DefaultEditor.Commands.AbstractClassImplementorCodeGenerator"/>
<Class id="ToStringCodeGenerator"
class="ICSharpCode.SharpDevelop.DefaultEditor.Commands.ToStringCodeGenerator"/>
<Class id="EqualsCodeGenerator"
class="ICSharpCode.SharpDevelop.DefaultEditor.Commands.EqualsCodeGenerator"/>
</Path>
</AddIn> </AddIn>

2
src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/ConvertVisitor.cs

@ -63,7 +63,7 @@ namespace Grunwald.BooBinding.CodeCompletion
if (m is AST.Field) { if (m is AST.Field) {
if (m.IsFinal) r |= ModifierEnum.Readonly; if (m.IsFinal) r |= ModifierEnum.Readonly;
} else { } else {
if (!m.IsFinal) r |= ModifierEnum.Virtual; if (m.IsFinal) r |= ModifierEnum.Sealed;
} }
if (m.IsAbstract) r |= ModifierEnum.Abstract; if (m.IsAbstract) r |= ModifierEnum.Abstract;
if (m.IsOverride) r |= ModifierEnum.Override; if (m.IsOverride) r |= ModifierEnum.Override;

8
src/AddIns/BackendBindings/Boo/NRefactoryToBooConverter/Project/ConvertVisitorStatements.cs

@ -278,18 +278,20 @@ namespace NRefactoryToBooConverter
public object Visit(AddHandlerStatement addHandlerStatement, object data) public object Visit(AddHandlerStatement addHandlerStatement, object data)
{ {
return new B.BinaryExpression(GetLexicalInfo(addHandlerStatement), B.Expression expr = new B.BinaryExpression(GetLexicalInfo(addHandlerStatement),
B.BinaryOperatorType.InPlaceAddition, B.BinaryOperatorType.InPlaceAddition,
ConvertExpression(addHandlerStatement.EventExpression), ConvertExpression(addHandlerStatement.EventExpression),
ConvertExpression(addHandlerStatement.HandlerExpression)); ConvertExpression(addHandlerStatement.HandlerExpression));
return new B.ExpressionStatement(expr);
} }
public object Visit(RemoveHandlerStatement removeHandlerStatement, object data) public object Visit(RemoveHandlerStatement removeHandlerStatement, object data)
{ {
return new B.BinaryExpression(GetLexicalInfo(removeHandlerStatement), B.Expression expr = new B.BinaryExpression(GetLexicalInfo(removeHandlerStatement),
B.BinaryOperatorType.InPlaceSubtraction, B.BinaryOperatorType.InPlaceSubtraction,
ConvertExpression(removeHandlerStatement.EventExpression), ConvertExpression(removeHandlerStatement.EventExpression),
ConvertExpression(removeHandlerStatement.HandlerExpression)); ConvertExpression(removeHandlerStatement.HandlerExpression));
return new B.ExpressionStatement(expr);
} }
public object Visit(RaiseEventStatement raiseEventStatement, object data) public object Visit(RaiseEventStatement raiseEventStatement, object data)
@ -297,7 +299,7 @@ namespace NRefactoryToBooConverter
B.MethodInvocationExpression mie = new B.MethodInvocationExpression(GetLexicalInfo(raiseEventStatement)); B.MethodInvocationExpression mie = new B.MethodInvocationExpression(GetLexicalInfo(raiseEventStatement));
mie.Target = new B.ReferenceExpression(raiseEventStatement.EventName); mie.Target = new B.ReferenceExpression(raiseEventStatement.EventName);
ConvertExpressions(raiseEventStatement.Arguments, mie.Arguments); ConvertExpressions(raiseEventStatement.Arguments, mie.Arguments);
return mie; return new B.ExpressionStatement(mie);
} }
public object Visit(EraseStatement eraseStatement, object data) public object Visit(EraseStatement eraseStatement, object data)

18
src/AddIns/BackendBindings/Boo/NRefactoryToBooConverter/Test/StatementTests.cs

@ -258,5 +258,23 @@ namespace NRefactoryToBooConverter.Tests
{ {
TestStatementVB("Dim A As Integer()\nB = A(5)", "A as (System.Int32)\nB = A[5]"); TestStatementVB("Dim A As Integer()\nB = A(5)", "A as (System.Int32)\nB = A[5]");
} }
[Test]
public void VBRaiseEvent()
{
TestStatementVB("RaiseEvent Test(4)", "Test(4)");
}
[Test]
public void VBAddEventHandler()
{
TestStatementVB("AddHandler someObject.Test, AddressOf HandlerMethod", "someObject.Test += HandlerMethod");
}
[Test]
public void VBAddRemoveHandler()
{
TestStatementVB("RemoveHandler someObject.Test, AddressOf HandlerMethod", "someObject.Test -= HandlerMethod");
}
} }
} }

86
src/Main/Base/Project/Src/Services/RefactoringService/CodeGenerator.cs

@ -273,7 +273,17 @@ namespace ICSharpCode.SharpDevelop.Refactoring
return Char.ToUpper(fieldName[0]) + fieldName.Substring(1); return Char.ToUpper(fieldName[0]) + fieldName.Substring(1);
} }
public virtual void CreateProperty(IField field, IDocument document, bool createGetter, bool createSetter) public virtual string GetParameterName(string fieldName)
{
if (fieldName.StartsWith("_") && fieldName.Length > 1)
return Char.ToLower(fieldName[1]) + fieldName.Substring(2);
else if (fieldName.StartsWith("m_") && fieldName.Length > 2)
return Char.ToLower(fieldName[2]) + fieldName.Substring(3);
else
return Char.ToLower(fieldName[0]) + fieldName.Substring(1);
}
public virtual PropertyDeclaration CreateProperty(IField field, bool createGetter, bool createSetter)
{ {
string name = GetPropertyName(field.Name); string name = GetPropertyName(field.Name);
PropertyDeclaration property = new PropertyDeclaration(name, PropertyDeclaration property = new PropertyDeclaration(name,
@ -293,8 +303,7 @@ namespace ICSharpCode.SharpDevelop.Refactoring
} }
property.Modifier = Modifier.Public | (property.Modifier & Modifier.Static); property.Modifier = Modifier.Public | (property.Modifier & Modifier.Static);
return property;
InsertCodeAfter(field, document, property);
} }
#endregion #endregion
@ -319,7 +328,7 @@ namespace ICSharpCode.SharpDevelop.Refactoring
#endregion #endregion
#region Generate OnEventMethod #region Generate OnEventMethod
public virtual void CreateOnEventMethod(IEvent e, IDocument document) public virtual MethodDeclaration CreateOnEventMethod(IEvent e)
{ {
TypeReference type = ConvertType(e.ReturnType, new ClassFinder(e)); TypeReference type = ConvertType(e.ReturnType, new ClassFinder(e));
if (type.Type.EndsWith("Handler")) if (type.Type.EndsWith("Handler"))
@ -348,7 +357,7 @@ namespace ICSharpCode.SharpDevelop.Refactoring
method.Body = new BlockStatement(); method.Body = new BlockStatement();
method.Body.AddChild(new RaiseEventStatement(e.Name, arguments)); method.Body.AddChild(new RaiseEventStatement(e.Name, arguments));
InsertCodeAfter(e, document, method); return method;
} }
#endregion #endregion
@ -361,12 +370,21 @@ namespace ICSharpCode.SharpDevelop.Refactoring
return member.DeclaringType.FullyQualifiedName; return member.DeclaringType.FullyQualifiedName;
} }
public virtual void ImplementInterface(IReturnType interf, IDocument document, bool explicitImpl, ModifierEnum implModifier, IClass targetClass) public void ImplementInterface(IReturnType interf, IDocument document, bool explicitImpl, ModifierEnum implModifier, IClass targetClass)
{
List<AbstractNode> nodes = new List<AbstractNode>();
InsertCodeInClass(targetClass, document, nodes.ToArray());
}
/// <summary>
/// Adds the methods implementing the <paramref name="interf"/> to the list
/// <paramref name="nodes"/>.
/// </summary>
public virtual void ImplementInterface(IList<AbstractNode> nodes, IReturnType interf, bool explicitImpl, ModifierEnum implModifier, IClass targetClass)
{ {
ClassFinder context = new ClassFinder(targetClass, targetClass.Region.BeginLine + 1, 0); ClassFinder context = new ClassFinder(targetClass, targetClass.Region.BeginLine + 1, 0);
TypeReference interfaceReference = ConvertType(interf, context); TypeReference interfaceReference = ConvertType(interf, context);
Modifier modifier = ConvertModifier(implModifier); Modifier modifier = ConvertModifier(implModifier);
List<AbstractNode> nodes = new List<AbstractNode>();
List<IEvent> targetClassEvents = targetClass.DefaultReturnType.GetEvents(); List<IEvent> targetClassEvents = targetClass.DefaultReturnType.GetEvents();
foreach (IEvent e in interf.GetEvents()) { foreach (IEvent e in interf.GetEvents()) {
if (targetClassEvents.Find(delegate(IEvent te) { return e.Name == te.Name; }) == null) { if (targetClassEvents.Find(delegate(IEvent te) { return e.Name == te.Name; }) == null) {
@ -410,7 +428,59 @@ namespace ICSharpCode.SharpDevelop.Refactoring
} }
} }
} }
InsertCodeInClass(targetClass, document, nodes.ToArray()); }
#endregion
#region Override member
public virtual AttributedNode GetOverridingMethod(IMember baseMember, ClassFinder targetContext)
{
AttributedNode node = ConvertMember(baseMember, targetContext);
node.Modifier &= ~(Modifier.Virtual | Modifier.Abstract);
node.Modifier |= Modifier.Override;
MethodDeclaration method = node as MethodDeclaration;
if (method != null) {
method.Body.Children.Clear();
if (method.TypeReference.SystemType == "System.Void") {
method.Body.AddChild(new StatementExpression(CreateForwardingMethodCall(method)));
} else {
method.Body.AddChild(new ReturnStatement(CreateForwardingMethodCall(method)));
}
}
PropertyDeclaration property = node as PropertyDeclaration;
if (property != null) {
Expression field = new FieldReferenceExpression(new BaseReferenceExpression(),
property.Name);
if (!property.GetRegion.Block.IsNull) {
property.GetRegion.Block.Children.Clear();
property.GetRegion.Block.AddChild(new ReturnStatement(field));
}
if (!property.SetRegion.Block.IsNull) {
property.SetRegion.Block.Children.Clear();
Expression expr = new AssignmentExpression(field,
AssignmentOperatorType.Assign,
new IdentifierExpression("value"));
property.SetRegion.Block.AddChild(new StatementExpression(expr));
}
}
return node;
}
static InvocationExpression CreateForwardingMethodCall(MethodDeclaration method)
{
Expression methodName = new FieldReferenceExpression(new BaseReferenceExpression(),
method.Name);
InvocationExpression ie = new InvocationExpression(methodName, null);
foreach (ParameterDeclarationExpression param in method.Parameters) {
Expression expr = new IdentifierExpression(param.ParameterName);
if (param.ParamModifier == ParamModifier.Ref) {
expr = new DirectionExpression(FieldDirection.Ref, expr);
} else if (param.ParamModifier == ParamModifier.Out) {
expr = new DirectionExpression(FieldDirection.Out, expr);
}
ie.Arguments.Add(expr);
}
return ie;
} }
#endregion #endregion
} }

9
src/Main/Base/Project/Src/TextEditor/Commands/ClassMemberMenuBuilder.cs

@ -133,7 +133,9 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands
IField member = (IField)item.Tag; IField member = (IField)item.Tag;
TextEditorControl textEditor = FindReferencesAndRenameHelper.JumpBehindDefinition(member); TextEditorControl textEditor = FindReferencesAndRenameHelper.JumpBehindDefinition(member);
member.DeclaringType.ProjectContent.Language.CodeGenerator.CreateProperty(member, textEditor.Document, true, includeSetter); CodeGenerator codeGen = member.DeclaringType.ProjectContent.Language.CodeGenerator;
codeGen.InsertCodeAfter(member, textEditor.Document,
codeGen.CreateProperty(member, true, includeSetter));
ParserService.ParseCurrentViewContent(); ParserService.ParseCurrentViewContent();
} }
@ -151,7 +153,8 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands
MenuCommand item = (MenuCommand)sender; MenuCommand item = (MenuCommand)sender;
IEvent member = (IEvent)item.Tag; IEvent member = (IEvent)item.Tag;
TextEditorControl textEditor = FindReferencesAndRenameHelper.JumpBehindDefinition(member); TextEditorControl textEditor = FindReferencesAndRenameHelper.JumpBehindDefinition(member);
member.DeclaringType.ProjectContent.Language.CodeGenerator.CreateOnEventMethod(member, textEditor.Document); CodeGenerator codeGen = member.DeclaringType.ProjectContent.Language.CodeGenerator;
codeGen.InsertCodeAfter(member, textEditor.Document, codeGen.CreateOnEventMethod(member));
ParserService.ParseCurrentViewContent(); ParserService.ParseCurrentViewContent();
} }
@ -184,7 +187,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands
if (member is IField) { if (member is IField) {
IProperty property = FindProperty((IField)member); IProperty property = FindProperty((IField)member);
if (property != null) { if (property != null) {
string newPropertyName = AbstractPropertyCodeGenerator.GetPropertyName(newName); string newPropertyName = member.DeclaringType.ProjectContent.Language.CodeGenerator.GetPropertyName(newName);
if (newPropertyName != newName && newPropertyName != property.Name) { if (newPropertyName != newName && newPropertyName != property.Name) {
if (MessageService.AskQuestionFormatted("${res:SharpDevelop.Refactoring.Rename}", "${res:SharpDevelop.Refactoring.RenameFieldAndProperty}", property.FullyQualifiedName, newPropertyName)) { if (MessageService.AskQuestionFormatted("${res:SharpDevelop.Refactoring.Rename}", "${res:SharpDevelop.Refactoring.RenameFieldAndProperty}", property.FullyQualifiedName, newPropertyName)) {
list = RefactoringService.FindReferences(property, null); list = RefactoringService.FindReferences(property, null);

32
src/Main/Base/Project/Src/TextEditor/Commands/CodeGenerators/AbstractClassImplementorCodeGenerator.cs

@ -7,9 +7,11 @@
using System; using System;
using System.Collections; using System.Collections;
using ICSharpCode.TextEditor; using System.Collections.Generic;
using ICSharpCode.NRefactory.Parser.AST;
using ICSharpCode.SharpDevelop.Dom; using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.SharpDevelop.Refactoring;
using ICSharpCode.Core; using ICSharpCode.Core;
namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands
@ -28,14 +30,34 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands
} }
} }
public AbstractClassImplementorCodeGenerator(IClass currentClass) : base(currentClass) public override void GenerateCode(List<AbstractNode> nodes, IList items)
{ {
base.useOverrideKeyword = true; foreach (IProperty property in currentClass.DefaultReturnType.GetProperties()) {
base.implementOnlyAbstractMembers = true; if (property.IsAbstract) {
AttributedNode node = CodeGenerator.ConvertMember(property, classFinderContext);
node.Modifier &= ~Modifier.Abstract;
node.Modifier |= Modifier.Override;
nodes.Add(node);
}
}
foreach (IMethod method in currentClass.DefaultReturnType.GetMethods()) {
if (method.IsAbstract) {
AttributedNode node = CodeGenerator.ConvertMember(method, classFinderContext);
node.Modifier &= ~Modifier.Abstract;
node.Modifier |= Modifier.Override;
nodes.Add(node);
}
}
}
protected override void InitContent()
{
if (currentClass.ClassType != ICSharpCode.SharpDevelop.Dom.ClassType.Class)
return;
for (int i = 0; i < currentClass.BaseTypes.Count; i++) { for (int i = 0; i < currentClass.BaseTypes.Count; i++) {
IReturnType baseType = currentClass.GetBaseType(i); IReturnType baseType = currentClass.GetBaseType(i);
IClass baseClass = (baseType != null) ? baseType.GetUnderlyingClass() : null; IClass baseClass = (baseType != null) ? baseType.GetUnderlyingClass() : null;
if (baseClass != null && baseClass.ClassType == ClassType.Class && baseClass.IsAbstract) { if (baseClass != null && baseClass.ClassType == ICSharpCode.SharpDevelop.Dom.ClassType.Class && baseClass.IsAbstract) {
Content.Add(new ClassWrapper(baseType)); Content.Add(new ClassWrapper(baseType));
} }
} }

8
src/Main/Base/Project/Src/TextEditor/Commands/CodeGenerators/AbstractFieldCodeGenerator.cs

@ -6,14 +6,18 @@
// </file> // </file>
using System; using System;
using System.Collections;
using System.Collections.Generic;
using ICSharpCode.SharpDevelop.Dom; using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.Core; using ICSharpCode.Core;
using ICSharpCode.TextEditor;
using ICSharpCode.NRefactory.Parser.AST;
namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands
{ {
public abstract class AbstractFieldCodeGenerator : OldCodeGeneratorBase public abstract class AbstractFieldCodeGenerator : CodeGeneratorBase
{ {
public AbstractFieldCodeGenerator(IClass currentClass) : base(currentClass) protected override void InitContent()
{ {
foreach (IField field in currentClass.Fields) { foreach (IField field in currentClass.Fields) {
Content.Add(new FieldWrapper(field)); Content.Add(new FieldWrapper(field));

139
src/Main/Base/Project/Src/TextEditor/Commands/CodeGenerators/AbstractPropertyCodeGenerator.cs

@ -16,149 +16,10 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands
{ {
public abstract class AbstractPropertyCodeGenerator : AbstractFieldCodeGenerator public abstract class AbstractPropertyCodeGenerator : AbstractFieldCodeGenerator
{ {
public AbstractPropertyCodeGenerator(IClass currentClass) : base(currentClass)
{
}
public override int ImageIndex { public override int ImageIndex {
get { get {
return ClassBrowserIconService.PropertyIndex; return ClassBrowserIconService.PropertyIndex;
} }
} }
public static string GetPropertyName(string fieldName)
{
if (fieldName.StartsWith("_") && fieldName.Length > 1)
return Char.ToUpper(fieldName[1]) + fieldName.Substring(2);
else if (fieldName.StartsWith("m_") && fieldName.Length > 2)
return Char.ToUpper(fieldName[2]) + fieldName.Substring(3);
else
return Char.ToUpper(fieldName[0]) + fieldName.Substring(1);
}
bool beginWithNewLine;
/// <summary>
/// Gets/Sets if the CodeGenerator should insert a blank line in front of the
/// first property.
/// </summary>
public bool BeginWithNewLine {
get {
return beginWithNewLine;
}
set {
beginWithNewLine = value;
}
}
protected override void StartGeneration(IList items, string fileExtension)
{
for (int i = 0; i < items.Count; ++i) {
if ((i > 0 || BeginWithNewLine) && BlankLinesBetweenMembers) {
Return();
IndentLine();
}
FieldWrapper fw = (FieldWrapper)items[i];
if (fileExtension == ".vb") {
editActionHandler.InsertString("Public " + (fw.Field.IsStatic ? "Shared " : "") + "Property " + GetPropertyName(fw.Field.Name) + " As " + vba.Convert(fw.Field.ReturnType));
} else {
editActionHandler.InsertString("public " + (fw.Field.IsStatic ? "static " : "") + csa.Convert(fw.Field.ReturnType) + " " + GetPropertyName(fw.Field.Name));
if (StartCodeBlockInSameLine) {
editActionHandler.InsertString(" {");
} else {
Return();
editActionHandler.InsertString("{");
}
++numOps;
}
++numOps;
Return();
GeneratePropertyBody(editActionHandler, fw, fileExtension);
if (fileExtension == ".vb") {
editActionHandler.InsertString("End Property");
} else {
editActionHandler.InsertChar('}');
}
++numOps;
Return();
IndentLine();
}
}
protected void GenerateGetter(TextArea editActionHandler, FieldWrapper fw, string fileExtension)
{
if (fileExtension == ".vb") {
editActionHandler.InsertString("Get");
} else {
editActionHandler.InsertString("get");
if (StartCodeBlockInSameLine) {
editActionHandler.InsertString(" {");
} else {
Return();
editActionHandler.InsertString("{");
}
++numOps;
}
++numOps;
Return();
Indent();
if (fileExtension == ".vb") {
editActionHandler.InsertString("Return " + fw.Field.Name);
} else {
editActionHandler.InsertString("return " + fw.Field.Name+ ";");
}
++numOps;
Return();
if (fileExtension == ".vb") {
editActionHandler.InsertString("End Get");
} else {
editActionHandler.InsertString("}");
}
++numOps;
Return();
}
protected void GenerateSetter(TextArea editActionHandler, FieldWrapper fw, string fileExtension)
{
if (fileExtension == ".vb") {
editActionHandler.InsertString("Set");
} else {
editActionHandler.InsertString("set");
if (StartCodeBlockInSameLine) {
editActionHandler.InsertString(" {");
} else {
Return();
editActionHandler.InsertString("{");
}
++numOps;
}
++numOps;
Return();
Indent();
if (fileExtension == ".vb") {
editActionHandler.InsertString(fw.Field.Name+ " = Value");
} else {
editActionHandler.InsertString(fw.Field.Name+ " = value;");
}
++numOps;
Return();
if (fileExtension == ".vb") {
editActionHandler.InsertString("End Set");
} else {
editActionHandler.InsertString("}");
}
++numOps;
Return();
}
protected abstract void GeneratePropertyBody(TextArea editActionHandler, FieldWrapper fw, string fileExtension);
} }
} }

121
src/Main/Base/Project/Src/TextEditor/Commands/CodeGenerators/CodeGenerator.cs

@ -8,50 +8,43 @@
using System; using System;
using System.IO; using System.IO;
using System.Collections; using System.Collections;
using System.Collections.Generic;
using ICSharpCode.TextEditor.Document; using ICSharpCode.NRefactory.Parser.AST;
using ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor;
using ICSharpCode.SharpDevelop.Gui;
using ICSharpCode.TextEditor.Actions;
using ICSharpCode.TextEditor; using ICSharpCode.TextEditor;
using ICSharpCode.SharpDevelop.Dom; using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.Core; using ICSharpCode.Core;
using ICSharpCode.SharpDevelop.Refactoring;
namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands
{ {
public abstract class OldCodeGeneratorBase public abstract class CodeGeneratorBase
{ {
ArrayList content = new ArrayList(); ArrayList content = new ArrayList();
protected int numOps = 0; protected IClass currentClass;
protected IAmbience csa; protected ICSharpCode.SharpDevelop.Refactoring.CodeGenerator codeGen;
protected IAmbience vba; protected ClassFinder classFinderContext;
protected IClass currentClass = null;
protected TextArea editActionHandler;
public OldCodeGeneratorBase(IClass currentClass) public void Initialize(IClass currentClass)
{ {
this.currentClass = currentClass; this.currentClass = currentClass;
try { this.codeGen = currentClass.ProjectContent.Language.CodeGenerator;
csa = (IAmbience)AddInTree.BuildItem("/SharpDevelop/Workbench/Ambiences/C#", this); this.classFinderContext = new ClassFinder(currentClass, currentClass.Region.BeginLine + 1, 0);
csa.ConversionFlags = ConversionFlags.ShowAccessibility | ConversionFlags.ShowModifiers | ConversionFlags.QualifiedNamesOnlyForReturnTypes | ConversionFlags.ShowReturnType | ConversionFlags.ShowParameterNames; this.InitContent();
} catch (TreePathNotFoundException) {
LoggingService.Warn("CSharpAmbience not found -- is the C# backend binding loaded???");
} }
try { protected virtual void InitContent()
vba = (IAmbience)AddInTree.BuildItem("/SharpDevelop/Workbench/Ambiences/VBNet", this); {
vba.ConversionFlags = ConversionFlags.ShowAccessibility | ConversionFlags.ShowModifiers | ConversionFlags.QualifiedNamesOnlyForReturnTypes | ConversionFlags.ShowReturnType | ConversionFlags.ShowParameterNames;
} catch (TreePathNotFoundException) {
LoggingService.Warn("VBNet ambience not found -- is the VB.NET backend binding loaded???");
}
} }
public abstract string CategoryName { public abstract string CategoryName {
get; get;
} }
public abstract string Hint { public virtual string Hint {
get; get {
return "no hint";
}
} }
public abstract int ImageIndex { public abstract int ImageIndex {
@ -70,83 +63,19 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands
} }
} }
public static bool BlankLinesBetweenMembers { protected TypeReference ConvertType(IReturnType type)
get {
return AmbienceService.CodeGenerationProperties.Get("BlankLinesBetweenMembers", true);
}
}
public static bool StartCodeBlockInSameLine {
get {
return AmbienceService.CodeGenerationProperties.Get("StartBlockOnSameLine", true);
}
}
public void GenerateCode(TextArea editActionHandler, IList items)
{ {
numOps = 0; return CodeGenerator.ConvertType(type, classFinderContext);
this.editActionHandler = editActionHandler;
editActionHandler.BeginUpdate();
bool save1 = editActionHandler.TextEditorProperties.AutoInsertCurlyBracket;
IndentStyle save2 = editActionHandler.TextEditorProperties.IndentStyle;
bool save3 = PropertyService.Get("VBBinding.TextEditor.EnableEndConstructs", true);
PropertyService.Set("VBBinding.TextEditor.EnableEndConstructs", false);
editActionHandler.TextEditorProperties.AutoInsertCurlyBracket = false;
editActionHandler.TextEditorProperties.IndentStyle = IndentStyle.Smart;
string extension = Path.GetExtension(editActionHandler.MotherTextEditorControl.FileName).ToLower();
StartGeneration(items, extension);
if (numOps > 0) {
editActionHandler.Document.UndoStack.UndoLast(numOps);
}
// restore old property settings
editActionHandler.TextEditorProperties.AutoInsertCurlyBracket = save1;
editActionHandler.TextEditorProperties.IndentStyle = save2;
PropertyService.Set("VBBinding.TextEditor.EnableEndConstructs", save3);
editActionHandler.EndUpdate();
editActionHandler.Document.RequestUpdate(new TextAreaUpdate(TextAreaUpdateType.WholeTextArea));
editActionHandler.Document.CommitUpdate();
} }
protected abstract void StartGeneration(IList items, string fileExtension); public virtual void GenerateCode(TextArea textArea, IList items)
protected void Indent()
{ {
List<AbstractNode> nodes = new List<AbstractNode>();
Properties p = ((Properties)PropertyService.Get("ICSharpCode.TextEditor.Document.Document.DefaultDocumentAggregatorProperties", new Properties())); GenerateCode(nodes, items);
codeGen.InsertCodeInClass(currentClass, textArea.Document, nodes.ToArray());
bool tabsToSpaces = p.Get("TabsToSpaces", false); ParserService.ParseCurrentViewContent();
int tabSize = p.Get("TabIndent", 4);
int indentSize = p.Get("IndentationSize", 4);
if (tabsToSpaces) {
editActionHandler.InsertString(new String(' ', indentSize));
} else {
editActionHandler.InsertString(new String('\t', indentSize / tabSize));
int trailingSpaces = indentSize % tabSize;
if (trailingSpaces > 0) {
editActionHandler.InsertString(new String(' ', trailingSpaces));
++numOps;
}
}
++numOps;
} }
protected void Return() public abstract void GenerateCode(List<AbstractNode> nodes, IList items);
{
IndentLine();
new Return().Execute(editActionHandler);
++numOps;
}
protected void IndentLine()
{
editActionHandler.Document.FormattingStrategy.IndentLine(editActionHandler, editActionHandler.Caret.Line);
}
} }
} }

75
src/Main/Base/Project/Src/TextEditor/Commands/CodeGenerators/ConstructorCodeGenerator.cs

@ -7,6 +7,8 @@
using System; using System;
using System.Collections; using System.Collections;
using System.Collections.Generic;
using ICSharpCode.NRefactory.Parser.AST;
using ICSharpCode.SharpDevelop.Dom; using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.Core; using ICSharpCode.Core;
@ -29,71 +31,24 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands
public override int ImageIndex { public override int ImageIndex {
get { get {
return ClassBrowserIconService.MethodIndex; return ClassBrowserIconService.MethodIndex;
} }
} }
public ConstructorCodeGenerator(IClass currentClass) : base(currentClass) public override void GenerateCode(List<AbstractNode> nodes, IList items)
{
}
protected override void StartGeneration(IList items, string fileExtension)
{ {
if (fileExtension == ".vb") { ConstructorDeclaration ctor = new ConstructorDeclaration(currentClass.Name, Modifier.Public, null, null);
editActionHandler.InsertString("Public Sub New("); ctor.Body = new BlockStatement();
} else { foreach (FieldWrapper w in items) {
editActionHandler.InsertString("public " + currentClass.Name + "("); string parameterName = codeGen.GetParameterName(w.Field.Name);
} ctor.Parameters.Add(new ParameterDeclarationExpression(ConvertType(w.Field.ReturnType),
++numOps; parameterName));
Expression left = new FieldReferenceExpression(new ThisReferenceExpression(), w.Field.Name);
for (int i = 0; i < items.Count; ++i) { Expression right = new IdentifierExpression(parameterName);
FieldWrapper fw = (FieldWrapper)items[i]; Expression expr = new AssignmentExpression(left, AssignmentOperatorType.Assign, right);
if (fileExtension == ".vb") { ctor.Body.AddChild(new StatementExpression(expr));
editActionHandler.InsertString(fw.Field.Name + " As " + vba.Convert(fw.Field.ReturnType)); }
} else { nodes.Add(ctor);
editActionHandler.InsertString(csa.Convert(fw.Field.ReturnType) + " " + fw.Field.Name);
}
++numOps;
if (i + 1 < items.Count) {
editActionHandler.InsertString(", ");
++numOps;
}
}
editActionHandler.InsertChar(')');++numOps;
Return();
if (fileExtension == ".vb") {
editActionHandler.InsertString("MyBase.New");
} else {
if (StartCodeBlockInSameLine) {
editActionHandler.InsertString(" {");
} else {
Return();
editActionHandler.InsertString("{");
}
}
++numOps;
Return();
for (int i = 0; i < items.Count; ++i) {
Indent();
FieldWrapper fw = (FieldWrapper)items[i];
if (fileExtension == ".vb") {
editActionHandler.InsertString("Me." + fw.Field.Name + " = " + fw.Field.Name);
} else {
editActionHandler.InsertString("this." + fw.Field.Name + " = " + fw.Field.Name + ";");
}
++numOps;
Return();
}
if (fileExtension == ".vb") {
editActionHandler.InsertString("End Sub");
} else {
editActionHandler.InsertChar('}');
}
++numOps;
Return();
IndentLine();
} }
} }
} }

137
src/Main/Base/Project/Src/TextEditor/Commands/CodeGenerators/EqualsCodeGenerator.cs

@ -7,17 +7,15 @@
using System; using System;
using System.Collections; using System.Collections;
using ICSharpCode.TextEditor; using System.Collections.Generic;
using ICSharpCode.NRefactory.Parser.AST;
using ICSharpCode.SharpDevelop.Dom; using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.Core; using ICSharpCode.Core;
namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands
{ {
/// <summary> public class EqualsCodeGenerator : CodeGeneratorBase
/// Description of EqualsCodeGenerator.
/// </summary>
public class EqualsCodeGenerator : OldCodeGeneratorBase
{ {
public override string CategoryName { public override string CategoryName {
get { get {
@ -25,94 +23,75 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands
} }
} }
public override string Hint { public override void GenerateCode(List<AbstractNode> nodes, IList items)
get { {
return "no hint"; TypeReference intReference = new TypeReference("System.Int32");
} MethodDeclaration method = new MethodDeclaration("GetHashCode", Modifier.Public | Modifier.Override, intReference, null, null);
} Expression expr = CallGetHashCode(new IdentifierExpression(currentClass.Fields[0].Name));
for (int i = 1; i < currentClass.Fields.Count; i++) {
IdentifierExpression identifier = new IdentifierExpression(currentClass.Fields[i].Name);
expr = new BinaryOperatorExpression(expr, BinaryOperatorType.ExclusiveOr,
CallGetHashCode(identifier));
}
method.Body = new BlockStatement();
method.Body.AddChild(new ReturnStatement(expr));
nodes.Add(method);
public override bool IsActive { TypeReference boolReference = new TypeReference("System.Boolean");
get { TypeReference objectReference = new TypeReference("System.Object");
return currentClass.Fields != null && currentClass.Fields.Count > 0;
}
}
public override int ImageIndex {
get {
return ClassBrowserIconService.MethodIndex; method = new MethodDeclaration("Equals", Modifier.Public | Modifier.Override, boolReference, null, null);
} method.Parameters.Add(new ParameterDeclarationExpression(objectReference, "obj"));
method.Body = new BlockStatement();
TypeReference currentType = ConvertType(currentClass.DefaultReturnType);
expr = new TypeOfIsExpression(new IdentifierExpression("obj"), currentType);
expr = new ParenthesizedExpression(expr);
expr = new UnaryOperatorExpression(expr, UnaryOperatorType.Not);
method.Body.AddChild(new IfElseStatement(expr, new ReturnStatement(new PrimitiveExpression(false, "false"))));
expr = new BinaryOperatorExpression(new ThisReferenceExpression(),
BinaryOperatorType.Equality,
new IdentifierExpression("obj"));
method.Body.AddChild(new IfElseStatement(expr, new ReturnStatement(new PrimitiveExpression(true, "true"))));
VariableDeclaration var = new VariableDeclaration("my" + currentClass.Name,
new CastExpression(currentType, new IdentifierExpression("obj")),
currentType);
method.Body.AddChild(new LocalVariableDeclaration(var));
expr = TestEquality(var.Name, currentClass.Fields[0]);
for (int i = 1; i < currentClass.Fields.Count; i++) {
expr = new BinaryOperatorExpression(expr, BinaryOperatorType.LogicalAnd,
TestEquality(var.Name, currentClass.Fields[i]));
} }
public EqualsCodeGenerator(IClass currentClass) : base(currentClass) method.Body.AddChild(new ReturnStatement(expr));
{
nodes.Add(method);
} }
protected override void StartGeneration(IList items, string fileExtension) static InvocationExpression CallGetHashCode(Expression expr)
{ {
editActionHandler.InsertString("public override bool Equals(object obj)");++numOps; return new InvocationExpression(new FieldReferenceExpression(expr, "GetHashCode"));
if (StartCodeBlockInSameLine) {
editActionHandler.InsertString(" {");++numOps;
} else {
Return();
editActionHandler.InsertString("{");++numOps;
} }
Return();
Indent();
editActionHandler.InsertString("if (!(obj is " + currentClass.Name + ")) return false;");++numOps;
Return();
Indent();
editActionHandler.InsertString("if (this == obj) return true;");++numOps;
Return();
string className = "my" + currentClass.Name;
editActionHandler.InsertString(currentClass.Name + " " + className + " = (" + currentClass.Name + ")obj;");++numOps;
Return();
foreach (IField field in currentClass.Fields) { static Expression TestEquality(string other, IField field)
Indent(); {
IClass cName = field.ReturnType.GetUnderlyingClass(); return new BinaryOperatorExpression(new FieldReferenceExpression(new ThisReferenceExpression(), field.Name),
if (cName == null || cName.ClassType == ClassType.Struct || cName.ClassType == ClassType.Enum) { BinaryOperatorType.Equality,
editActionHandler.InsertString("if (" + field.Name + " != " + className + "." + field.Name + ") return false;");++numOps; new FieldReferenceExpression(new IdentifierExpression(other), field.Name));
} else {
editActionHandler.InsertString("if (" + field.Name + " != null ? "+ field.Name + ".Equals(" + className + "." + field.Name + "): " + className + "." + field.Name + " != null) return false;");++numOps;
}
Return();
} }
Return(); public override bool IsActive {
Indent(); get {
editActionHandler.InsertString("return true");++numOps; return currentClass.Fields != null && currentClass.Fields.Count > 0;
Return();
editActionHandler.InsertString("}");++numOps;
Return();
Return();
editActionHandler.InsertString("public virtual int GetHashCode()");++numOps;
if (StartCodeBlockInSameLine) {
editActionHandler.InsertString(" {");++numOps;
} else {
Return();
editActionHandler.InsertString("{");++numOps;
}
Return();
Indent();
editActionHandler.InsertString("return ");++numOps;
for (int i = 0; i < currentClass.Fields.Count; ++i) {
IField field = currentClass.Fields[i];
IClass cName = field.ReturnType.GetUnderlyingClass();
if (cName == null || cName.ClassType == ClassType.Struct || cName.ClassType == ClassType.Enum) {
editActionHandler.InsertString(field.Name + ".GetHashCode()");++numOps;
} else {
editActionHandler.InsertString("(" + field.Name + " != null ? " + field.Name + ".GetHashCode() : 0)");++numOps;
} }
if (i + 1 < currentClass.Fields.Count) {
editActionHandler.InsertString(" ^ ");
} else {
editActionHandler.InsertString(";");
} }
++numOps; public override int ImageIndex {
get {
return ClassBrowserIconService.MethodIndex;
} }
Return();
editActionHandler.InsertString("}");++numOps;
Return();
} }
} }
} }

12
src/Main/Base/Project/Src/TextEditor/Commands/CodeGenerators/GetterAndSetterCodeGenerator.cs

@ -7,7 +7,8 @@
using System; using System;
using System.Collections; using System.Collections;
using ICSharpCode.TextEditor; using System.Collections.Generic;
using ICSharpCode.NRefactory.Parser.AST;
using ICSharpCode.SharpDevelop.Dom; using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.Core; using ICSharpCode.Core;
@ -28,14 +29,11 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands
} }
} }
public GetterAndSetterCodeGenerator(IClass currentClass) : base(currentClass) public override void GenerateCode(List<AbstractNode> nodes, IList items)
{ {
foreach (FieldWrapper w in items) {
nodes.Add(codeGen.CreateProperty(w.Field, true, true));
} }
protected override void GeneratePropertyBody(TextArea editActionHandler, FieldWrapper fw, string fileExtension)
{
GenerateGetter(editActionHandler, fw, fileExtension);
GenerateSetter(editActionHandler, fw, fileExtension);
} }
} }
} }

12
src/Main/Base/Project/Src/TextEditor/Commands/CodeGenerators/GetterCodeGenerator.cs

@ -7,7 +7,8 @@
using System; using System;
using System.Collections; using System.Collections;
using ICSharpCode.TextEditor; using System.Collections.Generic;
using ICSharpCode.NRefactory.Parser.AST;
using ICSharpCode.SharpDevelop.Dom; using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.Core; using ICSharpCode.Core;
@ -28,14 +29,11 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands
} }
} }
public GetterCodeGenerator(IClass currentClass) : base(currentClass) public override void GenerateCode(List<AbstractNode> nodes, IList items)
{ {
foreach (FieldWrapper w in items) {
nodes.Add(codeGen.CreateProperty(w.Field, true, false));
} }
protected override void GeneratePropertyBody(TextArea editActionHandler, FieldWrapper fw, string fileExtension)
{
GenerateGetter(editActionHandler, fw, fileExtension);
} }
} }
} }

237
src/Main/Base/Project/Src/TextEditor/Commands/CodeGenerators/InterfaceImplementorCodeGenerator.cs

@ -7,14 +7,15 @@
using System; using System;
using System.Collections; using System.Collections;
using ICSharpCode.TextEditor; using System.Collections.Generic;
using ICSharpCode.NRefactory.Parser.AST;
using ICSharpCode.SharpDevelop.Dom; using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.Core; using ICSharpCode.Core;
namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands
{ {
public abstract class InterfaceOrAbstractClassCodeGenerator : OldCodeGeneratorBase public abstract class InterfaceOrAbstractClassCodeGenerator : CodeGeneratorBase
{ {
public override int ImageIndex { public override int ImageIndex {
get { get {
@ -22,10 +23,6 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands
} }
} }
public InterfaceOrAbstractClassCodeGenerator(IClass currentClass) : base(currentClass)
{
}
protected class ClassWrapper protected class ClassWrapper
{ {
IReturnType c; IReturnType c;
@ -46,221 +43,6 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands
return ambience.Convert(c); return ambience.Convert(c);
} }
} }
protected override void StartGeneration(IList items, string fileExtension)
{
for (int i = 0; i < items.Count; ++i) {
ClassWrapper cw = (ClassWrapper)items[i];
GenerateInterface(cw.ClassType, fileExtension);
}
}
protected bool useOverrideKeyword = false;
protected bool implementOnlyAbstractMembers = false;
void GenerateInterface(IReturnType intf, string fileExtension)
{
Return();
Return();
editActionHandler.InsertString("#region " + intf.FullyQualifiedName + " interface implementation\n\t\t");++numOps;
foreach (IProperty property in intf.GetProperties()) {
if (implementOnlyAbstractMembers && !property.IsAbstract) {
continue;
}
string returnType = (fileExtension == ".vb" ? vba : csa).Convert(property.ReturnType);
if (property.IsProtected) {
if (fileExtension == ".vb") {
editActionHandler.InsertString("Protected ");
} else {
editActionHandler.InsertString("protected ");
}
++numOps;
} else {
if (fileExtension == ".vb") {
editActionHandler.InsertString("Public ");
} else {
editActionHandler.InsertString("public ");
}
++numOps;
}
if (fileExtension == ".vb") {
if (useOverrideKeyword) {
editActionHandler.InsertString("Overrides ");++numOps;
}
if (!property.CanSet) {
editActionHandler.InsertString("ReadOnly ");++numOps;
} else if (!property.CanGet) {
editActionHandler.InsertString("WriteOnly ");++numOps;
}
editActionHandler.InsertString("Property " + property.Name + " As " + returnType + "\n");
} else {
if (useOverrideKeyword) {
editActionHandler.InsertString("override ");++numOps;
}
editActionHandler.InsertString(returnType + " " + property.Name);
if (StartCodeBlockInSameLine) {
editActionHandler.InsertString(" {");++numOps;
} else {
Return();
editActionHandler.InsertString("{");++numOps;
}
Return();
}
++numOps;
if (property.CanGet) {
if (fileExtension == ".vb") {
editActionHandler.InsertString("\tGet");++numOps;
Return();
editActionHandler.InsertString("\t\tReturn " + GetReturnValue(returnType));++numOps;
Return();
editActionHandler.InsertString("\tEnd Get");++numOps;
Return();
} else {
editActionHandler.InsertString("\tget");++numOps;
if (StartCodeBlockInSameLine) {
editActionHandler.InsertString(" {");++numOps;
} else {
Return();
editActionHandler.InsertString("{");++numOps;
}
Return();
editActionHandler.InsertString("\t\treturn " + GetReturnValue(returnType) +";");++numOps;
Return();
editActionHandler.InsertString("\t}");++numOps;
Return();
}
}
if (property.CanSet) {
if (fileExtension == ".vb") {
editActionHandler.InsertString("\tSet");++numOps;
Return();
editActionHandler.InsertString("Throw New NotImplementedException()");++numOps;
Return();
editActionHandler.InsertString("\tEnd Set");++numOps;
Return();
} else {
editActionHandler.InsertString("\tset");++numOps;
if (StartCodeBlockInSameLine) {
editActionHandler.InsertString(" {");++numOps;
} else {
Return();
editActionHandler.InsertString("{");++numOps;
}
Return();
editActionHandler.InsertString("throw new NotImplementedException();");++numOps;
Return();
editActionHandler.InsertString("\t}");++numOps;
Return();
}
}
if (fileExtension == ".vb") {
editActionHandler.InsertString("End Property");++numOps;
} else {
editActionHandler.InsertChar('}');++numOps;
}
Return();
Return();
IndentLine();
}
foreach (IMethod method in intf.GetMethods()) {
string parameters = String.Empty;
string returnType = (fileExtension == ".vb" ? vba : csa).Convert(method.ReturnType);
if (implementOnlyAbstractMembers && !method.IsAbstract) {
continue;
}
for (int j = 0; j < method.Parameters.Count; ++j) {
parameters += (fileExtension == ".vb" ? vba : csa).Convert(method.Parameters[j]);
if (j + 1 < method.Parameters.Count) {
parameters += ", ";
}
}
if (method.IsProtected) {
if (fileExtension == ".vb") {
editActionHandler.InsertString("Protected ");
} else {
editActionHandler.InsertString("protected ");
}
} else {
if (fileExtension == ".vb") {
editActionHandler.InsertString("Public ");
} else {
editActionHandler.InsertString("public ");
}
}
bool isSub = returnType == "void";
if (fileExtension == ".vb") {
if (useOverrideKeyword) {
editActionHandler.InsertString("Overrides ");++numOps;
}
editActionHandler.InsertString((isSub ? "Sub " : "Function ") + method.Name + "(" + parameters + ") As " + returnType);++numOps;
Return();
} else {
if (useOverrideKeyword) {
editActionHandler.InsertString("override ");++numOps;
}
editActionHandler.InsertString(returnType + " " + method.Name + "(" + parameters + ")");++numOps;
if (StartCodeBlockInSameLine) {
editActionHandler.InsertString(" {");++numOps;
} else {
Return();
editActionHandler.InsertString("{");++numOps;
}
Return();
}
if (fileExtension == ".vb") {
editActionHandler.InsertString("Throw New NotImplementedException()");++numOps;
} else {
editActionHandler.InsertString("throw new NotImplementedException();");++numOps;
}
Return();
if (fileExtension == ".vb") {
editActionHandler.InsertString("End " + (isSub ? "Sub" : "Function"));
} else {
editActionHandler.InsertChar('}');++numOps;
}
Return();
Return();
IndentLine();
}
Return();
editActionHandler.InsertString("#endregion");++numOps;
Return();
}
string GetReturnValue(string returnType)
{
switch (returnType) {
case "string":
return "String.Empty";
case "char":
return "'\\0'";
case "bool":
return "false";
case "int":
case "long":
case "short":
case "byte":
case "uint":
case "ulong":
case "ushort":
case "double":
case "float":
case "decimal":
return "0";
default:
return "null";
}
}
} }
public class InterfaceImplementorCodeGenerator : InterfaceOrAbstractClassCodeGenerator public class InterfaceImplementorCodeGenerator : InterfaceOrAbstractClassCodeGenerator
@ -277,12 +59,21 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands
} }
} }
public InterfaceImplementorCodeGenerator(IClass currentClass) : base(currentClass) public override void GenerateCode(List<AbstractNode> nodes, IList items)
{
foreach (ClassWrapper w in items) {
codeGen.ImplementInterface(nodes, w.ClassType,
!currentClass.ProjectContent.Language.SupportsImplicitInterfaceImplementation,
ModifierEnum.Public, currentClass);
}
}
protected override void InitContent()
{ {
for (int i = 0; i < currentClass.BaseTypes.Count; i++) { for (int i = 0; i < currentClass.BaseTypes.Count; i++) {
IReturnType baseType = currentClass.GetBaseType(i); IReturnType baseType = currentClass.GetBaseType(i);
IClass baseClass = (baseType != null) ? baseType.GetUnderlyingClass() : null; IClass baseClass = (baseType != null) ? baseType.GetUnderlyingClass() : null;
if (baseClass != null && baseClass.ClassType == ClassType.Interface) { if (baseClass != null && baseClass.ClassType == ICSharpCode.SharpDevelop.Dom.ClassType.Interface) {
Content.Add(new ClassWrapper(baseType)); Content.Add(new ClassWrapper(baseType));
} }
} }

48
src/Main/Base/Project/Src/TextEditor/Commands/CodeGenerators/OnXXXMethodsCodeGenerator.cs

@ -7,14 +7,15 @@
using System; using System;
using System.Collections; using System.Collections;
using ICSharpCode.TextEditor; using System.Collections.Generic;
using ICSharpCode.NRefactory.Parser.AST;
using ICSharpCode.SharpDevelop.Dom; using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.Core; using ICSharpCode.Core;
namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands
{ {
public class OnXXXMethodsCodeGenerator : OldCodeGeneratorBase public class OnXXXMethodsCodeGenerator : CodeGeneratorBase
{ {
public override string CategoryName { public override string CategoryName {
get { get {
@ -30,56 +31,21 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands
public override int ImageIndex { public override int ImageIndex {
get { get {
return ClassBrowserIconService.EventIndex; return ClassBrowserIconService.EventIndex;
} }
} }
public OnXXXMethodsCodeGenerator(IClass currentClass) : base(currentClass) protected override void InitContent()
{ {
foreach (IEvent evt in currentClass.Events) { foreach (IEvent evt in currentClass.Events) {
Content.Add(new EventWrapper(evt)); Content.Add(new EventWrapper(evt));
} }
} }
protected override void StartGeneration(IList items, string fileExtension) public override void GenerateCode(List<AbstractNode> nodes, IList items)
{ {
for (int i = 0; i < items.Count; ++i) { foreach (EventWrapper ev in items) {
EventWrapper ew = (EventWrapper)items[i]; nodes.Add(codeGen.CreateOnEventMethod(ev.Event));
string eventArgsName = String.Empty;
if (ew.Event.ReturnType.FullyQualifiedName.EndsWith("Handler")) {
eventArgsName = ew.Event.ReturnType.FullyQualifiedName.Substring(0, ew.Event.ReturnType.FullyQualifiedName.Length - "Handler".Length);
} else {
eventArgsName = ew.Event.ReturnType.FullyQualifiedName;
}
eventArgsName += "Args";
editActionHandler.InsertString("protected " + (ew.Event.IsStatic ? "static" : "virtual") + " void On" + ew.Event.Name + "(" + eventArgsName + " e)");++numOps;
if (StartCodeBlockInSameLine) {
editActionHandler.InsertString(" {");++numOps;
} else {
Return();
editActionHandler.InsertString("{");++numOps;
}
Return();
Indent();
editActionHandler.InsertString("if (" + ew.Event.Name + " != null)");++numOps;
if (StartCodeBlockInSameLine) {
editActionHandler.InsertString(" {");++numOps;
} else {
Return();
editActionHandler.InsertString("{");++numOps;
}
Return();
Indent();
editActionHandler.InsertString(ew.Event.Name + "(this, e);");++numOps;
Return();
editActionHandler.InsertChar('}');++numOps;
Return();
editActionHandler.InsertChar('}');++numOps;
Return();
IndentLine();
} }
} }

113
src/Main/Base/Project/Src/TextEditor/Commands/CodeGenerators/OverrideMethodsCodeGenerator.cs

@ -7,14 +7,15 @@
using System; using System;
using System.Collections; using System.Collections;
using ICSharpCode.TextEditor; using System.Collections.Generic;
using ICSharpCode.NRefactory.Parser.AST;
using ICSharpCode.SharpDevelop.Dom; using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.Core; using ICSharpCode.Core;
namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands
{ {
public class OverrideMethodsCodeGenerator : OldCodeGeneratorBase public class OverrideMethodsCodeGenerator : CodeGeneratorBase
{ {
public override string CategoryName { public override string CategoryName {
get { get {
@ -30,18 +31,20 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands
public override int ImageIndex { public override int ImageIndex {
get { get {
return ClassBrowserIconService.MethodIndex; return ClassBrowserIconService.MethodIndex;
} }
} }
public OverrideMethodsCodeGenerator(IClass currentClass) : base(currentClass) protected override void InitContent()
{ {
foreach (IClass c in currentClass.ClassInheritanceTree) { foreach (IClass c in currentClass.ClassInheritanceTree) {
if (c.FullyQualifiedName != currentClass.FullyQualifiedName) { if (c.FullyQualifiedName != currentClass.FullyQualifiedName) {
foreach (IMethod method in c.Methods) { foreach (IMethod method in c.Methods) {
if (!method.IsPrivate && (method.IsAbstract || method.IsVirtual || method.IsOverride)) { if (!method.IsPrivate && (method.IsAbstract || method.IsVirtual || method.IsOverride)) {
Content.Add(new MethodWrapper(method)); MethodWrapper newWrapper = new MethodWrapper(method);
if (!Content.Contains(newWrapper)) {
Content.Add(newWrapper);
}
} }
} }
} }
@ -49,82 +52,11 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands
Content.Sort(); Content.Sort();
} }
protected override void StartGeneration(IList items, string fileExtension) public override void GenerateCode(List<AbstractNode> nodes, IList items)
{ {
// bool moveToMethod = sf.SelectedItems.Count == 1; foreach (MethodWrapper wrapper in items) {
// int caretPos = 0; nodes.Add(codeGen.GetOverridingMethod(wrapper.Method, this.classFinderContext));
for (int i = 0; i < items.Count; ++i) {
MethodWrapper mw = (MethodWrapper)items[i];
string parameters = String.Empty;
string paramList = String.Empty;
string returnType = (fileExtension == ".vb" ? vba : csa).Convert(mw.Method.ReturnType);
for (int j = 0; j < mw.Method.Parameters.Count; ++j) {
paramList += mw.Method.Parameters[j].Name;
parameters += (fileExtension == ".vb" ? vba : csa).Convert(mw.Method.Parameters[j]);
if (j + 1 < mw.Method.Parameters.Count) {
parameters += ", ";
paramList += ", ";
}
}
if (fileExtension == ".vb"){
editActionHandler.InsertString(vba.Convert(mw.Method.Modifiers) + "Overrides ");++numOps;
if (mw.Method.ReturnType.FullyQualifiedName != "System.Void") {
editActionHandler.InsertString("Function ");++numOps;
} else {
editActionHandler.InsertString("Sub ");++numOps;
}
editActionHandler.InsertString(mw.Method.Name + "(" + parameters + ")");++numOps;
if (mw.Method.ReturnType.FullyQualifiedName != "System.Void") {
editActionHandler.InsertString(" As " + returnType);++numOps;
}
} else {
editActionHandler.InsertString(csa.Convert(mw.Method.Modifiers) + "override " + returnType + " " + mw.Method.Name + "(" + parameters + ")");++numOps;
if (StartCodeBlockInSameLine) {
editActionHandler.InsertString(" {");
} else {
Return();
editActionHandler.InsertString("{");
}
++numOps;
}
Return();
if(fileExtension == ".vb") {
if (mw.Method.ReturnType.FullyQualifiedName != "System.Void") {
editActionHandler.InsertString("Return MyBase." + mw.Method.Name + "(" + paramList + ")");++numOps;
Return();
editActionHandler.InsertString("End Function");
} else {
editActionHandler.InsertString("MyBase." + mw.Method.Name + "(" + paramList + ")");++numOps;
Return();
editActionHandler.InsertString("End Sub");
}
} else {
if (mw.Method.ReturnType.FullyQualifiedName != "System.Void") {
string str = "return base." + mw.Method.Name + "(" + paramList + ");";
editActionHandler.InsertString(str);++numOps;
} else {
string str = "base." + mw.Method.Name + "(" + paramList + ");";
editActionHandler.InsertString(str);++numOps;
}
Return();
editActionHandler.InsertChar('}');
}
++numOps;
// caretPos = editActionHandler.Document.Caret.Offset;
Return();
IndentLine();
} }
// if (moveToMethod) {
// editActionHandler.Document.Caret.Offset = caretPos;
// }
} }
class MethodWrapper : IComparable class MethodWrapper : IComparable
@ -139,20 +71,37 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands
public int CompareTo(object other) public int CompareTo(object other)
{ {
return method.Name.CompareTo(((MethodWrapper)other).method.Name); return ToString().CompareTo(((MethodWrapper)other).ToString());
} }
public MethodWrapper(IMethod method) public MethodWrapper(IMethod method)
{ {
this.method = method; this.method = method;
} }
public override bool Equals(object obj)
{
MethodWrapper other = (MethodWrapper)obj;
if (method.Name != other.method.Name)
return false;
return 0 == ICSharpCode.SharpDevelop.DiffUtility.Compare(method.Parameters, other.method.Parameters);
}
public override int GetHashCode()
{
return ToString().GetHashCode();
}
string cachedStringRepresentation;
public override string ToString() public override string ToString()
{ {
if (cachedStringRepresentation == null) {
IAmbience ambience = AmbienceService.CurrentAmbience; IAmbience ambience = AmbienceService.CurrentAmbience;
ambience.ConversionFlags = ConversionFlags.ShowParameterNames; ambience.ConversionFlags = ConversionFlags.ShowParameterNames;
return ambience.Convert(method); cachedStringRepresentation = ambience.Convert(method);
}
return cachedStringRepresentation;
} }
} }
} }

127
src/Main/Base/Project/Src/TextEditor/Commands/CodeGenerators/OverridePropertiesCodeGenerator.cs

@ -7,14 +7,15 @@
using System; using System;
using System.Collections; using System.Collections;
using ICSharpCode.TextEditor; using System.Collections.Generic;
using ICSharpCode.NRefactory.Parser.AST;
using ICSharpCode.SharpDevelop.Dom; using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.Core; using ICSharpCode.Core;
namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands
{ {
public class OverridePropertiesCodeGenerator : OldCodeGeneratorBase public class OverridePropertiesCodeGenerator : CodeGeneratorBase
{ {
public override string CategoryName { public override string CategoryName {
get { get {
@ -30,133 +31,37 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands
public override int ImageIndex { public override int ImageIndex {
get { get {
return ClassBrowserIconService.PropertyIndex; return ClassBrowserIconService.PropertyIndex;
} }
} }
public OverridePropertiesCodeGenerator(IClass currentClass) : base(currentClass) protected override void InitContent()
{ {
foreach (IClass c in currentClass.ClassInheritanceTree) { foreach (IClass c in currentClass.ClassInheritanceTree) {
if (c.FullyQualifiedName != currentClass.FullyQualifiedName) { if (c.FullyQualifiedName != currentClass.FullyQualifiedName) {
foreach (IProperty property in c.Properties) { foreach (IProperty property in c.Properties) {
if (!property.IsPrivate && (property.IsAbstract || property.IsVirtual || property.IsOverride)) { if (!property.IsPrivate && (property.IsAbstract || property.IsVirtual || property.IsOverride)) {
Content.Add(new PropertyWrapper(property)); bool alreadyAdded = false;
} foreach (PropertyWrapper w in Content) {
} if (w.Property.Name == property.Name) {
} alreadyAdded = true;
break;
} }
Content.Sort();
}
protected override void StartGeneration(IList items, string fileExtension)
{
for (int i = 0; i < items.Count; ++i) {
PropertyWrapper pw = (PropertyWrapper)items[i];
string parameters = String.Empty;
string paramList = String.Empty;
string returnType = (fileExtension == ".vb" ? vba : csa).Convert(pw.Property.ReturnType);
for (int j = 0; j < pw.Property.Parameters.Count; ++j) {
paramList += pw.Property.Parameters[j].Name;
parameters += (fileExtension == ".vb" ? vba : csa).Convert(pw.Property.Parameters[j]);
if (j + 1 < pw.Property.Parameters.Count) {
parameters += ", ";
paramList += ", ";
}
}
if (fileExtension == ".vb"){
editActionHandler.InsertString(vba.Convert(pw.Property.Modifiers) + "Overrides ");++numOps;
editActionHandler.InsertString("Property ");++numOps;
editActionHandler.InsertString(pw.Property.Name + "()");++numOps;
} else {
editActionHandler.InsertString(csa.Convert(pw.Property.Modifiers) + "override " + returnType + " " + pw.Property.Name);++numOps;
if (StartCodeBlockInSameLine) {
editActionHandler.InsertString(" {");
} else {
Return();
editActionHandler.InsertString("{");
}
++numOps;
}
Return();
if(fileExtension == ".vb") {
editActionHandler.InsertString("Get");++numOps;
} else {
editActionHandler.InsertString("get");++numOps;
if (StartCodeBlockInSameLine) {
editActionHandler.InsertString(" {");
} else {
Return();
editActionHandler.InsertString("{");
}
++numOps;
} }
if (!alreadyAdded) {
Return(); Content.Add(new PropertyWrapper(property));
if(fileExtension == ".vb") {
editActionHandler.InsertString("Return MyBase." + pw.Property.Name); ++numOps;
} else {
editActionHandler.InsertString("return base." + pw.Property.Name); ++numOps;
} }
Return();
if(fileExtension == ".vb") {
editActionHandler.InsertString("End Get"); ++numOps;
} else {
editActionHandler.InsertChar('}'); ++numOps;
} }
Return();
if(fileExtension == ".vb") {
editActionHandler.InsertString("Set");++numOps;
} else {
editActionHandler.InsertString("set");++numOps;
if (StartCodeBlockInSameLine) {
editActionHandler.InsertString(" {");
} else {
Return();
editActionHandler.InsertString("{");
}
++numOps;
} }
Return();
if(fileExtension == ".vb") {
editActionHandler.InsertString("MyBase." + pw.Property.Name + " = value"); ++numOps;
} else {
editActionHandler.InsertString("base." + pw.Property.Name + " = value"); ++numOps;
} }
Return();
if(fileExtension == ".vb") {
editActionHandler.InsertString("End Set"); ++numOps;
} else {
editActionHandler.InsertChar('}'); ++numOps;
} }
Content.Sort();
Return();
if(fileExtension == ".vb") {
editActionHandler.InsertString("End Property"); ++numOps;
} else {
editActionHandler.InsertChar('}'); ++numOps;
} }
Return(); public override void GenerateCode(List<AbstractNode> nodes, IList items)
Return(); {
IndentLine(); foreach (PropertyWrapper wrapper in items) {
nodes.Add(codeGen.GetOverridingMethod(wrapper.Property, this.classFinderContext));
} }
} }

11
src/Main/Base/Project/Src/TextEditor/Commands/CodeGenerators/SetterCodeGenerator.cs

@ -7,6 +7,8 @@
using System; using System;
using System.Collections; using System.Collections;
using System.Collections.Generic;
using ICSharpCode.NRefactory.Parser.AST;
using ICSharpCode.TextEditor; using ICSharpCode.TextEditor;
using ICSharpCode.SharpDevelop.Dom; using ICSharpCode.SharpDevelop.Dom;
@ -28,14 +30,11 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands
} }
} }
public SetterCodeGenerator(IClass currentClass) : base(currentClass) public override void GenerateCode(List<AbstractNode> nodes, IList items)
{ {
foreach (FieldWrapper w in items) {
nodes.Add(codeGen.CreateProperty(w.Field, false, true));
} }
protected override void GeneratePropertyBody(TextArea editActionHandler, FieldWrapper fw, string fileExtension)
{
GenerateSetter(editActionHandler, fw, fileExtension);
} }
} }
} }

108
src/Main/Base/Project/Src/TextEditor/Commands/CodeGenerators/ToStringCodeGenerator.cs

@ -7,8 +7,11 @@
using System; using System;
using System.Collections; using System.Collections;
using ICSharpCode.TextEditor; using System.Collections.Generic;
using System.Text;
using ICSharpCode.NRefactory.Parser.AST;
using ICSharpCode.TextEditor;
using ICSharpCode.SharpDevelop.Dom; using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.Core; using ICSharpCode.Core;
@ -16,6 +19,36 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands
{ {
public class ToStringCodeGenerator : AbstractFieldCodeGenerator public class ToStringCodeGenerator : AbstractFieldCodeGenerator
{ {
public override void GenerateCode(List<AbstractNode> nodes, IList items)
{
TypeReference stringReference = new TypeReference("System.String");
MethodDeclaration method = new MethodDeclaration("ToString",
Modifier.Public | Modifier.Override,
stringReference,
null, null);
method.Body = new BlockStatement();
Expression target = new FieldReferenceExpression(new TypeReferenceExpression(stringReference),
"Format");
InvocationExpression methodCall = new InvocationExpression(target);
StringBuilder formatString = new StringBuilder();
formatString.Append('[');
formatString.Append(currentClass.Name);
for (int i = 0; i < items.Count; i++) {
formatString.Append(' ');
formatString.Append(codeGen.GetPropertyName(((FieldWrapper)items[i]).Field.Name));
formatString.Append("={");
formatString.Append(i);
formatString.Append('}');
}
formatString.Append(']');
methodCall.Arguments.Add(new PrimitiveExpression(formatString.ToString(), formatString.ToString()));
foreach (FieldWrapper w in items) {
methodCall.Arguments.Add(new FieldReferenceExpression(new ThisReferenceExpression(), w.Field.Name));
}
method.Body.AddChild(new ReturnStatement(methodCall));
nodes.Add(method);
}
public override string CategoryName { public override string CategoryName {
get { get {
return "Generate default ToString() method"; return "Generate default ToString() method";
@ -29,81 +62,8 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands
} }
public override int ImageIndex { public override int ImageIndex {
get { get {
return ClassBrowserIconService.MethodIndex; return ClassBrowserIconService.MethodIndex;
} }
} }
public ToStringCodeGenerator(IClass currentClass) : base(currentClass)
{
}
protected override void StartGeneration(IList items, string fileExtension)
{
if (fileExtension == ".vb") {
editActionHandler.InsertString("Public Overrides Function ToString() As String");
Return();
} else {
editActionHandler.InsertString("public override string ToString()");
}
++numOps;
if (fileExtension != ".vb") {
if (StartCodeBlockInSameLine) {
editActionHandler.InsertString(" {");++numOps;
} else {
Return();
editActionHandler.InsertString("{");++numOps;
}
}
Return();
Indent();
if (fileExtension == ".vb") {
editActionHandler.InsertString("Return String.Format(\"[");
} else {
editActionHandler.InsertString("return String.Format(\"[");
}
++numOps;
editActionHandler.InsertString(base.currentClass.Name);++numOps;
if (items.Count > 0) {
editActionHandler.InsertString(":");++numOps;
}
for (int i = 0; i < items.Count; ++i) {
FieldWrapper fieldWrapper = (FieldWrapper)items[i];
editActionHandler.InsertString(" ");++numOps;
editActionHandler.InsertString(fieldWrapper.Field.Name);++numOps;
editActionHandler.InsertString(" = {" + i + "}");++numOps;
if (i + 1 < items.Count) {
editActionHandler.InsertString(",");++numOps;
}
}
editActionHandler.InsertString("]\"");++numOps;
if (items.Count > 0) {
editActionHandler.InsertString(",");++numOps;
Return();
}
for (int i = 0; i < items.Count; ++i) {
FieldWrapper fieldWrapper = (FieldWrapper)items[i];
editActionHandler.InsertString(fieldWrapper.Field.Name);
if (i + 1 < items.Count) {
editActionHandler.InsertString(",");++numOps;
Return();
}
}
if (fileExtension == ".vb") {
editActionHandler.InsertString(")");
} else {
editActionHandler.InsertString(");");
}
++numOps;
Return();
if (fileExtension == ".vb") {
editActionHandler.InsertString("End Function");
} else {
editActionHandler.InsertString("}");
}
++numOps;
Return();
}
} }
} }

29
src/Main/Base/Project/Src/TextEditor/Commands/GenerateCodeCommand.cs

@ -57,19 +57,8 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands
if (currentClass != null) { if (currentClass != null) {
ArrayList categories = new ArrayList(); ArrayList categories = new ArrayList();
using (FormVersion1 form = new FormVersion1(textEditorControl, new OldCodeGeneratorBase[] { ArrayList generators = AddInTree.BuildItems("/AddIns/DefaultTextEditor/CodeGenerator", this, true);
new ConstructorCodeGenerator(currentClass), using (FormVersion1 form = new FormVersion1(textEditorControl, (CodeGeneratorBase[])generators.ToArray(typeof(CodeGeneratorBase)), currentClass)) {
new GetterCodeGenerator(currentClass),
new SetterCodeGenerator(currentClass),
new GetterAndSetterCodeGenerator(currentClass),
new OnXXXMethodsCodeGenerator(currentClass),
new OverrideMethodsCodeGenerator(currentClass),
new OverridePropertiesCodeGenerator(currentClass),
new InterfaceImplementorCodeGenerator(currentClass),
new AbstractClassImplementorCodeGenerator(currentClass),
new ToStringCodeGenerator(currentClass),
new EqualsCodeGenerator(currentClass),
})) {
form.ShowDialog(ICSharpCode.SharpDevelop.Gui.WorkbenchSingleton.MainForm); form.ShowDialog(ICSharpCode.SharpDevelop.Gui.WorkbenchSingleton.MainForm);
} }
} }
@ -123,19 +112,23 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands
TextEditorControl textEditorControl; TextEditorControl textEditorControl;
OldCodeGeneratorBase SelectedCodeGenerator { CodeGeneratorBase SelectedCodeGenerator {
get { get {
if (categoryListView.SelectedItems.Count <= 0) { if (categoryListView.SelectedItems.Count <= 0) {
return null; return null;
} }
return (OldCodeGeneratorBase)categoryListView.SelectedItems[0].Tag; return (CodeGeneratorBase)categoryListView.SelectedItems[0].Tag;
} }
} }
public FormVersion1(TextEditorControl textEditorControl, OldCodeGeneratorBase[] codeGenerators) public FormVersion1(TextEditorControl textEditorControl, CodeGeneratorBase[] codeGenerators, IClass currentClass)
{ {
this.textEditorControl = textEditorControl; this.textEditorControl = textEditorControl;
foreach (CodeGeneratorBase generator in codeGenerators) {
generator.Initialize(currentClass);
}
// Must be called for initialization // Must be called for initialization
this.InitializeComponents(); this.InitializeComponents();
// selectionListBox.Sorted = true; // selectionListBox.Sorted = true;
@ -161,7 +154,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands
categoryListView.SmallImageList = categoryListView.LargeImageList = ClassBrowserIconService.ImageList; categoryListView.SmallImageList = categoryListView.LargeImageList = ClassBrowserIconService.ImageList;
foreach (OldCodeGeneratorBase codeGenerator in codeGenerators) { foreach (CodeGeneratorBase codeGenerator in codeGenerators) {
if (codeGenerator.IsActive) { if (codeGenerator.IsActive) {
ListViewItem newItem = new ListViewItem(codeGenerator.CategoryName); ListViewItem newItem = new ListViewItem(codeGenerator.CategoryName);
newItem.ImageIndex = codeGenerator.ImageIndex; newItem.ImageIndex = codeGenerator.ImageIndex;
@ -211,7 +204,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Commands
void CategoryListViewItemChanged(object sender, EventArgs e) void CategoryListViewItemChanged(object sender, EventArgs e)
{ {
OldCodeGeneratorBase codeGenerator = SelectedCodeGenerator; CodeGeneratorBase codeGenerator = SelectedCodeGenerator;
if (codeGenerator == null) { if (codeGenerator == null) {
return; return;
} }

53
src/Main/Base/Project/Src/TextEditor/Gui/Editor/CompletionWindow/OverrideCompletionDataProvider.cs

@ -97,7 +97,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor
CodeGenerator codeGen = ParserService.CurrentProjectContent.Language.CodeGenerator; CodeGenerator codeGen = ParserService.CurrentProjectContent.Language.CodeGenerator;
string text = codeGen.GenerateCode(GetOverrideAST(member, context), indentation); string text = codeGen.GenerateCode(codeGen.GetOverridingMethod(member, context), indentation);
text = text.TrimEnd(); // remove newline from end text = text.TrimEnd(); // remove newline from end
textArea.Document.Replace(line.Offset, caretPosition - line.Offset, text); textArea.Document.Replace(line.Offset, caretPosition - line.Offset, text);
@ -108,56 +108,5 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor
textArea.Refresh(); textArea.Refresh();
return true; return true;
} }
AttributedNode GetOverrideAST(IMember member, ClassFinder targetContext)
{
AttributedNode node = CodeGenerator.ConvertMember(member, targetContext);
node.Modifier &= ~(Modifier.Virtual | Modifier.Abstract);
node.Modifier |= Modifier.Override;
MethodDeclaration method = node as MethodDeclaration;
if (method != null) {
method.Body.Children.Clear();
if (method.TypeReference.SystemType == "System.Void") {
method.Body.AddChild(new StatementExpression(CreateMethodCall(method)));
} else {
method.Body.AddChild(new ReturnStatement(CreateMethodCall(method)));
}
}
PropertyDeclaration property = node as PropertyDeclaration;
if (property != null) {
Expression field = new FieldReferenceExpression(new BaseReferenceExpression(),
property.Name);
if (!property.GetRegion.Block.IsNull) {
property.GetRegion.Block.Children.Clear();
property.GetRegion.Block.AddChild(new ReturnStatement(field));
}
if (!property.SetRegion.Block.IsNull) {
property.SetRegion.Block.Children.Clear();
Expression expr = new AssignmentExpression(field,
AssignmentOperatorType.Assign,
new IdentifierExpression("value"));
property.SetRegion.Block.AddChild(new StatementExpression(expr));
}
}
return node;
}
static InvocationExpression CreateMethodCall(MethodDeclaration method)
{
Expression methodName = new FieldReferenceExpression(new BaseReferenceExpression(),
method.Name);
InvocationExpression ie = new InvocationExpression(methodName, null);
foreach (ParameterDeclarationExpression param in method.Parameters) {
Expression expr = new IdentifierExpression(param.ParameterName);
if (param.ParamModifier == ParamModifier.Ref) {
expr = new DirectionExpression(FieldDirection.Ref, expr);
} else if (param.ParamModifier == ParamModifier.Out) {
expr = new DirectionExpression(FieldDirection.Out, expr);
}
ie.Arguments.Add(expr);
}
return ie;
}
} }
} }

21
src/Main/Core/Project/Src/Services/ResourceService/ResourceService.cs

@ -26,10 +26,10 @@ namespace ICSharpCode.Core
/// </summary> /// </summary>
public static class ResourceService public static class ResourceService
{ {
readonly static string uiLanguageProperty = "CoreProperties.UILanguage"; const string uiLanguageProperty = "CoreProperties.UILanguage";
readonly static string stringResources = "StringResources"; const string stringResources = "StringResources";
readonly static string imageResources = "BitmapResources"; const string imageResources = "BitmapResources";
static string resourceDirectory; static string resourceDirectory;
@ -167,21 +167,6 @@ namespace ICSharpCode.Core
icons.Add(imageManager); icons.Add(imageManager);
} }
/// <summary>
/// Take string/bitmap resources from an assembly and merge them in the resource service
/// </summary>
[Obsolete("Use should use RegisterStrings or RegisterImages instead.")]
public static void RegisterAssembly(Assembly assembly)
{
if (assembly.GetManifestResourceInfo(stringResources+".resources") != null) {
strings.Add(new ResourceManager(stringResources, assembly));
}
if (assembly.GetManifestResourceInfo(imageResources+".resources") != null) {
icons.Add(new ResourceManager(imageResources, assembly));
}
}
static void OnPropertyChange(object sender, PropertyChangedEventArgs e) static void OnPropertyChange(object sender, PropertyChangedEventArgs e)
{ {
if (e.Key == uiLanguageProperty && e.NewValue != e.OldValue) { if (e.Key == uiLanguageProperty && e.NewValue != e.OldValue) {

Loading…
Cancel
Save