Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/monodevelop.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Imison <nosami@users.noreply.github.com>2016-08-23 15:41:58 +0300
committerGitHub <noreply@github.com>2016-08-23 15:41:58 +0300
commit4fb2e8b3f2042f3be28b370d01f1c8057e993e51 (patch)
tree0a806fff8ff40d5b6b45224d3c32f14a394ff6d9
parent8e8caf4e8049a43ae52827f61244ff30c168769a (diff)
parent7c96229aad9fef71d027366c872830cda9580d31 (diff)
Merge pull request #1600 from mono/cycle8-fix-42253monodevelop-6.1.0.5365
Fixes copy paste indent when top line is empty.
-rw-r--r--main/external/fsharpbinding/MonoDevelop.FSharp.Tests/CopyPaste.fs95
-rw-r--r--main/external/fsharpbinding/MonoDevelop.FSharp.Tests/MonoDevelop.FSharp.Tests.fsproj24
-rw-r--r--main/external/fsharpbinding/MonoDevelop.FSharpBinding/FSharpIndentationTracker.fs28
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