From db8c7f14d2f74c3db205782acf8222cb7d91a047 Mon Sep 17 00:00:00 2001 From: _ov4 Date: Wed, 21 Oct 2026 06:14:00 +0000 Subject: feat(codegen): instantiate class templates Co-Authored-By: Claude Opus 5.5 --- tests/i/template-classes/program.cps | 110 +++++++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 tests/i/template-classes/program.cps (limited to 'tests/i/template-classes/program.cps') diff --git a/tests/i/template-classes/program.cps b/tests/i/template-classes/program.cps new file mode 100644 index 0000000..90427d3 --- /dev/null +++ b/tests/i/template-classes/program.cps @@ -0,0 +1,110 @@ +TEMPLATE +CLASS Box + PRIVATE Value : T + PUBLIC OVERLOAD PROCEDURE NEW() + ENDPROCEDURE + PUBLIC OVERLOAD PROCEDURE NEW(V : T) + Value <- V + ENDPROCEDURE + PUBLIC FUNCTION Get() RETURNS T + RETURN Value + ENDFUNCTION + PUBLIC PROCEDURE Set(V : T) + Value <- V + ENDPROCEDURE +ENDCLASS + +TEMPLATE +FUNCTION Make() RETURNS T + DECLARE Value : T + RETURN Value +ENDFUNCTION + +TEMPLATE +CLASS Pair + First : A + Second : B + PROCEDURE NEW(Left : A, Right : B) + First <- Left + Second <- Right + ENDPROCEDURE +ENDCLASS + +TEMPLATE +CLASS Stack3 + PRIVATE First : T + PRIVATE Second : T + PRIVATE Third : T + PRIVATE Count : INTEGER + PROCEDURE Push(Value : T) + Count <- Count + 1 + CASE OF Count + 1 : First <- Value + 2 : Second <- Value + 3 : Third <- Value + ENDCASE + ENDPROCEDURE + FUNCTION Pop() RETURNS T + Count <- Count - 1 + CASE OF Count + 2 : RETURN Third + 1 : RETURN Second + OTHERWISE : RETURN First + ENDCASE + ENDFUNCTION +ENDCLASS + +OVERLOAD PROCEDURE PrintAll() +ENDPROCEDURE +TEMPLATE +OVERLOAD PROCEDURE PrintAll(First : T, Others : Rest...) + OUTPUT First + CALL PrintAll(Others...) +ENDPROCEDURE + +TEMPLATE +CLASS Group + PROCEDURE Show(Values : Types...) + CALL PrintAll(Values...) + ENDPROCEDURE +ENDCLASS +TEMPLATE +PROCEDURE ShowGroup(Values : Types...) + DECLARE Items : Group + CALL Items.Show(Values...) +ENDPROCEDURE + +// Instantiation during the type pre-pass defers the Box method prototypes. +TYPE Holder + DECLARE Item : Box +ENDTYPE +OUTPUT Make>().Get() +DECLARE H : Holder +OUTPUT H.Item.Get() +DECLARE B : Box(7) +OUTPUT B.Get() +DECLARE P : Pair(3, 2.5) +OUTPUT P.First +OUTPUT P.Second +DECLARE S : Stack3 +CALL S.Push(10) +CALL S.Push(20) +CALL S.Push(30) +OUTPUT S.Pop() +OUTPUT S.Pop() +OUTPUT S.Pop() +B <- NEW Box(5) +OUTPUT B.Get() +DELETE B +DECLARE Inner : Box(9) +DECLARE Outer : Box>(Inner) +OUTPUT Outer.Get().Get() +DECLARE Text : Box("alpha") +DECLARE Copy : Box +Copy <- Text +CALL Text.Set("beta") +OUTPUT Copy.Get() +OUTPUT Text.Get() +DECLARE Values : Group +CALL Values.Show(1, 2.5, 'c') +CALL ShowGroup() -- cgit v1.3.1-4-g156e