Skip to content

Commit 5736612

Browse files
committed
Merge pull request #1134 from SlavaRa/feature/ExtractLocalVariable_improvements
Improves "Extract locale variable" when working with generic types
2 parents 69b7b09 + b9c91df commit 5736612

25 files changed

+379
-232
lines changed

External/Plugins/ASCompletion/ASCompletion.csproj

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -84,9 +84,7 @@
8484
<Compile Include="Completion\ASDocumentation.cs" />
8585
<Compile Include="Completion\ContextFeatures.cs" />
8686
<Compile Include="Context\IASContext.cs" />
87-
<Compile Include="CustomControls\StateSavingTreeView.cs">
88-
<SubType>Component</SubType>
89-
</Compile>
87+
<Compile Include="CustomControls\StateSavingTreeView.cs" />
9088
<Compile Include="CustomControls\ModelsExplorer.cs">
9189
<SubType>UserControl</SubType>
9290
</Compile>

External/Plugins/ASCompletion/Completion/ASGenerator.cs

Lines changed: 10 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -2749,18 +2749,15 @@ private static void GenerateClass(ScintillaControl sci, String className, ClassM
27492749
info["constructorArgTypes"] = constructorArgTypes;
27502750
DataEvent de = new DataEvent(EventType.Command, "ProjectManager.CreateNewFile", info);
27512751
EventManager.DispatchEvent(null, de);
2752-
if (de.Handled) return;
27532752
}
27542753

27552754
public static void GenerateExtractVariable(ScintillaControl Sci, string NewName)
27562755
{
2757-
FileModel cFile;
2758-
27592756
string expression = Sci.SelText.Trim(new char[] { '=', ' ', '\t', '\n', '\r', ';', '.' });
27602757
expression = expression.TrimEnd(new char[] { '(', '[', '{', '<' });
27612758
expression = expression.TrimStart(new char[] { ')', ']', '}', '>' });
27622759

2763-
cFile = ASContext.Context.CurrentModel;
2760+
var cFile = ASContext.Context.CurrentModel;
27642761
ASFileParser parser = new ASFileParser();
27652762
parser.ParseSrc(cFile, Sci.Text);
27662763

@@ -2771,18 +2768,18 @@ public static void GenerateExtractVariable(ScintillaControl Sci, string NewName)
27712768
int funcBodyStart = GetBodyStart(current.LineFrom, current.LineTo, Sci);
27722769
Sci.SetSel(funcBodyStart, Sci.LineEndPosition(current.LineTo));
27732770
string currentMethodBody = Sci.SelText;
2771+
var insertPosition = funcBodyStart + currentMethodBody.IndexOfOrdinal(expression);
2772+
var line = Sci.LineFromPosition(insertPosition);
2773+
insertPosition = Sci.LineIndentPosition(line);
27742774

2775-
bool isExprInSingleQuotes = (expression.StartsWith('\'') && expression.EndsWith('\''));
2776-
bool isExprInDoubleQuotes = (expression.StartsWith('\"') && expression.EndsWith('\"'));
2777-
int stylemask = (1 << Sci.StyleBits) - 1;
27782775
int lastPos = -1;
2779-
char prevOrNextChar;
27802776
Sci.Colourise(0, -1);
27812777
while (true)
27822778
{
27832779
lastPos = currentMethodBody.IndexOfOrdinal(expression, lastPos + 1);
27842780
if (lastPos > -1)
27852781
{
2782+
char prevOrNextChar;
27862783
if (lastPos > 0)
27872784
{
27882785
prevOrNextChar = currentMethodBody[lastPos - 1];
@@ -2800,22 +2797,10 @@ public static void GenerateExtractVariable(ScintillaControl Sci, string NewName)
28002797
}
28012798
}
28022799

2803-
int style = Sci.StyleAt(funcBodyStart + lastPos) & stylemask;
2804-
if (ASComplete.IsCommentStyle(style))
2805-
{
2806-
continue;
2807-
}
2808-
else if ((isExprInDoubleQuotes && currentMethodBody[lastPos] == '"' && currentMethodBody[lastPos + expression.Length - 1] == '"')
2809-
|| (isExprInSingleQuotes && currentMethodBody[lastPos] == '\'' && currentMethodBody[lastPos + expression.Length - 1] == '\''))
2810-
{
2811-
2812-
}
2813-
else if (!ASComplete.IsTextStyle(style))
2814-
{
2815-
continue;
2816-
}
2817-
2818-
Sci.SetSel(funcBodyStart + lastPos, funcBodyStart + lastPos + expression.Length);
2800+
var pos = funcBodyStart + lastPos;
2801+
int style = Sci.BaseStyleAt(pos);
2802+
if (ASComplete.IsCommentStyle(style)) continue;
2803+
Sci.SetSel(pos, pos + expression.Length);
28192804
Sci.ReplaceSel(NewName);
28202805
currentMethodBody = currentMethodBody.Substring(0, lastPos) + NewName + currentMethodBody.Substring(lastPos + expression.Length);
28212806
lastPos += NewName.Length;
@@ -2825,8 +2810,7 @@ public static void GenerateExtractVariable(ScintillaControl Sci, string NewName)
28252810
break;
28262811
}
28272812
}
2828-
2829-
Sci.CurrentPos = funcBodyStart;
2813+
Sci.CurrentPos = insertPosition;
28302814
Sci.SetSel(Sci.CurrentPos, Sci.CurrentPos);
28312815

