001 package org.bridj;
002 import java.util.*;
003 import java.io.*;
004 import static org.bridj.demangling.Demangler.*;
005
006 /**
007 * Unfinished experiment to (partially) reconstruct a header out of parsed shared libraries symbols.<br>
008 * Beware: GCC does not add return types to mangled C++ signatures, so this will be left as '?' in the resulting sources.
009 * @author ochafik
010 */
011 public class HeadersReconstructor {
012
013 public static void reconstructHeaders(Iterable<NativeLibrary> libraries, PrintWriter out) {
014 List<MemberRef> orphanMembers = new ArrayList<MemberRef>();
015 Map<TypeRef, List<MemberRef>> membersByClass = new HashMap<TypeRef, List<MemberRef>>();
016 for (NativeLibrary library : libraries) {
017 for (Symbol symbol : library.getSymbols()) {
018 MemberRef mr = symbol.getParsedRef();
019 if (mr == null)
020 continue;
021
022 TypeRef et = mr.getEnclosingType();
023 if (et == null)
024 orphanMembers.add(mr);
025 else {
026 List<MemberRef> mrs = membersByClass.get(et);
027 if (mrs == null)
028 membersByClass.put(et, mrs = new ArrayList<MemberRef>());
029 mrs.add(mr);
030 }
031 }
032 }
033 for (TypeRef tr : membersByClass.keySet())
034 out.println("class " + tr + ";");
035
036 for (MemberRef mr : orphanMembers)
037 out.println(mr + ";");
038
039 for (Map.Entry<TypeRef, List<MemberRef>> e : membersByClass.entrySet()) {
040 TypeRef tr = e.getKey();
041 List<MemberRef> mrs = e.getValue();
042 out.println("class " + tr + " \n{");
043 for (MemberRef mr : mrs) {
044 out.println("\t" + mr + ";");
045 }
046 out.println("}");
047 }
048
049 }
050
051 }