Класс не может быть найдена ошибка

Делать все возможное, чтобы попытаться решить мои проблемы без публикации вопросов здесь. Однако поисковая система valadoc недавно была взломана, и IRC-канал #vala менее полезен, когда дело доходит до кода Genie (понятно).

цель

Я пытаюсь предоставить интерфейс OOP Gtk из этого вопроса в это раннее приложение с графическим интерфейсом pandoc.

проблема

Я застрял с ошибкой pandoc-gui.gs:56.24-56.43: error: The type name `DocumentFileSelector' could not be found\n _document_selector:DocumentFileSelector при компиляции. Класс определен позже в программе, но я не могу найти то, что сделал неправильно, что делает его невидимым для init.

Это процедура инициализации:

init
    Intl.setlocale()
    Gtk.init (ref args)

    var header = new Header ( "Pandoc GUI" )
    var body = new WorkingFile(  )
    var app = new AppWindow ( header,body )
    var load_new_content_command = new Load( body, document_selector )
    var document_selector = new DocumentFileSelector( app )
    var convert_command = new Convert (document_selector)

    header.add_item( new OpenButton( load_new_content_command ) )
    header.add_item( new ConvertButton ( convert_command ) )

    app.show_all ()
    Gtk.main ()

Это класс Convert:

class Convert:Object implements Command

    _document_selector:DocumentFileSelector

    construct ( document_selector:DocumentFileSelector )

        _document_selector = document_selector

    def execute()

        var a = new ToPDF()
        a.convert.begin( document_selector.whichFile(), "output_file.pdf" )

И интерфейсы:

interface Command:Object
        def abstract execute()

interface DocumentSelector:Object
        def abstract select():bool
        def abstract get_document():string

И класс DocumentFileSelector:

class DocumentFileSelector:Object implements DocumentSelector

    _parent:Window
    _uri:string = ""
    _filename:string = ""

    construct( parent:Window )
        _parent = parent

    def select():bool
        var dialog = new FileChooserDialog( "Open file",
                                        _parent,
                                        FileChooserAction.OPEN,
                                        dgettext( "gtk30", "_OK"),
                                        ResponseType.ACCEPT,
                                        dgettext( "gtk30", "_Cancel" ),
                                        ResponseType.CANCEL)

        selected:bool = false
        var response = dialog.run()
        case response
            when ResponseType.ACCEPT
                    _filename = dialog.get_filename()
                    _uri = dialog.get_uri()
                    selected = true
        dialog.destroy()
        return selected

    def whichFile():string
        return _uri

    def get_document():string
        text : string
        len : size_t
        try
                FileUtils.get_contents (_filename, out text, out len)
        except ex : FileError
                print "%s\n", ex.message
        return text

Вопрос

Почему DocumentFileSelector не отображается init в этом случае?

Примечание. Я до сих пор выясняю, как написать минимально воспроизводимый вопрос, однако это не так просто, как кажется, когда дело доходит до ООП со всеми взаимозависимыми частями. По этой причине, вот весь код на случай, если того, что я предоставил, было недостаточно, чтобы помочь.

1 ответ

Решение

К сожалению, вы столкнулись с ошибкой в ​​парсере Genie. В вашем коде есть три места, где вы используете два отступа для обозначения одного нового блока кода. Это:

  1. Ваши определения интерфейса
  2. case when ... блок в select() метод DocumentFileSelector
  3. try...except блок в get_document() метод DocumentFileSelector

Например, изменить

interface Command:Object
        def abstract execute()

в

interface Command:Object
    def abstract execute()

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

Парсер Genie читает два отступа, но запутывается, потому что он не ведет записи, он ищет два отступа, чтобы отметить конец блока. Любой, кто хочет это исправить, взглянет на Developing Genie.

Другие вопросы по тегам