Skip to content

Commit

Permalink
Make namespace keyword refer to the current namespace
Browse files Browse the repository at this point in the history
  • Loading branch information
positively-charged committed Jan 11, 2017
1 parent 37fbf02 commit 3204307
Show file tree
Hide file tree
Showing 6 changed files with 45 additions and 7 deletions.
2 changes: 2 additions & 0 deletions src/parse/dec.c
Original file line number Diff line number Diff line change
Expand Up @@ -225,6 +225,7 @@ bool is_dec_bcs( struct parse* parse ) {
return true;
case TK_ID:
case TK_UPMOST:
case TK_NAMESPACE:
return p_peek_type_path( parse );
default:
return false;
Expand Down Expand Up @@ -874,6 +875,7 @@ void read_spec( struct parse* parse, struct spec_reading* spec ) {
break;
case TK_ID:
case TK_UPMOST:
case TK_NAMESPACE:
case TK_TYPENAME:
spec->type = SPEC_NAME;
spec->path = p_read_type_path( parse );
Expand Down
14 changes: 13 additions & 1 deletion src/parse/expr.c
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,8 @@ static void read_string( struct parse* parse, struct expr_reading* reading );
static void read_boolean( struct parse* parse, struct expr_reading* reading );
static void read_null( struct parse* parse, struct expr_reading* reading );
static void read_upmost( struct parse* parse, struct expr_reading* reading );
static void read_current_namespace( struct parse* parse,
struct expr_reading* reading );
static int convert_numerictoken_to_int( struct parse* parse, int base );
static int extract_radix_literal( struct parse* parse );
static void read_sure( struct parse* parse, struct expr_reading* reading );
Expand Down Expand Up @@ -563,6 +565,9 @@ void read_primary( struct parse* parse, struct expr_reading* reading ) {
case TK_UPMOST:
read_upmost( parse, reading );
break;
case TK_NAMESPACE:
read_current_namespace( parse, reading );
break;
case TK_STRCPY:
read_strcpy( parse, reading );
break;
Expand Down Expand Up @@ -653,14 +658,21 @@ void read_null( struct parse* parse, struct expr_reading* reading ) {
reading->node = &node;
}


void read_upmost( struct parse* parse, struct expr_reading* reading ) {
static struct node node = { NODE_UPMOST };
reading->node = &node;
p_test_tk( parse, TK_UPMOST );
p_read_tk( parse );
}

void read_current_namespace( struct parse* parse,
struct expr_reading* reading ) {
static struct node node = { NODE_CURRENTNAMESPACE };
reading->node = &node;
p_test_tk( parse, TK_NAMESPACE );
p_read_tk( parse );
}

int p_extract_literal_value( struct parse* parse ) {
if ( parse->tk == TK_LIT_DECIMAL ) {
return convert_numerictoken_to_int( parse, 10 );
Expand Down
17 changes: 11 additions & 6 deletions src/parse/library.c
Original file line number Diff line number Diff line change
Expand Up @@ -103,13 +103,8 @@ void read_module_item( struct parse* parse ) {
case TK_HASH:
read_pseudo_dirc( parse, false );
break;
case TK_STRICT:
case TK_NAMESPACE:
read_namespace( parse );
break;
default:
read_namespace_member( parse );
break;
}
break;
}
Expand Down Expand Up @@ -380,6 +375,10 @@ struct path* p_read_path( struct parse* parse ) {
path->upmost = true;
p_read_tk( parse );
}
else if ( parse->tk == TK_NAMESPACE ) {
path->current_ns = true;
p_read_tk( parse );
}
else {
p_test_tk( parse, TK_ID );
path->text = parse->tk_text;
Expand All @@ -406,6 +405,7 @@ struct path* alloc_path( struct pos pos ) {
path->text = "";
path->pos = pos;
path->upmost = false;
path->current_ns = false;
return path;
}

Expand All @@ -415,7 +415,8 @@ bool p_peek_type_path( struct parse* parse ) {
}
else if (
parse->tk == TK_ID ||
parse->tk == TK_UPMOST ) {
parse->tk == TK_UPMOST ||
parse->tk == TK_NAMESPACE ) {
struct parsertk_iter iter;
p_init_parsertk_iter( parse, &iter );
p_next_tk( parse, &iter );
Expand Down Expand Up @@ -452,6 +453,10 @@ struct path* p_read_type_path( struct parse* parse ) {
path->upmost = true;
p_read_tk( parse );
}
else if ( parse->tk == TK_NAMESPACE ) {
path->current_ns = true;
p_read_tk( parse );
}
else {
p_test_tk( parse, TK_ID );
path->text = parse->tk_text;
Expand Down
10 changes: 10 additions & 0 deletions src/semantic/expr.c
Original file line number Diff line number Diff line change
Expand Up @@ -209,6 +209,8 @@ static void test_anon_func( struct semantic* semantic, struct result* result,
static void test_paren( struct semantic* semantic, struct expr_test* test,
struct result* result, struct paren* paren );
static void test_upmost( struct semantic* semantic, struct result* result );
static void test_current_namespace( struct semantic* semantic,
struct result* result );
static void init_type_info( struct semantic* semantic, struct type_info* type,
struct result* result );
static bool is_value_type( struct semantic* semantic, struct result* result );
Expand Down Expand Up @@ -2177,6 +2179,9 @@ void test_primary( struct semantic* semantic, struct expr_test* test,
case NODE_UPMOST:
test_upmost( semantic, result );
break;
case NODE_CURRENTNAMESPACE:
test_current_namespace( semantic, result );
break;
case NODE_NULL:
result->null = true;
result->complete = true;
Expand Down Expand Up @@ -2891,6 +2896,11 @@ void test_upmost( struct semantic* semantic, struct result* result ) {
result->object = &semantic->task->upmost_ns->object;
}

void test_current_namespace( struct semantic* semantic,
struct result* result ) {
result->object = &semantic->ns->object;
}

void init_type_info( struct semantic* semantic, struct type_info* type,
struct result* result ) {
if ( result->func ) {
Expand Down
7 changes: 7 additions & 0 deletions src/semantic/phase.c
Original file line number Diff line number Diff line change
Expand Up @@ -765,6 +765,10 @@ void s_follow_path( struct semantic* semantic, struct follower* follower ) {
ns = semantic->task->upmost_ns;
path = path->next;
}
else if ( path->current_ns ) {
ns = semantic->ns;
path = path->next;
}
else {
struct object_search search;
s_init_object_search( &search, NODE_NONE, &path->pos, path->text );
Expand Down Expand Up @@ -807,6 +811,9 @@ void s_follow_path( struct semantic* semantic, struct follower* follower ) {
if ( path->upmost ) {
object = &semantic->task->upmost_ns->object;
}
else if ( path->current_ns ) {
object = &semantic->ns->object;
}
else {
struct object_search search;
s_init_object_search( &search, follower->requested_node, &path->pos,
Expand Down
2 changes: 2 additions & 0 deletions src/task.h
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,7 @@ struct node {
NODE_NAMESPACEFRAGMENT,
// 50
NODE_UPMOST,
NODE_CURRENTNAMESPACE,
NODE_USING,
NODE_MEMCPY,
NODE_CONVERSION,
Expand Down Expand Up @@ -146,6 +147,7 @@ struct path {
const char* text;
struct pos pos;
bool upmost;
bool current_ns;
};

enum {
Expand Down

0 comments on commit 3204307

Please sign in to comment.