blob: 51bdccf529c43c0843ce486cb79446773b8e1914 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
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);
}
}
|