2006-07-08 Jürg Billeter <j@bitron.ch>
+ * vala/valasemanticanalyzer.vala: check method signatures of overriding
+ methods
+ * vala/parser.y, vala/valaclassregisterfunction.vala,
+ vala/valatyperegisterfunction.vala: support abstract classes
+ * vala/valamethod.vala: add equals method
+ * vala/valatypereference.vala: add equals method
+ * corrects overriding methods to match signatures of overridden methods
+ to fix build with current compiler
+
+2006-07-08 Jürg Billeter <j@bitron.ch>
+
* vala/parser.y, vala/valacodegenerator.vala: adapt to ForStatement API
changes
* vala/valaclass.vala: make {get,set}_lower_case_csuffix methods private
*/
public CCodeExpression right { get; construct; }
- public override void write (CCodeWriter writer) {
+ public override void write (CCodeWriter! writer) {
if (left != null) {
left.write (writer);
}
public CCodeExpression left { get; construct; }
public CCodeExpression right { get; construct; }
- public override void write (CCodeWriter writer) {
+ public override void write (CCodeWriter! writer) {
if (left != null) {
left.write (writer);
}
statements.append (statement);
}
- public override void write (CCodeWriter writer) {
+ public override void write (CCodeWriter! writer) {
writer.write_begin_block ();
foreach (CCodeNode statement in statements) {
statement.write (writer);
namespace Vala {
public class CCodeBreakStatement : CCodeStatement {
- public override void write (CCodeWriter writer) {
+ public override void write (CCodeWriter! writer) {
writer.write_indent ();
writer.write_string ("break;");
writer.write_newline ();
public CCodeExpression expression { get; construct; }
List<CCodeStatement> statements;
- public void add_statement (CCodeStatement stmt) {
+ public void add_statement (CCodeStatement! stmt) {
statements.append (stmt);
}
- public override void write (CCodeWriter writer) {
+ public override void write (CCodeWriter! writer) {
writer.write_indent ();
writer.write_string ("case ");
expression.write (writer);
public class CCodeCommaExpression : CCodeExpression {
public List<CCodeExpression> inner;
- public override void write (CCodeWriter writer) {
+ public override void write (CCodeWriter! writer) {
bool first = true;
writer.write_string ("(");
public class CCodeComment : CCodeNode {
public string text { get; construct; }
- public override void write (CCodeWriter writer) {
+ public override void write (CCodeWriter! writer) {
writer.write_comment (text);
}
}
public CCodeExpression true_expression { get; construct; }
public CCodeExpression false_expression { get; construct; }
- public override void write (CCodeWriter writer) {
+ public override void write (CCodeWriter! writer) {
writer.write_string ("(");
condition.write (writer);
writer.write_string (" ? ");
public class CCodeConstant : CCodeExpression {
public string name { get; construct; }
- public override void write (CCodeWriter writer) {
+ public override void write (CCodeWriter! writer) {
writer.write_string (name);
}
}
namespace Vala {
public class CCodeContinueStatement : CCodeStatement {
- public override void write (CCodeWriter writer) {
+ public override void write (CCodeWriter! writer) {
writer.write_indent ();
writer.write_string ("continue;");
writer.write_newline ();
public CCodeModifiers modifiers;
List<CCodeDeclarator> declarators;
- public void add_declarator (CCodeDeclarator decl) {
+ public void add_declarator (CCodeDeclarator! decl) {
declarators.append (decl);
}
- public override void write (CCodeWriter writer) {
+ public override void write (CCodeWriter! writer) {
writer.write_indent ();
if ((modifiers & CCodeModifiers.STATIC) == CCodeModifiers.STATIC) {
writer.write_string ("static ");
namespace Vala {
public class CCodeEmptyStatement : CCodeStatement {
- public override void write (CCodeWriter writer) {
+ public override void write (CCodeWriter! writer) {
writer.write_indent ();
writer.write_string (";");
writer.write_newline ();
public string name { get; construct; }
List<string> values;
- public void add_value (string name, string value) {
+ public void add_value (string! name, string value = null) {
if (value == null) {
values.append (name);
} else {
}
}
- public override void write (CCodeWriter writer) {
+ public override void write (CCodeWriter! writer) {
if (name != null) {
writer.write_string ("typedef ");
}
public class CCodeExpressionStatement : CCodeStatement {
public CCodeExpression expression { get; construct; }
- public override void write (CCodeWriter writer) {
+ public override void write (CCodeWriter! writer) {
writer.write_indent ();
if (expression != null) {
expression.write (writer);
public string name { get; construct; }
public string type_name { get; construct; }
- public override void write (CCodeWriter writer) {
+ public override void write (CCodeWriter! writer) {
writer.write_string (type_name);
writer.write_string (" ");
writer.write_string (name);
List<CCodeExpression> initializer;
List<CCodeExpression> iterator;
- public void add_initializer (CCodeExpression expr) {
+ public void add_initializer (CCodeExpression! expr) {
initializer.append (expr);
}
- public void add_iterator (CCodeExpression expr) {
+ public void add_iterator (CCodeExpression! expr) {
iterator.append (expr);
}
- public override void write (CCodeWriter writer) {
+ public override void write (CCodeWriter! writer) {
bool first;
writer.write_indent ();
public class CCodeFragment : CCodeNode {
public GLib.List<CCodeNode> children { get; construct; }
- public void append (CCodeNode node) {
+ public void append (CCodeNode! node) {
_children.append (node);
}
- public override void write (CCodeWriter writer) {
+ public override void write (CCodeWriter! writer) {
foreach (CCodeNode node in children) {
node.write (writer);
}
List<CCodeFormalParameter> parameters;
public CCodeBlock block;
- public void add_parameter (CCodeFormalParameter param) {
+ public void add_parameter (CCodeFormalParameter!param) {
parameters.append (param);
}
- public ref CCodeFunction copy () {
+ public ref CCodeFunction! copy () {
var func = new CCodeFunction (name = name, return_type = return_type);
func.modifiers = modifiers;
return func;
}
- public override void write (CCodeWriter writer) {
+ public override void write (CCodeWriter! writer) {
writer.write_indent ();
if ((modifiers & CCodeModifiers.STATIC) == CCodeModifiers.STATIC) {
writer.write_string ("static ");
public string name { get; construct; }
List<CCodeFormalParameter> parameters;
- public void add_parameter (CCodeFormalParameter param) {
+ public void add_parameter (CCodeFormalParameter! param) {
parameters.append (param);
}
- public override void write (CCodeWriter writer) {
+ public override void write (CCodeWriter! writer) {
writer.write_string ("(*");
writer.write_string (name);
writer.write_string (") (");
public class CCodeIdentifier : CCodeExpression {
public string name { get; construct; }
- public override void write (CCodeWriter writer) {
+ public override void write (CCodeWriter! writer) {
writer.write_string (name);
}
}
public CCodeStatement false_statement { get; construct; }
public bool else_if;
- public override void write (CCodeWriter writer) {
+ public override void write (CCodeWriter! writer) {
if (!else_if) {
writer.write_indent ();
} else {
public class CCodeIncludeDirective : CCodeNode {
public string filename { get; construct; }
- public override void write (CCodeWriter writer) {
+ public override void write (CCodeWriter! writer) {
writer.write_indent ();
writer.write_string ("#include <");
writer.write_string (filename);
public class CCodeInitializerList : CCodeExpression {
List<CCodeExpression> initializers;
- public void append (CCodeExpression expr) {
+ public void append (CCodeExpression! expr) {
initializers.append (expr);
}
- public override void write (CCodeWriter writer) {
+ public override void write (CCodeWriter! writer) {
writer.write_string ("{");
bool first = true;
public string name { get; construct; }
public string replacement { get; construct; }
- public override void write (CCodeWriter writer) {
+ public override void write (CCodeWriter! writer) {
writer.write_indent ();
writer.write_string ("#define ");
writer.write_string (name);
public string member_name { get; construct; }
public bool is_pointer { get; construct; }
- public override void write (CCodeWriter writer) {
+ public override void write (CCodeWriter! writer) {
inner.write (writer);
if (is_pointer) {
writer.write_string ("->");
namespace Vala {
public class CCodeNewline : CCodeNode {
- public override void write (CCodeWriter writer) {
+ public override void write (CCodeWriter! writer) {
writer.write_newline ();
}
}
public class CCodeOnceSection : CCodeFragment {
public string define { get; construct; }
- public override void write (CCodeWriter writer) {
+ public override void write (CCodeWriter! writer) {
writer.write_indent ();
writer.write_string ("#ifndef ");
writer.write_string (define);
public class CCodeParenthesizedExpression : CCodeExpression {
public CCodeExpression inner { get; construct; }
- public override void write (CCodeWriter writer) {
+ public override void write (CCodeWriter! writer) {
writer.write_string ("(");
inner.write (writer);
public class CCodeReturnStatement : CCodeStatement {
public CCodeExpression return_expression { get; construct; }
- public override void write (CCodeWriter writer) {
+ public override void write (CCodeWriter! writer) {
writer.write_indent ();
writer.write_string ("return ");
public string name { get; construct; }
List<CCodeDeclaration> declarations;
- public void add_declaration (CCodeDeclaration decl) {
+ public void add_declaration (CCodeDeclaration! decl) {
declarations.append (decl);
}
- public void add_field (string type_name, string name) {
+ public void add_field (string! type_name, string! name) {
var decl = new CCodeDeclaration (type_name = type_name);
decl.add_declarator (new CCodeVariableDeclarator (name = name));
add_declaration (decl);
}
- public override void write (CCodeWriter writer) {
+ public override void write (CCodeWriter! writer) {
writer.write_string ("struct ");
writer.write_string (name);
writer.write_begin_block ();
public CCodeExpression expression { get; construct; }
List<CCodeCaseStatement> case_statements;
- public void add_case (CCodeCaseStatement case_stmt) {
+ public void add_case (CCodeCaseStatement! case_stmt) {
case_statements.append (case_stmt);
}
- public override void write (CCodeWriter writer) {
+ public override void write (CCodeWriter! writer) {
writer.write_indent ();
writer.write_string ("switch (");
expression.write (writer);
*/
public CCodeDeclarator declarator { get; set; }
- public override void write (CCodeWriter writer) {
+ public override void write (CCodeWriter! writer) {
writer.write_indent ();
writer.write_string ("typedef ");
public CCodeUnaryOperator operator { get; construct; }
public CCodeExpression inner { get; construct; }
- public override void write (CCodeWriter writer) {
+ public override void write (CCodeWriter! writer) {
if (operator == CCodeUnaryOperator.PLUS) {
writer.write_string ("+");
} else if (operator == CCodeUnaryOperator.MINUS) {
public string name { get; construct; }
public CCodeExpression initializer { get; construct; }
- public override void write (CCodeWriter writer) {
+ public override void write (CCodeWriter! writer) {
writer.write_string (name);
if (initializer != null) {
public CCodeExpression condition { get; construct; }
public CCodeStatement body { get; construct; }
- public override void write (CCodeWriter writer) {
+ public override void write (CCodeWriter! writer) {
writer.write_indent ();
writer.write_string ("while (");
if ($3 != 0) {
VALA_DATA_TYPE(current_class)->access = $3;
}
+ if (($4 & VALA_MODIFIER_ABSTRACT) == VALA_MODIFIER_ABSTRACT) {
+ vala_class_set_is_abstract (current_class, TRUE);
+ }
for (l = $8; l != NULL; l = l->next) {
vala_class_add_type_parameter (current_class, l->data);
g_object_unref (l->data);
visitor.visit_end_callback (this);
}
- public override string! get_cname () {
+ public override string get_cname () {
if (cname == null) {
cname = "%s%s".printf (@namespace.get_cprefix (), name);
}
return (new CastExpression (inner = inner, type_reference = type, source_reference = source));
}
- public override void accept (CodeVisitor visitor) {
+ public override void accept (CodeVisitor! visitor) {
inner.accept (visitor);
type_reference.accept (visitor);
return "%s%s%s".printf (@namespace.get_lower_case_cprefix (), infix, get_lower_case_csuffix ());
}
- public override ref string get_upper_case_cname (string! infix) {
+ public override ref string get_upper_case_cname (string infix) {
return get_lower_case_cname (infix).up ();
}
return class_reference.base_class.get_upper_case_cname ("TYPE_");
}
+ public override string get_type_flags () {
+ if (class_reference.is_abstract) {
+ return "G_TYPE_FLAG_ABSTRACT";
+ } else {
+ return "0";
+ }
+ }
+
public override ref CCodeFragment! get_type_interface_init_statements () {
var frag = new CCodeFragment ();
return (new Constant (name = name, type_reference = type, initializer = init, source_reference = source));
}
- public override void accept (CodeVisitor visitor) {
+ public override void accept (CodeVisitor! visitor) {
type_reference.accept (visitor);
initializer.accept (visitor);
* name or null
* @return the upper case name to be used in C code
*/
- public abstract ref string! get_upper_case_cname (string infix);
+ public abstract ref string get_upper_case_cname (string infix);
/**
* Returns the C name of this data type in lower case. Words are
* name or null
* @return the lower case name to be used in C code
*/
- public abstract ref string! get_lower_case_cname (string infix);
+ public abstract ref string get_lower_case_cname (string infix);
/**
* Returns a list of C header filenames users of this data type must
values.append (value);
}
- public override void accept (CodeVisitor visitor) {
+ public override void accept (CodeVisitor! visitor) {
visitor.visit_begin_enum (this);
foreach (EnumValue value in values) {
visitor.visit_end_flags (this);
}
- public override string! get_cname () {
+ public override string get_cname () {
if (cname == null) {
cname = "%s%s".printf (@namespace.get_cprefix (), name);
}
return cname;
}
- public override string! get_upper_case_cname (string infix) {
+ public override ref string get_upper_case_cname (string infix) {
return "%s%s".printf (@namespace.get_lower_case_cprefix (), Namespace.camel_case_to_lower_case (name)).up ();
}
return (new FormalParameter (ellipsis = true, source_reference = source));
}
- public override void accept (CodeVisitor visitor) {
+ public override void accept (CodeVisitor! visitor) {
if (!ellipsis) {
type_reference.accept (visitor);
}
return (new IfStatement (condition = cond, true_statement = true_stmt, false_statement = false_stmt, source_reference = source));
}
- public override void accept (CodeVisitor visitor) {
+ public override void accept (CodeVisitor! visitor) {
condition.accept (visitor);
visitor.visit_end_full_expression (condition);
return (new InitializerList (initializers = initializers, source_reference = source));
}
- public override void accept (CodeVisitor visitor) {
+ public override void accept (CodeVisitor! visitor) {
foreach (Expression expr in initializers) {
expr.accept (visitor);
}
private string cname;
private string lower_case_csuffix;
- public override string! get_cname () {
+ public override string get_cname () {
if (cname == null) {
cname = "%s%s".printf (@namespace.get_cprefix (), name);
}
this.lower_case_csuffix = csuffix;
}
- public override ref string! get_lower_case_cname (string infix) {
+ public override ref string get_lower_case_cname (string infix) {
if (infix == null) {
infix = "";
}
return "%s%s%s".printf (@namespace.get_lower_case_cprefix (), infix, get_lower_case_csuffix ());
}
- public override ref string! get_upper_case_cname (string infix) {
+ public override ref string get_upper_case_cname (string infix) {
return get_lower_case_cname (infix).up ();
}
*/
public Interface interface_reference { get; construct; }
- public override DataType get_type_declaration () {
+ public override DataType! get_type_declaration () {
return interface_reference;
}
- public override ref string get_type_struct_name () {
+ public override ref string! get_type_struct_name () {
return "%sInterface".printf (interface_reference.get_cname ());
}
- public override ref string get_class_init_func_name () {
+ public override ref string! get_class_init_func_name () {
return "NULL";
}
- public override ref string get_instance_struct_size () {
+ public override ref string! get_instance_struct_size () {
return "0";
}
- public override ref string get_instance_init_func_name () {
+ public override ref string! get_instance_init_func_name () {
return "NULL";
}
- public override ref string get_parent_type_name () {
+ public override ref string! get_parent_type_name () {
return "G_TYPE_INTERFACE";
}
stream = null;
}
- public override void visit_begin_source_file (SourceFile source_file) {
+ public override void visit_begin_source_file (SourceFile! source_file) {
current_cheader_filename = source_file.get_cheader_filename ();
}
- public override void visit_begin_namespace (Namespace ns) {
+ public override void visit_begin_namespace (Namespace! ns) {
if (ns.name == null) {
return;
}
write_begin_block ();
}
- public override void visit_end_namespace (Namespace ns) {
+ public override void visit_end_namespace (Namespace! ns) {
if (ns.name == null) {
return;
}
write_newline ();
}
- public override void visit_begin_class (Class cl) {
+ public override void visit_begin_class (Class! cl) {
if (cl.access != MemberAccessibility.PUBLIC) {
internal_scope = true;
return;
write_begin_block ();
}
- public override void visit_end_class (Class cl) {
+ public override void visit_end_class (Class! cl) {
if (cl.access != MemberAccessibility.PUBLIC) {
internal_scope = false;
return;
write_newline ();
}
- public override void visit_begin_struct (Struct st) {
+ public override void visit_begin_struct (Struct! st) {
if (st.access != MemberAccessibility.PUBLIC) {
internal_scope = true;
return;
write_begin_block ();
}
- public override void visit_end_struct (Struct st) {
+ public override void visit_end_struct (Struct! st) {
if (st.access != MemberAccessibility.PUBLIC) {
internal_scope = false;
return;
write_newline ();
}
- public override void visit_begin_enum (Enum en) {
+ public override void visit_begin_enum (Enum! en) {
if (en.access != MemberAccessibility.PUBLIC) {
internal_scope = true;
return;
write_begin_block ();
}
- public override void visit_end_enum (Enum en) {
+ public override void visit_end_enum (Enum! en) {
if (en.access != MemberAccessibility.PUBLIC) {
internal_scope = false;
return;
write_newline ();
}
- public override void visit_enum_value (EnumValue ev) {
+ public override void visit_enum_value (EnumValue! ev) {
if (internal_scope) {
return;
}
write_newline ();
}
- public override void visit_constant (Constant c) {
+ public override void visit_constant (Constant! c) {
}
- public override void visit_field (Field f) {
+ public override void visit_field (Field! f) {
if (internal_scope || f.access != MemberAccessibility.PUBLIC) {
return;
}
write_newline ();
}
- public override void visit_begin_method (Method m) {
+ public override void visit_begin_method (Method! m) {
if (internal_scope || m.access != MemberAccessibility.PUBLIC || m.overrides) {
return;
}
write_newline ();
}
- public override void visit_begin_property (Property prop) {
+ public override void visit_begin_property (Property! prop) {
if (internal_scope) {
return;
}
bol = false;
}
- private void write_identifier (string s) {
+ private void write_identifier (string! s) {
if (s == "namespace") {
stream.putc ('@');
}
write_string (s);
}
- private void write_string (string s) {
+ private void write_string (string! s) {
stream.printf ("%s", s);
bol = false;
}
return (new InvocationExpression (call = call, argument_list = argument_list, source_reference = source));
}
- public void add_argument (Expression arg) {
+ public void add_argument (Expression! arg) {
_argument_list.append (arg);
}
- public override void accept (CodeVisitor visitor) {
+ public override void accept (CodeVisitor! visitor) {
call.accept (visitor);
visitor.visit_begin_invocation_expression (this);
return (new LiteralExpression (literal = literal, source_reference = source));
}
- public override void accept (CodeVisitor visitor) {
+ public override void accept (CodeVisitor! visitor) {
literal.accept (visitor);
visitor.visit_literal_expression (this);
return (new LocalVariableDeclaration (variable_declarators = declarators, source_reference = source));
}
- public override void accept (CodeVisitor visitor) {
+ public override void accept (CodeVisitor! visitor) {
if (type_reference != null) {
type_reference.accept (visitor);
}
return new MemberAccess (inner = inner, member_name = member, source_reference = source);
}
- public override void accept (CodeVisitor visitor) {
+ public override void accept (CodeVisitor! visitor) {
if (inner != null) {
inner.accept (visitor);
}
current_symbol = m.symbol;
}
- public override void visit_begin_property (Property prop) {
+ public override void visit_begin_property (Property! prop) {
current_symbol = prop.symbol;
}
return parameters.copy ();
}
- public override void accept (CodeVisitor visitor) {
+ public override void accept (CodeVisitor! visitor) {
visitor.visit_begin_method (this);
return_type.accept (visitor);
}
}
}
+
+ /**
+ * Checks whether the arguments and return type of the specified method
+ * matches this method.
+ *
+ * @param m a method
+ * @return true if the specified method is compatible to this method
+ */
+ public bool equals (Method! m2) {
+ if (!m2.return_type.equals (return_type)) {
+ return false;
+ }
+
+ var method_params = m2.get_parameters ();
+ var method_params_it = method_params;
+ foreach (FormalParameter param in parameters) {
+ /* method may not expect less arguments */
+ if (method_params_it == null) {
+ return false;
+ }
+
+ var method_param = (FormalParameter) method_params_it.data;
+ if (!method_param.type_reference.equals (param.type_reference)) {
+ return false;
+ }
+
+ method_params_it = method_params_it.next;
+ }
+
+ /* method may not expect more arguments */
+ if (method_params_it != null) {
+ return false;
+ }
+
+ return true;
+ }
}
return (new NamedArgument (name = name, argument = arg, source_reference = source));
}
- public override void accept (CodeVisitor visitor) {
+ public override void accept (CodeVisitor! visitor) {
argument.accept (visitor);
visitor.visit_named_argument (this);
public string cprefix;
public string lower_case_cprefix;
- public static ref Namespace new (string name, SourceReference source) {
+ public static ref Namespace! new (string! name, SourceReference source) {
return (new Namespace (name = name, source_reference = source));
}
- public void add_class (Class cl) {
+ public void add_class (Class! cl) {
classes.append (cl);
cl.@namespace = this;
}
- public void remove_class (Class cl) {
+ public void remove_class (Class! cl) {
classes.remove (cl);
cl.@namespace = null;
}
- public void add_interface (Interface iface) {
+ public void add_interface (Interface! iface) {
interfaces.append (iface);
iface.@namespace = this;
}
- public void add_struct (Struct st) {
+ public void add_struct (Struct! st) {
structs.append (st);
st.@namespace = this;
}
- public void remove_struct (Struct st) {
+ public void remove_struct (Struct! st) {
structs.remove (st);
st.@namespace = null;
}
- public void add_enum (Enum en) {
+ public void add_enum (Enum! en) {
enums.append (en);
en.@namespace = this;
}
- public void add_flags (Flags fl) {
+ public void add_flags (Flags! fl) {
flags_.append (fl);
fl.@namespace = this;
}
return classes.copy ();
}
- public void add_field (Field f) {
+ public void add_field (Field! f) {
fields.append (f);
}
- public void add_method (Method m) {
+ public void add_method (Method! m) {
methods.append (m);
}
- public override void accept (CodeVisitor visitor) {
+ public override void accept (CodeVisitor! visitor) {
visitor.visit_begin_namespace (this);
foreach (Class cl in classes) {
return cheader_filenames.copy ();
}
- void process_ccode_attribute (Attribute a) {
+ void process_ccode_attribute (Attribute! a) {
foreach (NamedArgument arg in a.args) {
if (arg.name == "cprefix") {
/* this will already be checked during semantic analysis */
return (new NamespaceReference (name = name, source_reference = source));
}
- public override void accept (CodeVisitor visitor) {
+ public override void accept (CodeVisitor! visitor) {
visitor.visit_namespace_reference (this);
}
}
return (new ObjectCreationExpression (type_reference = type, named_argument_list = named_argument_list, source_reference = source));
}
- public override void accept (CodeVisitor visitor) {
+ public override void accept (CodeVisitor! visitor) {
type_reference.accept (visitor);
foreach (NamedArgument arg in named_argument_list) {
return (new ParenthesizedExpression (inner = inner, source_reference = source));
}
- public override void accept (CodeVisitor visitor) {
+ public override void accept (CodeVisitor! visitor) {
inner.accept (visitor);
visitor.visit_parenthesized_expression (this);
string comment;
string _file_comment;
- public void parse (CodeContext context) {
+ public void parse (CodeContext! context) {
context.accept (this);
}
- public override void visit_begin_source_file (SourceFile source_file) {
+ public override void visit_begin_source_file (SourceFile! source_file) {
parse_file (source_file);
source_file.comment = _file_comment;
}
- public void push_comment (string comment_item, bool file_comment) {
+ public void push_comment (string! comment_item, bool file_comment) {
if (comment == null) {
comment = comment_item;
} else {
}
[Import ()]
- public void parse_file (SourceFile source_file);
+ public void parse_file (SourceFile! source_file);
}
}
using GLib;
namespace Vala {
- public abstract class PostfixExpression : Expression {
- public Expression inner { get; construct; }
- public bool increment { get; construct; }
-
- public static ref PostfixExpression new (Expression inner, bool inc, SourceReference source) {
+ public class PostfixExpression : Expression {
+ public Expression! inner { get; set construct; }
+ public bool increment { get; set; }
+
+ public static ref PostfixExpression! new (Expression! inner, bool inc, SourceReference source) {
return (new PostfixExpression (inner = inner, increment = inc, source_reference = source));
}
- public override void accept (CodeVisitor visitor) {
+ public override void accept (CodeVisitor! visitor) {
inner.accept (visitor);
visitor.visit_postfix_expression (this);
return (new Property (name = name, type_reference = type, get_accessor = get_accessor, set_accessor = set_accessor, source_reference = source));
}
- public override void accept (CodeVisitor visitor) {
+ public override void accept (CodeVisitor! visitor) {
visitor.visit_begin_property (this);
type_reference.accept (visitor);
return (new PropertyAccessor (readable = readable, writable = writable, construct_ = construct_, body = body, source_reference = source));
}
- public override void accept (CodeVisitor visitor) {
+ public override void accept (CodeVisitor! visitor) {
visitor.visit_begin_property_accessor (this);
if (body != null) {
return (new ReturnStatement (return_expression = result, source_reference = source));
}
- public override void accept (CodeVisitor visitor) {
+ public override void accept (CodeVisitor! visitor) {
if (return_expression != null) {
return_expression.accept (visitor);
if (sym != null && sym.node is Method) {
var base_method = (Method) sym.node;
if (base_method.is_abstract || base_method.is_virtual) {
+ if (!m.equals (base_method)) {
+ m.error = true;
+ Report.error (m.source_reference, "Return type and or parameters of overridding method `%s' do not match overridden method `%s'.".printf (m.symbol.get_full_name (), base_method.symbol.get_full_name ()));
+ return;
+ }
+
m.base_method = base_method;
break;
}
expr.static_type.type = (DataType) root_symbol.lookup ("int").node;
}
- public override void visit_real_literal (IntegerLiteral! expr) {
+ public override void visit_real_literal (RealLiteral! expr) {
expr.static_type = new TypeReference ();
expr.static_type.type = (DataType) root_symbol.lookup ("double").node;
}
return (new TypeCheck (expression = expr, type_reference = type, source_reference = source));
}
- public override void accept (CodeVisitor visitor) {
+ public override void accept (CodeVisitor! visitor) {
expression.accept (visitor);
type_reference.accept (visitor);
return (new TypeofExpression (type_reference = type, source_reference = source));
}
- public override void accept (CodeVisitor visitor) {
+ public override void accept (CodeVisitor! visitor) {
type_reference.accept (visitor);
visitor.visit_typeof_expression (this);
return (new TypeParameter (name = name, source_reference = source));
}
- public override void accept (CodeVisitor visitor) {
+ public override void accept (CodeVisitor! visitor) {
visitor.visit_type_parameter (this);
}
}
return null;
}
- public void add_type_argument (TypeReference arg) {
+ public void add_type_argument (TypeReference! arg) {
type_argument_list.append (arg);
}
return type_argument_list.copy ();
}
- public override void accept (CodeVisitor visitor) {
+ public override void accept (CodeVisitor! visitor) {
foreach (TypeReference type_arg in type_argument_list) {
type_arg.accept (visitor);
}
return result;
}
+
+ public bool equals (TypeReference! type2) {
+ if (type2.is_ref != is_ref) {
+ return false;
+ }
+ if (type2.is_lvalue_ref != is_lvalue_ref) {
+ return false;
+ }
+ if (type2.is_weak != is_weak) {
+ return false;
+ }
+ if (type2.is_out != is_out) {
+ return false;
+ }
+ if (type2.array != array) {
+ return false;
+ }
+ if (type2.array_own != array_own) {
+ return false;
+ }
+ if (type2.non_null != non_null) {
+ return false;
+ }
+ if (type2.type != type) {
+ return false;
+ }
+ if (type2.type_parameter != type_parameter) {
+ return false;
+ }
+ if (type2.floating_reference != floating_reference) {
+ return false;
+ }
+
+ return true;
+ }
}
}
reg_call.add_argument (new CCodeIdentifier (name = get_parent_type_name ()));
reg_call.add_argument (new CCodeConstant (name = "\"%s\"".printf (get_type_declaration ().get_cname ())));
reg_call.add_argument (new CCodeIdentifier (name = "&g_define_type_info"));
- reg_call.add_argument (new CCodeConstant (name = "0"));
+ reg_call.add_argument (new CCodeConstant (name = get_type_flags ()));
type_init.add_statement (new CCodeExpressionStatement (expression = new CCodeAssignment (left = new CCodeIdentifier (name = "g_define_type_id"), right = reg_call)));
type_init.add_statement (get_type_interface_init_statements ());
public abstract ref string! get_parent_type_name ();
/**
+ * Returns the set of type flags to be applied when registering.
+ *
+ * @return type flags
+ */
+ public virtual string get_type_flags () {
+ return "0";
+ }
+
+ /**
* Returns additional C initialization statements to setup interfaces.
*
* @return C statements
return (new UnaryExpression (operator = op, inner = inner, source_reference = source));
}
- public override void accept (CodeVisitor visitor) {
+ public override void accept (CodeVisitor! visitor) {
inner.accept (visitor);
visitor.visit_unary_expression (this);
return (new VariableDeclarator (name = name, initializer = init, source_reference = source));
}
- public override void accept (CodeVisitor visitor) {
+ public override void accept (CodeVisitor! visitor) {
if (initializer != null) {
initializer.accept (visitor);
return (new WhileStatement (condition = cond, body = body, source_reference = source));
}
- public override void accept (CodeVisitor visitor) {
+ public override void accept (CodeVisitor! visitor) {
condition.accept (visitor);
visitor.visit_end_full_expression (condition);