// Objective-C API for talking to doc Go package.
//   gobind -lang=objc doc
//
// File is generated by gobind. Do not edit.

#ifndef __Doc_H__
#define __Doc_H__

@import Foundation;
#include "ref.h"
#include "Universe.objc.h"


@class DocNoDoc;
@class DocS;
@class DocS2;
@protocol DocI;
@class DocI;

@protocol DocI <NSObject>
- (void)im;
@end

/**
 * A generic comment with <HTML>.
 */
@interface DocNoDoc : NSObject <goSeqRefInterface> {
}
@property(strong, readonly) _Nonnull id _ref;

- (nonnull instancetype)initWithRef:(_Nonnull id)ref;
- (nonnull instancetype)init;
@end

/**
 * S is a struct.
 */
@interface DocS : NSObject <goSeqRefInterface> {
}
@property(strong, readonly) _Nonnull id _ref;

- (nonnull instancetype)initWithRef:(_Nonnull id)ref;
/**
 * NewS is a constructor.
 */
- (nullable instancetype)init;
/**
 * SF is a field.
 */
@property (nonatomic) NSString* _Nonnull sf;
/**
 * Anonymous field.
 */
@property (nonatomic) DocS2* _Nullable s2;
/**
 * Multiple fields.
 */
@property (nonatomic) NSString* _Nonnull f1;
/**
 * Multiple fields.
 */
@property (nonatomic) NSString* _Nonnull f2;
/**
 * After is another method.
 */
- (void)after;
- (void)before;
@end

/**
 * S2 is a struct.
 */
@interface DocS2 : NSObject <goSeqRefInterface> {
}
@property(strong, readonly) _Nonnull id _ref;

- (nonnull instancetype)initWithRef:(_Nonnull id)ref;
- (nonnull instancetype)init;
@end

/**
 * C is a constant.
 */
FOUNDATION_EXPORT const BOOL DocC;

@interface Doc : NSObject
/**
 * A group of vars.
 */
+ (double) noDocVar;
+ (void) setNoDocVar:(double)v;

/**
 * A specific var.
 */
+ (NSString* _Nonnull) specific;
+ (void) setSpecific:(NSString* _Nonnull)v;

/**
 * V is a var.
 */
+ (NSString* _Nonnull) v;
+ (void) setV:(NSString* _Nonnull)v;

@end

/**
 * F is a function.
 */
FOUNDATION_EXPORT void DocF(void);

/**
 * NewS is a constructor.
 */
FOUNDATION_EXPORT DocS* _Nullable DocNewS(void);

@class DocI;

/**
 * I is an interface.
 */
@interface DocI : NSObject <goSeqRefInterface, DocI> {
}
@property(strong, readonly) _Nonnull id _ref;

- (nonnull instancetype)initWithRef:(_Nonnull id)ref;
/**
 * IM is a method.
 */
- (void)im;
@end

#endif
