diff options
author | Jason Imison <nosami@users.noreply.github.com> | 2016-08-23 15:41:58 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-08-23 15:41:58 +0300 |
commit | 4fb2e8b3f2042f3be28b370d01f1c8057e993e51 (patch) | |
tree | 0a806fff8ff40d5b6b45224d3c32f14a394ff6d9 | |
parent | 8e8caf4e8049a43ae52827f61244ff30c168769a (diff) | |
parent | 7c96229aad9fef71d027366c872830cda9580d31 (diff) |
Merge pull request #1600 from mono/cycle8-fix-42253monodevelop-6.1.0.5365
Fixes copy paste indent when top line is empty.
3 files changed, 125 insertions, 22 deletions
diff --git a/main/external/fsharpbinding/MonoDevelop.FSharp.Tests/CopyPaste.fs b/main/external/fsharpbinding/MonoDevelop.FSharp.Tests/CopyPaste.fs new file mode 100644 index 0000000000..7bf61ca0c3 --- /dev/null +++ b/main/external/fsharpbinding/MonoDevelop.FSharp.Tests/CopyPaste.fs @@ -0,0 +1,95 @@ +namespace MonoDevelopTests + +open System +open NUnit.Framework +open MonoDevelop.FSharp +open Mono.TextEditor +open Mono.TextEditor.Highlighting +open MonoDevelop.Ide.Editor +open FsUnit + +[<TestFixture>] +type ``Copy and Paste tests``() = + let assertPaste (input:string) (expected:string) = + let offset = input.IndexOf("$") + let length = input.LastIndexOf("$") - offset - 1 + let pastePosition = input.IndexOf("PASTE_HERE") - 2 + let input = input.Replace("$", "").Replace("PASTE_HERE", "") + let copyText = input.[offset..offset+length-1] + let doc = TestHelpers.createDocWithoutParsing input "defined" + let pasteHandler = FSharpTextPasteHandler doc.Editor + let copyData = pasteHandler.GetCopyData(offset, length) + let pasteText = pasteHandler.FormatPlainText(pastePosition, copyText, copyData) + pasteText |> should equal expected + + [<Test>] + member x.``Plain copy paste``() = + let input = + """ + $let f = + let a = 3 + ()$ + PASTE_HERE + """ + + let expected = + """ + let f = + let a = 3 + () + """.Trim() + + assertPaste input expected + + [<Test>] + member x.``Indented copy paste``() = + let input = + """ + $let f = + let a = 3 + ()$ + PASTE_HERE + """ + + let expected = + """ + let f = + let a = 3 + () + """.Trim() + + assertPaste input expected + + [<Test>] + member x.``Copy blank line paste``() = + let input = + "$\n" + + " let f =\n" + + " let a = 3\n" + + " ()$\n" + + " PASTE_HERE" + + let expected = + "\n" + + " let f =\n" + + " let a = 3\n" + + " ()" + + assertPaste input expected + + [<Test>] + member x.``Copy indented blank line paste``() = + let input = + "$\n" + + " let f =\n" + + " let a = 3\n" + + " ()$\n" + + " PASTE_HERE" + + let expected = + "\n" + + " let f =\n" + + " let a = 3\n" + + " ()" + + assertPaste input expected
\ No newline at end of file diff --git a/main/external/fsharpbinding/MonoDevelop.FSharp.Tests/MonoDevelop.FSharp.Tests.fsproj b/main/external/fsharpbinding/MonoDevelop.FSharp.Tests/MonoDevelop.FSharp.Tests.fsproj index 747f665bad..a83b7c5fb7 100644 --- a/main/external/fsharpbinding/MonoDevelop.FSharp.Tests/MonoDevelop.FSharp.Tests.fsproj +++ b/main/external/fsharpbinding/MonoDevelop.FSharp.Tests/MonoDevelop.FSharp.Tests.fsproj @@ -1,4 +1,4 @@ -<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> +<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <PropertyGroup> <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> @@ -19,8 +19,7 @@ <OutputPath>bin\Debug</OutputPath> <DefineConstants>TRACE;DEBUG;$(DefineConstants)</DefineConstants> <ErrorReport>prompt</ErrorReport> - <PlatformTarget> - </PlatformTarget> + <PlatformTarget></PlatformTarget> <ConsolePause>true</ConsolePause> <Optimize>false</Optimize> <Tailcalls>false</Tailcalls> @@ -34,23 +33,17 @@ <Optimize>true</Optimize> <OutputPath>bin\Release</OutputPath> <ErrorReport>prompt</ErrorReport> - <PlatformTarget> - </PlatformTarget> + <PlatformTarget></PlatformTarget> <ConsolePause>false</ConsolePause> <Tailcalls>true</Tailcalls> <DefineConstants>$(DefineConstants)</DefineConstants> </PropertyGroup> <ItemGroup> - <Reference Include="pango-sharp"> - </Reference> - <Reference Include="atk-sharp"> - </Reference> - <Reference Include="gdk-sharp"> - </Reference> - <Reference Include="gtk-sharp"> - </Reference> - <Reference Include="glib-sharp"> - </Reference> + <Reference Include="pango-sharp"></Reference> + <Reference Include="atk-sharp"></Reference> + <Reference Include="gdk-sharp"></Reference> + <Reference Include="gtk-sharp"></Reference> + <Reference Include="glib-sharp"></Reference> <Reference Include="System" /> <Reference Include="System.Xml" /> <Reference Include="System.Xml.Linq" /> @@ -164,6 +157,7 @@ <ItemGroup> <Compile Include="ParameterHinting.fs" /> <Compile Include="HighlightUsagesTests.fs" /> + <Compile Include="CopyPaste.fs" /> <Compile Include="SelectionTests.fs" /> <None Include="paket.references" /> <None Include="Samples\Xamarin.iOS.fsproj" /> diff --git a/main/external/fsharpbinding/MonoDevelop.FSharpBinding/FSharpIndentationTracker.fs b/main/external/fsharpbinding/MonoDevelop.FSharpBinding/FSharpIndentationTracker.fs index 1b8bf0d563..783d752b74 100644 --- a/main/external/fsharpbinding/MonoDevelop.FSharpBinding/FSharpIndentationTracker.fs +++ b/main/external/fsharpbinding/MonoDevelop.FSharpBinding/FSharpIndentationTracker.fs @@ -7,10 +7,22 @@ open MonoDevelop.Ide.Editor.Extension type FSharpTextPasteHandler(editor:TextEditor) = inherit TextPasteHandler() - override x.GetCopyData(offset, _length) = + + let rec getNextNonBlankLineNumber lineNumber endOffset= + let line = editor.GetLine lineNumber + if line.Length <> 0 || line.EndOffset > endOffset then + lineNumber + else + getNextNonBlankLineNumber (lineNumber+1) endOffset + + override x.GetCopyData(offset, length) = // get the indent level the line was originally at - let line = editor.OffsetToLineNumber offset - let indent = editor.GetLineIndent line + let lineNumber = editor.OffsetToLineNumber offset + let endOffset = offset + length + + let nonBlankLineNumber = getNextNonBlankLineNumber lineNumber endOffset + + let indent = editor.GetLineIndent nonBlankLineNumber [|byte indent.Length|] override x.PostFomatPastedText (_offset, _length) = () @@ -27,10 +39,13 @@ type FSharpTextPasteHandler(editor:TextEditor) = line.Length - (String.trimStart [|' '|] line).Length let fixIndent (line:string, indentDifference:int) = - if indentDifference > 0 then - (String(' ', indentDifference)) + line + if line.Length = 0 then + line else - line.Substring -indentDifference + if indentDifference > 0 then + (String(' ', indentDifference)) + line + else + line.Substring -indentDifference let line = location.Line @@ -48,7 +63,6 @@ type FSharpTextPasteHandler(editor:TextEditor) = let lines = remainingLines |> Seq.append (seq [(String.trimStart [|' '|] firstLine)]) let res = String.Join (editor.Options.DefaultEolMarker, lines) - res else text |