Module

#include <jnc_Module.h>

// typedefs

typedef bool_t jnc_ModuleCompileErrorHandlerFunc(
    void *context,
    jnc_ModuleCompileErrorKind errorKind
    );

typedef void jnc_AttributeObserverFunc(
    void *context,
    jnc_ModuleItem *item,
    jnc_AttributeBlock *attributeBlock
    );

typedef enum jnc_OptLevel nc_OptLevel;

// enums

enum jnc_JitKind;
enum jnc_ModuleCompileErrorKind;
enum jnc_ModuleCompileFlag;
enum jnc_ModuleCompileState;
enum jnc_ModuleRequireFlag;
enum jnc_OptLevel;

// structs

struct jnc_CodeAuthenticatorConfig;
struct jnc_Module;
struct jnc_ModuleConfig;

// global variables

JNC_SELECT_ANY jnc_ModuleConfig jnc_g_defaultModuleConfig = {  jnc_JitKind_Auto,   jnc_OptLevel_Default,   jnc_ModuleCompileFlag_StdFlags, };

// global functions

jnc_Module*
jnc_Module_create();

void
jnc_Module_destroy(jnc_Module* module);

void
jnc_Module_clear(jnc_Module* module);

void
jnc_Module_unloadDynamicLibs(jnc_Module* module);

void
jnc_Module_initialize(
    jnc_Module* module,
    const char* name,
    const jnc_ModuleConfig* config
);

void
jnc_Module_updateCapabilities(jnc_Module* module);

void
jnc_Module_setDynamicExtensionAuthenticatorConfig(
    jnc_Module* module,
    const jnc_CodeAuthenticatorConfig* config
);

const char*
jnc_Module_getName(jnc_Module* module);

uint_t
jnc_Module_getCompileFlags(jnc_Module* module);

jnc_ModuleCompileState
jnc_Module_getCompileState(jnc_Module* module);

size_t
jnc_Module_getCompileErrorCountLimit(jnc_Module* module);

void
jnc_Module_setCompileErrorCountLimit(
    jnc_Module* module,
    size_t limit
);

size_t
jnc_Module_getCompileErrorCount(jnc_Module* module);

void
jnc_Module_setCompileErrorHandler(
    jnc_Module* module,
    jnc_ModuleCompileErrorHandlerFunc* handler,
    void* context
);

void
jnc_Module_setAttributeObserver(
    jnc_Module* module,
    jnc_AttributeObserverFunc* observer,
    void* context,
    uint_t itemKindMask
);

jnc_GlobalNamespace*
jnc_Module_getGlobalNamespace(jnc_Module* module);

jnc_GlobalNamespace*
jnc_Module_getStdNamespace(
    jnc_Module* module,
    jnc_StdNamespace stdNamespace
);

jnc_Type*
jnc_Module_getPrimitiveType(
    jnc_Module* module,
    jnc_TypeKind typeKind
);

jnc_Type*
jnc_Module_getStdType(
    jnc_Module* module,
    jnc_StdType stdType
);

handle_t
jnc_Module_getExtensionSourceFileIterator(jnc_Module* module);

const char*
jnc_Module_getNextExtensionSourceFile(
    jnc_Module* module,
    handle_t* iterator
);

jnc_FindModuleItemResult
jnc_Module_findExtensionLibItem(
    jnc_Module* module,
    const char* name,
    const jnc_Guid* libGuid,
    size_t itemCacheSlot
);

const char*
jnc_Module_getExtensionLibFilePath(
    jnc_Module* module,
    jnc_ExtensionLib* lib
);

bool_t
jnc_Module_mapVariable(
    jnc_Module* module,
    jnc_Variable* variable,
    void* p
);

bool_t
jnc_Module_mapFunction(
    jnc_Module* module,
    jnc_Function* function,
    void* p
);

void
jnc_Module_addSource(
    jnc_Module* module,
    jnc_ExtensionLib* lib,
    const char* fileName,
    const char* source,
    size_t length
);

handle_t
jnc_Module_getImportDirIterator(jnc_Module* module);

const char*
jnc_Module_getNextImportDir(
    jnc_Module* module,
    handle_t* iterator
);

void
jnc_Module_addImportDir(
    jnc_Module* module,
    const char* dir
);

bool_t
jnc_Module_addImport(
    jnc_Module* module,
    const char* fileName
);

void
jnc_Module_addSourceImport(
    jnc_Module* module,
    const char* fileName,
    const char* source,
    size_t length
);

void
jnc_Module_addIgnoredImport(
    jnc_Module* module,
    const char* fileName
);

void
jnc_Module_addOpaqueClassTypeInfo(
    jnc_Module* module,
    const char* qualifiedName,
    const jnc_OpaqueClassTypeInfo* info
);

void
jnc_Module_addStaticLib(
    jnc_Module* module,
    jnc_ExtensionLib* lib
);

void
jnc_Module_require(
    jnc_Module* module,
    jnc_ModuleItemKind itemKind,
    const char* name,
    uint_t flags
);

void
jnc_Module_requireType(
    jnc_Module* module,
    jnc_TypeKind typeKind,
    const char* name,
    uint_t flags
);

bool_t
jnc_Module_parse(
    jnc_Module* module,
    const char* fileName,
    const char* source,
    size_t length
);

bool_t
jnc_Module_parseFile(
    jnc_Module* module,
    const char* fileName
);

bool_t
jnc_Module_parseImports(jnc_Module* module);

bool_t
jnc_Module_compile(jnc_Module* module);

bool_t
jnc_Module_optimize(
    jnc_Module* module,
    uint_t level
);

bool_t
jnc_Module_ensureJitCreated(jnc_Module* module);

bool_t
jnc_Module_jit(jnc_Module* module);

bool_t
jnc_Module_generateDocumentation(
    jnc_Module* module,
    const char* outputDir
);

const char*
jnc_Module_getLlvmIrString_v(jnc_Module* module);

jnc_CodeAssist*
jnc_Module_generateCodeAssist(
    jnc_Module* module,
    jnc_CodeAssistKind kind,
    jnc_Module* cacheModule,
    size_t offset,
    const char* source,
    size_t length
);

void
jnc_Module_cancelCodeAssist(jnc_Module* module);

jnc_CodeAssist*
jnc_Module_getCodeAssist(jnc_Module* module);