mirror of
https://github.com/Ed94/refactor.git
synced 2024-11-10 04:14:53 -08:00
Non-include refactors work. Multi-file works.
This commit is contained in:
parent
97967e56d9
commit
d0fad572bc
@ -8,6 +8,7 @@ Refactor c/c++ files (and problably others) with ease.
|
|||||||
* `-src` : Source file to refactor
|
* `-src` : Source file to refactor
|
||||||
* `-dst` : Destination file after the refactor (omit to use the same as source)
|
* `-dst` : Destination file after the refactor (omit to use the same as source)
|
||||||
* `-spec` : Specification containing rules to use for the refactor.
|
* `-spec` : Specification containing rules to use for the refactor.
|
||||||
|
* `-debug` : Use only if on debug build and desire to attach to process.
|
||||||
|
|
||||||
## Syntax :
|
## Syntax :
|
||||||
|
|
||||||
@ -45,3 +46,4 @@ TODO:
|
|||||||
* Test to see how much needs to be ported for other platforms (if at all)
|
* Test to see how much needs to be ported for other platforms (if at all)
|
||||||
* Setup as api.
|
* Setup as api.
|
||||||
* Provide binaries in the release page for github. (debug and release builds)
|
* Provide binaries in the release page for github. (debug and release builds)
|
||||||
|
* Directive to ignore comments (with a way to specify the comment signature). Right now comments that meet the signature of words or namespaces are refactored.
|
||||||
|
@ -9,7 +9,7 @@ namespace Memory
|
|||||||
|
|
||||||
void setup()
|
void setup()
|
||||||
{
|
{
|
||||||
zpl_arena_init_from_allocator( & Global_Arena, zpl_heap(), zpl_megabytes(2) );
|
zpl_arena_init_from_allocator( & Global_Arena, zpl_heap(), Initial_Reserve );
|
||||||
|
|
||||||
if ( Global_Arena.total_size == 0 )
|
if ( Global_Arena.total_size == 0 )
|
||||||
{
|
{
|
||||||
|
@ -18,7 +18,8 @@ namespace IO
|
|||||||
uw Current_Size = 0;
|
uw Current_Size = 0;
|
||||||
uw Largest_Src_Size = 0;
|
uw Largest_Src_Size = 0;
|
||||||
|
|
||||||
zpl_arena MemPerist;
|
zpl_arena MemSpec;
|
||||||
|
zpl_arena MemSrc;
|
||||||
}
|
}
|
||||||
using namespace StaticData;
|
using namespace StaticData;
|
||||||
|
|
||||||
@ -49,16 +50,17 @@ namespace IO
|
|||||||
|
|
||||||
zpl_file_close( & src );
|
zpl_file_close( & src );
|
||||||
}
|
}
|
||||||
while ( left--, left > 1 );
|
while ( path++, left--, left > 1 );
|
||||||
|
|
||||||
uw persist_size = ZPL_ARRAY_GROW_FORMULA( Largest_Src_Size );
|
uw persist_size = Largest_Src_Size * 2 + 8;
|
||||||
|
|
||||||
zpl_arena_init_from_allocator( & MemPerist, zpl_heap(), persist_size );
|
zpl_arena_init_from_allocator( & MemSrc, zpl_heap(), persist_size );
|
||||||
}
|
}
|
||||||
|
|
||||||
void cleanup()
|
void cleanup()
|
||||||
{
|
{
|
||||||
zpl_arena_free( & MemPerist );
|
zpl_arena_free( & MemSpec );
|
||||||
|
zpl_arena_free( & MemSrc );
|
||||||
}
|
}
|
||||||
|
|
||||||
Array_Line get_specification()
|
Array_Line get_specification()
|
||||||
@ -78,22 +80,23 @@ namespace IO
|
|||||||
fatal("No content in specificaiton to process");
|
fatal("No content in specificaiton to process");
|
||||||
}
|
}
|
||||||
|
|
||||||
char* content = rcast( char*, zpl_alloc( zpl_arena_allocator( & MemPerist), fsize + 1) );
|
zpl_arena_init_from_allocator( & MemSpec, zpl_heap(), fsize * 2 + 8 );
|
||||||
|
|
||||||
|
char* content = rcast( char*, zpl_alloc( zpl_arena_allocator( & MemSpec), fsize + 1) );
|
||||||
|
|
||||||
zpl_file_read( & file, content, fsize);
|
zpl_file_read( & file, content, fsize);
|
||||||
zpl_file_close( & file );
|
zpl_file_close( & file );
|
||||||
|
|
||||||
content[fsize] = 0;
|
content[fsize] = 0;
|
||||||
|
|
||||||
Array_Line lines = zpl_str_split_lines( zpl_arena_allocator( & MemPerist ), content, false );
|
Array_Line lines = zpl_str_split_lines( zpl_arena_allocator( & MemSpec ), content, false );
|
||||||
return lines;
|
return lines;
|
||||||
}
|
}
|
||||||
|
|
||||||
char* get_next_source()
|
char* get_next_source()
|
||||||
{
|
{
|
||||||
zpl_memset( MemPerist.physical_start, 0, MemPerist.total_allocated);
|
zpl_memset( MemSrc.physical_start, 0, MemSrc.total_allocated);
|
||||||
MemPerist.total_allocated = 0;
|
zpl_free_all( zpl_arena_allocator( & MemSrc) );
|
||||||
MemPerist.temp_count = 0;
|
|
||||||
|
|
||||||
Current++;
|
Current++;
|
||||||
|
|
||||||
@ -111,7 +114,7 @@ namespace IO
|
|||||||
if ( Current_Size <= 0 )
|
if ( Current_Size <= 0 )
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
||||||
Current_Content = rcast( char* , zpl_alloc( zpl_arena_allocator( & MemPerist), Current_Size + 1) );
|
Current_Content = rcast( char* , zpl_alloc( zpl_arena_allocator( & MemSrc), Current_Size + 1) );
|
||||||
|
|
||||||
zpl_file_read( & file, Current_Content, Current_Size );
|
zpl_file_read( & file, Current_Content, Current_Size );
|
||||||
zpl_file_close( & file );
|
zpl_file_close( & file );
|
||||||
@ -138,7 +141,6 @@ namespace IO
|
|||||||
}
|
}
|
||||||
|
|
||||||
zpl_file_write( & file_dest, refacotred, zpl_string_length(refacotred) );
|
zpl_file_write( & file_dest, refacotred, zpl_string_length(refacotred) );
|
||||||
|
|
||||||
zpl_file_close( & file_dest );
|
zpl_file_close( & file_dest );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -38,15 +38,30 @@ namespace Spec
|
|||||||
|
|
||||||
// Helper function for process().
|
// Helper function for process().
|
||||||
forceinline
|
forceinline
|
||||||
void find_next_token( zpl_string& token, char*& line, u32& length )
|
void find_next_token( Tok& type, zpl_string& token, char*& line, u32& length )
|
||||||
{
|
{
|
||||||
zpl_string_clear( token );
|
zpl_string_clear( token );
|
||||||
length = 0;
|
length = 0;
|
||||||
|
|
||||||
while ( zpl_char_is_alphanumeric( line[length] ) || line[length] == '_' )
|
#define current line[length]
|
||||||
|
if (type == Tok::Include)
|
||||||
|
{
|
||||||
|
// Allows for '.'
|
||||||
|
while ( zpl_char_is_alphanumeric( current )
|
||||||
|
|| current == '_'
|
||||||
|
|| current == '.' )
|
||||||
{
|
{
|
||||||
length++;
|
length++;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
while ( zpl_char_is_alphanumeric( current ) || current == '_' )
|
||||||
|
{
|
||||||
|
length++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#undef current
|
||||||
|
|
||||||
if ( length == 0 )
|
if ( length == 0 )
|
||||||
{
|
{
|
||||||
@ -120,14 +135,14 @@ namespace Spec
|
|||||||
}
|
}
|
||||||
|
|
||||||
u32 length = 0;
|
u32 length = 0;
|
||||||
|
|
||||||
// Find a valid token
|
|
||||||
find_next_token( token, line, length );
|
|
||||||
|
|
||||||
Tok type = Tok::Num_Tok;
|
Tok type = Tok::Num_Tok;
|
||||||
bool ignore = false;
|
bool ignore = false;
|
||||||
Entry entry {};
|
Entry entry {};
|
||||||
|
|
||||||
|
|
||||||
|
// Find a valid token
|
||||||
|
find_next_token( type, token, line, length );
|
||||||
|
|
||||||
// Will be reguarded as an ignore.
|
// Will be reguarded as an ignore.
|
||||||
if ( is_tok( Tok::Not, token, length ))
|
if ( is_tok( Tok::Not, token, length ))
|
||||||
{
|
{
|
||||||
@ -143,7 +158,7 @@ namespace Spec
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Find the category token
|
// Find the category token
|
||||||
find_next_token( token, line, length );
|
find_next_token( type, token, line, length );
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( is_tok( Tok::Word, token, length ) )
|
if ( is_tok( Tok::Word, token, length ) )
|
||||||
@ -175,7 +190,7 @@ namespace Spec
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
find_next_token( token, line, length );
|
find_next_token( type, token, line, length );
|
||||||
|
|
||||||
// First argument is signature.
|
// First argument is signature.
|
||||||
entry.Sig = zpl_string_make_length( g_allocator, token, length );
|
entry.Sig = zpl_string_make_length( g_allocator, token, length );
|
||||||
@ -285,7 +300,7 @@ namespace Spec
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
find_next_token( token, line, length );
|
find_next_token( type, token, line, length );
|
||||||
|
|
||||||
// Second argument is substitute.
|
// Second argument is substitute.
|
||||||
entry.Sub = zpl_string_make_length( g_allocator, token, length );
|
entry.Sub = zpl_string_make_length( g_allocator, token, length );
|
||||||
|
@ -90,6 +90,8 @@ ct char const* Msg_Invalid_Value = "INVALID VALUE PROVIDED";
|
|||||||
|
|
||||||
namespace Memory
|
namespace Memory
|
||||||
{
|
{
|
||||||
|
ct uw Initial_Reserve = zpl_megabytes(2);
|
||||||
|
|
||||||
extern zpl_arena Global_Arena;
|
extern zpl_arena Global_Arena;
|
||||||
#define g_allocator zpl_arena_allocator( & Memory::Global_Arena)
|
#define g_allocator zpl_arena_allocator( & Memory::Global_Arena)
|
||||||
|
|
||||||
|
@ -9,16 +9,28 @@
|
|||||||
void parse_options( int num, char** arguments )
|
void parse_options( int num, char** arguments )
|
||||||
{
|
{
|
||||||
zpl_opts opts;
|
zpl_opts opts;
|
||||||
zpl_opts_init( & opts, g_allocator, "refactor");
|
zpl_opts_init( & opts, zpl_heap(), "refactor");
|
||||||
zpl_opts_add( & opts, "num", "num" , "Number of files to refactor" , ZPL_OPTS_INT );
|
zpl_opts_add( & opts, "num", "num" , "Number of files to refactor" , ZPL_OPTS_INT );
|
||||||
zpl_opts_add( & opts, "src" , "src" , "File/s to refactor" , ZPL_OPTS_STRING);
|
zpl_opts_add( & opts, "src" , "src" , "File/s to refactor" , ZPL_OPTS_STRING);
|
||||||
zpl_opts_add( & opts, "dst" , "dst" , "File/s post refactor" , ZPL_OPTS_STRING);
|
zpl_opts_add( & opts, "dst" , "dst" , "File/s post refactor" , ZPL_OPTS_STRING);
|
||||||
zpl_opts_add( & opts, "spec", "spec", "Specification for refactoring", ZPL_OPTS_STRING);
|
zpl_opts_add( & opts, "spec", "spec", "Specification for refactoring", ZPL_OPTS_STRING);
|
||||||
|
|
||||||
|
#if Build_Debug
|
||||||
|
zpl_opts_add( & opts, "debug", "debug", "Allows for wait to attach", ZPL_OPTS_FLAG);
|
||||||
|
#endif
|
||||||
|
|
||||||
if (opts_custom_compile( & opts, num, arguments))
|
if (opts_custom_compile( & opts, num, arguments))
|
||||||
{
|
{
|
||||||
sw num = 0;
|
sw num = 0;
|
||||||
|
|
||||||
|
#if Build_Debug
|
||||||
|
if ( zpl_opts_has_arg( & opts, "debug" ) )
|
||||||
|
{
|
||||||
|
zpl_printf("Will wait (pause available for attachment)");
|
||||||
|
char pause = getchar();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
if ( zpl_opts_has_arg( & opts, "num" ) )
|
if ( zpl_opts_has_arg( & opts, "num" ) )
|
||||||
{
|
{
|
||||||
num = zpl_opts_integer( & opts, "num", -1 );
|
num = zpl_opts_integer( & opts, "num", -1 );
|
||||||
@ -158,7 +170,7 @@ zpl_arena Refactor_Buffer;
|
|||||||
|
|
||||||
void refactor()
|
void refactor()
|
||||||
{
|
{
|
||||||
ct static char const* include_sig = "#include \"";
|
ct static char const* include_sig = "include";
|
||||||
|
|
||||||
struct Token
|
struct Token
|
||||||
{
|
{
|
||||||
@ -220,12 +232,23 @@ void refactor()
|
|||||||
if ( include_sig[0] != src[0] )
|
if ( include_sig[0] != src[0] )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
if ( zpl_strncmp( include_sig, src, sizeof(include_sig) - 1 ) != 0 )
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
src += sizeof(include_sig) - 1;
|
||||||
|
|
||||||
|
// Ignore whitespace
|
||||||
|
while ( zpl_char_is_space( src[0] ) || src[0] == '\"' || src[0] == '<' )
|
||||||
|
{
|
||||||
|
src++;
|
||||||
|
}
|
||||||
|
|
||||||
u32 sig_length = zpl_string_length( ignore->Sig );
|
u32 sig_length = zpl_string_length( ignore->Sig );
|
||||||
|
|
||||||
current = zpl_string_set( current, include_sig );
|
zpl_string_clear( current );
|
||||||
current = zpl_string_append_length( current, src, sig_length );
|
current = zpl_string_append_length( current, ignore->Sig, sig_length );
|
||||||
current = zpl_string_append_length( current, "\"", 1 );
|
|
||||||
// Formats current into: #include "<ignore->Sig>"
|
|
||||||
|
|
||||||
if ( zpl_string_are_equal( ignore->Sig, current ) )
|
if ( zpl_string_are_equal( ignore->Sig, current ) )
|
||||||
{
|
{
|
||||||
@ -233,7 +256,8 @@ void refactor()
|
|||||||
|
|
||||||
const sw length = zpl_string_length( current );
|
const sw length = zpl_string_length( current );
|
||||||
|
|
||||||
move_forward( length );
|
// The + 1 is for the closing " or > of the include
|
||||||
|
move_forward( length + 1 );
|
||||||
|
|
||||||
// Force end of line.
|
// Force end of line.
|
||||||
while ( src[0] != '\n' )
|
while ( src[0] != '\n' )
|
||||||
@ -332,21 +356,30 @@ void refactor()
|
|||||||
if ( include_sig[0] != src[0] )
|
if ( include_sig[0] != src[0] )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
if ( zpl_strncmp( include_sig, src, sizeof(include_sig) - 1 ) != 0 )
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
src += sizeof(include_sig) - 1;
|
||||||
|
|
||||||
|
// Ignore whitespace
|
||||||
|
while ( zpl_char_is_space( src[0] ) || src[0] == '\"' || src[0] == '<' )
|
||||||
|
{
|
||||||
|
src++;
|
||||||
|
}
|
||||||
|
|
||||||
u32 sig_length = zpl_string_length( include->Sig );
|
u32 sig_length = zpl_string_length( include->Sig );
|
||||||
|
|
||||||
current = zpl_string_set( current, include_sig );
|
zpl_string_clear( current );
|
||||||
current = zpl_string_append_length( current, src, sig_length );
|
current = zpl_string_append_length( current, include->Sig, sig_length );
|
||||||
current = zpl_string_append_length( current, "\"", 1 );
|
|
||||||
// Formats current into: #include "<ignore->Sig>"
|
|
||||||
|
|
||||||
if ( zpl_string_are_equal( include->Sig, current ) )
|
if ( zpl_string_are_equal( include->Sig, current ) )
|
||||||
{
|
{
|
||||||
Token entry {};
|
Token entry {};
|
||||||
|
|
||||||
const sw length = zpl_string_length( current );
|
|
||||||
|
|
||||||
entry.Start = pos;
|
entry.Start = pos;
|
||||||
entry.End = pos + length;
|
entry.End = pos + sig_length;
|
||||||
entry.Sig = include->Sig;
|
entry.Sig = include->Sig;
|
||||||
|
|
||||||
if ( include->Sub != nullptr )
|
if ( include->Sub != nullptr )
|
||||||
@ -359,10 +392,10 @@ void refactor()
|
|||||||
|
|
||||||
log_fmt("\nFound %-81s line %d, column %d", current, line, col );
|
log_fmt("\nFound %-81s line %d, column %d", current, line, col );
|
||||||
|
|
||||||
move_forward( length );
|
move_forward( sig_length );
|
||||||
|
|
||||||
// Force end of line.
|
// Force end of line.
|
||||||
while ( src[0] != '\0' )
|
while ( src[0] != '\n' )
|
||||||
{
|
{
|
||||||
move_forward( 1 );
|
move_forward( 1 );
|
||||||
}
|
}
|
||||||
@ -486,14 +519,19 @@ void refactor()
|
|||||||
}
|
}
|
||||||
while ( --left );
|
while ( --left );
|
||||||
|
|
||||||
|
if (zpl_array_count( tokens ) == 0)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// Prep data for building the content
|
// Prep data for building the content
|
||||||
left = zpl_array_count( tokens);
|
left = zpl_array_count( tokens);
|
||||||
|
|
||||||
char* content = IO::Current_Content;
|
char* content = IO::Current_Content;
|
||||||
|
|
||||||
|
zpl_string refactored = zpl_string_make_reserve( zpl_arena_allocator( & Refactor_Buffer ), buffer_size );
|
||||||
|
|
||||||
// Generate the refactored file content.
|
// Generate the refactored file content.
|
||||||
static zpl_string
|
|
||||||
refactored = zpl_string_make_reserve( zpl_arena_allocator( & Refactor_Buffer ), buffer_size );
|
|
||||||
{
|
{
|
||||||
Token* entry = tokens;
|
Token* entry = tokens;
|
||||||
sw previous_end = 0;
|
sw previous_end = 0;
|
||||||
@ -521,7 +559,7 @@ void refactor()
|
|||||||
previous_end = entry->End;
|
previous_end = entry->End;
|
||||||
entry++;
|
entry++;
|
||||||
}
|
}
|
||||||
while ( --left );
|
while ( --left > 0 );
|
||||||
|
|
||||||
entry--;
|
entry--;
|
||||||
|
|
||||||
@ -533,7 +571,7 @@ void refactor()
|
|||||||
|
|
||||||
IO::write( refactored );
|
IO::write( refactored );
|
||||||
|
|
||||||
zpl_string_clear( refactored );
|
zpl_free_all( zpl_arena_allocator( & Refactor_Buffer ));
|
||||||
}
|
}
|
||||||
|
|
||||||
int main( int num, char** arguments )
|
int main( int num, char** arguments )
|
||||||
|
Loading…
Reference in New Issue
Block a user