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    }