Skip to content

Commit 2d70cbf

Browse files
committed
Refactored a bit interface implementation. It's a bit faster, and fixes interface implementation in Haxe with a single property with get and set accessors.
Added a test to avoid possible future regressions.
1 parent db6e3c8 commit 2d70cbf

File tree

4 files changed

+76
-15
lines changed

4 files changed

+76
-15
lines changed

External/Plugins/ASCompletion/Completion/ASGenerator.cs

Lines changed: 22 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3139,25 +3139,32 @@ private static void GenerateImplementation(ClassModel iType, ClassModel inClass,
31393139
{
31403140
decl = TemplateUtils.ToDeclarationWithModifiersString(method, TemplateUtils.GetTemplate("Property"));
31413141

3142-
string getter = null, setter = null;
3142+
string templateName = null;
3143+
string metadata = null;
31433144
if (method.Parameters[0].Name == "get")
31443145
{
3145-
getter = NewLine + TemplateUtils.ToDeclarationString(method, TemplateUtils.GetTemplate("Getter"));
3146-
getter = TemplateUtils.ReplaceTemplateVariable(getter, "Modifiers", null);
3147-
getter = TemplateUtils.ReplaceTemplateVariable(getter, "Member", method.Name);
3148-
decl += getter;
3149-
}
3150-
3151-
if (method.Parameters[1].Name == "set")
3152-
{
3153-
setter = NewLine + TemplateUtils.ToDeclarationString(method, TemplateUtils.GetTemplate("Setter"));
3154-
setter = TemplateUtils.ReplaceTemplateVariable(setter, "Modifiers", null);
3155-
setter = TemplateUtils.ReplaceTemplateVariable(setter, "Member", method.Name);
3156-
decl += setter;
3146+
if (method.Parameters[1].Name == "set")
3147+
{
3148+
templateName = "GetterSetter";
3149+
metadata = "@:isVar";
3150+
}
3151+
else
3152+
templateName = "Getter";
31573153
}
3158-
3159-
string metadata = (getter != null && setter != null) ? "@:isVar" : null;
3154+
else if (method.Parameters[1].Name == "set")
3155+
{
3156+
templateName = "Setter";
3157+
}
3158+
31603159
decl = TemplateUtils.ReplaceTemplateVariable(decl, "MetaData", metadata);
3160+
3161+
if (templateName != null)
3162+
{
3163+
var accessor = NewLine + TemplateUtils.ToDeclarationString(method, TemplateUtils.GetTemplate(templateName));
3164+
accessor = TemplateUtils.ReplaceTemplateVariable(accessor, "Modifiers", null);
3165+
accessor = TemplateUtils.ReplaceTemplateVariable(accessor, "Member", method.Name);
3166+
decl += accessor;
3167+
}
31613168
}
31623169
else
31633170
decl = TemplateUtils.ToDeclarationWithModifiersString(method, TemplateUtils.GetTemplate("Getter"));

Tests/External/Plugins/ASCompletion.Tests/ASCompletion.Tests.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,7 @@
152152
<EmbeddedResource Include="Test Files\completion\as3\SimpleTest.as" />
153153
<EmbeddedResource Include="Test Files\parser\haxe\AnonymousStructuresTest.hx" />
154154
<EmbeddedResource Include="Test Files\parser\haxe\MultipleVarsAtOnceTest.hx" />
155+
<EmbeddedResource Include="Test Files\generated\haxe\ImplementInterfaceNoMembersInsertSingleProperty.hx" />
155156
</ItemGroup>
156157
<ItemGroup>
157158
<ProjectReference Include="..\..\..\..\External\Plugins\AS2Context\AS2Context.csproj">

Tests/External/Plugins/ASCompletion.Tests/Completion/ASGeneratorTests.cs

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -412,6 +412,43 @@ public void ImplementFromInterface_FullHaxe()
412412
ASGenerator.GenerateJob(GeneratorJobType.ImplementInterface, null, classModel, null, null);
413413
Assert.AreEqual(TestFile.ReadAllText("ASCompletion.Test_Files.generated.haxe.ImplementInterfaceNoMembers.hx"), sci.Text);
414414
}
415+
416+
[Test]
417+
public void ImplementFromInterface_SinglePropertyHaxe()
418+
{
419+
var interfaceModel = new ClassModel { InFile = new FileModel(), Name = "ITest", Type = "ITest" };
420+
interfaceModel.Members.Add(new MemberList
421+
{
422+
new MemberModel("x", "Int", FlagType.Getter, Visibility.Public)
423+
{
424+
Parameters = new List<MemberModel>
425+
{
426+
new MemberModel {Name = "get"},
427+
new MemberModel {Name = "set"}
428+
}
429+
}
430+
});
431+
432+
var classModel = new ClassModel { InFile = new FileModel(), LineFrom = 2, LineTo = 2 };
433+
var pluginMain = Substitute.For<PluginMain>();
434+
var pluginUiMock = new PluginUIMock(pluginMain);
435+
pluginMain.MenuItems.Returns(new List<System.Windows.Forms.ToolStripItem>());
436+
pluginMain.Settings.Returns(new GeneralSettings());
437+
pluginMain.Panel.Returns(pluginUiMock);
438+
ASContext.GlobalInit(pluginMain);
439+
ASContext.Context = Substitute.For<IASContext>();
440+
ASContext.Context.ResolveType(null, null).ReturnsForAnyArgs(interfaceModel);
441+
ASContext.Context.Features.voidKey = "Void";
442+
ASContext.Context.CurrentModel.Returns(new FileModel { haXe = true });
443+
444+
var sci = GetBaseScintillaControl();
445+
sci.Text = "package generatortest;\r\n\r\nclass ImplementTest{}";
446+
sci.ConfigurationLanguage = "haxe";
447+
doc.SciControl.Returns(sci);
448+
449+
ASGenerator.GenerateJob(GeneratorJobType.ImplementInterface, null, classModel, null, null);
450+
Assert.AreEqual(TestFile.ReadAllText("ASCompletion.Test_Files.generated.haxe.ImplementInterfaceNoMembersInsertSingleProperty.hx"), sci.Text);
451+
}
415452
}
416453
}
417454
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package generatortest;
2+
3+
class ImplementTest{
4+
5+
/* INTERFACE ITest */
6+
7+
@:isVar public var x(get, set):Int;
8+
9+
function get_x():Int {
10+
return x;
11+
}
12+
13+
function set_x(value:Int):Int {
14+
return x = value;
15+
}
16+
}

0 commit comments

Comments
 (0)