gen.out(",", MetamodelGenerator.KEY_PACKED_ANNS, ":", Integer.toString(bits));
//Remove these annotations from the list
anns = new ArrayList<Annotation>(d.getAnnotations().size());
anns.addAll(d.getAnnotations());
for (Iterator<Annotation> iter = anns.iterator(); iter.hasNext();) {
final Annotation a = iter.next();
final Declaration ad = d.getUnit().getPackage().getMemberOrParameter(d.getUnit(), a.getName(), null, false);
final String qn = ad.getQualifiedNameString();
if (qn.startsWith("ceylon.language::") && MetamodelGenerator.annotationBits.contains(qn.substring(17))) {
iter.remove();
}
}
if (anns.isEmpty()) {
return;
}
}
gen.out(",", MetamodelGenerator.KEY_ANNOTATIONS, ":function(){return[");
boolean first = true;
for (Annotation a : anns) {
Declaration ad = d.getUnit().getPackage().getMemberOrParameter(d.getUnit(), a.getName(), null, false);
if (ad instanceof Method) {
if (first) first=false; else gen.out(",");
final boolean isDoc = "ceylon.language::doc".equals(ad.getQualifiedNameString());
if (!isDoc) {
gen.qualify(node, ad);
gen.out(gen.getNames().name(ad), "(");
}
if (a.getPositionalArguments() == null) {
for (Parameter p : ((Method)ad).getParameterLists().get(0).getParameters()) {
String v = a.getNamedArguments().get(p.getName());
gen.out(v == null ? "undefined" : v);
}
} else {
if (isDoc) {
//Use ref if it's too long
final String ref = pathToModelDoc(d);
final String doc = a.getPositionalArguments().get(0);
if (ref != null && ref.length() < doc.length()) {
gen.out(gen.getClAlias(), "doc$($CCMM$,", ref);
} else {
gen.out(gen.getClAlias(), "doc(\"", gen.escapeStringLiteral(doc), "\"");
}
} else {
boolean farg = true;
for (String s : a.getPositionalArguments()) {
if (farg)farg=false; else gen.out(",");
gen.out("\"", gen.escapeStringLiteral(s), "\"");
}
}
}
gen.out(")");
} else {
gen.out("/*MISSING DECLARATION FOR ANNOTATION ", a.getName(), "*/");
}
}
gen.out("];}");
}