From 204b0e000c332efd4196c10bee81ef41cd103219 Mon Sep 17 00:00:00 2001 From: Miklos Magyari Date: Wed, 14 Jul 2021 16:21:16 +0200 Subject: [PATCH] OOP: basic implementation of object's methods (issue #417, issue #427) Signed-off-by: Miklos Magyari --- .../AST/TTCN3/definitions/Def_Function.java | 9 +++++ .../AST/TTCN3/types/ClassTypeBody.java | 10 ++++- .../TTCN3/types/ClassTypeReferenceList.java | 8 ++++ .../designer/AST/TTCN3/types/Class_Type.java | 37 +++++++++++++++++++ .../parsers/ttcn3parser/Ttcn3Parser.g4 | 6 +-- 5 files changed, 65 insertions(+), 5 deletions(-) diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/Def_Function.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/Def_Function.java index 033d30946..acdc0025f 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/Def_Function.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/definitions/Def_Function.java @@ -181,6 +181,15 @@ public final class Def_Function extends Definition implements IParameterisedAssi returnType.setFullNameParent(this); } } + + /** + * Constructor for functions defined by 'object' + * @param identifier + * @param returnType + */ + public Def_Function(final Identifier identifier, final FormalParameterList formalParameters, final Type returnType) { + this(identifier, formalParameters, null, null, null, null, returnType, false, null, null); + } public boolean isStartable() { return isStartable; diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/ClassTypeBody.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/ClassTypeBody.java index 98d2a7014..1f4fb083d 100755 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/ClassTypeBody.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/ClassTypeBody.java @@ -76,7 +76,7 @@ public final class ClassTypeBody extends TTCN3Scope implements IReferenceChainEl private CompilationTimeStamp lastCompilationTimeStamp; public ClassTypeBody(final Identifier identifier, final ClassTypeReferenceList extendsReferences) { - this.identifier = identifier; + this.identifier = identifier; this.extendsReferences = extendsReferences; if (extendsReferences != null) { @@ -353,6 +353,14 @@ public final class ClassTypeBody extends TTCN3Scope implements IReferenceChainEl return definitions.getDefinitionMap(); } + /** + * Checks if a class has 'extends' references. + * @return true if the class has parents other than 'object', false otherwise. + */ + public boolean hasExtendsReferences() { + return extendsReferences.hasExtendsReferences(); + } + @Override public boolean accept(ASTVisitor v) { // TODO Auto-generated method stub diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/ClassTypeReferenceList.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/ClassTypeReferenceList.java index c209c63c4..bfc0ffb69 100755 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/ClassTypeReferenceList.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/ClassTypeReferenceList.java @@ -116,6 +116,14 @@ public final class ClassTypeReferenceList extends ASTNode implements ILocateable } } + /** + * Checks if a class has 'extends' references. + * @return true if the class has parents other than 'object', false otherwise. + */ + public boolean hasExtendsReferences() { + return classReferences.size() > 0; + } + @Override public void updateSyntax(TTCN3ReparseUpdater reparser, boolean isDamaged) throws ReParseException { // TODO Auto-generated method stub diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/Class_Type.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/Class_Type.java index 631f8b113..e8891e548 100755 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/Class_Type.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/Class_Type.java @@ -15,15 +15,19 @@ package org.eclipse.titan.designer.AST.TTCN3.types; import java.text.MessageFormat; +import java.util.ArrayList; import java.util.List; import org.eclipse.titan.designer.AST.ArraySubReference; import org.eclipse.titan.designer.AST.Assignment; +import org.eclipse.titan.designer.AST.Assignment.Assignment_type; import org.eclipse.titan.designer.AST.IReferenceChain; import org.eclipse.titan.designer.AST.ISubReference; +import org.eclipse.titan.designer.AST.ISubReference.Subreference_type; import org.eclipse.titan.designer.AST.IType; import org.eclipse.titan.designer.AST.ITypeWithComponents; import org.eclipse.titan.designer.AST.Identifier; +import org.eclipse.titan.designer.AST.Identifier.Identifier_type; import org.eclipse.titan.designer.AST.Location; import org.eclipse.titan.designer.AST.Reference; import org.eclipse.titan.designer.AST.Scope; @@ -31,6 +35,9 @@ import org.eclipse.titan.designer.AST.Type; import org.eclipse.titan.designer.AST.TypeCompatibilityInfo; import org.eclipse.titan.designer.AST.TypeCompatibilityInfo.Chain; import org.eclipse.titan.designer.AST.TTCN3.Expected_Value_type; +import org.eclipse.titan.designer.AST.TTCN3.definitions.Def_Function; +import org.eclipse.titan.designer.AST.TTCN3.definitions.FormalParameter; +import org.eclipse.titan.designer.AST.TTCN3.definitions.FormalParameterList; import org.eclipse.titan.designer.AST.TTCN3.statements.StatementBlock; import org.eclipse.titan.designer.AST.TTCN3.templates.ITTCN3Template; import org.eclipse.titan.designer.compiler.JavaGenData; @@ -99,6 +106,28 @@ public final class Class_Type extends Type implements ITypeWithComponents { } final ISubReference subreference = subreferences.get(actualSubReference); + + /* methods defined by 'object' */ + if (subreference.getReferenceType() == Subreference_type.parameterisedSubReference) { + if (subreference.getId().getName().equals("toString")) { + Identifier id = new Identifier(Identifier_type.ID_NAME, "toString"); + Def_Function function = new Def_Function(id, new FormalParameterList(new ArrayList()), new UniversalCharstring_Type()); + function.setMyScope(reference.getMyScope()); + return function.getType(timestamp); + } + if (subreference.getId().getName().equals("equals")) { + Identifier id = new Identifier(Identifier_type.ID_NAME, "equals"); + Identifier objid = new Identifier(Identifier_type.ID_NAME, "obj"); + List list = new ArrayList(); + list.add(new FormalParameter(null, Assignment_type.A_PAR_VAL_IN, + new Anytype_Type(), objid, null, null)); + FormalParameterList paramList = new FormalParameterList(list); + Def_Function function = new Def_Function(id, paramList, new Boolean_Type()); + function.setMyScope(reference.getMyScope()); + return function.getType(timestamp); + } + } + switch (subreference.getReferenceType()) { case arraySubReference: subreference.getLocation().reportSemanticError(MessageFormat.format(ArraySubReference.INVALIDSUBREFERENCE, getTypename())); @@ -170,6 +199,14 @@ public final class Class_Type extends Type implements ITypeWithComponents { return "class"; } + /** + * checks if a class has any parents other than 'object' + * @return + */ + public boolean hasRealParent() { + return classBody.hasExtendsReferences(); + } + @Override public Identifier getComponentIdentifierByName(Identifier identifier) { // TODO Auto-generated method stub 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 69e5908cd..9a5848d69 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 @@ -9057,11 +9057,9 @@ pr_ExtendsClassDef returns[ClassTypeReferenceList refList] ( EXTENDS ( ec = pr_ExtendsClassItem { if ($ec.reference != null) $refList.addReference($ec.reference); } - | OBJECTKEYWORD + | OBJECTKEYWORD { // left empty on purpose } ) - (( COMMA ec2 = pr_ExtendsClassItem { if ($ec2.reference != null) $refList.addReference($ec2.reference); } )* - | OBJECTKEYWORD - ) + ( COMMA ec2 = pr_ExtendsClassItem { if ($ec2.reference != null) $refList.addReference($ec2.reference); } )* )?; pr_ExtendsClassItem returns[Reference reference] -- GitLab