public static <T> Prop<T> cannonicalize(Prop<T> p) { Prop<T> prop = cannon.computeIfAbsent(p.name, x -> p); if (p.isCannon() && !prop.isCannon()) { cannon.put(p.name, p); prop = p; } else if (p.isCannon() && prop.isCannon() && p != prop) { // should be an Error? System.err.println(" WARNING: two competing canonical definitions of a Prop <" + p + ">"); if (p.typeInformation != null && prop.typeInformation == null) { cannon.put(p.name, p); prop = p; } else if (p.typeInformation == null && prop.typeInformation != null) { } else if (p.typeInformation != null && prop.typeInformation != null) { if (!Conversions.typeInformationEquals(p.typeInformation, prop.typeInformation)) { System.err.println( " ERROR: the two competing canonical definitions of " + p + " have different type information"); throw new IllegalArgumentException( p.typeInformation + " " + prop.typeInformation + " " + p + " " + prop); } } } prop.setCannon(); return prop; }
public Dict getAttributes() { Prop on = this; if (!isCannon()) { Prop<T> already = (Prop<T>) findCannon(); if (already == null) { toCannon(); on.setCannon(); } else { on = already; } } return on.attributes == null ? (on.attributes = new Dict()) : on.attributes; }
public <T> Prop<T> autoConstructs(Supplier<T> t) { Prop on = this; if (!isCannon()) { Prop<T> already = (Prop<T>) findCannon(); if (already == null) { toCannon(); on.setCannon(); } else { on = already; } } on.autoConstructor = (Supplier) t; return (Prop<T>) on; }
public <T> Prop<T> doc(String doc) { Prop on = this; if (!isCannon()) { Prop<T> already = (Prop<T>) findCannon(); if (already == null) { toCannon(); on.setCannon(); } else { on = already; } } on.documentation = doc; return (Prop<T>) on; }
@CallerSensitive public <T> Prop<T> type() { Prop on = this; if (!isCannon()) { Prop<T> already = (Prop<T>) findCannon(); if (already == null) { toCannon(); on.setCannon(); } else { on = already; } } Class c = sun.reflect.Reflection.getCallerClass(2); on.definedInClass = c; Field f = null; try { f = c.getField(name); } catch (NoSuchFieldException e) { try { f = c.getField("_" + name); } catch (NoSuchFieldException e3) { if (name.startsWith("_")) try { f = c.getField(name.substring(1)); } catch (NoSuchFieldException e1) { if (name.startsWith("__")) try { f = c.getField(name.substring(1)); } catch (NoSuchFieldException e2) { } } } } if (f == null) throw new IllegalStateException( " cannot type a Dict.Prop<T> that we can't find. Name is :" + name + " class is :" + c); on.typeInformation = Conversions.linearize(f.getGenericType()); on.typeInformation.remove(0); return (Prop<T>) on; }