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

Reply via email to