param.beh.html

Program{
	private void expandParamDefs()to ClassSpec{
		after ClassSpec (@
      ClassName name = host.get_classname();
      ClassSpec_Commalist actuals = host.get_actual_parameters();
      if (actuals != null) {
	// It's a parameterized class; make sure it hasn't already been
	// defined.
	ClassName newname = host.expandName();
	if (!Program.prog.definesClass(newname)) {
	  // It hasn't; get the parameterized definition, copy it,
	  // replace the parameters with the actual parameters, and add
	  // it to the list of class defs.
	  ClassDef paramdef = Program.prog.findClassDef(name);
	  if (paramdef == null) {
	    System.err.println("Error: no such parameterized class \""
				+ name + "\"");
	  } else {
	    ClassDef actualdef = paramdef.deepCopy();
	    ParamClassName pname = ParamClassName.parse(newname.toString());
	    actualdef.set_paramclassname(pname);
	    actualdef.allParts(new ParamReplacer(paramdef.get_parameters(),
						 actuals));
	    Program.prog.addClassDef(actualdef);
	  }
	}
      }
    @)
		after Program (@
      // Remove the parameterized definitions from the class graph.
      ClassGraph cg = new ClassGraph();
      NonParamDefCollector coll = new NonParamDefCollector(cg);
      host.allClassDefs(coll);
      host.set_cg(coll.get_cg());
    @)
	}
}

ClassSpec{
	ClassName expandName()(@
    if (actual_parameters != null) {
      String newname = actual_parameters.concatenateNames() + classname;
      classname = ClassName.parse(newname);
      actual_parameters = null;
    }
    return classname;
  @)
}

ClassSpec_Commalist{
	String concatenateNames()to ClassName{
		init (@ return_val = ""; @)
		before ClassName (@ return_val += host + "_"; @)
	}
}

ParamReplacer{
	before{ Part, RepeatedPart }(@
    int i = params.indexOf(host.get_classname());
    if (i != -1) {
      ClassSpec actual = actuals.elementAt(i);
      host.set_classname(actual.get_classname());
    }
  @)
}

NonParamDefCollector{
	before ClassDef (@
    if (host.get_parameters() == null) cg.addClassDef(host);
  @)
}