// Java class keywords.KeywordCaller is a proxy for talking to a Go program.
//   gobind -lang=java keywords
//
// File is generated by gobind. Do not edit.
package keywords;

import go.Seq;

public interface KeywordCaller {
    public void abstract_();
    public void assert_();
    public void bool();
    public void boolean_();
    public void break_();
    public void byte_();
    public void case_();
    public void catch_();
    public void char_();
    public void class_();
    public void const_();
    public void continue_();
    public void default_();
    public void do_();
    public void double_();
    public void else_();
    public void enum_();
    public void extends_();
    public void false_();
    public void final_();
    public void finally_();
    public void float_();
    public void for_();
    public void goto_();
    public void if_();
    public void implements_();
    public void import_();
    public void instanceof_();
    public void int_();
    public void interface_();
    public void long_();
    public void native_();
    public void new_();
    public void nil();
    public void null_();
    public void package_();
    public void private_();
    public void protected_();
    public void public_();
    public void return_();
    public void short_();
    public void static_();
    public void strictfp_();
    public void super_();
    public void switch_();
    public void synchronized_();
    public void this_();
    public void throw_();
    public void throws_();
    public void transient_();
    public void true_();
    public void try_();
    public void void_();
    public void volatile_();
    public void while_();
    
}

// Java class keywords.Keywords is a proxy for talking to a Go program.
//   gobind -lang=java keywords
//
// File is generated by gobind. Do not edit.
package keywords;

import go.Seq;

public abstract class Keywords {
    static {
        Seq.touch(); // for loading the native library
        _init();
    }
    
    private Keywords() {} // uninstantiable
    
    // touch is called from other bound packages to initialize this package
    public static void touch() {}
    
    private static native void _init();
    
    private static final class proxyKeywordCaller implements Seq.Proxy, KeywordCaller {
        private final Seq.Ref ref;
        
        @Override public final int incRefnum() {
              int refnum = ref.refnum;
              Seq.incGoRef(refnum);
              return refnum;
        }
        
        proxyKeywordCaller(int refnum) { this.ref = Seq.trackGoRef(refnum); }
        
        public native void abstract_();
        public native void assert_();
        public native void bool();
        public native void boolean_();
        public native void break_();
        public native void byte_();
        public native void case_();
        public native void catch_();
        public native void char_();
        public native void class_();
        public native void const_();
        public native void continue_();
        public native void default_();
        public native void do_();
        public native void double_();
        public native void else_();
        public native void enum_();
        public native void extends_();
        public native void false_();
        public native void final_();
        public native void finally_();
        public native void float_();
        public native void for_();
        public native void goto_();
        public native void if_();
        public native void implements_();
        public native void import_();
        public native void instanceof_();
        public native void int_();
        public native void interface_();
        public native void long_();
        public native void native_();
        public native void new_();
        public native void nil();
        public native void null_();
        public native void package_();
        public native void private_();
        public native void protected_();
        public native void public_();
        public native void return_();
        public native void short_();
        public native void static_();
        public native void strictfp_();
        public native void super_();
        public native void switch_();
        public native void synchronized_();
        public native void this_();
        public native void throw_();
        public native void throws_();
        public native void transient_();
        public native void true_();
        public native void try_();
        public native void void_();
        public native void volatile_();
        public native void while_();
    }
    
    
    public static native void const_(String id);
    public static native void static_(String strictfp_);
}
