Interface methods aren't compiled
Monkey Forums/Monkey Bug Reports/Interface methods aren't compiled
| ||
| Hi, I'm experiencing this kind of error with increased frequency. When compiling, Monkey doesn't compile actually needed methods, which either generate runtime errors (in the case of JavaScript for example), or get caught by other compilers, like the Java one. I'm using Monkey Pro v84e. Following the code I'm using: util/publisher.monkey
import engine.core.idisposable
import ipublisher
import isubscriber
class Publisher implements IPublisher, IDisposable
method New()
subscribers = new StringMap<List<ISubscriber>>
subscribers.Add("*", new List<ISubscriber>)
Subscribe(null, "")
end
method Publish:void(event:string, data:Object)
for local s:= eachin subscribers.Get("*")
s.OnEventPublished(event, data)
next
if not subscribers.Contains(event) then return
for local s:= eachin subscribers.Get(event)
if subscribers.Get("*").Contains(s) then continue
s.OnEventPublished(event, data)
next
end
method Subscribe:void(subscriber:ISubscriber, event:string)
if not subscribers.Contains(event) then subscribers.Add(event, new List<ISubscriber>)
if subscribers.Get(event).Contains(subscriber) then return
subscribers.Get(event).AddLast(subscriber)
end
method Unsubscribe:void(subscriber:ISubscriber, event:string)
if not subscribers.Contains(event) then return
subscribers.Get(event).RemoveEach(subscriber)
end
method Dispose:void()
for local eventSubscribers:= eachin subscribers.Values()
eventSubscribers.Clear()
next
subscribers.Clear()
end
private
field subscribers:StringMap<List<ISubscriber>>
end
util/ipublisher.monkey
import isubscriber
interface IPublisher
method Publish:void(event:string, data:Object)
method Subscribe:void(subscriber:ISubscriber, event:string)
method Unsubscribe:void(subscriber:ISubscriber, event:string)
end
This is the translated Java code:
interface c_IPublisher{
public void p_Subscribe(c_ISubscriber t_subscriber,String t_event);
public void p_Publish(String t_event,Object t_data);
}
interface c_IDisposable{
public void p_Dispose();
}
class c_Publisher extends Object implements c_IPublisher,c_IDisposable{
c_StringMap m_subscribers=null;
public final c_Publisher m_Publisher_new(){
m_subscribers=(new c_StringMap()).m_StringMap_new();
m_subscribers.p_Add("*",(new c_List7()).m_List_new());
return this;
}
public final void p_Publish(String t_event,Object t_data){
c_Enumerator7 t_=m_subscribers.p_Get("*").p_ObjectEnumerator();
while(t_.p_HasNext()){
c_ISubscriber t_s=t_.p_NextObject();
t_s.p_OnEventPublished(t_event,t_data);
}
if(!m_subscribers.p_Contains3(t_event)){
return;
}
c_Enumerator7 t_2=m_subscribers.p_Get(t_event).p_ObjectEnumerator();
while(t_2.p_HasNext()){
c_ISubscriber t_s2=t_2.p_NextObject();
if(m_subscribers.p_Get("*").p_Contains7(t_s2)){
continue;
}
t_s2.p_OnEventPublished(t_event,t_data);
}
}
}
The IPublisher.Subscribe and IDisposable.Dispose methods are not compiled and Java complains
error: c_Publisher is not abstract and does not override abstract method p_Subscribe(c_ISubscriber,String) in c_IPublisher
[javac] class c_Publisher extends Object implements c_IPublisher,c_IDisposable{
[javac] ^
I can sometimes circumvent these errors by forcing the calling of those methods, like
class Publisher implements IPublisher, IDisposable
method New()
subscribers = new StringMap<List<ISubscriber>>
subscribers.Add("*", new List<ISubscriber>)
Subscribe(null, "") ' <---- really bad hack
end
...
But it's not always that simple obviously. I can also force the methods to compile by including the class in the reflection filter, but it's something I'd rather avoid. |
| ||
| Can you post a build/runnable example? |
| ||
| Nope, the error appears only when all the game code is being compiled, not when only that class is being used in a test code :/ I will try to narrow it down though. |