// ** This file was generated with DemFGen (vers:05/23/2010)

package edu.neu.ccs.demeterf.demfgen.classes;

import edu.neu.ccs.demeterf.lib.*;
import edu.neu.ccs.demeterf.demfgen.*;
import edu.neu.ccs.demeterf.demfgen.dgp.DGPFunc;
import edu.neu.ccs.demeterf.demfgen.traversals.Travs;
import edu.neu.ccs.demeterf.demfgen.pcdgp.PCDGPFunc;
import edu.neu.ccs.demeterf.dispatch.*;
import edu.neu.ccs.demeterf.*;
import edu.neu.ccs.demeterf.demfgen.ClassHier.InhrtPair;
import edu.neu.ccs.demeterf.demfgen.DemFGenMain;
import java.io.*;
import java.io.FileInputStream;
import edu.neu.ccs.demeterf.util.Util;
import edu.neu.ccs.demeterf.util.CLI;





/** Representation of ClassDef */
public class ClassDef extends TypeDef{
    protected final DoGen gen;
    protected final ident name;
    protected final TypeDefParams tparams;
    protected final PESubtypeList subtypes;
    protected final FieldList fields;
    protected final Impl ext;

    /** Construct a(n) ClassDef Instance */
    public ClassDef(DoGen gen, ident name, TypeDefParams tparams, PESubtypeList subtypes, FieldList fields, Impl ext){
        this.gen = gen;
        this.name = name;
        this.tparams = tparams;
        this.subtypes = subtypes;
        this.fields = fields;
        this.ext = ext;
    }
    /** Is the given object Equal to this ClassDef? */
    public boolean equals(Object o){
        if(!(o instanceof ClassDef))return false;
        if(o == this)return true;
        ClassDef oo = (ClassDef)o;
        return (((Object)gen).equals(oo.gen))&&(((Object)name).equals(oo.name))&&(((Object)tparams).equals(oo.tparams))&&(((Object)subtypes).equals(oo.subtypes))&&(((Object)fields).equals(oo.fields))&&(((Object)ext).equals(oo.ext));
    }
    /** Parse an instance of ClassDef from the given String */
    public static ClassDef parse(String inpt) throws edu.neu.ccs.demeterf.demfgen.classes.ParseException{
        return new edu.neu.ccs.demeterf.demfgen.classes.TheParser(new java.io.StringReader(inpt)).parse_ClassDef();
    }
    /** Parse an instance of ClassDef from the given Stream */
    public static ClassDef parse(java.io.InputStream inpt) throws edu.neu.ccs.demeterf.demfgen.classes.ParseException{
        return new edu.neu.ccs.demeterf.demfgen.classes.TheParser(inpt).parse_ClassDef();
    }
    /** Parse an instance of ClassDef from the given Reader */
    public static ClassDef parse(java.io.Reader inpt) throws edu.neu.ccs.demeterf.demfgen.classes.ParseException{
        return new edu.neu.ccs.demeterf.demfgen.classes.TheParser(inpt).parse_ClassDef();
    }

    /** Field Class for ClassDef.gen */
    public static class gen extends edu.neu.ccs.demeterf.Fields.any{}
    /** Field Class for ClassDef.name */
    public static class name extends edu.neu.ccs.demeterf.Fields.any{}
    /** Field Class for ClassDef.tparams */
    public static class tparams extends edu.neu.ccs.demeterf.Fields.any{}
    /** Field Class for ClassDef.subtypes */
    public static class subtypes extends edu.neu.ccs.demeterf.Fields.any{}
    /** Field Class for ClassDef.fields */
    public static class fields extends edu.neu.ccs.demeterf.Fields.any{}
    /** Field Class for ClassDef.ext */
    public static class ext extends edu.neu.ccs.demeterf.Fields.any{}

    public boolean isProd(){ return subtypes.isEmpty(); }
    public boolean isAbstr(){ return !subtypes.isEmpty(); }
    public String name(){ return ""+name; }
    public List<Field> fieldList(){ return fields.justFields(); }
    public TypeDefParams typeParams(){ return tparams; }
    public boolean doParse(){ return gen.doParse(); }
    public boolean doGen(){ return gen.doGen(); }
    public TypeDef addFieldsAndSyntax(List<FieldOrSyntax> nfs){
        return new ClassDef(gen, name, tparams, subtypes,
                            fields.append(nfs), ext);
    }

    /** DGP method from Class Print */
    public String print(){ return edu.neu.ccs.demeterf.demfgen.classes.Print.PrintM(this); }
    /** DGP method from Class ToStr */
    public String toStr(){ return edu.neu.ccs.demeterf.demfgen.classes.ToStr.ToStrM(this); }
    /** DGP method from Class ToXML */
    public String toXML(){ return edu.neu.ccs.demeterf.demfgen.classes.ToXML.ToXMLM(this); }
    /** Updater for field ClassDef.gen */
    public ClassDef updateGen(DoGen _gen){
        return new ClassDef(_gen, name, tparams, subtypes, fields, ext);
    }
    /** Updater for field ClassDef.name */
    public ClassDef updateName(ident _name){
        return new ClassDef(gen, _name, tparams, subtypes, fields, ext);
    }
    /** Updater for field ClassDef.tparams */
    public ClassDef updateTparams(TypeDefParams _tparams){
        return new ClassDef(gen, name, _tparams, subtypes, fields, ext);
    }
    /** Updater for field ClassDef.subtypes */
    public ClassDef updateSubtypes(PESubtypeList _subtypes){
        return new ClassDef(gen, name, tparams, _subtypes, fields, ext);
    }
    /** Updater for field ClassDef.fields */
    public ClassDef updateFields(FieldList _fields){
        return new ClassDef(gen, name, tparams, subtypes, _fields, ext);
    }
    /** Updater for field ClassDef.ext */
    public ClassDef updateExt(Impl _ext){
        return new ClassDef(gen, name, tparams, subtypes, fields, _ext);
    }
    /** Getter for field ClassDef.gen */
    public DoGen getGen(){ return gen; }
    /** Getter for field ClassDef.name */
    public ident getName(){ return name; }
    /** Getter for field ClassDef.tparams */
    public TypeDefParams getTparams(){ return tparams; }
    /** Getter for field ClassDef.subtypes */
    public PESubtypeList getSubtypes(){ return subtypes; }
    /** Getter for field ClassDef.fields */
    public FieldList getFields(){ return fields; }
    /** Getter for field ClassDef.ext */
    public Impl getExt(){ return ext; }

}