=head1 Name
SPVM::Document::NativeAPI::Compiler - Compiler Native APIs
=head1 Usage
SPVM_API_COMPILER* api_compiler = env->api->compiler;
void* compiler = api_compiler->new_instance();
api_compiler->add_include_dir(compiler, "lib");
api_compiler->set_start_file(compiler, __FILE__);
api_compiler->get_start_line(compiler, __LINE__ + 1);
int32_t status = api_compiler->compile(compiler, "MyClass");
api_compiler->free_instance(compiler);
=head1 Description
The compiler native APIs in L<SPVM> are the APIs for SPVM compilers.
=head1 Compiler Native APIs
=head2 new_instance
C<void* (*new_instance)(void);>
Creates a new L<compiler|SPVM::Document::NativeAPI::Compiler> and returns it.
=head2 free_instance
C<void (*free_instance)(L<void* compiler|SPVM::Document::NativeAPI::Compiler>);>
Frees the compiler I<compiler>.
=head2 get_start_line
C<int32_t (*get_start_line)(L<void* compiler|SPVM::Document::NativeAPI::Compiler>);>
Returns the value of the C<start_line> field. The starting line for an exception call stack is stored to this field.
=head2 set_start_line
C<void (*set_start_line)(L<void* compiler|SPVM::Document::NativeAPI::Compiler>, int32_t start_line);>
Sets I<start_line> to the C<start_line> field.
=head2 get_start_file
C<const char* (*get_start_file)(L<void* compiler|SPVM::Document::NativeAPI::Compiler>);>
Returns the value of the C<start_file> field. The starting file path for an exception call stack is stored to this field.
=head2 set_start_file
C<void (*set_start_file)(L<void* compiler|SPVM::Document::NativeAPI::Compiler>, const char* start_file);>
Sets I<start_file> to the C<start_file> field.
=head2 get_include_dirs_length
C<int32_t (*get_include_dirs_length)(L<void* compiler|SPVM::Document::NativeAPI::Compiler>);>
Returns the length of the class search directories.
=head2 get_include_dir
C<const char* (*get_include_dir)(L<void* compiler|SPVM::Document::NativeAPI::Compiler>, int32_t index);>
Searches a class search directory given the index I<index>.
If it is found, returns it. Otherwise, returns C<NULL>.
=head2 add_include_dir
C<void (*add_include_dir)(L<void* compiler|SPVM::Document::NativeAPI::Compiler>, const char* include_dir);>
Adds I<include_dir> at the end of the class search directories.
=head2 clear_include_dirs
C<void (*clear_include_dirs)(SPVM_COMPILER* compiler);>
Removes all class search directories.
=head2 add_class_file
C<void (*add_class_file)(L<void* compiler|SPVM::Document::NativeAPI::Compiler>, const char* class_name);>
Creates the L<class file|SPVM::Document::NativeAPI::ClassFile> for the class given by I<class_name>, and adds it to the symbol table of the compiler I<compiler>.
If the class file already exists, nothing is performed.
=head2 delete_class_file
C<void (*delete_class_file)(L<void* compiler|SPVM::Document::NativeAPI::Compiler>, const char* class_name);>
Removes the L<class file|SPVM::Document::NativeAPI::ClassFile> for the class given by the class name I<class_name>.
=head2 get_class_file
C<void* (*get_class_file)(L<void* compiler|SPVM::Document::NativeAPI::Compiler>, const char* class_name);>
Returns the L<class file|SPVM::Document::NativeAPI::ClassFile> for the class given by the class name I<class_name>.
=head2 compile
C<int32_t (*compile)(L<void* compiler|SPVM::Document::NativeAPI::Compiler>, const char* class_name);>
Compiles the SPVM class given by the class name I<class_name>. Classes loaded by the class and classes subsequently loaded are also compiled.
The L<runtime|/"get_runtime"> is build.
If the compilation is successful, returns 0. Otherwise, returns a non-zero value.
This native API can be called repeatedly to compile other classes.
=head2 get_error_messages_length
C<int32_t (*get_error_messages_length)(L<void* compiler|SPVM::Document::NativeAPI::Compiler>);>
Returns the length of the compilation error messages.
=head2 get_error_message
C<const char* (*get_error_message)(L<void* compiler|SPVM::Document::NativeAPI::Compiler>, int32_t index);>
Searches the compiler error message given the index I<index>.
If it is found, returns it. Otherwise, returns C<NULL>.
=head2 get_runtime
C<void* (*get_runtime)(L<void* compiler|SPVM::Document::NativeAPI::Compiler>);>
Returns the L<runtime|SPVM::Document::NativeAPI::Runtime> that is build by the compiler I<compiler>.
=head2 prepend_include_dir
C<void (*prepend_include_dir)(L<void* compiler|SPVM::Document::NativeAPI::Compiler>, const char* include_dir);>
Prepends I<include_dir> to the class search directory.
=head2 compile_anon_class
C<int32_t (*compile_anon_class)(L<void* compiler|SPVM::Document::NativeAPI::Compiler>, const char* source, const char** anon_basic_type_name_ptr);>
Compiles an SPVM anon class given the source code I<source>. Classes loaded by the class and classes subsequently loaded are also compiled.
The L<runtime|/"get_runtime"> is build.
If the compilation is successful, returns 0. Otherwise, returns a non-zero value.
The generated anon class name is set to the value referenced by I<anon_basic_type_name_ptr>.
This native API can be called repeatedly to compile other classes.
=head1 Native API IDs
0 new_instance
1 free_instance
2 get_start_line
3 set_start_line
4 get_start_file
5 set_start_file
6 get_include_dirs_length
7 get_include_dir
8 add_include_dir
9 clear_include_dirs
10 add_class_file
11 delete_class_file
12 get_class_file
13 compile
14 get_error_message
15 get_error_messages_length
16 get_runtime
17 prepend_include_dir
18 compile_anon_class
=head1 See Also
=over 2
=item * L<SPVM::Document::NativeAPI>
=item * L<SPVM::Document::NativeAPI::ClassFile>
=item * L<SPVM::Document::NativeAPI::Runtime>
=item * L<SPVM::Document::NativeClass>
=item * L<SPVM::Document>
=back
=head1 Copyright & License
Copyright (c) 2023 Yuki Kimoto
MIT License