fix(lsp/java): remove hardcoded 4-space indentation in generated code

This commit is contained in:
Akash Yadav
2023-03-27 22:46:17 +05:30
parent 9993793507
commit 7f69dc57a7
7 changed files with 55 additions and 48 deletions
@@ -34,6 +34,7 @@ import com.itsaky.androidide.lsp.java.compiler.CompileTask
import com.itsaky.androidide.lsp.java.utils.EditHelper
import com.itsaky.androidide.lsp.java.utils.JavaParserUtils
import com.itsaky.androidide.lsp.java.utils.TypeUtils.toType
import com.itsaky.androidide.preferences.internal.tabSize
import com.itsaky.androidide.projects.ProjectManager
import com.itsaky.androidide.resources.R
import com.itsaky.androidide.utils.ILogger
@@ -117,7 +118,7 @@ class GenerateSettersAndGettersAction : FieldBasedAction() {
}
val leaf = path.leaf
val indent = EditHelper.indent(task.task, task.root(file), leaf) + 4
val indent = EditHelper.indent(task.task, task.root(file), leaf) + tabSize
sb.append(createGetter(element, indent))
if (!element.modifiers.contains(FINAL)) {
sb.append(createSetter(element, indent))
@@ -29,6 +29,7 @@ import com.itsaky.androidide.lsp.java.JavaCompilerProvider
import com.itsaky.androidide.lsp.java.actions.FieldBasedAction
import com.itsaky.androidide.lsp.java.compiler.CompileTask
import com.itsaky.androidide.lsp.java.utils.EditHelper
import com.itsaky.androidide.preferences.internal.tabSize
import com.itsaky.androidide.projects.ProjectManager
import com.itsaky.androidide.resources.R
import com.itsaky.androidide.resources.R.string
@@ -113,7 +114,7 @@ class GenerateToStringMethodAction : FieldBasedAction() {
val file = data.requirePath()
val editor = data[CodeEditor::class.java]!!
val trees = JavacTrees.instance(task.task)
val indent = EditHelper.indent(task.task, task.root(), type) + 4
val indent = EditHelper.indent(task.task, task.root(), type) + tabSize
val insert = EditHelper.insertAtEndOfClass(task.task, task.root(file), type)
val string = StringBuilder()
var isFirst = true
@@ -35,12 +35,11 @@ import com.itsaky.androidide.lsp.java.utils.FindHelper
import com.itsaky.androidide.lsp.java.utils.JavaParserUtils
import com.itsaky.androidide.lsp.java.utils.MethodPtr
import com.itsaky.androidide.lsp.java.visitors.FindTypeDeclarationAt
import com.itsaky.androidide.preferences.internal.tabSize
import com.itsaky.androidide.projects.ProjectManager
import com.itsaky.androidide.resources.R
import com.itsaky.androidide.utils.ILogger
import com.itsaky.androidide.utils.flashError
import openjdk.source.tree.MethodTree
import openjdk.source.util.Trees
import io.github.rosemoe.sora.widget.CodeEditor
import java.util.Arrays
import java.util.Optional
@@ -52,6 +51,8 @@ import jdkx.lang.model.element.TypeElement
import jdkx.lang.model.type.DeclaredType
import jdkx.lang.model.type.ExecutableType
import jdkx.tools.JavaFileObject
import openjdk.source.tree.MethodTree
import openjdk.source.util.Trees
/**
* Allows the user to override multiple methods from superclass at once.
@@ -190,7 +191,6 @@ class OverrideSuperclassMethodsAction : BaseJavaCodeAction() {
builder.show()
}
@Suppress("Since15")
private fun overrideMethods(data: ActionData, checkedMethods: MutableList<MethodPtr>) {
val compiler =
JavaCompilerProvider.get(ProjectManager.findModuleForFile(data.requireFile()) ?: return)
@@ -205,7 +205,7 @@ class OverrideSuperclassMethodsAction : BaseJavaCodeAction() {
val typeFinder = FindTypeDeclarationAt(task.task)
val classTree = typeFinder.scan(task.root(), position)
val thisClass = trees.getElement(typeFinder.path) as TypeElement
val indent = EditHelper.indent(task.task, task.root(), classTree) + 4
val indent = EditHelper.indent(task.task, task.root(), classTree) + tabSize
val fileImports = task.root(file).imports.map { it.qualifiedIdentifier.toString() }.toSet()
val filePackage = task.root(file).`package`.packageName.toString()
@@ -19,6 +19,7 @@ package com.itsaky.androidide.lsp.java.rewrite;
import androidx.annotation.NonNull;
import com.itsaky.androidide.preferences.internal.EditorPreferencesKt;
import com.itsaky.androidide.utils.ILogger;
import com.itsaky.androidide.lsp.java.compiler.CompileTask;
import com.itsaky.androidide.lsp.java.compiler.CompilerProvider;
@@ -87,7 +88,7 @@ public class GenerateRecordConstructor extends Rewrite {
.append(initializers)
.append("\n}");
String string = buf.toString();
int indent = EditHelper.indent(task.task, task.root(), typeTree) + 4;
int indent = EditHelper.indent(task.task, task.root(), typeTree) + EditorPreferencesKt.getTabSize();
string = string.replaceAll("\n", "\n" + EditHelper.repeatSpaces(indent));
string = string + "\n\n";
Position insert = insertPoint(task, typeTree);
@@ -19,6 +19,7 @@ package com.itsaky.androidide.lsp.java.rewrite;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.itsaky.androidide.preferences.internal.EditorPreferencesKt;
import com.itsaky.androidide.utils.ILogger;
import com.itsaky.androidide.lsp.java.compiler.CompileTask;
import com.itsaky.androidide.lsp.java.compiler.CompilerProvider;
@@ -104,7 +105,7 @@ public class ImplementAbstractMethods extends Rewrite {
}
final Set<String> imports = new TreeSet<>();
int indent = EditHelper.indent(task.task, task.root(), thisTree) + 4;
int indent = EditHelper.indent(task.task, task.root(), thisTree) + EditorPreferencesKt.getTabSize();
for (Element member : elements.getAllMembers(thisClass)) {
if (member.getKind() == ElementKind.METHOD
&& member.getModifiers().contains(Modifier.ABSTRACT)) {
@@ -18,14 +18,28 @@
package com.itsaky.androidide.lsp.java.utils;
import androidx.annotation.NonNull;
import com.itsaky.androidide.lsp.java.compiler.CompilerProvider;
import com.itsaky.androidide.lsp.java.rewrite.AddImport;
import com.itsaky.androidide.lsp.models.TextEdit;
import com.itsaky.androidide.models.Position;
import com.itsaky.androidide.models.Range;
import com.itsaky.androidide.lsp.models.TextEdit;
import com.itsaky.androidide.projects.FileManager;
import com.itsaky.androidide.preferences.internal.EditorPreferencesKt;
import com.itsaky.androidide.projects.util.StringSearch;
import java.nio.file.Path;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.StringJoiner;
import jdkx.lang.model.element.ExecutableElement;
import jdkx.lang.model.element.Modifier;
import jdkx.lang.model.element.Name;
import jdkx.lang.model.element.TypeElement;
import jdkx.lang.model.type.ArrayType;
import jdkx.lang.model.type.DeclaredType;
import jdkx.lang.model.type.ExecutableType;
import jdkx.lang.model.type.TypeMirror;
import openjdk.source.tree.ClassTree;
import openjdk.source.tree.CompilationUnitTree;
import openjdk.source.tree.LineMap;
@@ -35,33 +49,15 @@ import openjdk.source.util.JavacTask;
import openjdk.source.util.SourcePositions;
import openjdk.source.util.Trees;
import java.nio.file.Path;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.StringJoiner;
import jdkx.lang.model.element.ExecutableElement;
import jdkx.lang.model.element.Modifier;
import jdkx.lang.model.element.Name;
import jdkx.lang.model.element.TypeElement;
import jdkx.lang.model.type.ArrayType;
import jdkx.lang.model.type.DeclaredType;
import jdkx.lang.model.type.ExecutableType;
import jdkx.lang.model.type.TypeMirror;
public class EditHelper {
public static List<TextEdit> addImportIfNeeded(
CompilerProvider compiler, Path file, Set<String> imports, String className) {
public static List<TextEdit> addImportIfNeeded(CompilerProvider compiler, Path file,
Set<String> imports, String className
) {
final String pkgName = Extractors.packageName(className);
final String star = pkgName + ".*";
if ("java.lang".equals(pkgName)
|| imports.contains(className)
|| imports.contains(star)
|| file == null) {
if ("java.lang".equals(pkgName) || imports.contains(className) || imports.contains(star) ||
file == null) {
return Collections.emptyList();
}
@@ -74,8 +70,9 @@ public class EditHelper {
return Arrays.asList(Objects.requireNonNull(addImport.rewrite(compiler).get(file)));
}
public static TextEdit removeTree(
final JavacTask task, final CompilationUnitTree root, final Tree remove) {
public static TextEdit removeTree(final JavacTask task, final CompilationUnitTree root,
final Tree remove
) {
SourcePositions pos = Trees.instance(task).getSourcePositions();
LineMap lines = root.getLineMap();
long start = pos.getStartPosition(root, remove);
@@ -90,8 +87,9 @@ public class EditHelper {
return new TextEdit(range, "");
}
public static String printMethod(
final ExecutableElement method, final ExecutableType parameterizedType, MethodTree source) {
public static String printMethod(final ExecutableElement method,
final ExecutableType parameterizedType, MethodTree source
) {
final StringBuilder buf = new StringBuilder();
// TODO leading \n is extra, but needed for indent replaceAll trick
buf.append("\n@Override\n");
@@ -136,8 +134,9 @@ public class EditHelper {
return indent(root, leaf, pos);
}
private static int indent(
@NonNull CompilationUnitTree root, Tree leaf, @NonNull SourcePositions pos) {
private static int indent(@NonNull CompilationUnitTree root, Tree leaf,
@NonNull SourcePositions pos
) {
LineMap lines = root.getLineMap();
long startClass = pos.getStartPosition(root, leaf);
long startLine = lines.getStartPosition(lines.getLineNumber(startClass));
@@ -154,11 +153,12 @@ public class EditHelper {
indent--;
}
}
return indent * 4;
return indent * EditorPreferencesKt.getTabSize();
}
public static Position insertBefore(
final JavacTask task, final CompilationUnitTree root, final Tree member) {
public static Position insertBefore(final JavacTask task, final CompilationUnitTree root,
final Tree member
) {
SourcePositions pos = Trees.instance(task).getSourcePositions();
LineMap lines = root.getLineMap();
long start = pos.getStartPosition(root, member);
@@ -166,8 +166,9 @@ public class EditHelper {
return new Position(line - 1, 0);
}
public static Position insertAfter(
final JavacTask task, final CompilationUnitTree root, final Tree member) {
public static Position insertAfter(final JavacTask task, final CompilationUnitTree root,
final Tree member
) {
SourcePositions pos = Trees.instance(task).getSourcePositions();
LineMap lines = root.getLineMap();
long end = pos.getEndPosition(root, member);
@@ -175,8 +176,9 @@ public class EditHelper {
return new Position(line, 0);
}
public static Position insertAtEndOfClass(
JavacTask task, CompilationUnitTree root, ClassTree leaf) {
public static Position insertAtEndOfClass(JavacTask task, CompilationUnitTree root,
ClassTree leaf
) {
SourcePositions pos = Trees.instance(task).getSourcePositions();
LineMap lines = root.getLineMap();
long end = pos.getEndPosition(root, leaf);
@@ -17,6 +17,7 @@
package com.itsaky.androidide.lsp.java.utils
import com.itsaky.androidide.preferences.internal.tabSize
import com.squareup.javapoet.AnnotationSpec
import com.squareup.javapoet.ImportCollectingCodeWriter
import com.squareup.javapoet.MethodSpec
@@ -38,7 +39,7 @@ class JavaPoetUtils {
qualifiedNames: Boolean = true,
): String {
val sb = StringBuilder()
val writer = ImportCollectingCodeWriter(sb)
val writer = ImportCollectingCodeWriter(sb, " ".repeat(tabSize), emptySet(), emptySet())
writer.isPrintQualifiedNames = qualifiedNames
writer.emit(method)