// Path: src/main/java/com/j2js/Log.java
// public class Log {
// 	
//     public static Log logger;
//     
//     public static Log getLogger() {
//         return logger;
//     }
//     
//     private int state = INFO;
//     
//     /**
//      * @return Returns the state.
//      */
//     public int getState() {
//         return state;
//     }
// 
//     /**
//      * @param state The state to set.
//      */
//     public void setState(int state) {
//         this.state = state;
//     }
// 
//     public static final int DEBUG = 3;
//     public static final int INFO = 2;
//     public static final int WARN = 1;
//     public static final int ERROR = 0;
//     
//     public void debug(CharSequence arg0, Throwable arg1) {
//         if (isDebugEnabled()) {
//             System.out.println("[DEBUG] " + arg0);
//             arg1.printStackTrace();
//         }
//     }
// 
//     public void debug(CharSequence arg0) {
//         if (isDebugEnabled()) {
//             System.out.println("[DEBUG] " + arg0);
//         }
//     }
// 
//     public void debug(Throwable arg0) {
//         if (isDebugEnabled()) {
//             arg0.printStackTrace();
//         }
//     }
// 
//     public void error(CharSequence arg0, Throwable arg1) {
//         if (isErrorEnabled()) {
//             System.out.println("[ERROR] " + arg0);
//             arg1.printStackTrace();
//         }
//     }
// 
//     public void error(CharSequence arg0) {
//         if (isErrorEnabled()) {
//             System.out.println("[ERROR] " + arg0);
//         }
//     }
// 
//     public void error(Throwable arg0) {
//         if (isErrorEnabled()) {
//             arg0.printStackTrace();
//         }
//     }
// 
//     public void info(CharSequence arg0, Throwable arg1) {
//         if (isInfoEnabled()) {
//             System.out.println("[INFO] " + arg0);
//             arg1.printStackTrace();
//         }
//     }
// 
//     public void info(CharSequence arg0) {
//         if (isInfoEnabled()) {
//             System.out.println("[INFO] " + arg0);
//         }
//     }
// 
//     public void info(Throwable arg0) {
//         if (isInfoEnabled()) {
//             arg0.printStackTrace();
//         }
//     }
// 
//     public boolean isDebugEnabled() {
//         return state >= DEBUG;
//     }
// 
//     public boolean isErrorEnabled() {
//         return state >= ERROR;
//     }
// 
//     public boolean isInfoEnabled() {
//         return state >= INFO;
//     }
// 
//     public boolean isWarnEnabled() {
//         return state >= WARN;
//     }
// 
//     public void warn(CharSequence arg0, Throwable arg1) {
//         if (isWarnEnabled()) {
//             System.out.println("[WARNING] " + arg0);
//             arg1.printStackTrace();
//         }
//     }
// 
//     public void warn(CharSequence arg0) {
//         if (isWarnEnabled()) {
//             System.out.println("[WARNING] " + arg0);
//         }
//     }
// 
//     public void warn(Throwable arg0) {
//         if (isWarnEnabled()) {
//             arg0.printStackTrace();
//         }
//     }
//     
// }


import java.io.IOException;
import java.io.Writer;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import com.j2js.Log;
package com.j2js.assembly;



public abstract class ProcedureUnit extends MemberUnit {
    
    // Set of all member signatures targeted by this method.
    private Collection<Signature> targetSignatures = new HashSet<Signature>();

    public ProcedureUnit(Signature theSignature, ClassUnit theDeclaringClazz) {
        super(theSignature, theDeclaringClazz);
    }
    
    public void addTarget(Signature targetSignature) {
        if (!targetSignature.toString().contains("#")) {
            throw new IllegalArgumentException("Signature must be field or method: " + targetSignature);
        }
        //Logger.getLogger().info("Adding " + this + " -> " + targetSignature);
        targetSignatures.add(targetSignature);
    }
    
    public void removeTargets() {
      Iterator iter = targetSignatures.iterator();
      while (iter.hasNext()) {
          iter.next();
          iter.remove();
      }
    }
    
