Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Show toString()/hashCode() and equals() fields in definition order #2212

Merged
merged 2 commits into from
Sep 15, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -14,14 +14,17 @@
package org.eclipse.jdt.ls.core.internal.handlers;

import java.util.Arrays;
import java.util.Comparator;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.core.dom.IMethodBinding;
import org.eclipse.jdt.core.dom.ITypeBinding;
import org.eclipse.jdt.core.dom.IVariableBinding;
import org.eclipse.jdt.core.dom.Modifier;
import org.eclipse.jdt.ls.core.internal.JDTUtils;

public class JdtDomModels {

Expand Down Expand Up @@ -63,10 +66,21 @@ public LspMethodBinding(IMethodBinding binding) {

public static IVariableBinding[] convertToVariableBindings(ITypeBinding typeBinding, LspVariableBinding[] fields) {
Set<String> bindingKeys = Stream.of(fields).map((field) -> field.bindingKey).collect(Collectors.toSet());
return Arrays.stream(typeBinding.getDeclaredFields()).filter(f -> bindingKeys.contains(f.getKey())).toArray(IVariableBinding[]::new);
return Arrays.stream(typeBinding.getDeclaredFields()).sorted(new VariableBindingComparator()).filter(f -> bindingKeys.contains(f.getKey())).toArray(IVariableBinding[]::new);
}

public static LspVariableBinding[] getDeclaredFields(ITypeBinding typeBinding, boolean includeStatic) {
return Arrays.stream(typeBinding.getDeclaredFields()).filter(f -> includeStatic || !Modifier.isStatic(f.getModifiers())).map(f -> new LspVariableBinding(f)).toArray(LspVariableBinding[]::new);
return Arrays.stream(typeBinding.getDeclaredFields()).sorted(new VariableBindingComparator()).filter(f -> includeStatic || !Modifier.isStatic(f.getModifiers())).map(f -> new LspVariableBinding(f)).toArray(LspVariableBinding[]::new);
}

public static class VariableBindingComparator implements Comparator<IVariableBinding> {
@Override
public int compare(IVariableBinding a, IVariableBinding b) {
try {
return JDTUtils.getNameRange(a.getJavaElement()).getOffset() - JDTUtils.getNameRange(b.getJavaElement()).getOffset();
} catch (JavaModelException e) {
return 0;
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,60 @@ public void testGenerateToString() throws ValidateEditException, CoreException,
" String[] arrays;\r\n" +
" @Override\r\n" +
" public String toString() {\r\n" +
" return \"B [aList=\" + aList + \", arrays=\" + (arrays != null ? Arrays.asList(arrays) : null) + \", id=\" + id + \", name=\" + name + \"]\";\r\n" +
" return \"B [name=\" + name + \", id=\" + id + \", aList=\" + aList + \", arrays=\" + (arrays != null ? Arrays.asList(arrays) : null) + \"]\";\r\n" +
" }\r\n" +
"}";
/* @formatter:on */

compareSource(expected, unit.getSource());
}

@Test
public void testGenerateToStringOrder() throws ValidateEditException, CoreException, IOException {
//@formatter:off
ICompilationUnit unit = fPackageP.createCompilationUnit("B.java", "package p;\r\n" +
"\r\n" +
"public class B {\r\n" +
" public String stringField;\r\n" +
" public int intField;\r\n" +
" public static int staticIntField;\r\n" +
" public boolean booleanField;\r\n" +
"}"
, true, null);
//@formatter:on
CodeActionParams params = CodeActionUtil.constructCodeActionParams(unit, "String stringField");
CheckToStringResponse response = GenerateToStringHandler.checkToStringStatus(params);
assertEquals("B", response.type);
assertNotNull(response.fields);
assertEquals(3, response.fields.length);
assertFalse(response.exists);
assertEquals("stringField", response.fields[0].name);
assertEquals("intField", response.fields[1].name);
assertEquals("booleanField", response.fields[2].name);

ToStringGenerationSettingsCore settings = new ToStringGenerationSettingsCore();
settings.overrideAnnotation = true;
settings.createComments = false;
settings.useBlocks = false;
settings.stringFormatTemplate = GenerateToStringHandler.DEFAULT_TEMPLATE;
settings.toStringStyle = GenerateToStringOperation.STRING_CONCATENATION;
settings.skipNulls = false;
settings.customArrayToString = true;
settings.limitElements = false;
settings.customBuilderSettings = new CustomBuilderSettings();
generateToString(unit.findPrimaryType(), settings);

/* @formatter:off */
String expected = "package p;\r\n" +
"\r\n" +
"public class B {\r\n" +
" public String stringField;\r\n" +
" public int intField;\r\n" +
" public static int staticIntField;\r\n" +
" public boolean booleanField;\r\n" +
" @Override\r\n" +
" public String toString() {\r\n" +
" return \"B [stringField=\" + stringField + \", intField=\" + intField + \", booleanField=\" + booleanField + \"]\";\r\n" +
" }\r\n" +
"}";
/* @formatter:on */
Expand Down Expand Up @@ -184,15 +237,15 @@ public void testGenerateToString_customizedSettings() throws ValidateEditExcepti
" final int maxLen = 10;\r\n" +
" StringBuilder builder = new StringBuilder();\r\n" +
" builder.append(\"B [\");\r\n" +
" if (name != null) {\r\n" +
" builder.append(\"name=\").append(name).append(\", \");\r\n" +
" }\r\n" +
" builder.append(\"id=\").append(id).append(\", \");\r\n" +
" if (aList != null) {\r\n" +
" builder.append(\"aList=\").append(aList.subList(0, Math.min(aList.size(), maxLen))).append(\", \");\r\n" +
" }\r\n" +
" if (arrays != null) {\r\n" +
" builder.append(\"arrays=\").append(arrays).append(\", \");\r\n" +
" }\r\n" +
" builder.append(\"id=\").append(id).append(\", \");\r\n" +
" if (name != null) {\r\n" +
" builder.append(\"name=\").append(name);\r\n" +
" builder.append(\"arrays=\").append(arrays);\r\n" +
" }\r\n" +
" builder.append(\"]\");\r\n" +
" return builder.toString();\r\n" +
Expand Down Expand Up @@ -248,7 +301,7 @@ public void testGenerateToStringAfterCursorPosition() throws ValidateEditExcepti
" List<String> aList;/*|*/\r\n" +
" @Override\r\n" +
" public String toString() {\r\n" +
" return \"B [aList=\" + aList + \", arrays=\" + (arrays != null ? Arrays.asList(arrays) : null) + \", id=\" + id + \", name=\" + name + \"]\";\r\n" +
" return \"B [name=\" + name + \", id=\" + id + \", aList=\" + aList + \", arrays=\" + (arrays != null ? Arrays.asList(arrays) : null) + \"]\";\r\n" +
" }\r\n" +
" String[] arrays;\r\n" +
"}";
Expand Down Expand Up @@ -304,7 +357,7 @@ public void testGenerateToStringBeforeCursorPosition() throws ValidateEditExcept
" int id;\r\n" +
" @Override\r\n" +
" public String toString() {\r\n" +
" return \"B [aList=\" + aList + \", arrays=\" + (arrays != null ? Arrays.asList(arrays) : null) + \", id=\" + id + \", name=\" + name + \"]\";\r\n" +
" return \"B [name=\" + name + \", id=\" + id + \", aList=\" + aList + \", arrays=\" + (arrays != null ? Arrays.asList(arrays) : null) + \"]\";\r\n" +
" }\r\n" +
" List<String> aList;/*|*/\r\n" +
" String[] arrays;\r\n" +
Expand Down
Loading