Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
硅谷海盗
kotlin
提交
2db413d5
K
kotlin
项目概览
硅谷海盗
/
kotlin
与 Fork 源项目一致
从无法访问的项目Fork
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
K
kotlin
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
2db413d5
编写于
3月 10, 2021
作者:
M
Mikhail Glukhikh
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
FIR: enhance (using mode inside) BodyResolveContext.withAnonymousFunction
上级
798d848a
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
38 addition
and
48 deletion
+38
-48
compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/BodyResolveContext.kt
...r/resolve/transformers/body/resolve/BodyResolveContext.kt
+8
-6
compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirDeclarationsResolveTransformer.kt
...formers/body/resolve/FirDeclarationsResolveTransformer.kt
+30
-42
未找到文件。
compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/BodyResolveContext.kt
浏览文件 @
2db413d5
...
...
@@ -214,10 +214,6 @@ class BodyResolveContext(
updateLastScope
{
storeBackingField
(
property
)
}
}
fun
saveContextForAnonymousFunction
(
anonymousFunction
:
FirAnonymousFunction
)
{
towerDataContextForAnonymousFunctions
[
anonymousFunction
.
symbol
]
=
towerDataContext
}
fun
dropContextForAnonymousFunction
(
anonymousFunction
:
FirAnonymousFunction
)
{
towerDataContextForAnonymousFunctions
.
remove
(
anonymousFunction
.
symbol
)
}
...
...
@@ -404,16 +400,22 @@ class BodyResolveContext(
inline
fun
<
T
>
withAnonymousFunction
(
anonymousFunction
:
FirAnonymousFunction
,
holder
:
SessionHolder
,
isInDependentContext
:
Boolean
=
fals
e
,
mode
:
ResolutionMod
e
,
crossinline
f
:
()
->
T
):
T
{
if
(
mode
!
is
ResolutionMode
.
LambdaResolution
)
{
towerDataContextForAnonymousFunctions
[
anonymousFunction
.
symbol
]
=
towerDataContext
}
if
(
mode
is
ResolutionMode
.
ContextDependent
||
mode
is
ResolutionMode
.
ContextDependentDelegate
)
{
return
f
()
}
return
withTowerDataCleanup
{
addLocalScope
(
FirLocalScope
())
val
receiverTypeRef
=
anonymousFunction
.
receiverTypeRef
val
labelName
=
anonymousFunction
.
label
?.
name
?.
let
{
Name
.
identifier
(
it
)
}
withContainer
(
anonymousFunction
)
{
withLabelAndReceiverType
(
labelName
,
anonymousFunction
,
receiverTypeRef
?.
coneType
,
holder
)
{
if
(
isInDependentContext
)
{
if
(
mode
is
ResolutionMode
.
LambdaResolution
)
{
withLambdaBeingAnalyzedInDependentContext
(
anonymousFunction
.
symbol
,
f
)
}
else
{
f
()
...
...
compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirDeclarationsResolveTransformer.kt
浏览文件 @
2db413d5
...
...
@@ -104,14 +104,6 @@ open class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransfor
}
}
protected
inline
fun
<
T
>
withTypeParametersOf
(
declaration
:
FirMemberDeclaration
,
crossinline
l
:
()
->
T
):
T
{
val
scope
=
createTypeParameterScope
(
declaration
)
return
context
.
withTowerDataCleanup
{
scope
?.
let
{
context
.
addNonLocalTowerDataElement
(
it
.
asTowerDataElement
(
isLocal
=
false
))
}
l
()
}
}
override
fun
transformEnumEntry
(
enumEntry
:
FirEnumEntry
,
data
:
ResolutionMode
):
CompositeTransformResult
<
FirDeclaration
>
{
if
(
enumEntry
.
resolvePhase
==
transformerPhase
)
return
enumEntry
.
compose
()
transformer
.
replaceDeclarationResolvePhaseIfNeeded
(
enumEntry
,
transformerPhase
)
...
...
@@ -424,38 +416,31 @@ open class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransfor
private
fun
transformAnonymousFunctionWithLambdaResolution
(
anonymousFunction
:
FirAnonymousFunction
,
lambdaResolution
:
ResolutionMode
.
LambdaResolution
):
FirAnonymousFunction
{
fun
transform
():
FirAnonymousFunction
{
val
expectedReturnType
=
lambdaResolution
.
expectedReturnTypeRef
?:
anonymousFunction
.
returnTypeRef
.
takeUnless
{
it
is
FirImplicitTypeRef
}
val
result
=
transformFunction
(
anonymousFunction
,
withExpectedType
(
expectedReturnType
)).
single
as
FirAnonymousFunction
val
body
=
result
.
body
if
(
result
.
returnTypeRef
is
FirImplicitTypeRef
&&
body
!=
null
)
{
// TODO: This part seems unnecessary because for lambdas in dependent context will be completed and their type
// should be replaced there properly
val
returnType
=
dataFlowAnalyzer
.
returnExpressionsOfAnonymousFunction
(
result
)
.
firstNotNullResult
{
(
it
as
?
FirExpression
)
?.
resultType
?.
coneTypeSafe
()
}
if
(
returnType
!=
null
)
{
result
.
transformReturnTypeRef
(
transformer
,
withExpectedType
(
returnType
))
}
else
{
result
.
transformReturnTypeRef
(
transformer
,
withExpectedType
(
buildErrorTypeRef
{
diagnostic
=
ConeSimpleDiagnostic
(
"Unresolved lambda return type"
,
DiagnosticKind
.
InferenceError
)
})
)
}
val
expectedReturnType
=
lambdaResolution
.
expectedReturnTypeRef
?:
anonymousFunction
.
returnTypeRef
.
takeUnless
{
it
is
FirImplicitTypeRef
}
val
result
=
transformFunction
(
anonymousFunction
,
withExpectedType
(
expectedReturnType
)).
single
as
FirAnonymousFunction
val
body
=
result
.
body
if
(
result
.
returnTypeRef
is
FirImplicitTypeRef
&&
body
!=
null
)
{
// TODO: This part seems unnecessary because for lambdas in dependent context will be completed and their type
// should be replaced there properly
val
returnType
=
dataFlowAnalyzer
.
returnExpressionsOfAnonymousFunction
(
result
)
.
firstNotNullResult
{
(
it
as
?
FirExpression
)
?.
resultType
?.
coneTypeSafe
()
}
if
(
returnType
!=
null
)
{
result
.
transformReturnTypeRef
(
transformer
,
withExpectedType
(
returnType
))
}
else
{
result
.
transformReturnTypeRef
(
transformer
,
withExpectedType
(
buildErrorTypeRef
{
diagnostic
=
ConeSimpleDiagnostic
(
"Unresolved lambda return type"
,
DiagnosticKind
.
InferenceError
)
})
)
}
return
result
}
return
context
.
withAnonymousFunction
(
anonymousFunction
,
components
,
isInDependentContext
=
true
)
{
transform
()
}
return
result
}
override
fun
transformSimpleFunction
(
...
...
@@ -630,15 +615,18 @@ open class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransfor
anonymousFunction
.
transformReturnTypeRef
(
transformer
,
ResolutionMode
.
ContextIndependent
)
anonymousFunction
.
transformReceiverTypeRef
(
transformer
,
ResolutionMode
.
ContextIndependent
)
anonymousFunction
.
valueParameters
.
forEach
{
it
.
transformReturnTypeRef
(
transformer
,
ResolutionMode
.
ContextIndependent
)
}
context
.
saveContextForAnonymousFunction
(
anonymousFunction
)
}
return
when
(
data
)
{
is
ResolutionMode
.
ContextDependent
,
is
ResolutionMode
.
ContextDependentDelegate
->
{
dataFlowAnalyzer
.
visitPostponedAnonymousFunction
(
anonymousFunction
)
anonymousFunction
.
addReturn
().
compose
()
context
.
withAnonymousFunction
(
anonymousFunction
,
components
,
data
)
{
dataFlowAnalyzer
.
visitPostponedAnonymousFunction
(
anonymousFunction
)
anonymousFunction
.
addReturn
().
compose
()
}
}
is
ResolutionMode
.
LambdaResolution
->
{
transformAnonymousFunctionWithLambdaResolution
(
anonymousFunction
,
data
).
addReturn
().
compose
()
context
.
withAnonymousFunction
(
anonymousFunction
,
components
,
data
)
{
transformAnonymousFunctionWithLambdaResolution
(
anonymousFunction
,
data
).
addReturn
().
compose
()
}
}
is
ResolutionMode
.
WithExpectedType
,
is
ResolutionMode
.
ContextIndependent
->
{
val
expectedTypeRef
=
(
data
as
?
ResolutionMode
.
WithExpectedType
)
?.
expectedTypeRef
?:
buildImplicitTypeRef
()
...
...
@@ -699,7 +687,7 @@ open class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransfor
)
lambda
=
lambda
.
transformValueParameters
(
ImplicitToErrorTypeTransformer
,
null
)
val
bodyExpectedType
=
returnTypeRefFromResolvedAtom
?:
expectedTypeRef
context
.
withAnonymousFunction
(
lambda
,
components
)
{
context
.
withAnonymousFunction
(
lambda
,
components
,
data
)
{
lambda
=
transformFunction
(
lambda
,
withExpectedType
(
bodyExpectedType
)).
single
as
FirAnonymousFunction
}
// To separate function and separate commit
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录