LeKaitoW / raox

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

Нечитаемые сообщения об ошибках #431

Open aurusov opened 8 years ago

aurusov commented 8 years ago

Нечитаемое сообщение об ошибке, пример для кода

logic Model {
    new Activity(Service.create());
}

2016-09-04_21-20-11

aurusov commented 8 years ago

Если задача тянет на бонус, практику или курсовой, то сформулируй постановку и набросай путь решения.

bogachev-pa commented 8 years ago

Пути решения сразу не вижу, надо разбираться.

bogachev-pa commented 8 years ago

Проблема решается созданием своего класса, наследующего SyntaxErrorMessageProvider и переопределением его метода getSyntaxErrorMessage(). В этом методе можно посмотреть контекст грамматической ошибки (на каком элементе грамматики она случилась) и дефолтное сообщение об ошибке, ну и вернуть свое сообщение об ошибке вместо дефолтного. Вполне тянет на бонус или практику.

Могу написать чуть более подробную инструкцию, если нужно.

aurusov commented 8 years ago

Пример в коде есть ?

bogachev-pa commented 8 years ago

Вечером скину.

bogachev-pa commented 8 years ago

Примерно так будет выглядеть нужный нам класс:

package ru.bmstu.rk9.rao.parser;

import static org.eclipse.xtext.diagnostics.Diagnostic.SYNTAX_DIAGNOSTIC;

import org.eclipse.xtext.nodemodel.SyntaxErrorMessage;
import org.eclipse.xtext.parser.antlr.SyntaxErrorMessageProvider;

import ru.bmstu.rk9.rao.rao.Logic;

public class RaoSyntaxErrorMessageProvider extends SyntaxErrorMessageProvider {
    @Override
    public SyntaxErrorMessage getSyntaxErrorMessage(IParserErrorContext context) {
        if (context.getCurrentContext() instanceof Logic) {
            return new SyntaxErrorMessage("This is the custom error message", SYNTAX_DIAGNOSTIC);
        }

        return super.getSyntaxErrorMessage(context);
    }
}

В RaoRuntimeModule надо его забиндить:

public Class<? extends ISyntaxErrorMessageProvider> bindISyntaxErrorMessageProvider() {
    return RaoSyntaxErrorMessageProvider.class;
}
aurusov commented 8 years ago

Как правильно работать с контекстом ? Можешь сделать пример для ошибки из топика ?

bogachev-pa commented 8 years ago

Пока не могу, не разбирался достаточно подробно. Сделать?

UPD: Немного покопался с контекстами, они странные. По непонятным для меня причинам в невалидном коде, который вы привели, он находит FunctionDeclaration. Не уверен, что, если икстест выдает такой мусор, то его можно адекватно обработать.

aurusov commented 8 years ago

Что делать ?

bogachev-pa commented 8 years ago

Ну, в лучше случае можно показать чуть более адекватное сообщение об ошибке в одном месте (где подчеркивается new) и оставить непонятный мусор в остальных местах.

aurusov commented 8 years ago

Это не решение. В Старом РДО я убил 1 год, чтобы сделать хоть какие-то сообщения об ошибках, которые и в финальной версии выглядели не очень. И для этого нужно было править грамматику, она выросла в несколько раз. Она писалась без оглядки на ошибки. Кажется, тут такой же случай. Поэтому прошу подумать над более сложным, но правильным решением. Не знаю true way для xbase'а. Решение главное наметить. Потом можно поставить как курсовой.