aspect CreateStruct { // create a struct, i.e. a class with fields and no methods except a constructor public static Pair> ASTNode.createStruct(String name, Iterable vars) { return createStruct(name, VIS_PUBLIC, vars); } public static Pair> ASTNode.createStruct(String name, int vis, Iterable vars) { Map map = new HashMap(); List bds = new List(); List ctor_parms = new List(); Block ctor_body = new Block(); Modifiers ctor_mods = new Modifiers(); ctor_mods.setVisibility(vis); ConstructorDecl ctor = new ConstructorDecl(ctor_mods, name, ctor_parms, new List(), new Opt(), ctor_body); for(Variable v : vars) { if(map.containsKey(v.name())) throw new RefactoringException("duplicate field name"); Modifiers field_mods = (Modifiers) v.getModifiers().fullCopyAndDetach(); field_mods.setVisibility(v.isField() ? ((FieldDeclaration)v).getVisibility() : VIS_PUBLIC); FieldDeclaration fd = new FieldDeclaration(field_mods, v.type().createLockedAccess(), v.name(), new Opt()); bds.add(fd); map.put(v.name(), fd); if(!v.isField() || v.hasInit()) { ParameterDeclaration pd = new ParameterDeclaration(v.type().createLockedAccess(), v.name()); ctor_parms.add(pd); ctor_body.addStmt(AssignExpr.asStmt(fd.createLockedAccess(), pd.createLockedAccess())); } } bds.add(ctor); Modifiers class_mods = (Modifiers)ctor_mods.fullCopyAndDetach(); class_mods.addModifier("static"); return new Pair(new ClassDecl(class_mods, name, new Opt(), new List(), bds), map); } }