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