IDEA-196751 Capitalization inspection: support ternary and parentheses

This commit is contained in:
Tagir Valeev
2018-08-04 03:00:17 +07:00
parent 2690e66c61
commit 6050d5d693
4 changed files with 76 additions and 28 deletions

View File

@@ -8,22 +8,18 @@ import com.intellij.lang.properties.references.PropertyReference;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.ReadonlyStatusHandler;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.*;
import com.intellij.psi.util.InheritanceUtil;
import com.intellij.psi.util.PropertyUtilBase;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.util.IncorrectOperationException;
import com.siyeh.ig.psiutils.ExpressionUtils;
import org.jetbrains.annotations.Nls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.*;
import java.util.stream.Collectors;
/**
* @author yole
@@ -44,12 +40,20 @@ public class TitleCapitalizationInspection extends AbstractBaseJavaLocalInspecti
PsiType type = method.getReturnType();
if (!InheritanceUtil.isInheritor(type, CommonClassNames.JAVA_LANG_STRING)) return;
Collection<PsiReturnStatement> statements = PsiTreeUtil.findChildrenOfType(method, PsiReturnStatement.class);
Nls.Capitalization capitalization = null;
for (PsiReturnStatement returnStatement : statements) {
PsiExpression expression = returnStatement.getReturnValue();
String value = getTitleValue(expression, new HashSet<>());
if (value == null) continue;
Nls.Capitalization capitalization = getCapitalizationFromAnno(method);
checkCapitalization(expression, holder, capitalization);
if (expression == null) continue;
List<PsiExpression> children = ExpressionUtils.nonStructuralChildren(expression).collect(Collectors.toList());
for (PsiExpression e : children) {
if (capitalization == null) {
capitalization = getCapitalizationFromAnno(method);
if (capitalization == Nls.Capitalization.NotSpecified) return;
}
String titleValue = getTitleValue(e, new HashSet<>());
if (titleValue == null) continue;
checkCapitalization(e, titleValue, holder, capitalization);
}
}
}
@@ -64,7 +68,9 @@ public class TitleCapitalizationInspection extends AbstractBaseJavaLocalInspecti
for (int i = 0; i < Math.min(parameters.length, args.length); i++) {
PsiParameter parameter = parameters[i];
Nls.Capitalization capitalization = getCapitalizationFromAnno(parameter);
checkCapitalization(args[i], holder, capitalization);
if (capitalization == Nls.Capitalization.NotSpecified) continue;
ExpressionUtils.nonStructuralChildren(args[i])
.forEach(e -> checkCapitalization(e, getTitleValue(e, new HashSet<>()), holder, capitalization));
}
}
}
@@ -80,12 +86,13 @@ public class TitleCapitalizationInspection extends AbstractBaseJavaLocalInspecti
return cap instanceof Nls.Capitalization ? (Nls.Capitalization)cap : Nls.Capitalization.NotSpecified;
}
private static void checkCapitalization(PsiExpression element, @NotNull ProblemsHolder holder, Nls.Capitalization capitalization) {
if (capitalization == Nls.Capitalization.NotSpecified) return;
String titleValue = getTitleValue(element, new HashSet<>());
if (!checkCapitalization(titleValue, capitalization)) {
holder.registerProblem(element, "String '" + titleValue + "' is not properly capitalized. It should have " +
StringUtil.toLowerCase(capitalization.toString()) + " capitalization",
private static void checkCapitalization(PsiExpression e,
String titleValue,
@NotNull ProblemsHolder holder,
Nls.Capitalization capitalization) {
if (!isCapitalizationSatisfied(titleValue, capitalization)) {
holder.registerProblem(e, "String '" + titleValue + "' is not properly capitalized. It should have " +
StringUtil.toLowerCase(capitalization.toString()) + " capitalization",
ProblemHighlightType.GENERIC_ERROR_OR_WARNING, new TitleCapitalizationFix(titleValue, capitalization));
}
}
@@ -144,7 +151,7 @@ public class TitleCapitalizationInspection extends AbstractBaseJavaLocalInspecti
return null;
}
public static boolean checkCapitalization(String value, Nls.Capitalization capitalization) {
public static boolean isCapitalizationSatisfied(String value, Nls.Capitalization capitalization) {
if (StringUtil.isEmpty(value) || capitalization == Nls.Capitalization.NotSpecified) {
return true;
}

View File

@@ -0,0 +1,30 @@
import org.jetbrains.annotations.Nls;
import java.util.Map;
class TernaryAndParentheses {
@Nls(capitalization = Nls.Capitalization.Sentence)
public String getName1() {
return (<warning descr="String 'Hello World' is not properly capitalized. It should have sentence capitalization">"Hello World"</warning>);
}
@Nls(capitalization = Nls.Capitalization.Sentence)
public String getName2(boolean a, boolean b) {
return (a ? <warning descr="String 'Hello World' is not properly capitalized. It should have sentence capitalization">"Hello World"</warning> :
b ? (<warning descr="String 'Goodbye World' is not properly capitalized. It should have sentence capitalization">"Goodbye World"</warning>) :
"");
}
@Nls(capitalization = Nls.Capitalization.Sentence)
public String getOrDefaultTest(Map<String, String> map) {
return map.getOrDefault("key", <warning descr="String 'Hello World' is not properly capitalized. It should have sentence capitalization">"Hello World"</warning>);
}
public void foo(@Nls(capitalization = Nls.Capitalization.Sentence) String string) {
}
public void testConsume(boolean b) {
foo(b ? <warning descr="String 'Hello World' is not properly capitalized. It should have sentence capitalization">"Hello World"</warning> : "Hello world");
}
}

View File

@@ -20,7 +20,9 @@ import com.intellij.codeInspection.capitalization.AnnotateCapitalizationIntentio
import com.intellij.codeInspection.capitalization.TitleCapitalizationInspection;
import com.intellij.openapi.application.PluginPathManager;
import com.intellij.openapi.command.WriteCommandAction;
import com.intellij.testFramework.LightProjectDescriptor;
import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase;
import org.jetbrains.annotations.NotNull;
/**
* @author Dmitry Avdeev
@@ -35,6 +37,10 @@ public class CapitalizationInspectionTest extends LightCodeInsightFixtureTestCas
doTest(true);
}
public void testTernaryAndParentheses() {
myFixture.testHighlighting(getTestName(false) + ".java");
}
public void testMultipleReturns() {
doTest(true);
}
@@ -86,6 +92,11 @@ public class CapitalizationInspectionTest extends LightCodeInsightFixtureTestCas
myFixture.enableInspections(TitleCapitalizationInspection.class);
}
@NotNull
@Override
protected LightProjectDescriptor getProjectDescriptor() {
return JAVA_8;
}
@Override
protected String getBasePath() {

View File

@@ -22,14 +22,14 @@ import org.jetbrains.annotations.Nls;
public class CapitalizationTest extends TestCase {
public void testCapitalization() {
assertTrue(TitleCapitalizationInspection.checkCapitalization("Fix SQL issues", Nls.Capitalization.Sentence));
assertTrue(TitleCapitalizationInspection.checkCapitalization("Fix I18n issues", Nls.Capitalization.Sentence));
assertTrue(TitleCapitalizationInspection.checkCapitalization("Fix C issues", Nls.Capitalization.Sentence));
assertTrue(TitleCapitalizationInspection.checkCapitalization("@charset is invalid", Nls.Capitalization.Sentence));
assertTrue(TitleCapitalizationInspection.checkCapitalization("Add 'this' qualifier", Nls.Capitalization.Sentence));
assertTrue(TitleCapitalizationInspection.checkCapitalization("Add 'this' qualifier", Nls.Capitalization.Sentence));
assertTrue(TitleCapitalizationInspection.checkCapitalization("Please select the configuration file (usually named IntelliLang.xml) to import.", Nls.Capitalization.Sentence));
assertFalse(TitleCapitalizationInspection.checkCapitalization("Foo Bar", Nls.Capitalization.Sentence));
assertTrue(TitleCapitalizationInspection.checkCapitalization("Foo", Nls.Capitalization.Sentence));
assertTrue(TitleCapitalizationInspection.isCapitalizationSatisfied("Fix SQL issues", Nls.Capitalization.Sentence));
assertTrue(TitleCapitalizationInspection.isCapitalizationSatisfied("Fix I18n issues", Nls.Capitalization.Sentence));
assertTrue(TitleCapitalizationInspection.isCapitalizationSatisfied("Fix C issues", Nls.Capitalization.Sentence));
assertTrue(TitleCapitalizationInspection.isCapitalizationSatisfied("@charset is invalid", Nls.Capitalization.Sentence));
assertTrue(TitleCapitalizationInspection.isCapitalizationSatisfied("Add 'this' qualifier", Nls.Capitalization.Sentence));
assertTrue(TitleCapitalizationInspection.isCapitalizationSatisfied("Add 'this' qualifier", Nls.Capitalization.Sentence));
assertTrue(TitleCapitalizationInspection.isCapitalizationSatisfied("Please select the configuration file (usually named IntelliLang.xml) to import.", Nls.Capitalization.Sentence));
assertFalse(TitleCapitalizationInspection.isCapitalizationSatisfied("Foo Bar", Nls.Capitalization.Sentence));
assertTrue(TitleCapitalizationInspection.isCapitalizationSatisfied("Foo", Nls.Capitalization.Sentence));
}
}