Reviewers: drfibonacci,
Description:
Only require @Service mapping for RequestContext types referenced from a
RequestFactory.
This allows RequestContext base types to be defined.
Patch by: bobv
Review by: drfibonacci
Please review this at http://gwt-code-reviews.appspot.com/1478803/
Affected files:
M
user/src/com/google/web/bindery/requestfactory/apt/RequestContextScanner.java
M
user/src/com/google/web/bindery/requestfactory/apt/RequestFactoryScanner.java
M user/src/com/google/web/bindery/requestfactory/apt/State.java
M
user/test/com/google/web/bindery/requestfactory/apt/MyRequestContext.java
M
user/test/com/google/web/bindery/requestfactory/apt/MyRequestFactory.java
Index:
user/src/com/google/web/bindery/requestfactory/apt/RequestContextScanner.java
===================================================================
---
user/src/com/google/web/bindery/requestfactory/apt/RequestContextScanner.java
(revision 10431)
+++
user/src/com/google/web/bindery/requestfactory/apt/RequestContextScanner.java
(working copy)
@@ -79,10 +79,6 @@
Service service = x.getAnnotation(Service.class);
ServiceName serviceName = x.getAnnotation(ServiceName.class);
JsonRpcService jsonRpcService = x.getAnnotation(JsonRpcService.class);
- if (service == null && serviceName == null && jsonRpcService == null) {
- state.poison(x,
Messages.contextMustBeAnnotated(state.requestContextType.asElement()
- .getSimpleName()));
- }
if (service != null) {
poisonIfAnnotationPresent(state, x, serviceName, jsonRpcService);
Index:
user/src/com/google/web/bindery/requestfactory/apt/RequestFactoryScanner.java
===================================================================
---
user/src/com/google/web/bindery/requestfactory/apt/RequestFactoryScanner.java
(revision 10431)
+++
user/src/com/google/web/bindery/requestfactory/apt/RequestFactoryScanner.java
(working copy)
@@ -41,7 +41,9 @@
if (!returnTypeElement.getKind().equals(ElementKind.INTERFACE)) {
state.poison(x,
Messages.factoryMustReturnInterface(returnTypeElement.getSimpleName()));
} else {
- state.maybeScanContext((TypeElement) returnTypeElement);
+ TypeElement contextElement = (TypeElement) returnTypeElement;
+ state.maybeScanContext(contextElement);
+ state.requireMapping(contextElement);
}
} else {
state.poison(x,
Messages.factoryMustBeAssignable(state.requestContextType.asElement()
Index: user/src/com/google/web/bindery/requestfactory/apt/State.java
===================================================================
--- user/src/com/google/web/bindery/requestfactory/apt/State.java (revision
10431)
+++ user/src/com/google/web/bindery/requestfactory/apt/State.java (working
copy)
@@ -128,7 +128,7 @@
*/
private final Map<Element, Set<String>> previousMessages = new
HashMap<Element, Set<String>>();
- private final Set<TypeElement> proxiesRequiringMapping = new
LinkedHashSet<TypeElement>();
+ private final Set<TypeElement> typesRequiringMapping = new
LinkedHashSet<TypeElement>();
public State(ProcessingEnvironment processingEnv) {
clientToDomainMain = new HashMap<TypeElement, TypeElement>();
@@ -234,9 +234,14 @@
poison(job.element, sw.toString());
}
}
- for (TypeElement proxyElement : proxiesRequiringMapping) {
- if (!getClientToDomainMap().containsKey(proxyElement)) {
- poison(proxyElement, Messages.proxyMustBeAnnotated());
+ for (TypeElement element : typesRequiringMapping) {
+ if (!getClientToDomainMap().containsKey(element)) {
+ if (types.isAssignable(element.asType(), requestContextType)) {
+ poison(element,
Messages.contextMustBeAnnotated(types.asElement(requestContextType)
+ .getSimpleName()));
+ } else {
+ poison(element, Messages.proxyMustBeAnnotated());
+ }
}
}
}
@@ -331,8 +336,8 @@
}
}
- public void requireMapping(TypeElement proxyElement) {
- proxiesRequiringMapping.add(proxyElement);
+ public void requireMapping(TypeElement interfaceElement) {
+ typesRequiringMapping.add(interfaceElement);
}
/**
Index:
user/test/com/google/web/bindery/requestfactory/apt/MyRequestContext.java
===================================================================
---
user/test/com/google/web/bindery/requestfactory/apt/MyRequestContext.java
(revision 10431)
+++
user/test/com/google/web/bindery/requestfactory/apt/MyRequestContext.java
(working copy)
@@ -23,7 +23,10 @@
import com.google.web.bindery.requestfactory.shared.Request;
import com.google.web.bindery.requestfactory.shared.RequestContext;
-@Expect(method = "contextMustBeAnnotated", args = "RequestContext")
+/*
+ * No error about a missing mapping expected because this type isn't
referenced
+ * from a RequestFactory.
+ */
interface MyRequestContext extends RequestContext {
@Expect(method = "proxyMustBeAnnotated")
interface ProxyMissingAnnotation extends EntityProxy {
Index:
user/test/com/google/web/bindery/requestfactory/apt/MyRequestFactory.java
===================================================================
---
user/test/com/google/web/bindery/requestfactory/apt/MyRequestFactory.java
(revision 10431)
+++
user/test/com/google/web/bindery/requestfactory/apt/MyRequestFactory.java
(working copy)
@@ -15,12 +15,36 @@
*/
package com.google.web.bindery.requestfactory.apt;
+import com.google.web.bindery.requestfactory.shared.JsonRpcService;
+import com.google.web.bindery.requestfactory.shared.RequestContext;
import com.google.web.bindery.requestfactory.shared.RequestFactory;
+import com.google.web.bindery.requestfactory.shared.Service;
+import com.google.web.bindery.requestfactory.shared.ServiceName;
import
com.google.web.bindery.requestfactory.shared.impl.AbstractRequestContext;
interface MyRequestFactory extends RequestFactory {
+
+ @Expect(method = "contextMustBeAnnotated", args = "RequestContext")
+ interface ReferencedContextWithoutMapping extends RequestContext {
+ }
+
+ // No error expected
+ interface UnreferencedContextWithoutMapping extends RequestContext {
+ }
+
+ @Expected({
+ @Expect(method = "redundantAnnotation", args = "ServiceName"),
+ @Expect(method = "redundantAnnotation", args = "JsonRpcService")})
+ @Service(Object.class)
+ @ServiceName("java.lang.Object")
+ @JsonRpcService
+ interface UnreferencedContextWithRedundantMapping extends RequestContext
{
+ }
+
@Expect(method = "factoryMustReturnInterface", args
= "AbstractRequestContext")
AbstractRequestContext concreteContext();
+
+ ReferencedContextWithoutMapping shouldError();
@Expected({
@Expect(method = "factoryNoMethodParameters"),
--
http://groups.google.com/group/Google-Web-Toolkit-Contributors