Browse Source

Implement EnvDTE.CodeInterface.AddFunction()

pull/375/head
Matt Ward 12 years ago
parent
commit
2a0cb435d7
  1. 14
      src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/CSharpCodeGenerator.cs
  2. 35
      src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeInterface.cs
  3. 1
      src/AddIns/Misc/PackageManagement/Project/Src/ICodeGenerator.cs
  4. 5
      src/AddIns/Misc/PackageManagement/Project/Src/ThreadSafeCodeGenerator.cs
  5. 5
      src/Main/Base/Project/Refactoring/CodeGenerator.cs

14
src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/CSharpCodeGenerator.cs

@ -159,6 +159,20 @@ namespace CSharpBinding.Refactoring @@ -159,6 +159,20 @@ namespace CSharpBinding.Refactoring
}
}
public override void AddMethodAtStart(ITypeDefinition declaringType, Accessibility accessibility, IType returnType, string name)
{
SDRefactoringContext context = declaringType.CreateRefactoringContext();
var typeDecl = context.GetNode<TypeDeclaration>();
using (var script = context.StartScript()) {
var astBuilder = context.CreateTypeSystemAstBuilder(typeDecl.FirstChild);
var methodDecl = new MethodDeclaration();
methodDecl.Name = name;
methodDecl.ReturnType = astBuilder.ConvertType(context.Compilation.Import(returnType));
script.AddTo(typeDecl, methodDecl);
}
}
public override void ChangeAccessibility(IEntity entity, Accessibility newAccessiblity)
{
// TODO script.ChangeModifiers(...)

35
src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeInterface.cs

@ -20,6 +20,7 @@ using System; @@ -20,6 +20,7 @@ using System;
using System.Linq;
using System.Text;
using ICSharpCode.NRefactory.TypeSystem;
using ICSharpCode.NRefactory.TypeSystem.Implementation;
using ICSharpCode.SharpDevelop.Dom;
namespace ICSharpCode.PackageManagement.EnvDTE
@ -37,9 +38,39 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -37,9 +38,39 @@ namespace ICSharpCode.PackageManagement.EnvDTE
public global::EnvDTE.CodeFunction AddFunction(string name, global::EnvDTE.vsCMFunction kind, object type, object Position = null, global::EnvDTE.vsCMAccess Access = global::EnvDTE.vsCMAccess.vsCMAccessPublic)
{
// var codeGenerator = new ClassCodeGenerator(Class);
// return codeGenerator.AddPublicMethod(name, (string)type);
IType returnType = GetMethodReturnType((string)type);
context.CodeGenerator.AddMethodAtStart(typeDefinition, Access.ToAccessibility(), returnType, name);
ReloadTypeDefinition();
IMethod method = typeDefinition.Methods.FirstOrDefault(f => f.Name == name);
if (method != null) {
return new CodeFunction(context, method);
}
return null;
}
IType GetMethodReturnType(string typeName)
{
var fullTypeName = new FullTypeName(typeName);
IType type = typeDefinition.Compilation.FindType(fullTypeName);
if (type != null) {
return type;
}
return new UnknownType(fullTypeName);
}
void ReloadTypeDefinition()
{
ICompilation compilation = context.DteProject.GetCompilationUnit(typeDefinition.BodyRegion.FileName);
ITypeDefinition matchedTypeDefinition = compilation.MainAssembly.GetTypeDefinition(typeDefinition.FullTypeName);
if (matchedTypeDefinition != null) {
typeDefinition = matchedTypeDefinition;
}
}
}
}

1
src/AddIns/Misc/PackageManagement/Project/Src/ICodeGenerator.cs

@ -27,5 +27,6 @@ namespace ICSharpCode.PackageManagement @@ -27,5 +27,6 @@ namespace ICSharpCode.PackageManagement
void AddImport(FileName fileName, string name);
void MakePartial(ITypeDefinition typeDefinition);
void AddFieldAtStart(ITypeDefinition typeDefinition, Accessibility accessibility, IType fieldType, string name);
void AddMethodAtStart(ITypeDefinition typeDefinition, Accessibility accessibility, IType returnType, string name);
}
}

5
src/AddIns/Misc/PackageManagement/Project/Src/ThreadSafeCodeGenerator.cs

@ -54,5 +54,10 @@ namespace ICSharpCode.PackageManagement @@ -54,5 +54,10 @@ namespace ICSharpCode.PackageManagement
{
InvokeIfRequired(() => codeGenerator.AddFieldAtStart(typeDefinition, accessibility, fieldType, name));
}
public void AddMethodAtStart(ITypeDefinition typeDefinition, Accessibility accessibility, IType returnType, string name)
{
InvokeIfRequired(() => codeGenerator.AddMethodAtStart(typeDefinition, accessibility, returnType, name));
}
}
}

5
src/Main/Base/Project/Refactoring/CodeGenerator.cs

@ -93,6 +93,11 @@ namespace ICSharpCode.SharpDevelop.Refactoring @@ -93,6 +93,11 @@ namespace ICSharpCode.SharpDevelop.Refactoring
throw new NotSupportedException("Feature not supported!");
}
public virtual void AddMethodAtStart(ITypeDefinition declaringType, Accessibility accessibility, IType returnType, string name)
{
throw new NotSupportedException("Feature not supported!");
}
public virtual void ChangeAccessibility(IEntity entity, Accessibility newAccessiblity)
{
throw new NotSupportedException("Feature not supported!");

Loading…
Cancel
Save