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 033d30946b8d137d3369fdd6b53e80d62983fabe..acdc0025f453b03c7e14bc38801828a33a0dc7f8 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 98d2a70149dbd7448e32f9cbabd1bd2868b4371f..1f4fb083dddbd1930d833d9723384f5df32adbb1 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 c209c63c48e16c758f796562848b72382e376e85..bfc0ffb69115d3ebabdbabe588587a630f18beeb 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 631f8b113d5f40b507e4acc4e44675b81fc1ba47..e8891e548dcf0f7acf40c7b50fac150874d6a64c 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 69e5908cd49032858ed5194303e72f0b44010c09..9a5848d69916733d7984ce4807b23a6a96e48ddd 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]