void WriteInnerClasses(JavaAttributeSet attributes) { if (OuterAndInnerClasses != null) { int n = 0; for (int i = 0; i < OuterAndInnerClasses.Length; i++) { if (OuterAndInnerClasses[i] != null) { n++; } } if (n != 0) { var innerClasses = new JavaClass.InnerClass[n]; n = 0; for (int i = 0; i < OuterAndInnerClasses.Length; i++) { if (OuterAndInnerClasses[i] != null) { innerClasses[n++] = OuterAndInnerClasses[i]; } } attributes.Put(new JavaAttribute.InnerClasses(innerClasses)); } } }
public InnerClasses(JavaReader rdr) { classes = new JavaClass.InnerClass[rdr.Read16()]; for (int i = 0; i < classes.Length; i++) { classes[i] = new JavaClass.InnerClass(); classes[i].InnerLongName = rdr.ConstClass(rdr.Read16()).ClassName; ushort v = rdr.Read16(); if (v != 0) { classes[i].OuterLongName = rdr.ConstClass(v).ClassName; } v = rdr.Read16(); if (v != 0) { classes[i].InnerShortName = rdr.ConstUtf8(v); } classes[i].Flags = (JavaAccessFlags)rdr.Read16(); } }
public void AddInnerClass(JavaClass innerClassToAdd) { if (!innerClassToAdd.Name.StartsWith(Name)) { throw new ArgumentException(); } int n = Name.Length; if (innerClassToAdd.Name[n] == '$') { n++; } var entryFlags = (innerClassToAdd.Flags & ~JavaAccessFlags.ACC_SUPER) | JavaAccessFlags.ACC_STATIC; // // append a new entry in this class, linking to innerClassToAdd // var innerEntry = new JavaClass.InnerClass(); innerEntry.InnerShortName = innerClassToAdd.Name.Substring(n); innerEntry.InnerLongName = innerClassToAdd.Name; innerEntry.OuterLongName = Name; innerEntry.Flags = entryFlags; if (OuterAndInnerClasses == null) { n = 1; OuterAndInnerClasses = new JavaClass.InnerClass[2]; } else { n = OuterAndInnerClasses.Length; var newArray = new JavaClass.InnerClass[n + 1]; Array.Copy(OuterAndInnerClasses, 0, newArray, 0, n); OuterAndInnerClasses = newArray; } OuterAndInnerClasses[n] = innerEntry; // // update the first entry in innerClassToAdd, connecting it to this class // var outerEntry = new JavaClass.InnerClass(); outerEntry.InnerShortName = innerEntry.InnerShortName; outerEntry.InnerLongName = innerEntry.InnerLongName; outerEntry.OuterLongName = innerEntry.OuterLongName; outerEntry.Flags = entryFlags; if (innerClassToAdd.OuterAndInnerClasses == null) { innerClassToAdd.OuterAndInnerClasses = new JavaClass.InnerClass[1]; } else if (innerClassToAdd.OuterAndInnerClasses[0] != null) { // the inner class is already connected to a parent throw new ArgumentException(); } innerClassToAdd.OuterAndInnerClasses[0] = outerEntry; }