Folding: add replacing with inferred type for var as folding: IDEA-194935

This commit is contained in:
Roman.Ivanov
2018-07-26 14:49:59 +07:00
parent 16e9fb30d3
commit c945d4721f
6 changed files with 63 additions and 1 deletions
@@ -39,6 +39,8 @@ public class JavaCodeFoldingOptionsProvider extends BeanConfigurable<JavaCodeFol
checkBox(ApplicationBundle.message("checkbox.collapse.generic.constructor.parameters"), settings::isCollapseConstructorGenericParameters, settings::setCollapseConstructorGenericParameters);
checkBox(ApplicationBundle.message("checkbox.collapse.inferred.type"), settings::isReplaceVarWithInferredType, settings::setReplaceVarWithInferredType);
checkBox(ApplicationBundle.message("checkbox.collapse.i18n.messages"), settings::isCollapseI18nMessages, settings::setCollapseI18nMessages);
checkBox(ApplicationBundle.message("checkbox.collapse.suppress.warnings"), settings::isCollapseSuppressWarnings, settings::setCollapseSuppressWarnings);
@@ -65,4 +65,7 @@ public abstract class JavaCodeFoldingSettings {
public abstract boolean isCollapseEndOfLineComments();
public abstract void setCollapseEndOfLineComments(boolean value);
public abstract boolean isReplaceVarWithInferredType();
public abstract void setReplaceVarWithInferredType(boolean value);
}
@@ -29,6 +29,7 @@ public class JavaCodeFoldingSettingsBase extends JavaCodeFoldingSettings {
private boolean COLLAPSE_I18N_MESSAGES = true;
private boolean COLLAPSE_SUPPRESS_WARNINGS = true;
private boolean COLLAPSE_END_OF_LINE_COMMENTS;
private boolean REPLACE_VAR_WITH_INFERRED_TYPE = false;
@Override
public boolean isCollapseImports() {
@@ -168,4 +169,14 @@ public class JavaCodeFoldingSettingsBase extends JavaCodeFoldingSettings {
public void setCollapseEndOfLineComments(boolean value) {
COLLAPSE_END_OF_LINE_COMMENTS = value;
}
@Override
public boolean isReplaceVarWithInferredType() {
return REPLACE_VAR_WITH_INFERRED_TYPE;
}
@Override
public void setReplaceVarWithInferredType(boolean value) {
REPLACE_VAR_WITH_INFERRED_TYPE = value;
}
}
@@ -269,6 +269,17 @@ public abstract class JavaFoldingBuilderBase extends CustomFoldingBuilder implem
addTypeParametersFolding(list, document, parameterList, 3, quick);
}
private static void addLocalVariableTypeFolding(@NotNull List<? super FoldingDescriptor> list,
@NotNull PsiVariable expression,
boolean quick) {
if (quick) return; // presentable text may require resolve
PsiTypeElement typeElement = expression.getTypeElement();
if (typeElement == null) return;
if (!typeElement.isInferredType()) return;
String presentableText = expression.getType().getPresentableText();
list.add(new NamedFoldingDescriptor(typeElement.getNode(), typeElement.getTextRange(), null, presentableText, true, Collections.emptySet()));
}
private static boolean resolvesCorrectly(@NotNull PsiReferenceExpression expression) {
for (final JavaResolveResult result : expression.multiResolve(true)) {
if (!result.isValidResult()) {
@@ -550,7 +561,7 @@ public abstract class JavaFoldingBuilderBase extends CustomFoldingBuilder implem
}
PsiCodeBlock body = method.getBody();
if (body != null && !oneLiner) {
if (body != null) {
addCodeBlockFolds(list, body, processedComments, document, quick);
}
}
@@ -678,6 +689,15 @@ public abstract class JavaFoldingBuilderBase extends CustomFoldingBuilder implem
}
}
@Override
public void visitLocalVariable(PsiLocalVariable variable) {
if (!dumb && JavaCodeFoldingSettings.getInstance().isReplaceVarWithInferredType()) {
addLocalVariableTypeFolding(list, variable, quick);
}
super.visitLocalVariable(variable);
}
@Override
public void visitMethodCallExpression(PsiMethodCallExpression expression) {
if (!dumb) {
@@ -0,0 +1,25 @@
// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package com.intellij.java.codeInsight.folding
import com.intellij.testFramework.LightProjectDescriptor
import org.assertj.core.api.Assertions.assertThat
class JavaFolding10Test : JavaFoldingTestCase() {
override fun getProjectDescriptor(): LightProjectDescriptor = JAVA_10
fun testLocalVariable() {
val text = """
class A {
void test() {
var x = "FOO";
}
}""".trimIndent()
configure(text)
val regions = myFixture.editor.foldingModel.allFoldRegions
assertThat(regions).hasSize(3)
val region = regions[1]
assertThat(region.placeholderText).isEqualTo("String")
}
}
@@ -398,6 +398,7 @@ checkbox.collapse.data.uri=Data URIs
checkbox.collapse.anonymous.classes=<html>Anonymous classes</html>
checkbox.collapse.closures=<html>"Closures" (anonymous classes implementing one method, before Java 8)</html>
checkbox.collapse.generic.constructor.parameters=<html>Generic constructor and method parameters</html>
checkbox.collapse.inferred.type=<html>Replace 'var' with inferred type</html>
checkbox.collapse.i18n.messages=<html>I18n strings</html>
checkbox.collapse.annotations=<html>Annotations</html>
checkbox.collapse.inner.classes=Inner classes