From: Rico Tzschichholz Date: Tue, 9 Jan 2018 15:21:06 +0000 (+0100) Subject: vala: Rename Loop to LoopStatement and introduce a common base class X-Git-Tag: 0.51.1~31 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b3ee5b0fffc7ab7f5d070bfde5bf8bb1d661b5e8;p=thirdparty%2Fvala.git vala: Rename Loop to LoopStatement and introduce a common base class --- diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala index 0f501fc2e..c7ef8c9a3 100644 --- a/codegen/valaccodebasemodule.vala +++ b/codegen/valaccodebasemodule.vala @@ -3950,13 +3950,13 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator { append_scope_free (sym, stop_at); if (jump_stmt is BreakStatement) { - if (b.parent_node is Loop || + if (b.parent_node is LoopStatement || b.parent_node is ForeachStatement || b.parent_node is SwitchStatement) { return; } } else if (jump_stmt is ContinueStatement) { - if (b.parent_node is Loop || + if (b.parent_node is LoopStatement || b.parent_node is ForeachStatement) { return; } diff --git a/codegen/valaccodecontrolflowmodule.vala b/codegen/valaccodecontrolflowmodule.vala index dbf64b759..5cca19707 100644 --- a/codegen/valaccodecontrolflowmodule.vala +++ b/codegen/valaccodecontrolflowmodule.vala @@ -205,7 +205,7 @@ public abstract class Vala.CCodeControlFlowModule : CCodeMethodModule { } } - public override void visit_loop (Loop stmt) { + public override void visit_loop_statement (LoopStatement stmt) { if (context.profile == Profile.GOBJECT) { ccode.open_while (new CCodeConstant ("TRUE")); } else { diff --git a/vala/Makefile.am b/vala/Makefile.am index 542c24f4d..09f3c0672 100644 --- a/vala/Makefile.am +++ b/vala/Makefile.am @@ -111,6 +111,7 @@ libvala_la_VALASOURCES = \ valalockable.vala \ valalockstatement.vala \ valaloop.vala \ + valaloopstatement.vala \ valamarkupreader.vala \ valamemberaccess.vala \ valamemberinitializer.vala \ diff --git a/vala/valacodevisitor.vala b/vala/valacodevisitor.vala index f47f96349..598d15c04 100644 --- a/vala/valacodevisitor.vala +++ b/vala/valacodevisitor.vala @@ -297,7 +297,7 @@ public abstract class Vala.CodeVisitor { * * @param stmt a loop */ - public virtual void visit_loop (Loop stmt) { + public virtual void visit_loop_statement (LoopStatement stmt) { } /** diff --git a/vala/valacodewriter.vala b/vala/valacodewriter.vala index 0f624c010..944451e41 100644 --- a/vala/valacodewriter.vala +++ b/vala/valacodewriter.vala @@ -1081,7 +1081,7 @@ public class Vala.CodeWriter : CodeVisitor { } } - public override void visit_loop (Loop stmt) { + public override void visit_loop_statement (LoopStatement stmt) { write_indent (); write_string ("loop"); stmt.body.accept (this); diff --git a/vala/valadostatement.vala b/vala/valadostatement.vala index 80df5849e..5605e1a01 100644 --- a/vala/valadostatement.vala +++ b/vala/valadostatement.vala @@ -25,48 +25,17 @@ using GLib; /** * Represents a do iteration statement in the source code. */ -public class Vala.DoStatement : CodeNode, Statement { - /** - * Specifies the loop body. - */ - public Block body { - get { - return _body; - } - private set { - _body = value; - _body.parent_node = this; - } - } - - /** - * Specifies the loop condition. - */ - public Expression condition { - get { - return _condition; - } - private set { - _condition = value; - _condition.parent_node = this; - } - } - - private Expression _condition; - private Block _body; - +public class Vala.DoStatement : Loop, Statement { /** * Creates a new do statement. * - * @param body loop body * @param condition loop condition + * @param body loop body * @param source_reference reference to source code * @return newly created do statement */ - public DoStatement (Block body, Expression condition, SourceReference? source_reference = null) { - this.condition = condition; - this.source_reference = source_reference; - this.body = body; + public DoStatement (Expression condition, Block body, SourceReference? source_reference = null) { + base (condition, body, source_reference); } public override void accept (CodeVisitor visitor) { @@ -81,12 +50,6 @@ public class Vala.DoStatement : CodeNode, Statement { visitor.visit_end_full_expression (condition); } - public override void replace_expression (Expression old_node, Expression new_node) { - if (condition == old_node) { - condition = new_node; - } - } - public override bool check (CodeContext context) { if (checked) { return !error; @@ -98,7 +61,7 @@ public class Vala.DoStatement : CodeNode, Statement { // do not generate variable and if block if condition is always true if (condition.is_always_true ()) { - var loop = new Loop (body, source_reference); + var loop = new LoopStatement (body, source_reference); unowned Block parent_block = (Block) parent_node; parent_block.replace_statement (this, loop); @@ -127,7 +90,7 @@ public class Vala.DoStatement : CodeNode, Statement { body.insert_statement (0, first_if); body.insert_statement (1, new ExpressionStatement (new Assignment (new MemberAccess.simple (first_local.name, source_reference), new BooleanLiteral (false, source_reference), AssignmentOperator.SIMPLE, source_reference), source_reference)); - block.add_statement (new Loop (body, source_reference)); + block.add_statement (new LoopStatement (body, source_reference)); unowned Block parent_block = (Block) parent_node; parent_block.replace_statement (this, block); diff --git a/vala/valaflowanalyzer.vala b/vala/valaflowanalyzer.vala index a859d7b8b..a86bda42a 100644 --- a/vala/valaflowanalyzer.vala +++ b/vala/valaflowanalyzer.vala @@ -752,7 +752,7 @@ public class Vala.FlowAnalyzer : CodeVisitor { jump_stack.remove_at (jump_stack.size - 1); } - public override void visit_loop (Loop stmt) { + public override void visit_loop_statement (LoopStatement stmt) { if (unreachable (stmt)) { return; } diff --git a/vala/valaforstatement.vala b/vala/valaforstatement.vala index dc721163c..cb494444f 100644 --- a/vala/valaforstatement.vala +++ b/vala/valaforstatement.vala @@ -25,41 +25,10 @@ using GLib; /** * Represents a for iteration statement in the source code. */ -public class Vala.ForStatement : CodeNode, Statement { - /** - * Specifies the loop condition. - */ - public Expression? condition { - get { - return _condition; - } - private set { - _condition = value; - if (_condition != null) { - _condition.parent_node = this; - } - } - } - - /** - * Specifies the loop body. - */ - public Block body { - get { - return _body; - } - private set { - _body = value; - _body.parent_node = this; - } - } - +public class Vala.ForStatement : Loop, Statement { private List initializer = new ArrayList (); private List iterator = new ArrayList (); - private Expression _condition; - private Block _body; - /** * Creates a new for statement. * @@ -69,9 +38,7 @@ public class Vala.ForStatement : CodeNode, Statement { * @return newly created for statement */ public ForStatement (Expression? condition, Block body, SourceReference? source_reference = null) { - this.condition = condition; - this.body = body; - this.source_reference = source_reference; + base (condition, body, source_reference); } /** @@ -137,9 +104,8 @@ public class Vala.ForStatement : CodeNode, Statement { } public override void replace_expression (Expression old_node, Expression new_node) { - if (condition == old_node) { - condition = new_node; - } + base.replace_expression (old_node, new_node); + for (int i=0; i < initializer.size; i++) { if (initializer[i] == old_node) { initializer[i] = new_node; @@ -197,7 +163,7 @@ public class Vala.ForStatement : CodeNode, Statement { body.insert_statement (0, first_if); body.insert_statement (1, new ExpressionStatement (new Assignment (new MemberAccess.simple (first_local.name, source_reference), new BooleanLiteral (false, source_reference), AssignmentOperator.SIMPLE, source_reference), source_reference)); - block.add_statement (new Loop (body, source_reference)); + block.add_statement (new LoopStatement (body, source_reference)); unowned Block parent_block = (Block) parent_node; parent_block.replace_statement (this, block); diff --git a/vala/valagenieparser.vala b/vala/valagenieparser.vala index 239a72542..2b3537cf6 100644 --- a/vala/valagenieparser.vala +++ b/vala/valagenieparser.vala @@ -2111,7 +2111,7 @@ public class Vala.Genie.Parser : CodeVisitor { expect_terminator (); - return new DoStatement (body, condition, get_src (begin)); + return new DoStatement (condition, body, get_src (begin)); } diff --git a/vala/valaloop.vala b/vala/valaloop.vala index ce6894633..c9e16a21f 100644 --- a/vala/valaloop.vala +++ b/vala/valaloop.vala @@ -1,6 +1,6 @@ /* valaloop.vala * - * Copyright (C) 2009-2010 Jürg Billeter + * Copyright (C) 2021 Rico Tzschichholz * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -17,15 +17,28 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Author: - * Jürg Billeter + * Rico Tzschichholz */ -using GLib; - /** - * Represents an endless loop. + * Base class for all loop statements. */ -public class Vala.Loop : CodeNode, Statement { +public abstract class Vala.Loop : CodeNode { + /** + * Specifies the loop condition. + */ + public Expression? condition { + get { + return _condition; + } + private set { + _condition = value; + if (_condition != null) { + _condition.parent_node = this; + } + } + } + /** * Specifies the loop body. */ @@ -33,52 +46,24 @@ public class Vala.Loop : CodeNode, Statement { get { return _body; } - set { + private set { _body = value; _body.parent_node = this; } } - private Block _body; + Expression _condition; + Block _body; - /** - * Creates a new loop. - * - * @param body loop body - * @param source_reference reference to source code - * @return newly created while statement - */ - public Loop (Block body, SourceReference? source_reference = null) { + protected Loop (Expression? condition, Block body, SourceReference? source_reference = null) { + this.condition = condition; this.body = body; this.source_reference = source_reference; } - public override void accept (CodeVisitor visitor) { - visitor.visit_loop (this); - } - - public override void accept_children (CodeVisitor visitor) { - body.accept (visitor); - } - - public override void get_error_types (Collection collection, SourceReference? source_reference = null) { - body.get_error_types (collection, source_reference); - } - - public override bool check (CodeContext context) { - if (checked) { - return !error; + public override void replace_expression (Expression old_node, Expression new_node) { + if (condition == old_node) { + condition = new_node; } - - checked = true; - - body.check (context); - - return !error; - } - - public override void emit (CodeGenerator codegen) { - codegen.visit_loop (this); } } - diff --git a/vala/valaloopstatement.vala b/vala/valaloopstatement.vala new file mode 100644 index 000000000..8348d300c --- /dev/null +++ b/vala/valaloopstatement.vala @@ -0,0 +1,68 @@ +/* valaloopstatement.vala + * + * Copyright (C) 2009-2010 Jürg Billeter + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Author: + * Jürg Billeter + */ + +using GLib; + +/** + * Represents an endless loop. + */ +public class Vala.LoopStatement : Loop, Statement { + /** + * Creates a new loop. + * + * @param body loop body + * @param source_reference reference to source code + * @return newly created while statement + */ + public LoopStatement (Block body, SourceReference? source_reference = null) { + base (null, body, source_reference); + } + + public override void accept (CodeVisitor visitor) { + visitor.visit_loop_statement (this); + } + + public override void accept_children (CodeVisitor visitor) { + body.accept (visitor); + } + + public override void get_error_types (Collection collection, SourceReference? source_reference = null) { + body.get_error_types (collection, source_reference); + } + + public override bool check (CodeContext context) { + if (checked) { + return !error; + } + + checked = true; + + body.check (context); + + return !error; + } + + public override void emit (CodeGenerator codegen) { + codegen.visit_loop_statement (this); + } +} + diff --git a/vala/valaparser.vala b/vala/valaparser.vala index f54de7832..2c2db2d3a 100644 --- a/vala/valaparser.vala +++ b/vala/valaparser.vala @@ -2124,7 +2124,7 @@ public class Vala.Parser : CodeVisitor { var condition = parse_expression (); expect (TokenType.CLOSE_PARENS); expect (TokenType.SEMICOLON); - return new DoStatement (body, condition, get_src (begin)); + return new DoStatement (condition, body, get_src (begin)); } Statement parse_for_statement () throws ParseError { diff --git a/vala/valasymbolresolver.vala b/vala/valasymbolresolver.vala index 35d19d89d..b5594bfe0 100644 --- a/vala/valasymbolresolver.vala +++ b/vala/valasymbolresolver.vala @@ -562,7 +562,7 @@ public class Vala.SymbolResolver : CodeVisitor { label.accept_children (this); } - public override void visit_loop (Loop stmt) { + public override void visit_loop_statement (LoopStatement stmt) { if (stmt.checked) { return; } diff --git a/vala/valatraversevisitor.vala b/vala/valatraversevisitor.vala index c8e466481..34eb7a39a 100644 --- a/vala/valatraversevisitor.vala +++ b/vala/valatraversevisitor.vala @@ -198,7 +198,7 @@ public class Vala.TraverseVisitor : CodeVisitor { } } - public override void visit_loop (Loop loop) { + public override void visit_loop_statement (LoopStatement loop) { if (func (loop) == TraverseStatus.CONTINUE) { loop.accept_children (this); } diff --git a/vala/valawhilestatement.vala b/vala/valawhilestatement.vala index 161252219..be9237242 100644 --- a/vala/valawhilestatement.vala +++ b/vala/valawhilestatement.vala @@ -25,36 +25,7 @@ using GLib; /** * Represents a while iteration statement in the source code. */ -public class Vala.WhileStatement : CodeNode, Statement { - /** - * Specifies the loop condition. - */ - public Expression condition { - get { - return _condition; - } - private set { - _condition = value; - _condition.parent_node = this; - } - } - - /** - * Specifies the loop body. - */ - public Block body { - get { - return _body; - } - private set { - _body = value; - _body.parent_node = this; - } - } - - private Expression _condition; - private Block _body; - +public class Vala.WhileStatement : Loop, Statement { /** * Creates a new while statement. * @@ -64,9 +35,7 @@ public class Vala.WhileStatement : CodeNode, Statement { * @return newly created while statement */ public WhileStatement (Expression condition, Block body, SourceReference? source_reference = null) { - this.body = body; - this.source_reference = source_reference; - this.condition = condition; + base (condition, body, source_reference); } public override void accept (CodeVisitor visitor) { @@ -81,12 +50,6 @@ public class Vala.WhileStatement : CodeNode, Statement { body.accept (visitor); } - public override void replace_expression (Expression old_node, Expression new_node) { - if (condition == old_node) { - condition = new_node; - } - } - public override bool check (CodeContext context) { if (checked) { return !error; @@ -109,7 +72,7 @@ public class Vala.WhileStatement : CodeNode, Statement { body.insert_statement (0, if_stmt); } - var loop = new Loop (body, source_reference); + var loop = new LoopStatement (body, source_reference); unowned Block parent_block = (Block) parent_node; parent_block.replace_statement (this, loop);