    void write(int depth, Writer writer) throws IOException {
        if (getData() == null) return;
// Path: src/main/java/com/j2js/Log.java
// public class Log {
// 	
//     public static Log logger;
//     
//     public static Log getLogger() {
//         return logger;
//     }
//     
//     private int state = INFO;
//     
//     /**
//      * @return Returns the state.
//      */
//     public int getState() {
//         return state;
//     }
// 
//     /**
//      * @param state The state to set.
//      */
//     public void setState(int state) {
//         this.state = state;
//     }
// 
//     public static final int DEBUG = 3;
//     public static final int INFO = 2;
//     public static final int WARN = 1;
//     public static final int ERROR = 0;
//     
//     public void debug(CharSequence arg0, Throwable arg1) {
//         if (isDebugEnabled()) {
//             System.out.println("[DEBUG] " + arg0);
//             arg1.printStackTrace();
//         }
//     }
// 
//     public void debug(CharSequence arg0) {
//         if (isDebugEnabled()) {
//             System.out.println("[DEBUG] " + arg0);
//         }
//     }
// 
//     public void debug(Throwable arg0) {
//         if (isDebugEnabled()) {
//             arg0.printStackTrace();
//         }
//     }
// 
//     public void error(CharSequence arg0, Throwable arg1) {
//         if (isErrorEnabled()) {
//             System.out.println("[ERROR] " + arg0);
//             arg1.printStackTrace();
//         }
//     }
// 
//     public void error(CharSequence arg0) {
//         if (isErrorEnabled()) {
//             System.out.println("[ERROR] " + arg0);
//         }
//     }
// 
//     public void error(Throwable arg0) {
//         if (isErrorEnabled()) {
//             arg0.printStackTrace();
//         }
//     }
// 
//     public void info(CharSequence arg0, Throwable arg1) {
//         if (isInfoEnabled()) {
//             System.out.println("[INFO] " + arg0);
//             arg1.printStackTrace();
//         }
//     }
// 
//     public void info(CharSequence arg0) {
//         if (isInfoEnabled()) {
//             System.out.println("[INFO] " + arg0);
//         }
//     }
// 
//     public void info(Throwable arg0) {
//         if (isInfoEnabled()) {
//             arg0.printStackTrace();
//         }
//     }
// 
//     public boolean isDebugEnabled() {
//         return state >= DEBUG;
//     }
// 
//     public boolean isErrorEnabled() {
//         return state >= ERROR;
//     }
// 
//     public boolean isInfoEnabled() {
//         return state >= INFO;
//     }
// 
//     public boolean isWarnEnabled() {
//         return state >= WARN;
//     }
// 
//     public void warn(CharSequence arg0, Throwable arg1) {
//         if (isWarnEnabled()) {
//             System.out.println("[WARNING] " + arg0);
//             arg1.printStackTrace();
//         }
//     }
// 
//     public void warn(CharSequence arg0) {
//         if (isWarnEnabled()) {
//             System.out.println("[WARNING] " + arg0);
//         }
//     }
// 
//     public void warn(Throwable arg0) {
//         if (isWarnEnabled()) {
//             arg0.printStackTrace();
//         }
//     }
//     
// }


// Path: src/main/java/com/j2js/assembly/ProcedureUnit.java
import java.io.IOException;
import java.io.Writer;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import com.j2js.Log;

package com.j2js.assembly;



public abstract class ProcedureUnit extends MemberUnit {
    
    // Set of all member signatures targeted by this method.
    private Collection<Signature> targetSignatures = new HashSet<Signature>();

    public ProcedureUnit(Signature theSignature, ClassUnit theDeclaringClazz) {
        super(theSignature, theDeclaringClazz);
    }
    
    public void addTarget(Signature targetSignature) {
        if (!targetSignature.toString().contains("#")) {
            throw new IllegalArgumentException("Signature must be field or method: " + targetSignature);
        }
        //Logger.getLogger().info("Adding " + this + " -> " + targetSignature);
        targetSignatures.add(targetSignature);
    }
    
    public void removeTargets() {
      Iterator iter = targetSignatures.iterator();
      while (iter.hasNext()) {
          iter.next();
          iter.remove();
      }
    }
    
    void write(int depth, Writer writer) throws IOException {
        if (getData() == null) return;
        Log.getLogger().debug(getIndent(depth) + getSignature());