Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
梦境迷离
Scala Macro Tools
提交
0ac0a60e
S
Scala Macro Tools
项目概览
梦境迷离
/
Scala Macro Tools
上一次同步 大约 1 年
通知
8
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
S
Scala Macro Tools
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
未验证
提交
0ac0a60e
编写于
12月 11, 2021
作者:
梦境迷离
提交者:
GitHub
12月 11, 2021
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
optimize macro (#130)
上级
6caac9de
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
46 addition
and
18 deletion
+46
-18
src/main/scala/org/bitlap/tools/ProcessorCreator.scala
src/main/scala/org/bitlap/tools/ProcessorCreator.scala
+1
-4
src/main/scala/org/bitlap/tools/macros/ProcessorCreatorMacro.scala
...scala/org/bitlap/tools/macros/ProcessorCreatorMacro.scala
+8
-5
src/test/scala/org/bitlap/tools/ProcessorCreatorTest.scala
src/test/scala/org/bitlap/tools/ProcessorCreatorTest.scala
+37
-9
未找到文件。
src/main/scala/org/bitlap/tools/ProcessorCreator.scala
浏览文件 @
0ac0a60e
...
...
@@ -66,8 +66,5 @@ object ProcessorCreator {
* Having two identical type parameters will cause the compiler to recognize error and change the order of generics to avoid.
*/
def
apply
[
Service
,
RRC
,
RRP
[
_
<:
Req
]
,
RC
,
Req
,
Resp
]
(
processRequest
:
(
Service
,
RRC
,
Req
)
⇒
Resp
,
processException
:
(
Service
,
RC
,
Exception
)
⇒
Resp
)
:
RRP
[
Req
]
=
macro
ProcessorCreatorMacro
.
OnlyWithFunctionalParameters
[
Service
,
RRC
,
RRP
[
_
<:
Req
]
,
RC
,
Req
,
Resp
]
(
processRequest
:
(
Service
,
RRC
,
Req
)
⇒
Resp
)(
processException
:
(
Service
,
RC
,
Exception
)
⇒
Resp
)
:
RRP
[
Req
]
=
macro
ProcessorCreatorMacro
.
OnlyWithFunctionalParameters
[
Service
,
RRC
,
RRP
[
_
<:
Req
]
,
RC
,
Req
,
Resp
]
}
src/main/scala/org/bitlap/tools/macros/ProcessorCreatorMacro.scala
浏览文件 @
0ac0a60e
...
...
@@ -41,6 +41,7 @@ object ProcessorCreatorMacro {
processException
:
c.Expr
[(
Service
,
RC
,
Exception
)
⇒
Req
]
)(
service
:
c.Expr
[
Service
],
executor
:
c.Expr
[
E
])
:
c.Expr
[
RRP
]
=
{
// parameters in order, parameter names differ will compile error
import
c.universe._
checkTree
[
RRC
,
RRP
,
RC
,
Service
](
c
)(
needCheckService
=
false
)
val
serviceType
=
weakTypeOf
[
Service
]
val
className
=
TypeName
(
classNamePrefix
+
MacroCache
.
getIdentityId
)
val
reqProtoType
=
weakTypeOf
[
Req
]
...
...
@@ -84,7 +85,7 @@ object ProcessorCreatorMacro {
processException
:
c.Expr
[(
Service
,
RC
,
Exception
)
⇒
Req
]
)(
service
:
c.Expr
[
Service
])
:
c.Expr
[
RRP
]
=
{
import
c.universe._
checkTree
[
RRC
,
RRP
,
RC
,
Service
](
c
)
checkTree
[
RRC
,
RRP
,
RC
,
Service
](
c
)
(
needCheckService
=
false
)
val
serviceType
=
weakTypeOf
[
Service
]
val
className
=
TypeName
(
classNamePrefix
+
MacroCache
.
getIdentityId
)
val
reqProtoType
=
weakTypeOf
[
Req
]
...
...
@@ -126,11 +127,12 @@ object ProcessorCreatorMacro {
def
OnlyWithFunctionalParameters
[
Service:
c.WeakTypeTag
,
RRC:
c.WeakTypeTag
,
RRP:
c.WeakTypeTag
,
RC:
c.WeakTypeTag
,
Req:
c.WeakTypeTag
,
Resp:
c.WeakTypeTag
]
(
c
:
blackbox.Context
)(
processRequest
:
c.Expr
[(
Service
,
RRC
,
Req
)
⇒
Req
],
processRequest
:
c.Expr
[(
Service
,
RRC
,
Req
)
⇒
Req
])
(
processException
:
c.Expr
[(
Service
,
RC
,
Exception
)
⇒
Req
]
)
:
c.Expr
[
RRP
]
=
{
import
c.universe._
checkTree
[
RRC
,
RRP
,
RC
,
Service
](
c
)
checkTree
[
RRC
,
RRP
,
RC
,
Service
](
c
)
(
needCheckService
=
true
)
val
serviceType
=
weakTypeOf
[
Service
]
val
className
=
TypeName
(
classNamePrefix
+
MacroCache
.
getIdentityId
)
val
reqProtoType
=
weakTypeOf
[
Req
]
...
...
@@ -184,10 +186,11 @@ object ProcessorCreatorMacro {
ret
}
private
def
checkTree
[
RRC:
c.WeakTypeTag
,
RRP:
c.WeakTypeTag
,
RC:
c.WeakTypeTag
,
Service:
c.WeakTypeTag
](
c
:
blackbox.Context
)
:
Unit
=
{
private
def
checkTree
[
RRC:
c.WeakTypeTag
,
RRP:
c.WeakTypeTag
,
RC:
c.WeakTypeTag
,
Service:
c.WeakTypeTag
](
c
:
blackbox.Context
)
(
needCheckService
:
Boolean
=
true
)
:
Unit
=
{
import
c.universe._
val
serviceType
=
weakTypeOf
[
Service
]
if
(
serviceType
.
typeSymbol
.
isAbstract
||
!
serviceType
.
typeSymbol
.
isClass
)
{
if
(
needCheckService
&&
(
serviceType
.
typeSymbol
.
isAbstract
||
!
serviceType
.
typeSymbol
.
isClass
)
)
{
c
.
abort
(
c
.
enclosingPosition
,
"Not support for abstract classes"
)
}
if
(
serviceType
.
typeSymbol
.
isModuleClass
)
{
...
...
src/test/scala/org/bitlap/tools/ProcessorCreatorTest.scala
浏览文件 @
0ac0a60e
...
...
@@ -99,11 +99,11 @@ class ProcessorCreatorTest extends AnyFlatSpec with Matchers {
val
configurationMap
=
req
.
getConfigurationMap
val
ret
=
service
.
openSession
(
username
,
password
,
configurationMap
.
asScala
.
toMap
)
BOpenSessionResp
.
newBuilder
().
setSessionHandle
(
ret
).
build
()
}
,
(
service
,
rpc
,
exception
)
=>
{
BOpenSessionResp
.
newBuilder
().
setStatus
(
exception
.
getLocalizedMessage
).
build
()
}
)
}
)(
(
service
,
rpc
,
exception
)
=>
{
BOpenSessionResp
.
newBuilder
().
setStatus
(
exception
.
getLocalizedMessage
).
build
()
}
)
println
(
openSession
.
defaultResp
)
...
...
@@ -119,7 +119,7 @@ class ProcessorCreatorTest extends AnyFlatSpec with Matchers {
| val openSession = ProcessorCreator[Service, RpcRequestClosure, RpcRequestProcessor, RpcContext, BOpenSessionReq, BOpenSessionResp](
| (service, rpc, req) => {
| BOpenSessionResp.newBuilder().setSessionHandle(null).build()
| }
,
| }
)(
| (service, rpc, exception) => {
| BOpenSessionResp.newBuilder().setStatus(exception.getLocalizedMessage).build()
| }
...
...
@@ -140,7 +140,7 @@ class ProcessorCreatorTest extends AnyFlatSpec with Matchers {
| val openSession = ProcessorCreator[Service, RpcRequestProcessor, RpcRequestClosure, RpcContext, BOpenSessionReq, BOpenSessionResp](
| (service, rpc, req) => {
| BOpenSessionResp.newBuilder().setSessionHandle(null).build()
| }
,
| }
)(
| (service, rpc, exception) => {
| BOpenSessionResp.newBuilder().setStatus(exception.getLocalizedMessage).build()
| }
...
...
@@ -158,10 +158,10 @@ class ProcessorCreatorTest extends AnyFlatSpec with Matchers {
"ProcessorCreator6"
should
"compile error"
in
{
object
Service
"""
| val openSession = ProcessorCreator[Service, RpcRequestClosure, RpcRequestProcessor, RpcContext, BOpenSessionReq, BOpenSessionResp](
| val openSession = ProcessorCreator[Service
.type
, RpcRequestClosure, RpcRequestProcessor, RpcContext, BOpenSessionReq, BOpenSessionResp](
| (service, rpc, req) => {
| BOpenSessionResp.newBuilder().setSessionHandle(null).build()
| }
,
| }
)(
| (service, rpc, exception) => {
| BOpenSessionResp.newBuilder().setStatus(exception.getLocalizedMessage).build()
| }
...
...
@@ -174,4 +174,32 @@ class ProcessorCreatorTest extends AnyFlatSpec with Matchers {
| println(openSession.interest())
|"""
.
stripMargin
shouldNot
compile
}
// not support interface, because it use runtime reflect to create `NetService` instance.
"ProcessorCreator7"
should
"compile ok"
in
{
"""
| trait NetService {
| def openSession(username: String, password: String, configuration: Map[String, String] = Map.empty): String
| }
| class NetServiceImpl extends NetService {
| override def openSession(username: String, password: String, configuration: Map[String, String] = Map.empty): String = {
| username + password
| }
| }
| implicit val service: NetService = null
| val openSession = ProcessorCreator[NetService, RpcRequestClosure, RpcRequestProcessor, RpcContext, BOpenSessionReq, BOpenSessionResp](
| (service, _, req) => {
| import scala.jdk.CollectionConverters.MapHasAsScala
| val username = req.getUsername
| val password = req.getPassword
| val configurationMap = req.getConfigurationMap
| val ret = service.openSession(username, password, configurationMap.asScala.toMap)
| BOpenSessionResp.newBuilder().setSessionHandle(ret).build()
| })(
| (_, _, exception) => {
| BOpenSessionResp.newBuilder().setStatus(exception.getLocalizedMessage).build()
| }
| )
|"""
.
stripMargin
shouldNot
compile
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录