var type_sym = (TypeSymbol) m.parent_symbol;
if (type_sym is ObjectTypeSymbol) {
ccode.add_declaration (get_ccode_name (type_sym) + "*", new CCodeVariableDeclarator ("result"));
- return_type = ((ObjectTypeSymbol) type_sym).get_this_type ();
+ return_type = SemanticAnalyzer.get_this_type (m, type_sym);
}
} else if (!(return_type is VoidType) && !return_type.is_real_non_null_struct_type ()) {
ccode.add_declaration (get_ccode_name (m.return_type), new CCodeVariableDeclarator ("result"));
_destructor = value;
if (_destructor != null) {
_destructor.owner = scope;
- if (_destructor.this_parameter != null) {
- _destructor.scope.remove (_destructor.this_parameter.name);
- }
- _destructor.this_parameter = new Parameter ("this", get_this_type ());
- _destructor.scope.add (_destructor.this_parameter.name, _destructor.this_parameter);
}
}
}
* @param m a method
*/
public override void add_method (Method m) {
- if (m.binding == MemberBinding.INSTANCE || m is CreationMethod) {
+ if (m.binding != MemberBinding.STATIC || m is CreationMethod) {
if (m.this_parameter != null) {
m.scope.remove (m.this_parameter.name);
}
- m.this_parameter = new Parameter ("this", get_this_type ());
+ m.this_parameter = new Parameter ("this", SemanticAnalyzer.get_this_type (m, this));
m.scope.add (m.this_parameter.name, m.this_parameter);
}
if (!(m.return_type is VoidType) && m.get_postconditions ().size > 0) {
public override void add_property (Property prop) {
base.add_property (prop);
- prop.this_parameter = new Parameter ("this", get_this_type ());
- prop.scope.add (prop.this_parameter.name, prop.this_parameter);
+ if (prop.binding != MemberBinding.STATIC) {
+ prop.this_parameter = new Parameter ("this", SemanticAnalyzer.get_this_type (prop, this));
+ prop.scope.add (prop.this_parameter.name, prop.this_parameter);
+ }
if (prop.field != null) {
add_field (prop.field);
default:
assert_not_reached ();
}
+
+ if (c.binding != MemberBinding.STATIC) {
+ if (c.this_parameter != null) {
+ c.scope.remove (c.this_parameter.name);
+ }
+ c.this_parameter = new Parameter ("this", SemanticAnalyzer.get_this_type (c, this));
+ c.scope.add (c.this_parameter.name, c.this_parameter);
+ }
}
public override void add_destructor (Destructor d) {
default:
assert_not_reached ();
}
+
+ if (d.binding != MemberBinding.STATIC) {
+ if (d.this_parameter != null) {
+ d.scope.remove (d.this_parameter.name);
+ }
+ d.this_parameter = new Parameter ("this", SemanticAnalyzer.get_this_type (d, this));
+ d.scope.add (d.this_parameter.name, d.this_parameter);
+ }
}
public override void accept (CodeVisitor visitor) {
checked = true;
- this_parameter = new Parameter ("this", new ObjectType ((ObjectTypeSymbol) parent_symbol));
- scope.add (this_parameter.name, this_parameter);
-
context.analyzer.current_symbol = this;
if (body != null) {
m.error = true;
return;
}
- if (m.binding == MemberBinding.INSTANCE) {
- m.this_parameter = new Parameter ("this", get_this_type ());
+ if (m.binding != MemberBinding.STATIC) {
+ m.this_parameter = new Parameter ("this", SemanticAnalyzer.get_this_type (m, this));
m.scope.add (m.this_parameter.name, m.this_parameter);
}
if (!(m.return_type is VoidType) && m.get_postconditions ().size > 0) {
base.add_property (prop);
- prop.this_parameter = new Parameter ("this", new ObjectType (this));
- prop.scope.add (prop.this_parameter.name, prop.this_parameter);
+ if (prop.binding != MemberBinding.STATIC) {
+ prop.this_parameter = new Parameter ("this", SemanticAnalyzer.get_this_type (prop, this));
+ prop.scope.add (prop.this_parameter.name, prop.this_parameter);
+ }
}
public virtual List<Symbol> get_virtuals () {
return -1;
}
- public ObjectType get_this_type () {
- var result = new ObjectType (this);
- foreach (var type_parameter in get_type_parameters ()) {
- var type_arg = new GenericType (type_parameter);
- type_arg.value_owned = true;
- result.add_type_argument (type_arg);
- }
- return result;
- }
-
/**
* Adds the specified method as a hidden member to this class,
* primarily used for default signal handlers.
if (m.this_parameter != null) {
m.scope.remove (m.this_parameter.name);
}
- m.this_parameter = new Parameter ("this", get_this_type ());
+ m.this_parameter = new Parameter ("this", SemanticAnalyzer.get_this_type (m, this));
m.scope.add (m.this_parameter.name, m.this_parameter);
}
if (!(m.return_type is VoidType) && m.get_postconditions ().size > 0) {
*/
public override void add_method (Method m) {
if (m.binding == MemberBinding.INSTANCE || m is CreationMethod) {
- m.this_parameter = new Parameter ("this", SemanticAnalyzer.get_data_type_for_symbol (this));
+ m.this_parameter = new Parameter ("this", SemanticAnalyzer.get_this_type (m, this));
m.scope.add (m.this_parameter.name, m.this_parameter);
}
if (!(m.return_type is VoidType) && m.get_postconditions ().size > 0) {
properties.add (prop);
scope.add (prop.name, prop);
- prop.this_parameter = new Parameter ("this", SemanticAnalyzer.get_data_type_for_symbol (this));
- prop.scope.add (prop.this_parameter.name, prop.this_parameter);
+ if (prop.binding == MemberBinding.INSTANCE) {
+ prop.this_parameter = new Parameter ("this", SemanticAnalyzer.get_this_type (prop, this));
+ prop.scope.add (prop.this_parameter.name, prop.this_parameter);
+ }
if (prop.field != null) {
add_field (prop.field);