@@ -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