5 public class SumExpr extends Expr {
11 public SumExpr(SetDescriptor sd, RelationDescriptor rd) {
12 if (sd == null||rd==null) {
13 throw new NullPointerException();
19 public String name() {
20 return "sum("+sd.toString()+"."+rd.toString()+")";
23 public boolean equals(Map remap, Expr e) {
24 if (e==null||!(e instanceof SumExpr))
26 SumExpr se=(SumExpr)e;
27 return (se.sd==sd)&&(se.rd==rd);
30 public boolean usesDescriptor(Descriptor d) {
31 return (sd==d)||(rd==d);
34 public Set useDescriptor(Descriptor d) {
35 HashSet newset=new HashSet();
41 public Descriptor getDescriptor() {
42 throw new Error("Sum shouldn't appear on left hand side!");
45 public boolean inverted() {
49 public Set getRequiredDescriptors() {
50 HashSet v=new HashSet();
56 public void generate(CodeWriter writer, VarDescriptor dest) {
60 public void prettyPrint(PrettyPrinter pp) {
62 pp.output(sd.toString());
64 pp.output(rd.toString());
68 public TypeDescriptor typecheck(SemanticAnalyzer sa) {
69 this.td = ReservedTypeDescriptor.INT;
73 public Set getInversedRelations() {