summaryrefslogtreecommitdiff
path: root/src/test/java/dardia/MultiextendingClass.oj
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/java/dardia/MultiextendingClass.oj')
-rw-r--r--src/test/java/dardia/MultiextendingClass.oj129
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);
+ }
+
+}