This is an automated email from the ASF dual-hosted git repository.

junichi11 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/netbeans.git


The following commit(s) were added to refs/heads/master by this push:
     new 553ad23  [NETBEANS-2653] Generate toString() with StringBuilder (#1288)
553ad23 is described below

commit 553ad23798e93b677b4fa8a054e275a8272dd75e
Author: Junichi Yamamoto <junich...@apache.org>
AuthorDate: Sun Sep 8 06:24:02 2019 +0900

    [NETBEANS-2653] Generate toString() with StringBuilder (#1288)
---
 .../modules/java/editor/codegen/Bundle.properties  |   1 +
 .../java/editor/codegen/ToStringGenerator.java     | 148 ++++++--
 .../java/editor/codegen/ui/ToStringPanel.java      |  34 +-
 .../java/editor/codegen/ToStringGeneratorTest.java | 372 +++++++++++++++++++++
 4 files changed, 525 insertions(+), 30 deletions(-)

diff --git 
a/java/java.editor/src/org/netbeans/modules/java/editor/codegen/Bundle.properties
 
b/java/java.editor/src/org/netbeans/modules/java/editor/codegen/Bundle.properties
index 4f45a1b..4056430 100644
--- 
a/java/java.editor/src/org/netbeans/modules/java/editor/codegen/Bundle.properties
+++ 
b/java/java.editor/src/org/netbeans/modules/java/editor/codegen/Bundle.properties
@@ -42,6 +42,7 @@ LBL_hashcode_select=Select fields to be included in 
hashCode():
 LBL_tostring=toString()...
 LBL_generate_tostring=Generate toString()
 LBL_tostring_select=Select fields to be included in toString():
+LBL_tostring_use_stringbuilder=&Use StringBuilder
 LBL_implement_method=Implement Method...
 LBL_generate_implement=Generate Implement Methods
 LBL_implement_method_select=Select methods to implement:
diff --git 
a/java/java.editor/src/org/netbeans/modules/java/editor/codegen/ToStringGenerator.java
 
b/java/java.editor/src/org/netbeans/modules/java/editor/codegen/ToStringGenerator.java
index 718b749..e0ccca1 100644
--- 
a/java/java.editor/src/org/netbeans/modules/java/editor/codegen/ToStringGenerator.java
+++ 
b/java/java.editor/src/org/netbeans/modules/java/editor/codegen/ToStringGenerator.java
@@ -22,8 +22,11 @@ import com.sun.source.tree.AnnotationTree;
 import com.sun.source.tree.BlockTree;
 import com.sun.source.tree.ClassTree;
 import com.sun.source.tree.ExpressionTree;
+import com.sun.source.tree.IdentifierTree;
+import com.sun.source.tree.MethodInvocationTree;
 import com.sun.source.tree.MethodTree;
 import com.sun.source.tree.ModifiersTree;
+import com.sun.source.tree.NewClassTree;
 import com.sun.source.tree.StatementTree;
 import com.sun.source.tree.Tree;
 import com.sun.source.tree.TypeParameterTree;
@@ -37,17 +40,19 @@ import java.util.EnumSet;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Set;
+import javax.lang.model.SourceVersion;
 import javax.lang.model.element.Element;
 import javax.lang.model.element.ExecutableElement;
 import javax.lang.model.element.Modifier;
 import javax.lang.model.element.TypeElement;
 import javax.lang.model.element.VariableElement;
 import javax.swing.text.JTextComponent;
-import org.netbeans.api.java.source.Task;
+import org.netbeans.api.annotations.common.CheckForNull;
 import org.netbeans.api.java.source.CompilationController;
 import org.netbeans.api.java.source.ElementHandle;
 import org.netbeans.api.java.source.JavaSource;
 import org.netbeans.api.java.source.ModificationResult;
+import org.netbeans.api.java.source.Task;
 import org.netbeans.api.java.source.TreeMaker;
 import org.netbeans.api.java.source.TreeUtilities;
 import org.netbeans.api.java.source.WorkingCopy;
@@ -66,9 +71,9 @@ import org.openide.util.NbBundle;
  */
 public class ToStringGenerator implements CodeGenerator {
 
-    public static class Factory implements CodeGenerator.Factory {
+    private static final String ERROR = "<error>"; //NOI18N
 
-        private static final String ERROR = "<error>"; //NOI18N
+    public static class Factory implements CodeGenerator.Factory {
 
         @Override
         public List<? extends CodeGenerator> create(Lookup context) {
@@ -92,31 +97,65 @@ public class ToStringGenerator implements CodeGenerator {
             if (typeElement == null || !typeElement.getKind().isClass()) {
                 return ret;
             }
-            List<ElementNode.Description> descriptions = new ArrayList<>();
-            for (Element element : typeElement.getEnclosedElements()) {
-                switch (element.getKind()) {
-                    case METHOD:
-                        if (element.getSimpleName().contentEquals("toString") 
&& ((ExecutableElement) element).getParameters().isEmpty()) { //NOI18N
-                            return ret;
-                        }
-                        break;
-                    case FIELD:
-                        if (!ERROR.contentEquals(element.getSimpleName()) && 
!element.getModifiers().contains(Modifier.STATIC)) {
-                            
descriptions.add(ElementNode.Description.create(controller, element, null, 
true, true));
-                        }
-                }
+            ToStringGenerator generator = createToStringGenerator(component, 
controller, typeElement, false);
+            if (generator == null) {
+                return ret;
             }
-            ret.add(new ToStringGenerator(component, 
ElementNode.Description.create(controller, typeElement, descriptions, false, 
false)));
+            ret.add(generator);
             return ret;
         }
     }
     private final JTextComponent component;
     private final ElementNode.Description description;
+    private final boolean useStringBuilder;
+    private final boolean supportsStringBuilder;
+
+    @CheckForNull
+    static ToStringGenerator createToStringGenerator(JTextComponent component, 
CompilationController controller, Element typeElement, boolean 
useStringBuilder) {
+        List<ElementNode.Description> descriptions = new ArrayList<>();
+        for (Element element : typeElement.getEnclosedElements()) {
+            switch (element.getKind()) {
+                case METHOD:
+                    if (element.getSimpleName().contentEquals("toString") && 
((ExecutableElement) element).getParameters().isEmpty()) { //NOI18N
+                        return null;
+                    }
+                    break;
+                case FIELD:
+                    if (!ERROR.contentEquals(element.getSimpleName()) && 
!element.getModifiers().contains(Modifier.STATIC)) {
+                        
descriptions.add(ElementNode.Description.create(controller, element, null, 
true, true));
+                    }
+                    break;
+                default:
+                    break;
+            }
+        }
+        return new ToStringGenerator(
+                component,
+                ElementNode.Description.create(controller, typeElement, 
descriptions, false, false),
+                useStringBuilder,
+                supportsStringBuilder(controller)
+        );
+    }
+
+    private static boolean supportsStringBuilder(CompilationController 
controller) {
+        return 
SourceVersion.RELEASE_5.compareTo(controller.getSourceVersion()) <= 0
+               && 
controller.getElements().getTypeElement("java.lang.StringBuilder") != null; // 
NOI18N
+    }
 
     /** Creates a new instance of ToStringGenerator */
-    private ToStringGenerator(JTextComponent component, 
ElementNode.Description description) {
+    private ToStringGenerator(JTextComponent component, 
ElementNode.Description description, boolean useStringBuilder, boolean 
supportsStringBuilder) {
         this.component = component;
         this.description = description;
+        this.useStringBuilder = useStringBuilder;
+        this.supportsStringBuilder = supportsStringBuilder;
+    }
+
+    ElementNode.Description getDescription() {
+        return description;
+    }
+
+    boolean useStringBuilder() {
+        return useStringBuilder;
     }
 
     @Override
@@ -127,7 +166,7 @@ public class ToStringGenerator implements CodeGenerator {
     @Override
     public void invoke() {
         final int caretOffset = component.getCaretPosition();
-        final ToStringPanel panel = new ToStringPanel(description);
+        final ToStringPanel panel = new ToStringPanel(description, 
useStringBuilder, supportsStringBuilder);
         DialogDescriptor dialogDescriptor = 
GeneratorUtils.createDialogDescriptor(panel, 
NbBundle.getMessage(ToStringGenerator.class, "LBL_generate_tostring")); //NOI18N
         Dialog dialog = 
DialogDisplayer.getDefault().createDialog(dialogDescriptor);
         dialog.setVisible(true);
@@ -158,7 +197,7 @@ public class ToStringGenerator implements CodeGenerator {
                                 }
                                 fields.add(field);
                             }
-                            MethodTree mth = createToStringMethod(copy, 
fields, cls.getSimpleName().toString());
+                            MethodTree mth = createToStringMethod(copy, 
fields, cls.getSimpleName().toString(), panel.useStringBuilder());
                             copy.rewrite(cls, 
GeneratorUtils.insertClassMembers(copy, cls, Collections.singletonList(mth), 
caretOffset));
                         }
                     }
@@ -170,7 +209,7 @@ public class ToStringGenerator implements CodeGenerator {
         }
     }
 
-    private static MethodTree createToStringMethod(WorkingCopy wc, Iterable<? 
extends VariableElement> fields, String typeName) {
+    private static MethodTree createToStringMethod(WorkingCopy wc, Iterable<? 
extends VariableElement> fields, String typeName, boolean useStringBuilder) {
         TreeMaker make = wc.getTreeMaker();
         Set<Modifier> mods = EnumSet.of(Modifier.PUBLIC);
         List<AnnotationTree> annotations = new LinkedList<>();
@@ -181,7 +220,22 @@ public class ToStringGenerator implements CodeGenerator {
             }
         }
         ModifiersTree modifiers = make.Modifiers(mods, annotations);
+        BlockTree body = createToStringMethodBody(make, typeName, fields, 
useStringBuilder);
+        return make.Method(modifiers, "toString", make.Identifier("String"), 
Collections.<TypeParameterTree>emptyList(), 
Collections.<VariableTree>emptyList(), Collections.<ExpressionTree>emptyList(), 
body, null); //NOI18N
+    }
+
+    private static BlockTree createToStringMethodBody(TreeMaker make, String 
typeName, Iterable<? extends VariableElement> fields, boolean useStringBuilder) 
{
+        List<StatementTree> statements;
+        if (useStringBuilder) {
+            statements = createToStringMethodBodyWithStringBuilder(make, 
typeName, fields);
+        } else {
+            statements = createToStringMethodBodyWithPlusOperator(make, 
typeName, fields);
+        }
+        BlockTree body = make.Block(statements, false);
+        return body;
+    }
 
+    private static List<StatementTree> 
createToStringMethodBodyWithPlusOperator(TreeMaker make, String typeName, 
Iterable<? extends VariableElement> fields) {
         ExpressionTree exp = make.Literal(typeName + '{');
         boolean first = true;
         for (VariableElement variableElement : fields) {
@@ -195,8 +249,56 @@ public class ToStringGenerator implements CodeGenerator {
             first = false;
         }
         StatementTree stat = make.Return(make.Binary(Tree.Kind.PLUS, exp, 
make.Literal('}'))); //NOI18N
-        BlockTree body = make.Block(Collections.singletonList(stat), false);
+        return Collections.singletonList(stat);
+    }
 
-        return make.Method(modifiers, "toString", make.Identifier("String"), 
Collections.<TypeParameterTree>emptyList(), 
Collections.<VariableTree>emptyList(), Collections.<ExpressionTree>emptyList(), 
body, null); //NOI18N
+    private static List<StatementTree> 
createToStringMethodBodyWithStringBuilder(TreeMaker make, String typeName, 
Iterable<? extends VariableElement> fields) {
+        List<StatementTree> statements = new ArrayList<>();
+        final ExpressionTree stringBuilder = 
make.QualIdent(StringBuilder.class.getName());
+        NewClassTree newStringBuilder = make.NewClass(null, 
Collections.emptyList(), stringBuilder, Collections.emptyList(), null);
+        VariableTree variable = 
make.Variable(make.Modifiers(Collections.emptySet()), "sb", stringBuilder, 
newStringBuilder); // NOI18N
+        statements.add(variable); // StringBuilder sb = new StringBuilder();
+
+        IdentifierTree varName = make.Identifier(variable.getName());
+        boolean first = true;
+        for (VariableElement variableElement : fields) {
+            StringBuilder sb = new StringBuilder();
+            if (first) {
+                sb.append(typeName).append('{');
+            } else {
+                sb.append(", "); // NOI18N
+            }
+            sb.append(variableElement.getSimpleName().toString()).append('=');
+            // sb.append("typeName{fieldName=").append(fieldName); or 
sb.append(", fieldName=").append(fieldName);
+            statements.add(make.ExpressionStatement(createAppendInvocation(
+                    make,
+                    createAppendInvocation(
+                            make,
+                            varName,
+                            
Collections.singletonList(make.Literal(sb.toString()))),
+                    
Collections.singletonList(make.Identifier(variableElement.getSimpleName())))
+            ));
+            first = false;
+        }
+        statements.add(make.ExpressionStatement(createAppendInvocation( // 
sb.append('}');
+                make,
+                varName,
+                Collections.singletonList(make.Literal('}'))
+        )));
+        statements.add(make.Return(make.MethodInvocation( // return 
sb.toString();
+                Collections.emptyList(),
+                make.MemberSelect(varName, "toString"), // NOI18N
+                Collections.emptyList()
+        )));
+        return statements;
+    }
+
+    private static MethodInvocationTree createAppendInvocation(TreeMaker make, 
ExpressionTree expression, List<? extends ExpressionTree> arguments){
+        return make.MethodInvocation( // sb.append()
+                Collections.emptyList(),
+                make.MemberSelect(expression, "append"), // NOI18N
+                arguments
+        );
     }
+
 }
diff --git 
a/java/java.editor/src/org/netbeans/modules/java/editor/codegen/ui/ToStringPanel.java
 
b/java/java.editor/src/org/netbeans/modules/java/editor/codegen/ui/ToStringPanel.java
index 7e61b51..61d1982 100644
--- 
a/java/java.editor/src/org/netbeans/modules/java/editor/codegen/ui/ToStringPanel.java
+++ 
b/java/java.editor/src/org/netbeans/modules/java/editor/codegen/ui/ToStringPanel.java
@@ -19,8 +19,11 @@
 
 package org.netbeans.modules.java.editor.codegen.ui;
 
+import java.awt.GridBagConstraints;
+import java.awt.Insets;
 import java.util.List;
 import javax.lang.model.element.Element;
+import javax.swing.JCheckBox;
 import javax.swing.JPanel;
 import org.netbeans.api.java.source.ElementHandle;
 import org.netbeans.modules.java.editor.codegen.ToStringGenerator;
@@ -31,11 +34,12 @@ import org.openide.util.NbBundle;
  * @author  Dusan Balek
  */
 public class ToStringPanel extends JPanel {
-    
-    private ElementSelectorPanel elementSelector;
-    
+
+    private final ElementSelectorPanel elementSelector;
+    private final JCheckBox useStringBuilderCheckBox = new JCheckBox();
+
     /** Creates new form GetterSetterPanel */
-    public ToStringPanel(ElementNode.Description description) {
+    public ToStringPanel(ElementNode.Description description, boolean 
useStringBuilder, boolean supportsStringBuilder) {
         initComponents();
         elementSelector = new ElementSelectorPanel(description, false);
         java.awt.GridBagConstraints gridBagConstraints = new 
java.awt.GridBagConstraints();
@@ -47,13 +51,29 @@ public class ToStringPanel extends JPanel {
         selectorLabel.setText(NbBundle.getMessage(ToStringGenerator.class, 
"LBL_tostring_select")); //NOI18N
         selectorLabel.setLabelFor(elementSelector);
         elementSelector.doInitialExpansion(1);
+        useStringBuilderCheckBox.setSelected(false);
+        if (supportsStringBuilder) {
+            useStringBuilderCheckBox.setSelected(useStringBuilder);
+            
org.openide.awt.Mnemonics.setLocalizedText(useStringBuilderCheckBox, 
NbBundle.getMessage(ToStringGenerator.class, 
"LBL_tostring_use_stringbuilder")); // NOI18N
+            GridBagConstraints gbc = new GridBagConstraints();
+            gbc.fill = GridBagConstraints.BOTH;
+            gbc.gridx = 0;
+            gbc.gridy = 2;
+            gbc.insets = new Insets(0, 12, 0, 12);
+            gbc.anchor = GridBagConstraints.WEST;
+            add(useStringBuilderCheckBox, gbc);
+        }
        
this.getAccessibleContext().setAccessibleDescription(NbBundle.getMessage(ToStringGenerator.class,
 "A11Y_Generate_ToString"));
     }
-    
+
     public List<ElementHandle<? extends Element>> getVariables() {
         return ((ElementSelectorPanel)elementSelector).getSelectedElements();
     }
 
+    public boolean useStringBuilder() {
+        return useStringBuilderCheckBox.isSelected();
+    }
+
     /** This method is called from within the constructor to
      * initialize the form.
      * WARNING: Do NOT modify this code. The content of this method is
@@ -73,8 +93,8 @@ public class ToStringPanel extends JPanel {
         gridBagConstraints.insets = new java.awt.Insets(12, 12, 6, 12);
         add(selectorLabel, gridBagConstraints);
     }// </editor-fold>//GEN-END:initComponents
-    
-    
+
+
     // Variables declaration - do not modify//GEN-BEGIN:variables
     private javax.swing.JLabel selectorLabel;
     // End of variables declaration//GEN-END:variables
diff --git 
a/java/java.editor/test/unit/src/org/netbeans/modules/java/editor/codegen/ToStringGeneratorTest.java
 
b/java/java.editor/test/unit/src/org/netbeans/modules/java/editor/codegen/ToStringGeneratorTest.java
new file mode 100644
index 0000000..7561472
--- /dev/null
+++ 
b/java/java.editor/test/unit/src/org/netbeans/modules/java/editor/codegen/ToStringGeneratorTest.java
@@ -0,0 +1,372 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.netbeans.modules.java.editor.codegen;
+
+import java.awt.Dialog;
+import java.io.IOException;
+import javax.lang.model.element.Element;
+import javax.swing.JDialog;
+import javax.swing.JTextArea;
+import javax.swing.SwingUtilities;
+import javax.swing.event.ChangeListener;
+import javax.swing.text.Document;
+import static junit.framework.TestCase.assertEquals;
+import static junit.framework.TestCase.assertNotNull;
+import org.netbeans.api.java.source.CompilationController;
+import org.netbeans.api.java.source.JavaSource;
+import org.netbeans.api.java.source.SourceUtilsTestUtil;
+import org.netbeans.junit.NbTestCase;
+import org.netbeans.spi.java.queries.SourceLevelQueryImplementation2;
+import org.openide.DialogDescriptor;
+import org.openide.DialogDisplayer;
+import org.openide.NotifyDescriptor;
+import org.openide.cookies.EditorCookie;
+import org.openide.filesystems.FileObject;
+import org.openide.filesystems.FileUtil;
+import org.openide.loaders.DataObject;
+import org.openide.loaders.DataObjectNotFoundException;
+
+/**
+ *
+ * @author junichi11
+ */
+public class ToStringGeneratorTest extends NbTestCase {
+
+    private FileObject fo;
+    private String sourceLevel;
+
+    public ToStringGeneratorTest(String name) {
+        super(name);
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        fo = SourceUtilsTestUtil.makeScratchDir(this);
+        System.setProperty("netbeans.user", getWorkDirPath());
+        SourceUtilsTestUtil.setLookup(new Object[]{new 
ToStringGeneratorTest.DD(), new SourceLevelQueryImplementation2() {
+            @Override
+            public SourceLevelQueryImplementation2.Result 
getSourceLevel(FileObject javaFile) {
+                return new Result() {
+                    @Override
+                    public String getSourceLevel() {
+                        return sourceLevel != null ? sourceLevel : "1.5";
+                    }
+
+                    @Override
+                    public void addChangeListener(ChangeListener listener) {
+                    }
+
+                    @Override
+                    public void removeChangeListener(ChangeListener listener) {
+                    }
+                };
+            }
+        }}, getClass().getClassLoader());
+    }
+
+    public void testToStringWithPlusOperator() throws Exception {
+        FileObject javaFile = FileUtil.createData(fo, "NewClass.java");
+        String what1 = ""
+                + "public class NewClass {\n"
+                + "    private final String test1 = \"test\";\n"
+                + "    private final String test2 = \"test\";\n"
+                + "    private final String test3 = \"test\";\n";
+
+        String what2 = ""
+                + "\n"
+                + "}";
+        String what = what1 + what2;
+        GeneratorUtilsTest.writeIntoFile(javaFile, what);
+
+        JavaSource javaSource = JavaSource.forFileObject(javaFile);
+        assertNotNull("Created", javaSource);
+
+        Document doc = getDocuemnt(javaFile);
+
+        final JTextArea component = new JTextArea(doc);
+        component.setCaretPosition(what1.length());
+
+        class Task implements 
org.netbeans.api.java.source.Task<CompilationController> {
+
+            private ToStringGenerator generator;
+
+            @Override
+            public void run(CompilationController controller) throws Exception 
{
+                controller.toPhase(JavaSource.Phase.ELEMENTS_RESOLVED);
+                Element typeElement = 
controller.getElements().getTypeElement("NewClass");
+                generator = 
ToStringGenerator.createToStringGenerator(component, controller, typeElement, 
false);
+            }
+
+            public void post() throws Exception {
+                assertNotNull("Created", generator);
+
+                assertEquals("Three fields", 3, 
generator.getDescription().getSubs().size());
+                assertEquals("test1 field selected", true, 
generator.getDescription().getSubs().get(0).isSelected());
+                assertEquals("test2 field selected", true, 
generator.getDescription().getSubs().get(1).isSelected());
+                assertEquals("test3 field selected", true, 
generator.getDescription().getSubs().get(2).isSelected());
+                assertEquals("Don't use StringBuilder", false, 
generator.useStringBuilder());
+            }
+        }
+        final Task task = new Task();
+
+        javaSource.runUserActionTask(task, false);
+        task.post();
+
+        SwingUtilities.invokeAndWait(() -> task.generator.invoke());
+
+        Document document = component.getDocument();
+        String text = document.getText(0, document.getLength());
+        String expected = ""
+                + "public class NewClass {\n"
+                + "    private final String test1 = \"test\";\n"
+                + "    private final String test2 = \"test\";\n"
+                + "    private final String test3 = \"test\";\n"
+                + "\n"
+                + "    @Override\n"
+                + "    public String toString() {\n"
+                + "        return \"NewClass{\" + \"test1=\" + test1 + \", 
test2=\" + test2 + \", test3=\" + test3 + '}';\n"
+                + "    }\n"
+                + "\n"
+                + "}";
+        assertEquals(expected, text);
+    }
+
+    public void testToStringWithStringBuilder() throws Exception {
+        FileObject javaFile = FileUtil.createData(fo, "NewClass.java");
+        String what1 = ""
+                + "public class NewClass {\n"
+                + "    private final String test1 = \"test\";\n"
+                + "    private final String test2 = \"test\";\n"
+                + "    private final String test3 = \"test\";\n";
+
+        String what2 = ""
+                + "\n"
+                + "}";
+        String what = what1 + what2;
+        GeneratorUtilsTest.writeIntoFile(javaFile, what);
+
+        JavaSource javaSource = JavaSource.forFileObject(javaFile);
+        assertNotNull("Created", javaSource);
+
+        Document doc = getDocuemnt(javaFile);
+
+        final JTextArea component = new JTextArea(doc);
+        component.setCaretPosition(what1.length());
+
+        class Task implements 
org.netbeans.api.java.source.Task<CompilationController> {
+
+            private ToStringGenerator generator;
+
+            @Override
+            public void run(CompilationController controller) throws Exception 
{
+                controller.toPhase(JavaSource.Phase.ELEMENTS_RESOLVED);
+                Element typeElement = 
controller.getElements().getTypeElement("NewClass");
+                generator = 
ToStringGenerator.createToStringGenerator(component, controller, typeElement, 
true);
+            }
+
+            public void post() throws Exception {
+                assertNotNull("Created", generator);
+
+                assertEquals("Three fields", 3, 
generator.getDescription().getSubs().size());
+                assertEquals("test1 field selected", true, 
generator.getDescription().getSubs().get(0).isSelected());
+                assertEquals("test2 field selected", true, 
generator.getDescription().getSubs().get(1).isSelected());
+                assertEquals("test3 field selected", true, 
generator.getDescription().getSubs().get(2).isSelected());
+                assertEquals("Use StringBuilder", true, 
generator.useStringBuilder());
+            }
+        }
+        final Task task = new Task();
+
+        javaSource.runUserActionTask(task, false);
+        task.post();
+
+        SwingUtilities.invokeAndWait(() -> task.generator.invoke());
+
+        Document document = component.getDocument();
+        String text = document.getText(0, document.getLength());
+        String expected = ""
+                + "public class NewClass {\n"
+                + "    private final String test1 = \"test\";\n"
+                + "    private final String test2 = \"test\";\n"
+                + "    private final String test3 = \"test\";\n"
+                + "\n"
+                + "    @Override\n"
+                + "    public String toString() {\n"
+                + "        StringBuilder sb = new StringBuilder();\n"
+                + "        sb.append(\"NewClass{test1=\").append(test1);\n"
+                + "        sb.append(\", test2=\").append(test2);\n"
+                + "        sb.append(\", test3=\").append(test3);\n"
+                + "        sb.append('}');\n"
+                + "        return sb.toString();\n"
+                + "    }\n"
+                + "\n"
+                + "}";
+        assertEquals(expected, text);
+    }
+
+    public void testToStringExists() throws Exception {
+        FileObject javaFile = FileUtil.createData(fo, "NewClass.java");
+        String what1 = ""
+                + "public class NewClass {\n"
+                + "    private final String test1 = \"test\";\n"
+                + "    private final String test2 = \"test\";\n"
+                + "    private final String test3 = \"test\";\n";
+
+        String what2 = ""
+                + "\n"
+                + "    @Override\n"
+                + "    public String toString() {\n"
+                + "        StringBuilder sb = new StringBuilder();\n"
+                + "        sb.append(\"NewClass{\");\n"
+                + "        sb.append(\"test1=\").append(test1);\n"
+                + "        sb.append(\", \");\n"
+                + "        sb.append(\"test2=\").append(test2);\n"
+                + "        sb.append(\", \");\n"
+                + "        sb.append(\"test3=\").append(test3);\n"
+                + "        sb.append('}');\n"
+                + "        return sb.toString();\n"
+                + "    }\n"
+                + "\n"
+                + "}";
+        String what = what1 + what2;
+        GeneratorUtilsTest.writeIntoFile(javaFile, what);
+
+        JavaSource javaSource = JavaSource.forFileObject(javaFile);
+        assertNotNull("Created", javaSource);
+
+        Document doc = getDocuemnt(javaFile);
+
+        final JTextArea component = new JTextArea(doc);
+        component.setCaretPosition(what1.length());
+
+        class Task implements 
org.netbeans.api.java.source.Task<CompilationController> {
+
+            private ToStringGenerator generator;
+
+            @Override
+            public void run(CompilationController controller) throws Exception 
{
+                controller.toPhase(JavaSource.Phase.ELEMENTS_RESOLVED);
+                Element typeElement = 
controller.getElements().getTypeElement("NewClass");
+                generator = 
ToStringGenerator.createToStringGenerator(component, controller, typeElement, 
true);
+            }
+
+            public void post() throws Exception {
+                assertNull("Not created", generator);
+            }
+        }
+        final Task task = new Task();
+
+        javaSource.runUserActionTask(task, false);
+        task.post();
+    }
+
+    public void testToStringCanNotUseStringBuilder() throws Exception {
+        sourceLevel = "1.4";
+        FileObject javaFile = FileUtil.createData(fo, "NewClass.java");
+        String what1 = ""
+                + "public class NewClass {\n"
+                + "    private final String test1 = \"test\";\n"
+                + "    private final String test2 = \"test\";\n"
+                + "    private final String test3 = \"test\";\n";
+
+        String what2 = ""
+                + "\n"
+                + "}";
+        String what = what1 + what2;
+        GeneratorUtilsTest.writeIntoFile(javaFile, what);
+
+        JavaSource javaSource = JavaSource.forFileObject(javaFile);
+        assertNotNull("Created", javaSource);
+
+        Document doc = getDocuemnt(javaFile);
+
+        final JTextArea component = new JTextArea(doc);
+        component.setCaretPosition(what1.length());
+
+        class Task implements 
org.netbeans.api.java.source.Task<CompilationController> {
+
+            private ToStringGenerator generator;
+
+            @Override
+            public void run(CompilationController controller) throws Exception 
{
+                controller.toPhase(JavaSource.Phase.ELEMENTS_RESOLVED);
+                Element typeElement = 
controller.getElements().getTypeElement("NewClass");
+                generator = 
ToStringGenerator.createToStringGenerator(component, controller, typeElement, 
true);
+            }
+
+            public void post() throws Exception {
+                assertNotNull("Created", generator);
+
+                assertEquals("Three fields", 3, 
generator.getDescription().getSubs().size());
+                assertEquals("test1 field selected", true, 
generator.getDescription().getSubs().get(0).isSelected());
+                assertEquals("test2 field selected", true, 
generator.getDescription().getSubs().get(1).isSelected());
+                assertEquals("test3 field selected", true, 
generator.getDescription().getSubs().get(2).isSelected());
+                assertEquals("Don't use StringBuilder", true, 
generator.useStringBuilder());
+            }
+        }
+        final Task task = new Task();
+
+        javaSource.runUserActionTask(task, false);
+        task.post();
+
+        SwingUtilities.invokeAndWait(() -> task.generator.invoke());
+
+        Document document = component.getDocument();
+        String text = document.getText(0, document.getLength());
+        String expected = ""
+                + "public class NewClass {\n"
+                + "    private final String test1 = \"test\";\n"
+                + "    private final String test2 = \"test\";\n"
+                + "    private final String test3 = \"test\";\n"
+                + "\n"
+                + "    public String toString() {\n"
+                + "        return \"NewClass{\" + \"test1=\" + test1 + \", 
test2=\" + test2 + \", test3=\" + test3 + '}';\n"
+                + "    }\n"
+                + "\n"
+                + "}";
+        assertEquals(expected, text);
+    }
+
+    private static Document getDocuemnt(FileObject fileObject) throws 
DataObjectNotFoundException, IOException {
+        DataObject dataObject = DataObject.find(fileObject);
+        EditorCookie ec = 
dataObject.getLookup().lookup(org.openide.cookies.EditorCookie.class);
+        return ec.openDocument();
+    }
+
+    private static final class DD extends DialogDisplayer {
+
+        @Override
+        public Object notify(NotifyDescriptor descriptor) {
+            throw new UnsupportedOperationException("Not supported yet.");
+        }
+
+        @Override
+        public Dialog createDialog(DialogDescriptor descriptor) {
+            descriptor.setValue(descriptor.getDefaultValue());
+
+            return new JDialog() {
+                @Override
+                public void setVisible(boolean b) {
+                }
+            };
+        }
+
+    }
+
+}


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@netbeans.apache.org
For additional commands, e-mail: commits-h...@netbeans.apache.org

For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists

Reply via email to