defineAttr(FunctionModel$meta$model.$$.prototype,'parameterTypes',function(){
  var ps=this.tipo.$$metamodel$$.$ps;
  if (!ps || ps.length==0)return getEmpty();
  var r=[];
  for (var i=0; i < ps.length; i++) {
    var pt=ps[i].$t;
    if (typeof(pt)==='string'){
      if (!this.$targs)throw TypeApplicationException$meta$model(String$("This function model needs type parameters"));
      pt=this.$targs[pt];
      if (!pt)throw TypeApplicationException$meta$model(String$("Function model is missing type argument for <" + ps[i].$t + ">"));
    }
    r.push(typeLiteral$meta({Type:pt}));
  }
  return r.reifyCeylonType({Element:{t:Type$meta$model,a:{t:Anything}},Absent:{t:Null}});
},undefined,function(){return{mod:$$METAMODEL$$,$cont:FunctionModel$meta$model,d:['ceylon.language.meta.model','FunctionModel','$at','parameterTypes'],$t:{t:Sequential,a:{Element:{t:Type$meta$model,a:{Type:{t:Anything}}},Absent:{t:Null}}}};});
defineAttr(FunctionModel$meta$model.$$.prototype,'typeArguments',function(){
  var mm = this.tipo.$$metamodel$$;
  if (mm) {
    if (mm.$tp) {
      if (this.$targs===undefined)throw TypeApplicationException$meta$model("Missing type arguments for "+this.string);
      var targs=[];
      for (var tp in mm.$tp) {
        var param = OpenTypeParam(this.tipo,tp);
        var targ = this.$targs[tp];
        if (targ) {
          targ=typeLiteral$meta({Type:targ});
        } else {
          targ=typeLiteral$meta({Type:{t:Anything}});
        }
        targs.push(Entry(param,targ,{Key:{t:TypeParameter$meta$declaration},Item:{t:Type$meta$model,a:{Type:{t:Anything}}}}));
      }
      return LazyMap(targs.reifyCeylonType({Absent:{t:Null},Element:{t:Entry,a:{Key:{t:TypeParameter$meta$declaration},Item:{t:Type$meta$model,a:{Type:{t:Anything}}}}}}), {Key:{t:TypeParameter$meta$declaration},Item:{t:Type$meta$model,a:{Type:{t:Anything}}}});
    }
    return getEmpty();
  }
  throw wrapexc(Exception(String$("IMPL FunctionModel.typeArguments ")),'15:63-15:99','?');
},undefined,function(){return{mod:$$METAMODEL$$,$t:{t:Map,a:{Key:{t:TypeParameter$meta$declaration},Item:{t:Type$meta$model,a:{Type:{t:Anything}}}}},$cont:FunctionModel$meta$model,$an:function(){return[shared(),actual()];},d:['ceylon.language.meta.model','Generic','$at','typeArguments']};});
defineAttr(FunctionModel$meta$model.$$.prototype,'string',function(){
  var mm=this.tipo.$$metamodel$$;
  var qn=$qname(mm);
  if (mm.$tp) {
    qn+="<";
    var first=true;
    for (var tp in mm.$tp) {
      if (first)first=false; else qn+=",";
      var targ=this.$targs[tp];
      if (targ.t) {
        if (typeof(targ.t.$$metamodel$$)==='function')targ.t.$$metamodel$$=targ.t.$$metamodel$$();
        qn+=$qname(targ.t.$$metamodel$$);
      } else {
        qn+=tp;
      }
    }
    qn+=">";
  }
  return String$(qn);
},undefined,function(){return{mod:$$METAMODEL$$,$t:{t:String$},d:['ceylon.language','Object','$at','string'],$cont:FunctionModel$meta$model};});

@@ -2390,16 +2390,452 @@
 ;%0A  var 
+qn;%0A  if (mm.$cont) %7B%0A    qn=$qname(mm.$cont);%0A    if (mm.$cont.$$metamodel$$.$tp) %7B%0A      var cnt=this.$$targs$$&&this.$$targs$$.Container&&this.$$targs$$.Container.a;%0A      qn+=%22%3C%22;var first=true;%0A      for (var tp in mm.$cont.$$metamodel$$.$tp) %7B%0A        if (first)first=false;else qn+=%22,%22;%0A        var _ta=cnt&&cnt%5Btp%5D;%0A        qn+=$qname(_ta%7C%7CAnything);%0A      %7D%0A      qn+=%22%3E%22;%0A    %7D%0A    qn+=%22.%22+mm.d%5Bmm.d.length-1%5D;%0A  %7D else %7B%0A    
 qn=$qnam
@@ -2841,16 +2841,20 @@
 me(mm);%0A
+  %7D%0A
   if (mm

fix FunctionModel.string