LeKaitoW / raox

Rao modelling language written in Xbase
http://raox.ru
MIT License
12 stars 26 forks source link

Не собирается под Neon #411

Closed aurusov closed 8 years ago

aurusov commented 8 years ago

Вышла новая версия Эклипса http://www.eclipse.org/downloads/packages/eclipse-ide-java-and-dsl-developers/neonr

В ru.bmstu.rk9.rao.tests ошибка в сгенеренном файле. Не знаю где именно ошибка, но он не может скастить RaoRuntimeModule -> Module. Нужно что-то типа

public Injector createInjector() {
    return Guice.createInjector((com.google.inject.Module)createRuntimeModule());
}

или разбираться глубже. Вижу две ошибки

Само РДО собирается, запускается и работает.

aurusov commented 8 years ago

Паша, посмотри это место. Блочит переход на Неон.

bogachev-pa commented 8 years ago

Проблема в том, что метод createInjector() принимает Module..., т.е. varargs. Джава воспринимает его как массив с произвольным числом элементов. Поэтому если передавать просто RaoRuntimeModule, то он не может покастить массив RaoRuntimeModule к массиву Module (хоть и RaoRuntimeModule к Module кастится). Тут камень в огород джавы, я думаю.

Теперь надо выяснить, почему генерится такой кривой код.

aurusov commented 8 years ago

Тоже думал про кастинг к массиву. Но где-то в другом месте нашел аналогичную конструкцию, которая компилится. Или ошибаюсь, и подобного нет ?

bogachev-pa commented 8 years ago

Проверил в доках джавы, с массивами так действительно можно делать. https://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html

Example 5.2-3.

Point[] pvec = new Point[100];
ColoredPoint[] cpvec = new ColoredPoint[100];
pvec = cpvec;                // okay

The value of cpvec can be assigned to pvec, because any reference that could be the value of an expression of type ColoredPoint can be the value of a variable of type Point.

В таком случае непонятно, почему с varargs не получается. Пока разбираюсь.

UPD: подозреваю, что такой каст работает с переменными, но не будет работать с параметрами методов. По возможности проверю на простом примере.

aurusov commented 8 years ago

Главное, не закопайся в этой задаче. Нам тут тесты восстановить надо. Для раскопок можно другую задачу создать.

bogachev-pa commented 8 years ago

Странно, вроде должно работать. Возможно, я неправильно понял ошибку. На простом примере все ок.

class Test {

    private static void test1(Object[] args) {
    }

    private static void test2(Object... args) {
    }

    public static void main(String[] args) {

        String s = new String("Hello1");
        Object o = new String("Hello2");

        // test1(s); //fails
        // test1(o); //fails

        test2(s); //ok
        test2(o); //ok
    }
}
aurusov commented 8 years ago

Во-во, странно.

aurusov commented 8 years ago

Кажется, что он не видит кастинг

bogachev-pa commented 8 years ago

Ведет себя очень странно, RaoRuntimeModule нормально кастится к Module (неявным кастом) в проекте, где он объявлен, но в проекте тестов почему-то не кастится. Разъехались какие-то зависимости, но какие именно пока мне неясно.

В качестве временного быстрого решения можно просто отключить генерацию файлов в tests/src-gen, т.к. они на данный момент не используются. Коммит выше. Если ок, поставлю пул-реквест.

aurusov commented 8 years ago

Да, давай отключим и всё.

bogachev-pa commented 8 years ago

Закрывать?

aurusov commented 8 years ago

Да