From 12afc3736c1ef66298fcfea5c351c81068389b63 Mon Sep 17 00:00:00 2001 From: Miklos Magyari Date: Wed, 14 Jul 2021 12:10:19 +0200 Subject: [PATCH 1/2] OOP: improved 'super' references (issue #417, issue #427) Signed-off-by: Miklos Magyari --- .../Basic_tests/OopNegativeSemanticTest.ttcn | 21 +++++++++++++++++++ .../Basic_tests/OopPositiveBasicSyntax.ttcn | 18 ++++++++++++++++ .../eclipse/titan/designer/AST/Reference.java | 21 +++++++++++++++++-- .../AST/TTCN3/types/ClassTypeBody.java | 13 ++++++++++++ .../parsers/ttcn3parser/Ttcn3Parser.g4 | 21 ++++++++++++------- .../Basic_tests/OOP_Semantic_tests.java | 9 ++++++-- 6 files changed, 91 insertions(+), 12 deletions(-) diff --git a/Semantic_Analizer_Tests/src/Basic_tests/OopNegativeSemanticTest.ttcn b/Semantic_Analizer_Tests/src/Basic_tests/OopNegativeSemanticTest.ttcn index 182eb1af4..ccc642459 100755 --- a/Semantic_Analizer_Tests/src/Basic_tests/OopNegativeSemanticTest.ttcn +++ b/Semantic_Analizer_Tests/src/Basic_tests/OopNegativeSemanticTest.ttcn @@ -124,6 +124,27 @@ type class ClassWithThis { } } +function f_fake_super() return charstring { + return "abc"; +} + +// bad super references +function f_notinclass(in integer pl_int) { + var charstring m_ch := super.f_fake_super(); +} + +type class FuncClass extends BaseFunctionClass { + public function f_get_one() return charstring { + return "xyz"; + } + + private function f_test_super() { + // type mismatches + var integer vl_int := f_get_one(); + var charstring vl_cs:= super.f_get_one(); + } +} + testcase tc_basicSyntax() runs on CT { var GrandSubClass vl_gsc := GrandSubClass.create; diff --git a/Semantic_Analizer_Tests/src/Basic_tests/OopPositiveBasicSyntax.ttcn b/Semantic_Analizer_Tests/src/Basic_tests/OopPositiveBasicSyntax.ttcn index b69577e76..dc2f7367d 100644 --- a/Semantic_Analizer_Tests/src/Basic_tests/OopPositiveBasicSyntax.ttcn +++ b/Semantic_Analizer_Tests/src/Basic_tests/OopPositiveBasicSyntax.ttcn @@ -191,6 +191,24 @@ type class SubClass4 extends SuperBaseClass { } } +type class BaseFunctionClass { + public function f_get_one() return integer { + return 1; + } +} + +type class FuncClass extends BaseFunctionClass { + public function f_get_one() return charstring { + return "xyz"; + } + + private function f_test_super() { + // type mismatches + var integer vl_int := super.f_get_one(); + var charstring vl_cs:= f_get_one(); + } +} + testcase tc_basicSyntax() runs on CT { var object vl_obj := MinimalClass.create; diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/Reference.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/Reference.java index 4f99b2903..e1e7ec8da 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/Reference.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/Reference.java @@ -41,6 +41,7 @@ import org.eclipse.titan.designer.AST.TTCN3.statements.StatementBlock; import org.eclipse.titan.designer.AST.TTCN3.types.AbstractOfType; import org.eclipse.titan.designer.AST.TTCN3.types.Anytype_Type; import org.eclipse.titan.designer.AST.TTCN3.types.Array_Type; +import org.eclipse.titan.designer.AST.TTCN3.types.ClassTypeBody; import org.eclipse.titan.designer.AST.TTCN3.types.Class_Type; import org.eclipse.titan.designer.AST.TTCN3.types.CompField; import org.eclipse.titan.designer.AST.TTCN3.types.ComponentTypeBody; @@ -60,11 +61,13 @@ import org.eclipse.titan.designer.parsers.ttcn3parser.TTCN3ReparseUpdater; * in the source code. * * @author Kristof Szabados + * @author Miklos Magyari * */ public class Reference extends ASTNode implements ILocateableNode, IIncrementallyUpdateable, IReferencingElement { private static final String STRINGELEMENTUNUSABLE = "Reference to a string element of type `{0}'' cannot be used in this context"; private static final String VARIABLEXPECTED = "Reference to a variable or value parameter was expected instead of {0}"; private static final String ALTSTEPEXPECTED = "Reference to an altstep was expected in the argument instead of {0}"; + private static final String THISORSUPEROUTSIDECLASS = "`{0}'' reference is only valid inside class bodies"; private static final String FULLNAMEPART = ". toBeChecked = new LinkedList(extendsReferences.getClassBodies()); + + Assignment assignment = null; + for (ClassTypeBody body : toBeChecked) { + assignment = body.getAssBySRef(timestamp, reference); + if (assignment != null) { + return assignment; + } + } + return null; + } + public void check(final CompilationTimeStamp timestamp) { if (lastCompilationTimeStamp != null && !lastCompilationTimeStamp.isLess(timestamp)) { return; diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/parsers/ttcn3parser/Ttcn3Parser.g4 b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/parsers/ttcn3parser/Ttcn3Parser.g4 index bce64086d..69e5908cd 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/parsers/ttcn3parser/Ttcn3Parser.g4 +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/parsers/ttcn3parser/Ttcn3Parser.g4 @@ -3061,11 +3061,12 @@ pr_FunctionInstance returns[Reference temporalReference] ParsedActualParameters parameters = null; Reference ref = null; FieldSubReference fieldSubReference = null; + Reference superRef = null; }: ( ((id = pr_Identifier { fieldSubReference = new FieldSubReference($id.identifier); fieldSubReference.setLocation(getLocation( $id.start, $id.stop)); - } | SUPER) DOT )? + } | SUPER { superRef = new Reference(null, Reference.Ref_Type.REF_SUPER); } ) DOT )? t = pr_FunctionRef { $temporalReference = $t.reference; } a = pr_LParen ( p = pr_FunctionActualParList { parameters = $p.parsedParameters; } )? @@ -3074,6 +3075,9 @@ pr_FunctionInstance returns[Reference temporalReference] { if($temporalReference != null) { ISubReference subReference = $temporalReference.removeLastSubReference(); + if (superRef != null) { + $temporalReference = superRef; + } if(parameters == null) { parameters = new ParsedActualParameters(); } @@ -3092,6 +3096,7 @@ pr_FunctionInstance returns[Reference temporalReference] pr_FunctionRef returns[Reference reference] @init { $reference = null; + boolean isSuperRef = false; }: ( i1 = pr_Identifier ( DOT @@ -6443,10 +6448,11 @@ pr_ValueReference returns[Reference reference] @init { $reference = null; boolean isThisRef = false; + boolean isSuperRef = false; }: ( ( ( r = pr_GlobalModuleId { $reference = $r.reference; } - | th = pr_ThisKeyword { isThisRef = true; } - | SUPER + | THIS { isThisRef = true; } + | SUPER { isSuperRef = true; } ) pr_Dot )? @@ -6454,6 +6460,9 @@ pr_ValueReference returns[Reference reference] if (isThisRef == true) { $reference = new Reference(null, Reference.Ref_Type.REF_THIS); } + if (isSuperRef == true) { + $reference = new Reference(null, Reference.Ref_Type.REF_SUPER); + } if ( $id.identifier != null ) { if ( $reference == null ) { $reference = new Reference(null); @@ -6464,7 +6473,7 @@ pr_ValueReference returns[Reference reference] $reference.setLocation(getLocation( $start, getLastVisibleToken()));//TODO: maybe this can be improved too. } } - | th = pr_ThisKeyword { + | THIS { $reference = new Reference(null, Reference.Ref_Type.REF_THIS); } ); @@ -9014,10 +9023,6 @@ pr_ClassKeyword: CLASS ); -pr_ThisKeyword: - THIS -; - pr_FinalModifier returns[boolean isFinal] @init { $isFinal = false; diff --git a/org.eclipse.titan.regressiontests/src/org/eclipse/titan/regressiontests/designer/statictests/Basic_tests/OOP_Semantic_tests.java b/org.eclipse.titan.regressiontests/src/org/eclipse/titan/regressiontests/designer/statictests/Basic_tests/OOP_Semantic_tests.java index 2b88c7b20..20c2a98b0 100755 --- a/org.eclipse.titan.regressiontests/src/org/eclipse/titan/regressiontests/designer/statictests/Basic_tests/OOP_Semantic_tests.java +++ b/org.eclipse.titan.regressiontests/src/org/eclipse/titan/regressiontests/designer/statictests/Basic_tests/OOP_Semantic_tests.java @@ -45,7 +45,7 @@ public class OOP_Semantic_tests { private ArrayList oopNegative_ttcn_initializer() { //oopNegativeSemanticTest.ttcn - ArrayList markersToCheck = new ArrayList(13); + ArrayList markersToCheck = new ArrayList(16); int lineNum = 28; markersToCheck.add(new MarkerToCheck("class type expected", lineNum, IMarker.SEVERITY_ERROR)); lineNum += 15; @@ -66,7 +66,12 @@ public class OOP_Semantic_tests { markersToCheck.add(new MarkerToCheck("A class cannot be both abstract and trait", ++lineNum, IMarker.SEVERITY_ERROR)); lineNum += 12; markersToCheck.add(new MarkerToCheck("Type mismatch: a value of type `charstring' was expected instead of `integer'", lineNum, IMarker.SEVERITY_ERROR)); - lineNum += 17; + lineNum += 15; + markersToCheck.add(new MarkerToCheck("`super' reference is only valid inside class bodies", lineNum, IMarker.SEVERITY_ERROR)); + lineNum += 10; + markersToCheck.add(new MarkerToCheck("Type mismatch: a value of type `integer' was expected instead of `charstring'", lineNum, IMarker.SEVERITY_ERROR)); + markersToCheck.add(new MarkerToCheck("Type mismatch: a value of type `charstring' was expected instead of `integer'", ++lineNum, IMarker.SEVERITY_ERROR)); + lineNum += 12; markersToCheck.add(new MarkerToCheck("Type mismatch: a value of type `charstring' was expected instead of `integer'", lineNum, IMarker.SEVERITY_ERROR)); lineNum += 8; markersToCheck.add(new MarkerToCheck("integer value was expected", lineNum, IMarker.SEVERITY_ERROR)); -- GitLab From 8ad2c13acac6f462e5121965486ea528b8ea30c7 Mon Sep 17 00:00:00 2001 From: Miklos Magyari Date: Wed, 14 Jul 2021 12:12:40 +0200 Subject: [PATCH 2/2] OOP: fixed naming convention problem in test Signed-off-by: Miklos Magyari --- .../src/Basic_tests/OopNegativeSemanticTest.ttcn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Semantic_Analizer_Tests/src/Basic_tests/OopNegativeSemanticTest.ttcn b/Semantic_Analizer_Tests/src/Basic_tests/OopNegativeSemanticTest.ttcn index ccc642459..1d0bb8fe6 100755 --- a/Semantic_Analizer_Tests/src/Basic_tests/OopNegativeSemanticTest.ttcn +++ b/Semantic_Analizer_Tests/src/Basic_tests/OopNegativeSemanticTest.ttcn @@ -130,7 +130,7 @@ function f_fake_super() return charstring { // bad super references function f_notinclass(in integer pl_int) { - var charstring m_ch := super.f_fake_super(); + var charstring vl_ch := super.f_fake_super(); } type class FuncClass extends BaseFunctionClass { -- GitLab