diff options
Diffstat (limited to 'vala/valaparser.vala')
-rw-r--r-- | vala/valaparser.vala | 23 |
1 files changed, 20 insertions, 3 deletions
diff --git a/vala/valaparser.vala b/vala/valaparser.vala index fdeedb7dc..dc10c33d5 100644 --- a/vala/valaparser.vala +++ b/vala/valaparser.vala @@ -31,6 +31,8 @@ public class Vala.Parser : CodeVisitor { CodeContext context; bool compiler_code = false; SourceReference? from_string_reference = null; + Expression[]? replacements = null; + int replacement_index = 0; // token buffer TokenInfo[] tokens; @@ -337,10 +339,12 @@ public class Vala.Parser : CodeVisitor { } } - public Expression? parse_expression_string (string str, SourceReference source_reference) { + public Expression? parse_expression_string (string str, owned Expression[]? replacements, SourceReference source_reference) { compiler_code = true; context = source_reference.file.context; from_string_reference = source_reference; + this.replacements = (owned) replacements; + replacement_index = 0; scanner = new Scanner.from_string (str, source_reference.file); index = -1; @@ -358,10 +362,12 @@ public class Vala.Parser : CodeVisitor { return null; } - public void parse_statements_string (string str, Block block, SourceReference source_reference) { + public void parse_statements_string (string str, Block block, owned Expression[]? replacements, SourceReference source_reference) { compiler_code = true; context = source_reference.file.context; from_string_reference = source_reference; + this.replacements = (owned) replacements; + replacement_index = 0; scanner = new Scanner.from_string (str, source_reference.file); index = -1; @@ -704,7 +710,18 @@ public class Vala.Parser : CodeVisitor { expr = parse_typeof_expression (); break; default: - expr = parse_simple_name (); + if (compiler_code && current () == TokenType.PERCENT) { + var begin2 = get_location (); + next (); + if (accept (TokenType.INTERR)) { + expr = replacements[replacement_index++]; + } else { + rollback (begin2); + expr = parse_simple_name (); + } + } else { + expr = parse_simple_name (); + } break; } |