Interface methods aren't compiled

Monkey Forums/Monkey Bug Reports/Interface methods aren't compiled

itto(Posted 2015) [#1]
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.


marksibly(Posted 2015) [#2]
Can you post a build/runnable example?


itto(Posted 2015) [#3]
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.