sogou / srpc

RPC framework based on C++ Workflow. Supports SRPC, Baidu bRPC, Tencent tRPC, thrift protocols.
Apache License 2.0
1.93k stars 382 forks source link

list<bool>和map返回值不能正确处理 #381

Closed longyn closed 3 months ago

longyn commented 3 months ago

struct CResult
{
    1: i32 result;
}

/** 变量类别 */
enum EFruit
{
  Apple
}

service TestService
{
   list<bool> getStatusList();
   map<i32, i32> getValue();
}

问题:

Barenboim commented 3 months ago

好的!感谢报case。

我们看一下怎么解决。

Barenboim commented 3 months ago

请教一下,list应该被解析成std::list吗?

Barenboim commented 3 months ago

我们看了一下,list好像解析成std::vector是正确的。thrift本身没有vector,只能写成list。

std::map<int, int>这个写法不对,thrift只能写成map<i32, i32>

Barenboim commented 3 months ago

大括号在行首或行尾,也都没有问题……

Barenboim commented 3 months ago

明白你list的问题了。C++的vector\<bool>,没有办法用引用遍历。我们看看怎么解决。

longyn commented 3 months ago

我们看了一下,list好像解析成std::vector是正确的。thrift本身没有vector,只能写成list。

std::map<int, int>这个写法不对,thrift只能写成map<i32, i32>

已更正,手写错了,意思就是用map返回值解析类型,错误

  1. 在行尾,不是必现,有条件
longyn commented 3 months ago

大括号在行首或行尾,也都没有问题……

@Barenboim FYI


struct CResult
{
    1: i32 result;
}

/** 变量类别 */
enum EFruit
{
  Apple
}

service TestService
{
   list<bool> getStatusList();
   map<i32, i32> getValue();
}
Barenboim commented 3 months ago

大括号在行首或行尾,也都没有问题……

@Barenboim FYI

struct CResult
{
    1: i32 result;
}

/** 变量类别 */
enum EFruit
{
  Apple
}

service TestService
{
   list<bool> getStatusList();
   map<i32, i32> getValue();
}

应该是我们解析注释的问题。去掉注释是对的。

Barenboim commented 3 months ago

@longyn 你好,两个问题应该都修复了,麻烦用最新代码再帮我们试一下。

map目前没发现有什么问题。

Barenboim commented 3 months ago

目前对注释的去除可能会出现一些过召的问题,例如这么写可能会被解析成功:

struct CR/*****/esult
{
    1: i32 result;
}

/** 变量类别 */
enum EFruit
{
  Apple
}

service TestService
{
   list<bool> getStatusList();
   map<i32, i32> getValue();
}

之后有空我们再完善一下,不影响正常使用。

longyn commented 3 months ago

@Barenboim 看生成的代码,没有map的接口, parser.cc里是通split空格取得返回值类型和方法,aa.size() == 3, 被忽略

/*
 * Server codes
 * Generated by SRPC
 */

class Service : public srpc::RPCService
{
public:
    // please implement these methods in server.cc

    virtual void getStatusList(std::vector<bool>& _return);

public:

    virtual void getStatusList(getStatusListRequest *request, getStatusListResponse *response,
                    srpc::RPCContext *ctx);

public:
    Service();
};
Barenboim commented 3 months ago

@Barenboim 看生成的代码,没有map的接口, parser.cc里是通split空格取得返回值类型和方法,aa.size() == 3, 被忽略

/*
 * Server codes
 * Generated by SRPC
 */

class Service : public srpc::RPCService
{
public:
  // please implement these methods in server.cc

  virtual void getStatusList(std::vector<bool>& _return);

public:

  virtual void getStatusList(getStatusListRequest *request, getStatusListResponse *response,
                  srpc::RPCContext *ctx);

public:
  Service();
};

好的,感谢。我们一会修改一下。

longyn commented 3 months ago

我用最新的代码,测试了一下,可以正常解析和工作了,感谢

Barenboim commented 3 months ago

我用最新的代码,测试了一下,可以正常解析和工作了,感谢

其实这个bug还没有改好…… 主要是写成map<i32,i32>,两个i32之间不加空格就没有问题。我们还在修。你这边可以先把空格去了先用起来。

Barenboim commented 3 months ago

感谢给我们报bug。如果用上了,也麻烦star一下我们项目。

Barenboim commented 3 months ago

@longyn map的问题也彻底修复了,不会再受空格影响。