# HG changeset patch # User Jaroslav Tulach # Date 1361284897 -3600 # Node ID 1bc37d5f30d8531cc3c5abe239849440cd1d6422 # Parent 605791f059b09c8e72dfc0a47ee687184ea27edf Better error messages diff -r 605791f059b0 -r 1bc37d5f30d8 javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/PageProcessor.java --- a/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/PageProcessor.java Mon Feb 18 19:52:06 2013 +0100 +++ b/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/PageProcessor.java Tue Feb 19 15:41:37 2013 +0100 @@ -68,6 +68,7 @@ public final class PageProcessor extends AbstractProcessor { @Override public boolean process(Set annotations, RoundEnvironment roundEnv) { + boolean ok = true; for (Element e : roundEnv.getElementsAnnotatedWith(Page.class)) { Page p = e.getAnnotation(Page.class); if (p == null) { @@ -83,7 +84,8 @@ is.close(); } catch (IOException iOException) { processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, "Can't read " + p.xhtml(), e); - return false; + ok = false; + pp = null; } Writer w; String className = p.className(); @@ -101,18 +103,21 @@ w.append("final class ").append(className).append(" {\n"); w.append(" private boolean locked;\n"); if (!initializeOnClick(className, (TypeElement) e, w, pp)) { - return false; - } - for (String id : pp.ids()) { - String tag = pp.tagNameForId(id); - String type = type(tag); - w.append(" ").append("public final "). - append(type).append(' ').append(cnstnt(id)).append(" = new "). - append(type).append("(\"").append(id).append("\");\n"); + ok = false; + } else { + for (String id : pp.ids()) { + String tag = pp.tagNameForId(id); + String type = type(tag); + w.append(" ").append("public final "). + append(type).append(' ').append(cnstnt(id)).append(" = new "). + append(type).append("(\"").append(id).append("\");\n"); + } } List propsGetSet = new ArrayList(); Map> propsDeps = new HashMap>(); - generateComputedProperties(w, e.getEnclosedElements(), propsGetSet, propsDeps); + if (!generateComputedProperties(w, p.properties(), e.getEnclosedElements(), propsGetSet, propsDeps)) { + ok = false; + } generateProperties(w, p.properties(), propsGetSet, propsDeps); w.append(" private org.apidesign.bck2brwsr.htmlpage.Knockout ko;\n"); if (!propsGetSet.isEmpty()) { @@ -145,7 +150,7 @@ return false; } } - return true; + return ok; } private InputStream openStream(String pkg, String name) throws IOException { @@ -184,6 +189,7 @@ private boolean initializeOnClick( String className, TypeElement type, Writer w, ProcessPage pp ) throws IOException { + boolean ok = true; TypeMirror stringType = processingEnv.getElementUtils().getTypeElement("java.lang.String").asType(); { //for (Element clazz : pe.getEnclosedElements()) { // if (clazz.getKind() != ElementKind.CLASS) { @@ -196,9 +202,15 @@ On oc = method.getAnnotation(On.class); if (oc != null) { for (String id : oc.id()) { + if (pp == null) { + processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, "id = " + id + " not found in HTML page."); + ok = false; + continue; + } if (pp.tagNameForId(id) == null) { processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, "id = " + id + " does not exist in the HTML page. Found only " + pp.ids(), method); - return false; + ok = false; + continue; } ExecutableElement ee = (ExecutableElement)method; StringBuilder params = new StringBuilder(); @@ -231,11 +243,13 @@ } if (!ee.getModifiers().contains(Modifier.STATIC)) { processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, "@On method has to be static", ee); - return false; + ok = false; + continue; } if (ee.getModifiers().contains(Modifier.PRIVATE)) { processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, "@On method can't be private", ee); - return false; + ok = false; + continue; } w.append(" OnEvent." + oc.event()).append(".of(").append(cnstnt(id)). append(").perform(new OnDispatch(" + dispatchCnt + "));\n"); @@ -266,7 +280,7 @@ } - return true; + return ok; } @Override @@ -312,7 +326,7 @@ return e.getEnclosingElement(); } - private static void generateProperties( + private void generateProperties( Writer w, Property[] properties, Collection props, Map> deps ) throws IOException { @@ -370,9 +384,11 @@ } private boolean generateComputedProperties( - Writer w, Collection arr, Collection props, + Writer w, Property[] fixedProps, + Collection arr, Collection props, Map> deps ) throws IOException { + boolean ok = true; for (Element e : arr) { if (e.getKind() != ElementKind.METHOD) { continue; @@ -390,6 +406,11 @@ int arg = 0; for (VariableElement pe : ee.getParameters()) { final String dn = pe.getSimpleName().toString(); + + if (!verifyPropName(pe, dn, fixedProps)) { + ok = false; + } + final String dt = pe.asType().toString(); String[] call = toGetSet(dn, dt, false); w.write(" " + dt + " arg" + (++arg) + " = "); @@ -423,7 +444,7 @@ props.add(gs[0]); } - return true; + return ok; } private static String[] toGetSet(String name, String type, boolean array) { @@ -457,12 +478,13 @@ }; } - private static String typeName(Property p) { + private String typeName(Property p) { String ret; try { ret = p.type().getName(); } catch (MirroredTypeException ex) { - ret = ex.getTypeMirror().toString(); + TypeMirror tm = processingEnv.getTypeUtils().erasure(ex.getTypeMirror()); + ret = tm.toString(); } if (p.array()) { if (ret.equals("byte")) { @@ -489,4 +511,24 @@ } return ret; } + + private boolean verifyPropName(Element e, String propName, Property[] existingProps) { + StringBuilder sb = new StringBuilder(); + String sep = ""; + for (Property property : existingProps) { + if (property.name().equals(propName)) { + return true; + } + sb.append(sep); + sb.append('"'); + sb.append(property.name()); + sb.append('"'); + sep = ", "; + } + processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, + propName + " is not one of known properties: " + sb + , e + ); + return false; + } }