From 39661855c0816ac248be437704c76f58359cb5f0 Mon Sep 17 00:00:00 2001 From: _ov4 Date: Sat, 17 Oct 2026 06:52:23 +0000 Subject: feat(classes): construct declared objects and nested fields and arrays Co-Authored-By: Claude Opus 5.5 --- tests/i/class-constructors/case.json | 1 + tests/i/class-constructors/expected.txt | 17 +++++++++ tests/i/class-constructors/notes.md | 5 +++ tests/i/class-constructors/program.cps | 42 ++++++++++++++++++++++ tests/i/class-new-methods/notes.md | 2 +- tests/i/class-new-methods/program.cps | 2 +- .../iii/class-constructor-default-errors/case.json | 32 +++++++++++++++++ .../class-constructor-default-errors/program.cps | 21 +++++++++++ 8 files changed, 120 insertions(+), 2 deletions(-) create mode 100644 tests/i/class-constructors/case.json create mode 100644 tests/i/class-constructors/expected.txt create mode 100644 tests/i/class-constructors/notes.md create mode 100644 tests/i/class-constructors/program.cps create mode 100644 tests/iii/class-constructor-default-errors/case.json create mode 100644 tests/iii/class-constructor-default-errors/program.cps (limited to 'tests') diff --git a/tests/i/class-constructors/case.json b/tests/i/class-constructors/case.json new file mode 100644 index 0000000..0967ef4 --- /dev/null +++ b/tests/i/class-constructors/case.json @@ -0,0 +1 @@ +{} diff --git a/tests/i/class-constructors/expected.txt b/tests/i/class-constructors/expected.txt new file mode 100644 index 0000000..cb57e7c --- /dev/null +++ b/tests/i/class-constructors/expected.txt @@ -0,0 +1,17 @@ +leaf:0 +leaf:0 +name +0 +leaf:0 +leaf:0 +leaf:0 +leaf:0 +3,3 +leaf:0 +leaf:0 +pair:6 +3,3 +leaf:0 +3 +leaf:0 +3 diff --git a/tests/i/class-constructors/notes.md b/tests/i/class-constructors/notes.md new file mode 100644 index 0000000..0145a0a --- /dev/null +++ b/tests/i/class-constructors/notes.md @@ -0,0 +1,5 @@ +# Class constructors + +Human review: pending. Expected output was independently traced by AI. + +The project extends guide section 10.2 with automatic stack, field and array construction. Leaf observes its zeroed Value before setting it to 3. A and B each construct once; Named stores name; Plain has no constructor and stays zero. Four array elements each construct once. Wrapped constructs Pair's two Leaf fields in order before Pair observes their sum of 6. Each execution of the loop declaration zeroes and constructs Local again, so both iterations print leaf:0 then 3 despite storing 99 in the previous iteration. diff --git a/tests/i/class-constructors/program.cps b/tests/i/class-constructors/program.cps new file mode 100644 index 0000000..2b85b4d --- /dev/null +++ b/tests/i/class-constructors/program.cps @@ -0,0 +1,42 @@ +CLASS Leaf + Value : INTEGER + PROCEDURE New() + OUTPUT "leaf:", Value + Value <- 3 + ENDPROCEDURE +ENDCLASS +CLASS Pair + First : Leaf + Second : Leaf + PROCEDURE NEW() + OUTPUT "pair:", First.Value + Second.Value + ENDPROCEDURE +ENDCLASS +TYPE Wrapped + DECLARE Item : Pair +ENDTYPE +CLASS Named + Text : STRING + PROCEDURE NEW(Name : STRING) + Text <- Name + ENDPROCEDURE +ENDCLASS +CLASS Plain + Value : INTEGER +ENDCLASS +DECLARE A : Leaf +DECLARE B : Leaf() +DECLARE N : Named("name") +OUTPUT N.Text +DECLARE P : Plain() +OUTPUT P.Value +DECLARE Items : ARRAY[-1:0, 2:3] OF Leaf +OUTPUT Items[-1,2].Value, ",", Items[0,3].Value +DECLARE W : Wrapped +OUTPUT W.Item.First.Value, ",", W.Item.Second.Value +DECLARE Index : INTEGER +FOR Index <- 1 TO 2 + DECLARE Local : Leaf + OUTPUT Local.Value + Local.Value <- 99 +NEXT Index diff --git a/tests/i/class-new-methods/notes.md b/tests/i/class-new-methods/notes.md index 53192fb..cc7cffa 100644 --- a/tests/i/class-new-methods/notes.md +++ b/tests/i/class-new-methods/notes.md @@ -2,4 +2,4 @@ Human review: pending. Expected output was independently traced by AI. -NEW is an ordinary procedure: the bare member call stores x, CALL with mixed case stores call, and Reset calls this.NEW to store again. DECLARE is extended with arguments in the next implementation step. +NEW is an ordinary procedure: the bare member call stores x, CALL with mixed case stores call, and Reset calls this.NEW to store again. The initial constructor value is overwritten before output. diff --git a/tests/i/class-new-methods/program.cps b/tests/i/class-new-methods/program.cps index 573fe0f..880f538 100644 --- a/tests/i/class-new-methods/program.cps +++ b/tests/i/class-new-methods/program.cps @@ -7,7 +7,7 @@ CLASS Box this.NEW("again") ENDPROCEDURE ENDCLASS -DECLARE Obj : Box +DECLARE Obj : Box("initial") Obj.NEW("x") OUTPUT Obj.Value CALL Obj.new("call") diff --git a/tests/iii/class-constructor-default-errors/case.json b/tests/iii/class-constructor-default-errors/case.json new file mode 100644 index 0000000..adcefe8 --- /dev/null +++ b/tests/iii/class-constructor-default-errors/case.json @@ -0,0 +1,32 @@ +{ + "errors": [ + { + "reason": "Incorrect # arguments passed to Required.NEW", + "line": 15 + }, + { + "reason": "Incorrect # arguments passed to Required.NEW", + "line": 16 + }, + { + "reason": "has no constructor NEW", + "line": 17 + }, + { + "reason": "Cannot access private method NEW", + "line": 18 + }, + { + "reason": "Incorrect # arguments passed to Required.NEW", + "line": 19 + }, + { + "reason": "Incorrect # arguments passed to Required.NEW", + "line": 20 + }, + { + "reason": "Constructor arguments require a class type", + "line": 21 + } + ] +} diff --git a/tests/iii/class-constructor-default-errors/program.cps b/tests/iii/class-constructor-default-errors/program.cps new file mode 100644 index 0000000..43dfef7 --- /dev/null +++ b/tests/iii/class-constructor-default-errors/program.cps @@ -0,0 +1,21 @@ +CLASS Required + PROCEDURE NEW(Number : INTEGER) + ENDPROCEDURE +ENDCLASS +CLASS Plain + Value : INTEGER +ENDCLASS +CLASS Hidden + PRIVATE PROCEDURE NEW() + ENDPROCEDURE +ENDCLASS +TYPE Wrapped + DECLARE Item : Required +ENDTYPE +DECLARE Missing : Required +DECLARE EmptyArgs : Required() +DECLARE Extra : Plain(1) +DECLARE PrivateObject : Hidden +DECLARE Items : ARRAY[1:2] OF Required +DECLARE Nested : Wrapped +DECLARE Scalar : INTEGER() -- cgit v1.3.1-4-g156e