summaryrefslogtreecommitdiff
path: root/vala
diff options
context:
space:
mode:
authorRico Tzschichholz <ricotz@ubuntu.com>2019-11-17 12:49:11 +0100
committerRico Tzschichholz <ricotz@ubuntu.com>2019-11-17 14:12:07 +0100
commit96635ddabb296f31f5eb48da10aea2d218421492 (patch)
tree7cc495e1aa28789764fe0788b1f37afc212ff06c /vala
parent626d3e63015a9ac303de3a9e72314b309a0ae123 (diff)
downloadvala-96635ddabb296f31f5eb48da10aea2d218421492.tar.gz
vala: Allow SemanticAnalyzer.get_this_type() to handle more symbols
and append possible type-parameters to match get_data_type_for_symbol() Suported symbol types are Method, Property, Constructor and Destructor
Diffstat (limited to 'vala')
-rw-r--r--vala/valasemanticanalyzer.vala37
1 files changed, 33 insertions, 4 deletions
diff --git a/vala/valasemanticanalyzer.vala b/vala/valasemanticanalyzer.vala
index c83d58b53..25d0c40dd 100644
--- a/vala/valasemanticanalyzer.vala
+++ b/vala/valasemanticanalyzer.vala
@@ -1162,22 +1162,40 @@ public class Vala.SemanticAnalyzer : CodeVisitor {
return null;
}
- public static DataType? get_this_type (Method m) {
- unowned TypeSymbol? parent_type = find_parent_type_symbol (m);
+ public static DataType? get_this_type (Symbol s, TypeSymbol? parent = null) {
+ unowned TypeSymbol? parent_type = parent ?? find_parent_type_symbol (s);
if (parent_type == null) {
Report.error (parent_type.source_reference, "internal: Unsupported symbol type");
return new InvalidType ();
}
+ MemberBinding binding;
+ if (s is Method) {
+ binding = ((Method) s).binding;
+ } else if (s is Constructor) {
+ binding = ((Constructor) s).binding;
+ } else if (s is Destructor) {
+ binding = ((Destructor) s).binding;
+ } else if (s is Property) {
+ binding = ((Property) s).binding;
+ } else {
+ Report.error (s.source_reference, "internal: Unsupported symbol type");
+ return new InvalidType ();
+ }
+
DataType? this_type = null;
- switch (m.binding) {
+ List<TypeParameter>? type_parameters = null;
+ switch (binding) {
case MemberBinding.INSTANCE:
if (parent_type is Class) {
this_type = new ObjectType ((Class) parent_type);
+ type_parameters = ((Class) parent_type).get_type_parameters ();
} else if (parent_type is Interface) {
this_type = new ObjectType ((Interface) parent_type);
+ type_parameters = ((Interface) parent_type).get_type_parameters ();
} else if (parent_type is Struct) {
this_type = new StructValueType ((Struct) parent_type);
+ type_parameters = ((Struct) parent_type).get_type_parameters ();
} else if (parent_type is Enum) {
this_type = new EnumValueType ((Enum) parent_type);
} else {
@@ -1188,6 +1206,8 @@ public class Vala.SemanticAnalyzer : CodeVisitor {
case MemberBinding.CLASS:
if (parent_type is Class) {
this_type = new ClassType ((Class) parent_type);
+ } else if (parent_type is Interface) {
+ this_type = new InterfaceType ((Interface) parent_type);
} else {
Report.error (parent_type.source_reference, "internal: Unsupported symbol type");
this_type = new InvalidType ();
@@ -1195,10 +1215,19 @@ public class Vala.SemanticAnalyzer : CodeVisitor {
break;
case MemberBinding.STATIC:
default:
- Report.error (m.source_reference, "internal: Does not support a parent instance");
+ Report.error (s.source_reference, "internal: Does not support a parent instance");
this_type = new InvalidType ();
break;
}
+
+ if (type_parameters != null) {
+ foreach (var type_param in type_parameters) {
+ var type_arg = new GenericType (type_param);
+ type_arg.value_owned = true;
+ this_type.add_type_argument (type_arg);
+ }
+ }
+
return this_type;
}