Author: akazakov
Date: 2010-09-07 11:24:48 -0400 (Tue, 07 Sep 2010)
New Revision: 24770
Modified:
trunk/cdi/plugins/org.jboss.tools.cdi.core/src/org/jboss/tools/cdi/internal/core/validation/CDICoreValidator.java
trunk/cdi/tests/org.jboss.tools.cdi.core.test/resources/tck/tests/jbt/validation/producers/ParameterizedTypeWithWrongScope_Broken.java
trunk/cdi/tests/org.jboss.tools.cdi.core.test/src/org/jboss/tools/cdi/core/test/tck/validation/DefenitionErrorsValidationTest.java
Log:
https://jira.jboss.org/browse/JBIDE-7013 Non dependent producer method with parameterized
return type with actual types is valid - Fixed
Modified:
trunk/cdi/plugins/org.jboss.tools.cdi.core/src/org/jboss/tools/cdi/internal/core/validation/CDICoreValidator.java
===================================================================
---
trunk/cdi/plugins/org.jboss.tools.cdi.core/src/org/jboss/tools/cdi/internal/core/validation/CDICoreValidator.java 2010-09-07
15:12:57 UTC (rev 24769)
+++
trunk/cdi/plugins/org.jboss.tools.cdi.core/src/org/jboss/tools/cdi/internal/core/validation/CDICoreValidator.java 2010-09-07
15:24:48 UTC (rev 24770)
@@ -880,6 +880,7 @@
private void validateProducer(IProducer producer) {
try {
Set<ITypeDeclaration> typeDeclarations = producer.getAllTypeDeclarations();
+ String[] typeVariables = producer.getBeanClass().getTypeParameterSignatures();
ITypeDeclaration typeDeclaration = null;
if (!typeDeclarations.isEmpty()) {
/*
@@ -894,6 +895,7 @@
*/
typeDeclaration = typeDeclarations.iterator().next();
String[] paramTypes = Signature.getTypeArguments(typeDeclaration.getSignature());
+ boolean variable = false;
for (String paramType : paramTypes) {
if (Signature.getTypeSignatureKind(paramType) == Signature.WILDCARD_TYPE_SIGNATURE)
{
if (producer instanceof IProducerField) {
@@ -903,25 +905,25 @@
addError(CDIValidationMessages.PRODUCER_METHOD_RETURN_TYPE_HAS_WILDCARD,
CDIPreferences.PRODUCER_METHOD_RETURN_TYPE_HAS_WILDCARD,
typeDeclaration, producer.getResource());
}
+ } else if(!variable && isTypeVariable(producer,
Signature.toString(paramType), typeVariables)) {
+ /*
+ * 3.3. Producer methods
+ * - producer method with a parameterized return type with a type variable
declares any scope other than @Dependent
+ *
+ * 3.4. Producer fields
+ * - producer field with a parameterized type with a type variable declares any
scope other than @Dependent
+ */
+ variable = true;
+ IAnnotationDeclaration scopeOrStereotypeDeclaration =
CDIUtil.getDifferentScopeDeclarationThanDepentend(producer);
+ if (scopeOrStereotypeDeclaration != null) {
+ boolean field = producer instanceof IProducerField;
+ addError(field ? CDIValidationMessages.ILLEGAL_SCOPE_FOR_PRODUCER_FIELD :
CDIValidationMessages.ILLEGAL_SCOPE_FOR_PRODUCER_METHOD,
+ field ? CDIPreferences.ILLEGAL_SCOPE_FOR_PRODUCER_METHOD :
CDIPreferences.ILLEGAL_SCOPE_FOR_PRODUCER_METHOD,
+ scopeOrStereotypeDeclaration, producer.getResource());
+ }
+ break;
}
}
-
- /*
- * 3.3. Producer methods
- * - producer method with a parameterized return type with a type variable declares
any scope other than @Dependent
- *
- * 3.4. Producer fields
- * - producer field with a parameterized type with a type variable declares any
scope other than @Dependent
- */
- if (paramTypes.length > 0) {
- IAnnotationDeclaration scopeOrStereotypeDeclaration =
CDIUtil.getDifferentScopeDeclarationThanDepentend(producer);
- if (scopeOrStereotypeDeclaration != null) {
- boolean field = producer instanceof IProducerField;
- addError(field ? CDIValidationMessages.ILLEGAL_SCOPE_FOR_PRODUCER_FIELD :
CDIValidationMessages.ILLEGAL_SCOPE_FOR_PRODUCER_METHOD,
- field ? CDIPreferences.ILLEGAL_SCOPE_FOR_PRODUCER_METHOD :
CDIPreferences.ILLEGAL_SCOPE_FOR_PRODUCER_METHOD,
- scopeOrStereotypeDeclaration, producer.getResource());
- }
- }
}
/*
@@ -933,8 +935,6 @@
addError(CDIValidationMessages.PRODUCER_ANNOTATED_INJECT,
CDIPreferences.PRODUCER_ANNOTATED_INJECT, inject, producer.getResource());
}
- String[] typeVariables = producer.getBeanClass().getTypeParameterSignatures();
-
if (producer instanceof IProducerField) {
/*
* 3.5.1. Declaring a resource
@@ -1028,25 +1028,10 @@
*/
String typeSign = producerMethod.getMethod().getReturnType();
String typeString = Signature.toString(typeSign);
- ITypeParameter[] paramTypes = producerMethod.getMethod().getTypeParameters();
- boolean marked = false;
- for (ITypeParameter param : paramTypes) {
- String variableName = param.getElementName();
- if (variableName.equals(typeString)) {
- addError(CDIValidationMessages.PRODUCER_METHOD_RETURN_TYPE_IS_VARIABLE,
CDIPreferences.PRODUCER_METHOD_RETURN_TYPE_IS_VARIABLE,
- typeDeclaration != null ? typeDeclaration : producer, producer.getResource());
- marked = true;
- }
+ if(isTypeVariable(producerMethod, typeString, typeVariables)) {
+ addError(CDIValidationMessages.PRODUCER_METHOD_RETURN_TYPE_IS_VARIABLE,
CDIPreferences.PRODUCER_METHOD_RETURN_TYPE_IS_VARIABLE,
+ typeDeclaration != null ? typeDeclaration : producer, producer.getResource());
}
- if (!marked && typeVariables.length > 0) {
- for (String variableSig : typeVariables) {
- String variableName = Signature.getTypeVariable(variableSig);
- if (typeString.equals(variableName)) {
- addError(CDIValidationMessages.PRODUCER_METHOD_RETURN_TYPE_IS_VARIABLE,
CDIPreferences.PRODUCER_METHOD_RETURN_TYPE_IS_VARIABLE,
- typeDeclaration != null ? typeDeclaration : producer, producer.getResource());
- }
- }
- }
/*
* 3.3.2. Declaring a producer method
* - non-static method of a session bean class is annotated @Produces, and the
method is not a business method of the session bean
@@ -1111,6 +1096,27 @@
}
}
+ private boolean isTypeVariable(IProducer producer, String type, String[] typeVariables)
throws JavaModelException {
+ if(producer instanceof IProducerMethod) {
+ ITypeParameter[] paramTypes =
((IProducerMethod)producer).getMethod().getTypeParameters();
+ for (ITypeParameter param : paramTypes) {
+ String variableName = param.getElementName();
+ if (variableName.equals(type)) {
+ return true;
+ }
+ }
+ }
+ if (typeVariables.length > 0) {
+ for (String variableSig : typeVariables) {
+ String variableName = Signature.getTypeVariable(variableSig);
+ if (type.equals(variableName)) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
private void saveAllSuperTypesAsLinkedResources(IClassBean bean) {
Set<IParametedType> types = bean.getAllTypes();
for (IParametedType type : types) {
Modified:
trunk/cdi/tests/org.jboss.tools.cdi.core.test/resources/tck/tests/jbt/validation/producers/ParameterizedTypeWithWrongScope_Broken.java
===================================================================
---
trunk/cdi/tests/org.jboss.tools.cdi.core.test/resources/tck/tests/jbt/validation/producers/ParameterizedTypeWithWrongScope_Broken.java 2010-09-07
15:12:57 UTC (rev 24769)
+++
trunk/cdi/tests/org.jboss.tools.cdi.core.test/resources/tck/tests/jbt/validation/producers/ParameterizedTypeWithWrongScope_Broken.java 2010-09-07
15:24:48 UTC (rev 24770)
@@ -1,34 +1,38 @@
package org.jboss.jsr299.tck.tests.jbt.validation.producers;
+import java.util.List;
+
import javax.enterprise.context.Dependent;
+import javax.enterprise.context.RequestScoped;
import javax.enterprise.inject.Produces;
import javax.enterprise.inject.spi.InjectionPoint;
+import javax.inject.Named;
-public class ParameterizedTypeWithWrongScope_Broken {
+public class ParameterizedTypeWithWrongScope_Broken <T> {
- @Produces public FunnelWeaver<String> getAnotherFunnelWeaver;
+ @Produces public FunnelWeaver<T> getAnotherFunnelWeaver;
@AnotherScope
- @Produces public FunnelWeaver<String> getAnotherFunnelWeaver2;
+ @Produces public FunnelWeaver<T> getAnotherFunnelWeaver2;
- @Dependent @Produces public FunnelWeaver<String> getAnotherFunnelWeaver3;
+ @Dependent @Produces public FunnelWeaver<T> getAnotherFunnelWeaver3;
@AnotherScope @Produces public String getAnotherFunnelWeaver4;
@FishStereotype
- @Produces public FunnelWeaver<String> getAnotherFunnelWeaver5;
+ @Produces public FunnelWeaver<T> getAnotherFunnelWeaver5;
- @Produces public FunnelWeaver<String> create(InjectionPoint point) {
+ @Produces public FunnelWeaver<T> create(InjectionPoint point) {
return null;
}
@AnotherScope
@Produces
- public FunnelWeaver<String> create2(InjectionPoint point) {
+ public <E> FunnelWeaver<E> create2(InjectionPoint point) {
return null;
}
- @Dependent @Produces public FunnelWeaver<String> create3(InjectionPoint point) {
+ @Dependent @Produces public <E> FunnelWeaver<E> create3(InjectionPoint
point) {
return null;
}
@@ -38,7 +42,18 @@
@FishStereotype
@Produces
- public FunnelWeaver<String> create5(InjectionPoint point) {
+ public FunnelWeaver<T> create5(InjectionPoint point) {
return null;
}
+
+ @SuppressWarnings("unchecked")
+ @Produces
+ @Named
+ @RequestScoped
+ public List<String> getUsers() {
+ return null;
+ }
+
+ @AnotherScope
+ @Produces public FunnelWeaver<String> getAnotherFunnelWeaver7;
}
\ No newline at end of file
Modified:
trunk/cdi/tests/org.jboss.tools.cdi.core.test/src/org/jboss/tools/cdi/core/test/tck/validation/DefenitionErrorsValidationTest.java
===================================================================
---
trunk/cdi/tests/org.jboss.tools.cdi.core.test/src/org/jboss/tools/cdi/core/test/tck/validation/DefenitionErrorsValidationTest.java 2010-09-07
15:12:57 UTC (rev 24769)
+++
trunk/cdi/tests/org.jboss.tools.cdi.core.test/src/org/jboss/tools/cdi/core/test/tck/validation/DefenitionErrorsValidationTest.java 2010-09-07
15:24:48 UTC (rev 24770)
@@ -456,13 +456,24 @@
*/
public void testParameterizedReturnTypeWithWrongScope() throws Exception {
IFile file =
tckProject.getFile("JavaSource/org/jboss/jsr299/tck/tests/jbt/validation/producers/ParameterizedTypeWithWrongScope_Broken.java");
- assertMarkerIsCreated(file, CDIValidationMessages.ILLEGAL_SCOPE_FOR_PRODUCER_METHOD,
25, 39);
- assertMarkerIsNotCreated(file, CDIValidationMessages.ILLEGAL_SCOPE_FOR_PRODUCER_METHOD,
21);
+ assertMarkerIsCreated(file, CDIValidationMessages.ILLEGAL_SCOPE_FOR_PRODUCER_METHOD,
29, 43);
+ assertMarkerIsNotCreated(file, CDIValidationMessages.ILLEGAL_SCOPE_FOR_PRODUCER_METHOD,
25);
assertMarkerIsNotCreated(file, CDIValidationMessages.ILLEGAL_SCOPE_FOR_PRODUCER_METHOD,
35);
- assertMarkerIsNotCreated(file, CDIValidationMessages.ILLEGAL_SCOPE_FOR_PRODUCER_METHOD,
31);
+ assertMarkerIsNotCreated(file, CDIValidationMessages.ILLEGAL_SCOPE_FOR_PRODUCER_METHOD,
39);
}
/**
+ *
https://jira.jboss.org/browse/JBIDE-7013
+ *
+ * @throws Exception
+ */
+ public void testParameterizedReturnTypeWithoutTypeVariableOk() throws Exception {
+ IFile file =
tckProject.getFile("JavaSource/org/jboss/jsr299/tck/tests/jbt/validation/producers/ParameterizedTypeWithWrongScope_Broken.java");
+ assertMarkerIsNotCreated(file, CDIValidationMessages.ILLEGAL_SCOPE_FOR_PRODUCER_METHOD,
52);
+ assertMarkerIsNotCreated(file, CDIValidationMessages.ILLEGAL_SCOPE_FOR_PRODUCER_METHOD,
57);
+ }
+
+ /**
* 3.3.2. Declaring a producer method
* - producer method is annotated @Inject
*
@@ -686,10 +697,10 @@
*/
public void testParameterizedTypeWithWrongScope() throws Exception {
IFile file =
tckProject.getFile("JavaSource/org/jboss/jsr299/tck/tests/jbt/validation/producers/ParameterizedTypeWithWrongScope_Broken.java");
- assertMarkerIsCreated(file, CDIValidationMessages.ILLEGAL_SCOPE_FOR_PRODUCER_FIELD, 11,
18);
- assertMarkerIsNotCreated(file, CDIValidationMessages.ILLEGAL_SCOPE_FOR_PRODUCER_FIELD,
9);
- assertMarkerIsNotCreated(file, CDIValidationMessages.ILLEGAL_SCOPE_FOR_PRODUCER_FIELD,
14);
- assertMarkerIsNotCreated(file, CDIValidationMessages.ILLEGAL_SCOPE_FOR_PRODUCER_FIELD,
16);
+ assertMarkerIsCreated(file, CDIValidationMessages.ILLEGAL_SCOPE_FOR_PRODUCER_FIELD, 15,
22);
+ assertMarkerIsNotCreated(file, CDIValidationMessages.ILLEGAL_SCOPE_FOR_PRODUCER_FIELD,
13);
+ assertMarkerIsNotCreated(file, CDIValidationMessages.ILLEGAL_SCOPE_FOR_PRODUCER_FIELD,
18);
+ assertMarkerIsNotCreated(file, CDIValidationMessages.ILLEGAL_SCOPE_FOR_PRODUCER_FIELD,
20);
}
/**