From b64b8619251601d9f9fcb8e00ef4084d311c8d28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=91=D0=BE=D0=BD=D0=B4=D0=B0=D1=80=D0=B5=D0=B2=20=D0=98?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD?= Date: Tue, 21 Aug 2018 21:55:37 +0200 Subject: [PATCH] bug fix #1062 --- CodeCompletion/CodeFormatter.cs | 2 ++ TestSuite/abstract3.pas | 41 +++++++++++++++++++++++ TreeConverter/TreeRealization/generics.cs | 3 +- 3 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 TestSuite/abstract3.pas diff --git a/CodeCompletion/CodeFormatter.cs b/CodeCompletion/CodeFormatter.cs index af685f1b7..fa8a95dd1 100644 --- a/CodeCompletion/CodeFormatter.cs +++ b/CodeCompletion/CodeFormatter.cs @@ -707,6 +707,7 @@ namespace CodeFormatters || sn is lock_stmt || sn is loop_stmt || sn is simple_property || sn is read_accessor_name || sn is write_accessor_name || sn is formal_parameters || sn is bracket_expr || sn is record_const || sn is array_const || sn is exception_handler || sn is try_handler_finally || sn is try_handler_except || sn is external_directive || sn is where_definition + || sn is match_with || (sn is simple_const_definition && in_class && !in_procedure) || (sn is typed_const_definition && in_class && !in_procedure) ) read_from_beg_pos = true; @@ -2992,6 +2993,7 @@ namespace CodeFormatters public override void visit(match_with _match_with) { sb.Append("match"); + SetKeywordOffset("match"); visit_node(_match_with.expr); IncOffset(); add_space_before = true; diff --git a/TestSuite/abstract3.pas b/TestSuite/abstract3.pas new file mode 100644 index 000000000..a1d7ffae6 --- /dev/null +++ b/TestSuite/abstract3.pas @@ -0,0 +1,41 @@ +var i: integer; + +type + t0base=abstract class + procedure p1; abstract; + procedure p2(a: U); abstract; + end; + + t0base2=abstract class + procedure p1(a:T); abstract; + end; + + t0 = class(t0base) + procedure p1; override := exit; + procedure p2(a: U); override := exit; + end; + + t1=class(t0) end; + + t2 = class(t0base2) + procedure p1(a: T); override; + begin + assert(a = default(T)); + i := 3; + end; + + end; + + t3=class(t2) end; + +begin + var o := new t0; + var o2 := new t1; + var o3 := new t3; + var o4 := new t2; + o3.p1(0); + assert(i = 3); + i := 0; + o4.p1(0); + assert(i = 3); +end. \ No newline at end of file diff --git a/TreeConverter/TreeRealization/generics.cs b/TreeConverter/TreeRealization/generics.cs index e00c96511..ac385f7fa 100644 --- a/TreeConverter/TreeRealization/generics.cs +++ b/TreeConverter/TreeRealization/generics.cs @@ -1583,6 +1583,8 @@ namespace PascalABCCompiler.TreeRealization cmn.is_constructor = (compiled_orig != null || (common_orig != null && common_orig.is_constructor)); cmn.return_value_type = generic_convertions.determine_type(orig_fn.return_value_type, _instance_params, false); + if (common_orig != null) + cmn.overrided_method = common_orig.overrided_method; if (orig_fn.is_generic_function) { cmn.return_value_type = generic_convertions.determine_type(cmn.return_value_type, meth_inst_pars, true); @@ -2233,7 +2235,6 @@ namespace PascalABCCompiler.TreeRealization this.is_final = original_generic_function.is_final; this.is_overload = true; this.polymorphic_state = original_generic_function.polymorphic_state; - this.return_value_type = generic_convertions.determine_type(original_generic_function.return_value_type, instance_parameters, true); foreach (parameter par in original_generic_function.parameters)