From e0465f7acf90e29c68f8ab850be7d93cf87ddd55 Mon Sep 17 00:00:00 2001 From: Remko Popma Date: Thu, 3 Jan 2019 06:52:56 +0900 Subject: [PATCH] [#586] Replace Ansi.Text.clone() with copy constructor. --- RELEASE-NOTES.md | 1 + src/main/java/picocli/CommandLine.java | 20 +++++++++++-------- .../java/picocli/CommandLineHelpAnsiTest.java | 9 ++++++--- 3 files changed, 19 insertions(+), 11 deletions(-) diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md index de51ec117..84095ad1e 100644 --- a/RELEASE-NOTES.md +++ b/RELEASE-NOTES.md @@ -146,6 +146,7 @@ Support was added for the following environment variables to control enabling AN - [#576] Bugfix: fixed StringIndexOutOfBoundsException in shell-jline2 completion when cursor was before `=` when option parameter was attached to option name. - [#583] Bugfix: Default exception handler now exits on exception if exitCode was set, regardless of exception type. - [#584] Add documentation for generating autocompletion script during a Maven build. Thanks to [Bob Tiernay](https://github.com/bobtiernay-okta). +- [#586] Replace Ansi.Text.clone() with copy constructor. ## Deprecations No features were deprecated in this release. diff --git a/src/main/java/picocli/CommandLine.java b/src/main/java/picocli/CommandLine.java index 85cbc5c95..0e21e9b74 100644 --- a/src/main/java/picocli/CommandLine.java +++ b/src/main/java/picocli/CommandLine.java @@ -10234,6 +10234,15 @@ public class Text implements Cloneable { * @param maxLength max length of this text */ public Text(int maxLength) { this.maxLength = maxLength; } + /** Copy constructor. + * @since 3.9 */ + public Text(Text other) { + this.maxLength = other.maxLength; + this.from = other.from; + this.length = other.length; + this.plain = new StringBuilder(other.plain); + this.sections = new ArrayList(other.sections); + } /** * Constructs a Text with the specified String, which may contain markup like * {@code @|bg(red),white,underline some text|@}. @@ -10283,13 +10292,10 @@ public Text(String input) { private void addStyledSection(int start, int length, String startStyle, String endStyle) { sections.add(new StyledSection(start, length, startStyle, endStyle)); } - public Object clone() { - try { return super.clone(); } catch (CloneNotSupportedException e) { throw new IllegalStateException(e); } - } + public Object clone() { return new Text(this); } public Text[] splitLines() { List result = new ArrayList(); - boolean trailingEmptyString = plain.length() == 0; int start = 0, end = 0; for (int i = 0; i < plain.length(); i++, end = i) { char c = plain.charAt(i); @@ -10298,13 +10304,11 @@ public Text[] splitLines() { eol |= c == '\r'; if (eol) { result.add(this.substring(start, end)); - trailingEmptyString = i == plain.length() - 1; start = i + 1; } } - if (start < plain.length() || trailingEmptyString) { - result.add(this.substring(start, plain.length())); - } + // add remainder (may be empty string) + result.add(this.substring(start, plain.length())); return result.toArray(new Text[result.size()]); } diff --git a/src/test/java/picocli/CommandLineHelpAnsiTest.java b/src/test/java/picocli/CommandLineHelpAnsiTest.java index ea0d59520..b11dd79a8 100644 --- a/src/test/java/picocli/CommandLineHelpAnsiTest.java +++ b/src/test/java/picocli/CommandLineHelpAnsiTest.java @@ -550,10 +550,13 @@ ansi.new Text("@|bold 012\r\n34|@").concat("5\r\nAA\r\n6").concat("@|underline 7 @Test public void testTextSplitLinesEmpty() { Ansi ansi = Ansi.ON; - Ansi.Text text = ansi.new Text(""); + Ansi.Text text = ansi.new Text("abc\n\n\n"); Ansi.Text[] lines = text.splitLines(); - assertEquals(1, lines.length); - assertEquals(ansi.new Text(""), lines[0]); + assertEquals(4, lines.length); + assertEquals(ansi.new Text("abc"), lines[0]); + assertEquals(ansi.new Text(""), lines[1]); + assertEquals(ansi.new Text(""), lines[2]); + assertEquals(ansi.new Text(""), lines[3]); } @Test public void testTextSplitLinesStartEnd() {