package EDU.neu.ccs.demeter.tools.apstudio.graphedit;
import java.awt.*;
import java.io.*;
import java.util.*;
import EDU.neu.ccs.demeter.*;
import EDU.neu.ccs.demeter.common.tg.*;


import EDU.neu.ccs.demeter.*;
class Part extends PartOrSyntax {
  protected PartName partname;
  public PartName get_partname() { return partname; }
  public void set_partname(PartName new_partname)
    { partname = new_partname; }
  protected PartKeyword_List keywords;
  public PartKeyword_List get_keywords() { return keywords; }
  public void set_keywords(PartKeyword_List new_keywords)
    { keywords = new_keywords; }
  protected ClassSpec classspec;
  public ClassSpec get_classspec() { return classspec; }
  public void set_classspec(ClassSpec new_classspec)
    { classspec = new_classspec; }
  protected PartInit partinit;
  public PartInit get_partinit() { return partinit; }
  public void set_partinit(PartInit new_partinit)
    { partinit = new_partinit; }
  Part() { super(); }
  public Part(PartName partname, PartKeyword_List keywords, ClassSpec classspec, PartInit partinit) {
    super();
    set_partname(partname);
    set_keywords(keywords);
    set_classspec(classspec);
    set_partinit(partinit);
  }
  public static Part parse(java.io.InputStream in) throws ParseException
    { return new Parser(in)._Part(); }
  public static Part parse(String s) {
    try { return parse(new java.io.ByteArrayInputStream(s.getBytes())); }
    catch (ParseException e) { throw new RuntimeException(e.toString()); }
  }

	public PartModifier_List getPartMods()
	{
		PartModifier_List pl = new PartModifier_List();
		toPartKeyword(new PartModVisitor(pl));
		return pl;
	}
	  ClassName get_classname() {
    __V_Part_get_classname v0 = new __V_Part_get_classname();
    v0.start();
    toClassName(v0);
    v0.finish();
    return v0.get_return_val();
  }
  void universal_trv0_bef(UniversalVisitor _v_) {
    super.universal_trv0_bef(_v_);
    _v_.before(this);
  }
  void universal_trv0_aft(UniversalVisitor _v_) {
    _v_.after(this);
    super.universal_trv0_aft(_v_);
  }
  void universal_trv0(UniversalVisitor _v_) {
    universal_trv0_bef(_v_);
    if (partname != null) {
      _v_.before_partname(this, partname);
    partname.universal_trv0(_v_);
      _v_.after_partname(this, partname);
    }
    _v_.before_keywords(this, keywords);
    keywords.universal_trv0(_v_);
    _v_.after_keywords(this, keywords);
    _v_.before_classspec(this, classspec);
    classspec.universal_trv0(_v_);
    _v_.after_classspec(this, classspec);
    if (partinit != null) {
      _v_.before_partinit(this, partinit);
    partinit.universal_trv0(_v_);
      _v_.after_partinit(this, partinit);
    }
    super.universal_trv0(_v_);
    universal_trv0_aft(_v_);
  }
  void toAllSubclasses_Program_trv_bef(ClassNameTranspVisitor cntv, EdgeVisitor aev) {
    super.toAllSubclasses_Program_trv_bef(cntv, aev);
    aev.before(this);
  }
  void toAllSubclasses_Program_trv_aft(ClassNameTranspVisitor cntv, EdgeVisitor aev) {
    aev.after(this);
    super.toAllSubclasses_Program_trv_aft(cntv, aev);
  }
  void toAllSubclasses_Program_trv(ClassNameTranspVisitor cntv, EdgeVisitor aev) {
    toAllSubclasses_Program_trv_bef(cntv, aev);
    classspec.toAllSubclasses_Program_trv(cntv, aev);
    toAllSubclasses_Program_trv_aft(cntv, aev);
  }
  public void toPartKeyword(PartModVisitor v) {
    toPartKeyword_Part_trv(v);
  }
  void toPartKeyword_Part_trv_bef(PartModVisitor v) {
    super.toPartKeyword_Part_trv_bef(v);
  }
  void toPartKeyword_Part_trv_aft(PartModVisitor v) {
    super.toPartKeyword_Part_trv_aft(v);
  }
  void toPartKeyword_Part_trv(PartModVisitor v) {
    toPartKeyword_Part_trv_bef(v);
    keywords.toPartKeyword_Part_trv(v);
    toPartKeyword_Part_trv_aft(v);
  }
  public void toClassName(ClassNameAccessor v) {
    toClassName_Part_trv(v);
  }
  void toClassName_Part_trv_bef(ClassNameAccessor v) {
    super.toClassName_Part_trv_bef(v);
  }
  void toClassName_Part_trv_aft(ClassNameAccessor v) {
    super.toClassName_Part_trv_aft(v);
  }
  void toClassName_Part_trv(ClassNameAccessor v) {
    toClassName_Part_trv_bef(v);
    classspec.toClassName_Part_trv(v);
    toClassName_Part_trv_aft(v);
  }
  void toClassSpec_RepeatedPart_trv(RepClassSpecVisitor csv) {  }
  void toSyntaxClassSpec_RepeatedPart_trv(SomeClassSpecVisitor scv) {  }
  void toClassName_RepeatedPart_trv(ClassNameAccessor v) {  }
}