28322816
MemberModel m = new MemberModel(NewName, "", FlagType.LocalVar, 0);

External/Plugins/CodeRefactor/Commands/ExtractLocalVariableCommand.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ namespace CodeRefactor.Commands
66
{
77
class ExtractLocalVariableCommand
88
{
9-
private string NewName;
9+
private readonly string NewName;
1010

1111
public ExtractLocalVariableCommand(string newName)
1212
{
@@ -15,15 +15,15 @@ public ExtractLocalVariableCommand(string newName)
1515

1616
public void Execute()
1717
{
18-
ScintillaControl Sci = PluginBase.MainForm.CurrentDocument.SciControl;
19-
Sci.BeginUndoAction();
18+
ScintillaControl sci = PluginBase.MainForm.CurrentDocument.SciControl;
19+
sci.BeginUndoAction();
2020
try
2121
{
22-
ASGenerator.GenerateExtractVariable(Sci, NewName);
22+
ASGenerator.GenerateExtractVariable(sci, NewName);
2323
}
2424
finally
2525
{
26-
Sci.EndUndoAction();
26+
sci.EndUndoAction();
2727
}
2828
}
2929
}

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

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -106,12 +106,9 @@
106106
<SubType>UserControl</SubType>
107107
</Compile>
108108
<Compile Include="Properties\AssemblyInfo.cs" />
109-
<Compile Include="Properties\Resources.Designer.cs">
110-
<AutoGen>True</AutoGen>
111-
<DesignTime>True</DesignTime>
112-
<DependentUpon>Resources.resx</DependentUpon>
113-
</Compile>
114109
<EmbeddedResource Include="Test Files\parser\haxe\WrongSyntaxCompilerMetaAfterMethodWithNoType.hx" />
110+
<EmbeddedResource Include="Test Files\generated\haxe\BeforeGenerateExtractVariableGeneric.hx" />
111+
<EmbeddedResource Include="Test Files\generated\haxe\AfterGenerateExtractVariableGeneric.hx" />
115112
<Compile Include="TestUtils\ContextExtensions.cs" />
116113
<Compile Include="TestUtils\TestFile.cs" />
117114
</ItemGroup>
@@ -169,6 +166,20 @@
169166
<EmbeddedResource Include="Test Files\parser\haxe\MetadataTest.hx" />
170167
<EmbeddedResource Include="Test Files\parser\haxe\MethodAfterGenericReturnTest.hx" />
171168
<EmbeddedResource Include="Test Files\parser\haxe\WrongSyntaxCompilerMetaAfterVarWithNoType.hx" />
169+
<EmbeddedResource Include="Test Files\generated\as3\AfterExtractLocalVariable.as" />
170+
<EmbeddedResource Include="Test Files\generated\as3\BeforeExtractLocalVariable.as" />
171+
<EmbeddedResource Include="Test Files\generated\as3\AfterExtractLocalVariable_fromString.as" />
172+
<EmbeddedResource Include="Test Files\generated\as3\BeforeExtractLocalVariable_fromString.as" />
173+
<EmbeddedResource Include="Test Files\generated\as3\AfterExtractLocalVariable_fromNumber.as" />
174+
<EmbeddedResource Include="Test Files\generated\as3\BeforeExtractLocalVariable_fromNumber.as" />
175+
<EmbeddedResource Include="Test Files\generated\haxe\AfterExtractLocalVariable_fromNumber.hx" />
176+
<EmbeddedResource Include="Test Files\generated\haxe\AfterExtractLocalVariable_fromString.hx" />
177+
<EmbeddedResource Include="Test Files\generated\haxe\BeforeExtractLocalVariable_fromNumber.hx" />
178+
<EmbeddedResource Include="Test Files\generated\haxe\BeforeExtractLocalVariable_fromString.hx" />
179+
<EmbeddedResource Include="Test Files\generated\haxe\AfterExtractLocalVariable_inSinglelineMethod.hx" />
180+
<EmbeddedResource Include="Test Files\generated\haxe\BeforeExtractLocalVariable_inSinglelineMethod.hx" />
181+
<EmbeddedResource Include="Test Files\generated\as3\AfterExtractLocalVariable_forCheckingThePositionOfNewVar.as" />
182+
<EmbeddedResource Include="Test Files\generated\as3\BeforeExtractLocalVariable_forCheckingThePositionOfNewVar.as" />
172183
<EmbeddedResource Include="Test Files\parser\haxe\FunctionTypesAsArgumentsTest.hx" />
173184
<EmbeddedResource Include="Test Files\parser\haxe\KeywordAndUnderscoreInNameTest.hx" />
174185
</ItemGroup>
@@ -215,12 +226,6 @@
215226
<Install>true</Install>
216227
</BootstrapperPackage>
217228
</ItemGroup>
218-
<ItemGroup>
219-
<EmbeddedResource Include="Properties\Resources.resx">
220-
<Generator>ResXFileCodeGenerator</Generator>
221-
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
222-
</EmbeddedResource>
223-
</ItemGroup>
224229
<ItemGroup>
225230
<Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
226231
</ItemGroup>

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

Lines changed: 173 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
// TODO: Tests with different formatting options using parameterized tests
22

3+
using System;
34
using System.Collections;
45
using System.Collections.Generic;
5-
using AS3Context;
6+
using System.Diagnostics;
67
using ASCompletion.Context;
78
using ASCompletion.Model;
89
using ASCompletion.Settings;
@@ -14,6 +15,7 @@
1415
using ScintillaNet;
1516
using ScintillaNet.Enums;
1617
using System.Text.RegularExpressions;
18+
using PluginCore.Helpers;
1719

1820
namespace ASCompletion.Completion
1921
{
@@ -544,6 +546,176 @@ public string Haxe(string sourceText, ClassModel sourceModel, ClassModel interfa
544546
return sci.Text;
545547
}
546548
}
549+
550+
[TestFixture]
551+
public class GenerateExtractVariable : GenerateJob
552+
{
553+
public IEnumerable<TestCaseData> GenerateExtractVariableHaxeTestCases
554+
{
555+
get
556+
{
557+
yield return
558+
new TestCaseData(
559+
TestFile.ReadAllText(
560+
"ASCompletion.Test_Files.generated.haxe.BeforeGenerateExtractVariableGeneric.hx"),
561+
new MemberModel("main", null, FlagType.Static | FlagType.Function, 0)
562+
{
563+
LineFrom = 2,
564+
LineTo = 4
565+
},
566+
"newVar"
567+
)
568+
.Returns(
569+
TestFile.ReadAllText(
570+
"ASCompletion.Test_Files.generated.haxe.AfterGenerateExtractVariableGeneric.hx"))
571+
.SetName("GenerateExtractVariable");
572+
573+
yield return
574+
new TestCaseData(
575+
TestFile.ReadAllText(
576+
"ASCompletion.Test_Files.generated.haxe.BeforeExtractLocalVariable_fromString.hx"),
577+
new MemberModel("extractLocalVariable", null, FlagType.Function, Visibility.Public)
578+
{
579+
LineFrom = 4,
580+
LineTo = 7
581+
},
582+
"newVar"
583+
)
584+
.Returns(
585+
TestFile.ReadAllText(
586+
"ASCompletion.Test_Files.generated.haxe.AfterExtractLocalVariable_fromString.hx"))
587+
.SetName("ExtractLocaleVariable from String");
588+
589+
yield return
590+
new TestCaseData(
591+
TestFile.ReadAllText(
592+
"ASCompletion.Test_Files.generated.haxe.BeforeExtractLocalVariable_fromNumber.hx"),
593+
new MemberModel("extractLocalVariable", null, FlagType.Function, Visibility.Public)
594+
{
595+
LineFrom = 4,
596+
LineTo = 7
597+
},
598+
"newVar"
599+
)
600+
.Returns(
601+
TestFile.ReadAllText(
602+
"ASCompletion.Test_Files.generated.haxe.AfterExtractLocalVariable_fromNumber.hx"))
603+
.SetName("ExtractLocaleVariable from Number");
604+
605+
yield return
606+
new TestCaseData(
607+
TestFile.ReadAllText(
608+
"ASCompletion.Test_Files.generated.haxe.BeforeExtractLocalVariable_inSinglelineMethod.hx"),
609+
new MemberModel("extractLocalVariable", null, FlagType.Function, Visibility.Public)
610+
{
611+
LineFrom = 4,
612+
LineTo = 5
613+
},
614+
"newVar"
615+
)
616+
.Returns(
617+
TestFile.ReadAllText(
618+
"ASCompletion.Test_Files.generated.haxe.AfterExtractLocalVariable_inSinglelineMethod.hx"))
619+
.SetName("ExtractLocaleVariable in single line method");
620+
}
621+
}
622+
623+
[Test, TestCaseSource("GenerateExtractVariableHaxeTestCases")]
624+
public string Haxe(string sourceText, MemberModel currentMember, string newName)
625+
{
626+
ASContext.Context.SetHaxeFeatures();
627+
ASContext.Context.CurrentModel.Returns(new FileModel {haXe = true, Context = ASContext.Context});
628+
ASContext.Context.CurrentMember.Returns(currentMember);
629+
sci.Text = sourceText;
630+
sci.ConfigurationLanguage = "haxe";
631+
SnippetHelper.PostProcessSnippets(sci, 0);
632+
ASGenerator.GenerateExtractVariable(sci, newName);
633+
return sci.Text;
634+
}
635+
636+
public IEnumerable<TestCaseData> GenerateExtractVariableAS3TestCases
637+
{
638+
get
639+
{
640+
yield return
641+
new TestCaseData(
642+
TestFile.ReadAllText(
643+
"ASCompletion.Test_Files.generated.as3.BeforeExtractLocalVariable.as"),
644+
new MemberModel("ExtractLocalVariable", null, FlagType.Constructor | FlagType.Function, 0)
645+
{
646+
LineFrom = 4,
647+
LineTo = 7
648+
},
649+
"newVar"
650+
)
651+
.Returns(
652+
TestFile.ReadAllText(
653+
"ASCompletion.Test_Files.generated.as3.AfterExtractLocalVariable.as"))
654+
.SetName("ExtractLocaleVariable");
655+
656+
yield return
657+
new TestCaseData(
658+
TestFile.ReadAllText(
659+
"ASCompletion.Test_Files.generated.as3.BeforeExtractLocalVariable_fromString.as"),
660+
new MemberModel("ExtractLocalVariable", null, FlagType.Constructor | FlagType.Function, 0)
661+
{
662+
LineFrom = 4,
663+
LineTo = 7
664+
},
665+
"newVar"
666+
)
667+
.Returns(
668+
TestFile.ReadAllText(
669+
"ASCompletion.Test_Files.generated.as3.AfterExtractLocalVariable_fromString.as"))
670+
.SetName("ExtractLocaleVariable from String");
671+
672+
yield return
673+
new TestCaseData(
674+
TestFile.ReadAllText(
675+
"ASCompletion.Test_Files.generated.as3.BeforeExtractLocalVariable_fromNumber.as"),
676+
new MemberModel("ExtractLocalVariable", null, FlagType.Constructor | FlagType.Function, 0)
677+
{
678+
LineFrom = 4,
679+
LineTo = 7
680+
},
681+
"newVar"
682+
)
683+
.Returns(
684+
TestFile.ReadAllText(
685+
"ASCompletion.Test_Files.generated.as3.AfterExtractLocalVariable_fromNumber.as"))
686+
.SetName("ExtractLocaleVariable from Number");
687+
688+
yield return
689+
new TestCaseData(
690+
TestFile.ReadAllText(
691+
"ASCompletion.Test_Files.generated.as3.BeforeExtractLocalVariable_forCheckingThePositionOfNewVar.as"),
692+
new MemberModel("extractLocalVariable", null, FlagType.Function, Visibility.Public)
693+
{
694+
LineFrom = 4,
695+
LineTo = 10
696+
},
697+
"newVar"
698+
)
699+
.Returns(
700+
TestFile.ReadAllText(
701+
"ASCompletion.Test_Files.generated.as3.AfterExtractLocalVariable_forCheckingThePositionOfNewVar.as"))
702+
.SetName("ExtractLocaleVariable with checking the position of a new variable");
703+
}
704+
}
705+
706+
[Test, TestCaseSource("GenerateExtractVariableAS3TestCases")]
707+
public string AS3(string sourceText, MemberModel currentMember, string newName)
708+
{
709+
ASContext.Context.SetHaxeFeatures();
710+
ASContext.Context.CurrentModel.Returns(new FileModel { Context = ASContext.Context });
711+
ASContext.Context.CurrentMember.Returns(currentMember);
712+
sci.Text = sourceText;
713+
sci.ConfigurationLanguage = "as3";
714+
SnippetHelper.PostProcessSnippets(sci, 0);
715+
ASGenerator.GenerateExtractVariable(sci, newName);
716+
return sci.Text;
717+
}
718+
}
547719
}
548720
}
549721
}

Tests/External/Plugins/ASCompletion.Tests/MainForm.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using System.Collections.Generic;
33
using System.Drawing;
44
using System.Windows.Forms;
5+
using FlashDevelop.Dialogs;
56
using FlashDevelop.Utilities;
67
using PluginCore;
78
using ScintillaNet.Configuration;
@@ -148,6 +149,7 @@ public Dictionary<Keys, string> GetShortcutItemsByKeys()
148149

149150
public string GetThemeValue(string id)
150151
{
152+
if (id == "ScrollBar.UseCustom") return string.Empty;
151153
throw new NotImplementedException();
152154
}
153155

0 commit comments

Comments
 (0)