#pragma once

#include "location_type.h"
#include "lsDocumentUri.h"
#include "lsTextEdit.h"
#include "lsPosition.h"

// codeAction
struct CommandArgs
{
    lsDocumentUri textDocumentUri;
    std::vector<lsTextEdit> edits;
};
MAKE_REFLECT_STRUCT_WRITER_AS_ARRAY(CommandArgs, textDocumentUri, edits);
inline void Reflect(Reader& visitor, CommandArgs& value)
{
    int i = 0;
    visitor.IterArray(
        [&](Reader& visitor)
        {
            switch (i++)
            {
            case 0:
                Reflect(visitor, value.textDocumentUri);
                break;
            case 1:
                Reflect(visitor, value.edits);
                break;
            }
        }
    );
}

// codeLens
struct lsCodeLensUserData
{
};
MAKE_REFLECT_EMPTY_STRUCT(lsCodeLensUserData);

struct lsCodeLensCommandArguments
{
    lsDocumentUri uri;
    lsPosition position;
    std::vector<lsLocation> locations;
};

// FIXME Don't use array in vscode-cquery
inline void Reflect(Writer& visitor, lsCodeLensCommandArguments& value)
{
    visitor.StartArray(3);
    Reflect(visitor, value.uri);
    Reflect(visitor, value.position);
    Reflect(visitor, value.locations);
    visitor.EndArray();
}

inline void Reflect(Reader& visitor, lsCodeLensCommandArguments& value)
{
    int i = 0;
    visitor.IterArray(
        [&](Reader& visitor)
        {
            switch (i++)
            {
            case 0:
                Reflect(visitor, value.uri);
                break;
            case 1:
                Reflect(visitor, value.position);
                break;
            case 2:
                Reflect(visitor, value.locations);
                break;
            }
        }
    );
}
