Skip to content
This repository was archived by the owner on Oct 16, 2020. It is now read-only.

Commit c0b7089

Browse files
committed
Implement EnvDTE.CodeType.AddVariable()
1 parent 825be03 commit c0b7089

8 files changed

Lines changed: 70 additions & 19 deletions

File tree

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

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,21 @@ public override void AddField(ITypeDefinition declaringType, Accessibility acces
144144
}
145145
}
146146

147+
public override void AddFieldAtStart(ITypeDefinition declaringType, Accessibility accessibility, IType fieldType, string name)
148+
{
149+
SDRefactoringContext context = declaringType.CreateRefactoringContext();
150+
var typeDecl = context.GetNode<TypeDeclaration>();
151+
using (var script = context.StartScript()) {
152+
var astBuilder = context.CreateTypeSystemAstBuilder(typeDecl.FirstChild);
153+
var fieldDecl = new FieldDeclaration();
154+
fieldDecl.Modifiers = TypeSystemAstBuilder.ModifierFromAccessibility(accessibility);
155+
fieldDecl.ReturnType = astBuilder.ConvertType(context.Compilation.Import(fieldType));
156+
fieldDecl.Variables.Add(new VariableInitializer(name));
157+
158+
script.AddTo(typeDecl, fieldDecl);
159+
}
160+
}
161+
147162
public override void ChangeAccessibility(IEntity entity, Accessibility newAccessiblity)
148163
{
149164
// TODO script.ChangeModifiers(...)

src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeClass.cs

Lines changed: 33 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
using System;
2020
using System.Linq;
2121
using ICSharpCode.NRefactory.TypeSystem;
22+
using ICSharpCode.NRefactory.TypeSystem.Implementation;
2223

2324
namespace ICSharpCode.PackageManagement.EnvDTE
2425
{
@@ -52,18 +53,39 @@ public CodeClass()
5253

5354
public virtual global::EnvDTE.CodeVariable AddVariable(string name, object type, object Position = null, global::EnvDTE.vsCMAccess Access = global::EnvDTE.vsCMAccess.vsCMAccessPublic, object Location = null)
5455
{
55-
// var fieldTypeName = new FullTypeName((string)type);
56-
// var typeDefinition = typeModel.Resolve();
57-
// if (typeDefinition == null)
58-
// return null;
59-
//
60-
// IType fieldType = typeDefinition.Compilation.FindType(fieldTypeName);
61-
// context.CodeGenerator.AddField(typeDefinition, Access.ToAccessibility(), fieldType, name);
62-
// var fieldModel = typeModel.Members.OfType<IFieldModel>().FirstOrDefault(f => f.Name == name);
63-
// if (fieldModel != null) {
64-
// return new CodeVariable(context, fieldModel);
65-
// }
56+
IType fieldType = GetFieldType((string)type);
57+
58+
context.CodeGenerator.AddFieldAtStart(typeDefinition, Access.ToAccessibility(), fieldType, name);
59+
60+
ReloadTypeDefinition();
61+
62+
IField field = typeDefinition.Fields.FirstOrDefault(f => f.Name == name);
63+
if (field != null) {
64+
return new CodeVariable(context, field);
65+
}
6666
return null;
6767
}
68+
69+
IType GetFieldType(string type)
70+
{
71+
var fieldTypeName = new FullTypeName(type);
72+
73+
IType fieldType = typeDefinition.Compilation.FindType(fieldTypeName);
74+
if (fieldType != null) {
75+
return fieldType;
76+
}
77+
78+
return new UnknownType(fieldTypeName);
79+
}
80+
81+
void ReloadTypeDefinition()
82+
{
83+
ICompilation compilation = context.DteProject.GetCompilationUnit(typeDefinition.BodyRegion.FileName);
84+
85+
ITypeDefinition matchedTypeDefinition = compilation.MainAssembly.GetTypeDefinition(typeDefinition.FullTypeName);
86+
if (matchedTypeDefinition != null) {
87+
typeDefinition = matchedTypeDefinition;
88+
}
89+
}
6890
}
6991
}

src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeType.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE
2828
{
2929
public class CodeType : CodeElement, global::EnvDTE.CodeType
3030
{
31-
protected readonly ITypeDefinition typeDefinition;
31+
protected ITypeDefinition typeDefinition;
3232
IType[] typeArguments;
3333

3434
CodeElementsList<CodeElement> members;

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,5 +26,6 @@ public interface ICodeGenerator
2626
{
2727
void AddImport(FileName fileName, string name);
2828
void MakePartial(ITypeDefinition typeDefinition);
29+
void AddFieldAtStart(ITypeDefinition typeDefinition, Accessibility accessibility, IType fieldType, string name);
2930
}
3031
}

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,5 +49,10 @@ void InvokeIfRequired(Action action)
4949
{
5050
mainThread.InvokeIfRequired(action);
5151
}
52+
53+
public void AddFieldAtStart(ITypeDefinition typeDefinition, Accessibility accessibility, IType fieldType, string name)
54+
{
55+
InvokeIfRequired(() => codeGenerator.AddFieldAtStart(typeDefinition, accessibility, fieldType, name));
56+
}
5257
}
5358
}

src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -398,11 +398,5 @@
398398
<Folder Include="Src\VisualStudio" />
399399
<Folder Include="Src\Scripting" />
400400
</ItemGroup>
401-
<ItemGroup>
402-
<None Include="..\..\..\..\..\bin\SharpDevelop.exe">
403-
<Link>SharpDevelop.exe</Link>
404-
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
405-
</None>
406-
</ItemGroup>
407401
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.Targets" />
408402
</Project>

src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Refactoring/Script.cs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,16 @@ public void AddTo(BlockStatement bodyStatement, AstNode newNode)
222222
output.RegisterTrackedSegments(this, startOffset);
223223
CorrectFormatting (null, newNode);
224224
}
225-
225+
226+
public void AddTo(TypeDeclaration typeDecl, EntityDeclaration entityDecl)
227+
{
228+
var startOffset = GetCurrentOffset(typeDecl.LBraceToken.EndLocation);
229+
var output = OutputNode(1 + GetIndentLevelAt(startOffset), entityDecl, true);
230+
InsertText(startOffset, output.Text);
231+
output.RegisterTrackedSegments(this, startOffset);
232+
CorrectFormatting (null, entityDecl);
233+
}
234+
226235
/// <summary>
227236
/// Changes the modifier of a given entity declaration.
228237
/// </summary>

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,11 @@ public virtual void AddField(ITypeDefinition declaringType, Accessibility access
8888
throw new NotSupportedException("Feature not supported!");
8989
}
9090

91+
public virtual void AddFieldAtStart(ITypeDefinition typeDefinition, Accessibility accessibility, IType fieldType, string name)
92+
{
93+
throw new NotSupportedException("Feature not supported!");
94+
}
95+
9196
public virtual void ChangeAccessibility(IEntity entity, Accessibility newAccessiblity)
9297
{
9398
throw new NotSupportedException("Feature not supported!");

0 commit comments

Comments
 (0)