Skip to content

Commit aab69ff

Browse files
committed
Fixing bug in GenericsHighlightUtil which caused error while parsing code like "Map<String, String> map = new LinkedHashMap<>();" due to incorrect refactoring of GenericsHighlightUtil.checkReferenceTypeArgumentList().
1 parent 112edec commit aab69ff

File tree

1 file changed

+46
-57
lines changed

1 file changed

+46
-57
lines changed

java-analysis-impl/src/main/java/com/intellij/java/analysis/impl/codeInsight/daemon/impl/analysis/GenericsHighlightUtil.java

Lines changed: 46 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -155,18 +155,56 @@ && detectExpectedType(referenceParameterList) instanceof PsiClassType expectedCl
155155
}
156156
}
157157

158-
if (registerIntentions) {
159-
HighlightInfo.Builder wrongParamNumberHighlightInfo =
160-
checkForWrongNumberOfTypeParameters(typeParameterListOwner, referenceParameterList, javaSdkVersion);
161-
if (wrongParamNumberHighlightInfo != null) {
162-
return wrongParamNumberHighlightInfo;
158+
PsiTypeParameter[] typeParameters = typeParameterListOwner.getTypeParameters();
159+
int targetParametersNum = typeParameters.length;
160+
int refParametersNum = referenceParameterList == null ? 0 : referenceParameterList.getTypeArguments().length;
161+
if (targetParametersNum != refParametersNum && refParametersNum != 0) {
162+
LocalizeValue description;
163+
if (targetParametersNum == 0) {
164+
if (PsiTreeUtil.getParentOfType(referenceParameterList, PsiCall.class) != null
165+
&& typeParameterListOwner instanceof PsiMethod method
166+
&& (javaSdkVersion.isAtLeast(JavaSdkVersion.JDK_1_7) || hasSuperMethodsWithTypeParams(method))) {
167+
description = LocalizeValue.empty();
168+
}
169+
else {
170+
description = JavaErrorLocalize.genericsTypeOrMethodDoesNotHaveTypeParameters(
171+
typeParameterListOwnerCategoryDescription(typeParameterListOwner),
172+
typeParameterListOwnerDescription(typeParameterListOwner)
173+
);
174+
}
175+
}
176+
else {
177+
description = JavaErrorLocalize.genericsWrongNumberOfTypeArguments(refParametersNum, targetParametersNum);
178+
}
179+
180+
if (description != LocalizeValue.empty()) {
181+
HighlightInfo.Builder hlBuilder = HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR)
182+
.range(referenceParameterList)
183+
.descriptionAndTooltip(description);
184+
if (registerIntentions) {
185+
QuickFixFactory factory = QuickFixFactory.getInstance();
186+
if (typeParameterListOwner instanceof PsiClass psiClass) {
187+
hlBuilder.registerFix(factory.createChangeClassSignatureFromUsageFix(psiClass, referenceParameterList));
188+
}
189+
190+
if (referenceParameterList.getParent().getParent() instanceof PsiTypeElement typeElement
191+
&& typeElement.getParent() instanceof PsiVariable variable) {
192+
if (targetParametersNum == 0) {
193+
hlBuilder.registerFix(factory.createRemoveTypeArgumentsFix(variable));
194+
}
195+
registerVariableParameterizedTypeFixes(
196+
hlBuilder,
197+
variable,
198+
referenceParameterList,
199+
javaSdkVersion
200+
);
201+
}
202+
}
203+
return hlBuilder;
163204
}
164205
}
165206

166207
// bounds check
167-
PsiTypeParameter[] typeParameters = typeParameterListOwner.getTypeParameters();
168-
int targetParametersNum = typeParameters.length;
169-
int refParametersNum = referenceParameterList == null ? 0 : referenceParameterList.getTypeArguments().length;
170208
if (targetParametersNum > 0 && refParametersNum != 0) {
171209
if (inferenceResult != null) {
172210
PsiType[] types = inferenceResult.getTypes();
@@ -204,55 +242,6 @@ && detectExpectedType(referenceParameterList) instanceof PsiClassType expectedCl
204242
return null;
205243
}
206244

207-
@Nullable
208-
@RequiredReadAction
209-
private static HighlightInfo.Builder checkForWrongNumberOfTypeParameters(
210-
PsiTypeParameterListOwner typeParameterListOwner,
211-
PsiReferenceParameterList referenceParameterList,
212-
@Nonnull JavaSdkVersion javaSdkVersion
213-
) {
214-
PsiTypeParameter[] typeParameters = typeParameterListOwner.getTypeParameters();
215-
int targetParametersNum = typeParameters.length;
216-
int refParametersNum = referenceParameterList == null ? 0 : referenceParameterList.getTypeArguments().length;
217-
if (targetParametersNum == refParametersNum || refParametersNum == 0) {
218-
return null;
219-
}
220-
221-
LocalizeValue description;
222-
if (targetParametersNum == 0) {
223-
if (PsiTreeUtil.getParentOfType(referenceParameterList, PsiCall.class) != null
224-
&& typeParameterListOwner instanceof PsiMethod method
225-
&& (javaSdkVersion.isAtLeast(JavaSdkVersion.JDK_1_7) || hasSuperMethodsWithTypeParams(method))) {
226-
return null;
227-
}
228-
else {
229-
description = JavaErrorLocalize.genericsTypeOrMethodDoesNotHaveTypeParameters(
230-
typeParameterListOwnerCategoryDescription(typeParameterListOwner),
231-
typeParameterListOwnerDescription(typeParameterListOwner)
232-
);
233-
}
234-
}
235-
else {
236-
description = JavaErrorLocalize.genericsWrongNumberOfTypeArguments(refParametersNum, targetParametersNum);
237-
}
238-
239-
HighlightInfo.Builder hlBuilder = HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR)
240-
.range(referenceParameterList)
241-
.descriptionAndTooltip(description);
242-
if (typeParameterListOwner instanceof PsiClass psiClass) {
243-
hlBuilder.registerFix(QuickFixFactory.getInstance().createChangeClassSignatureFromUsageFix(psiClass, referenceParameterList));
244-
}
245-
246-
if (referenceParameterList.getParent().getParent() instanceof PsiTypeElement typeElem
247-
&& typeElem.getParent() instanceof PsiVariable variable) {
248-
if (targetParametersNum == 0) {
249-
hlBuilder.registerFix(QuickFixFactory.getInstance().createRemoveTypeArgumentsFix(variable));
250-
}
251-
registerVariableParameterizedTypeFixes(hlBuilder, variable, referenceParameterList, javaSdkVersion);
252-
}
253-
return hlBuilder;
254-
}
255-
256245
private static boolean hasSuperMethodsWithTypeParams(PsiMethod method) {
257246
for (PsiMethod superMethod : method.findDeepestSuperMethods()) {
258247
if (superMethod.hasTypeParameters()) {

0 commit comments

Comments
 (0)