Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Closed
longyn opened this issue May 21, 2024 · 16 comments · Fixed by #382 or #385
Closed

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

longyn opened this issue May 21, 2024 · 16 comments · Fixed by #382 or #385

Comments

@longyn
Copy link

longyn commented May 21, 2024

struct CResult
{
    1: i32 result;
}

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

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

问题:

  • '{'不在同行尾,会导致解析失败,
  • list<bool>解析成std::vector<bool>,无法编译
  • map返回值,解析失败,未生成对应的函数
@Barenboim
Copy link
Contributor

好的!感谢报case。

我们看一下怎么解决。

@Barenboim
Copy link
Contributor

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

@Barenboim
Copy link
Contributor

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

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

@Barenboim
Copy link
Contributor

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

@Barenboim
Copy link
Contributor

Barenboim commented May 21, 2024

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

@longyn
Copy link
Author

longyn commented May 21, 2024

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

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

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

  1. 在行尾,不是必现,有条件

@longyn
Copy link
Author

longyn commented May 21, 2024

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

@Barenboim FYI

struct CResult
{
    1: i32 result;
}

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

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

@Barenboim Barenboim linked a pull request May 21, 2024 that will close this issue
@Barenboim
Copy link
Contributor

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

@Barenboim FYI

struct CResult
{
    1: i32 result;
}

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

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

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

@Barenboim
Copy link
Contributor

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

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

@Barenboim
Copy link
Contributor

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

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

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

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

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

@longyn
Copy link
Author

longyn commented May 22, 2024

@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
Copy link
Contributor

@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
Copy link
Author

longyn commented May 22, 2024

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

@Barenboim
Copy link
Contributor

Barenboim commented May 22, 2024

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

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

@Barenboim
Copy link
Contributor

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

@Barenboim Barenboim linked a pull request May 22, 2024 that will close this issue
@Barenboim
Copy link
Contributor

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
2 participants