diff options
Diffstat (limited to 'src/test/java/dardia/MultiextendingClass.oj')
-rw-r--r-- | src/test/java/dardia/MultiextendingClass.oj | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/src/test/java/dardia/MultiextendingClass.oj b/src/test/java/dardia/MultiextendingClass.oj new file mode 100644 index 0000000..51bdccf --- /dev/null +++ b/src/test/java/dardia/MultiextendingClass.oj @@ -0,0 +1,129 @@ +package dardia; + +import io.devnulllabs.openjava.mop.CannotAlterException; +import io.devnulllabs.openjava.mop.Environment; +import io.devnulllabs.openjava.mop.MOPException; +import io.devnulllabs.openjava.mop.Metaclass; +import io.devnulllabs.openjava.mop.MetaInfo; +import io.devnulllabs.openjava.mop.OJClass; +import io.devnulllabs.openjava.mop.OJConstructor; +import io.devnulllabs.openjava.mop.OJField; +import io.devnulllabs.openjava.mop.OJMethod; +import io.devnulllabs.openjava.mop.OJModifier; +import io.devnulllabs.openjava.mop.OJSystem; +import io.devnulllabs.openjava.ptree.ClassDeclaration; +import io.devnulllabs.openjava.ptree.ObjectList; +import io.devnulllabs.openjava.syntax.DefaultListRule; +import io.devnulllabs.openjava.syntax.SyntaxRule; +import io.devnulllabs.openjava.syntax.TokenID; +import io.devnulllabs.openjava.syntax.TypeNameRule; + +public class InterImpl instantiates Metaclass extends OJClass { + + public void translateDefinition() throws io.devnulllabs.openjava.mop.MOPException { + ObjectList extendedClasses = + (openjava.ptree.ObjectList) getSuffix("multiextends"); + if (extendedClasses == null) + return; + + EditableClass newClass = + new EditableClass(makeCopy(getName() + "Impl")); + for (int i = 0; i < extendedClasses.size(); ++i) { + OJClass extendedInterface = + OJClass.forName(extendedClasses.get(i).toString()); + addImplementation(newClass, extendedInterface); + } + + beInterface(); + for (int i = 0; i < extendedClasses.size(); ++i) { + OJClass extendedInterface = + OJClass.forName(extendedClasses.get(i).toString()); + addInterface(extendedInterface); + } + + newClass.addInterface(this); + OJSystem.addNewClass(newClass); + } + + public void addImplementation( + EditableClass newClass, + OJClass extendedInterface) + throws MOPException { + newClass.addInterface(extendedInterface); + OJClass extendedImpl = + OJClass.forName(extendedInterface.getName() + "Impl"); + OJMethod[] methodImpls = extendedImpl.getDeclaredMethods(); + for (int i = 0; i < methodImpls.length; ++i) { + newClass.addMethod(methodImpls[i]); + } + } + + public void beInterface() throws MOPException { + getModifiers().add(OJModifier.INTERFACE); + OJMethod[] methods = getDeclaredMethods(); + for (int i = 0; i < methods.length; ++i) { + methods[i].getModifiers().setAbstract(); + methods[i].setBody(null); + } + } + + public InterImpl( + Environment oj_param0, + OJClass oj_param1, + ClassDeclaration oj_param2) { + super(oj_param0, oj_param1, oj_param2); + } + + public InterImpl(Class oj_param0, MetaInfo oj_param1) { + super(oj_param0, oj_param1); + } + + // new class modifier: "multiextends". + public static boolean isRegisteredKeyword(String str) { + if (str.equals("multiextends")) { + return (true); + } + return OJClass.isRegisteredKeyword(str); + } + + // overridden to let OpenJava know how multiextends arguments are + // separated. + public static SyntaxRule getDeclSuffixRule(String str) { + if (str.equals("multiextends")) { + return new DefaultListRule(new TypeNameRule(), TokenID.COMMA); + } + return OJClass.getDeclSuffixRule(str); + } +} + +class EditableClass extends io.devnulllabs.openjava.mop.OJClass { + public EditableClass(OJClass original) throws CannotAlterException { + super( + original.getEnvironment(), + original.getDeclaringClass(), + original.getSourceCode()); + } + + public OJClass addClass(openjava.mop.OJClass clazz) + throws CannotAlterException { + return super.addClass(clazz); + } + + public OJConstructor addConstructor(OJConstructor constr) + throws CannotAlterException { + return super.addConstructor(constr); + } + + public OJField addField(OJField field) throws CannotAlterException { + return super.addField(field); + } + + public void addInterface(OJClass clazz) throws CannotAlterException { + super.addInterface(clazz); + } + + public OJMethod addMethod(OJMethod method) throws CannotAlterException { + return super.addMethod(method); + } + +} |