Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
硅谷海盗
kotlin
提交
bd809c87
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 搜索 >>
提交
bd809c87
编写于
9月 07, 2017
作者:
D
Denis Zharkov
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Minor. Move local functions to file and inline parameter
上级
775d6988
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
51 addition
and
40 deletion
+51
-40
core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/typeEnhancement/signatureEnhancement.kt
.../kotlin/load/java/typeEnhancement/signatureEnhancement.kt
+51
-40
未找到文件。
core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/typeEnhancement/signatureEnhancement.kt
浏览文件 @
bd809c87
...
...
@@ -302,14 +302,14 @@ class SignatureEnhancement(private val annotationTypeQualifierResolver: Annotati
val
verticalSlice
=
indexedFromSupertypes
.
mapNotNull
{
it
.
getOrNull
(
index
)
}
// Only the head type constructor is safely co-variant
qualifiers
.
computeQualifiersForOverride
(
verticalSlice
,
is
Covariant
&&
isHeadTypeConstructor
,
is
HeadTypeConstructor
)
qualifiers
.
computeQualifiersForOverride
(
verticalSlice
,
isHeadTypeConstructor
)
}
return
{
index
->
computedResult
.
getOrElse
(
index
)
{
JavaTypeQualifiers
.
NONE
}
}
}
private
fun
KotlinType
.
computeQualifiersForOverride
(
fromSupertypes
:
Collection
<
KotlinType
>,
isCovariant
:
Boolean
,
fromSupertypes
:
Collection
<
KotlinType
>,
isHeadTypeConstructor
:
Boolean
):
JavaTypeQualifiers
{
val
superQualifiers
=
fromSupertypes
.
map
{
it
.
extractQualifiers
()
}
...
...
@@ -320,55 +320,34 @@ class SignatureEnhancement(private val annotationTypeQualifierResolver: Annotati
.
toSet
()
val
own
=
extractQualifiersFromAnnotations
(
isHeadTypeConstructor
)
val
isAnyNonNullTypeParameter
=
own
.
isNotNullTypeParameter
||
superQualifiers
.
any
{
it
.
isNotNullTypeParameter
}
fun
createJavaTypeQualifiers
(
nullability
:
NullabilityQualifier
?,
mutability
:
MutabilityQualifier
?,
forWarning
:
Boolean
):
JavaTypeQualifiers
{
if
(!
isAnyNonNullTypeParameter
||
nullability
!=
NullabilityQualifier
.
NOT_NULL
)
{
return
JavaTypeQualifiers
(
nullability
,
mutability
,
false
,
forWarning
)
}
return
JavaTypeQualifiers
(
nullability
,
mutability
,
true
,
forWarning
)
}
fun
<
T
:
Any
>
Set
<
T
>.
select
(
low
:
T
,
high
:
T
,
own
:
T
?):
T
?
{
if
(
isCovariant
)
{
val
supertypeQualifier
=
if
(
low
in
this
)
low
else
if
(
high
in
this
)
high
else
null
return
if
(
supertypeQualifier
==
low
&&
own
==
high
)
null
else
own
?:
supertypeQualifier
}
// isInvariant
val
effectiveSet
=
own
?.
let
{
(
this
+
own
).
toSet
()
}
?:
this
// if this set contains exactly one element, it is the qualifier everybody agrees upon,
// otherwise (no qualifiers, or multiple qualifiers), there's no single such qualifier
// and all qualifiers are discarded
return
effectiveSet
.
singleOrNull
()
}
fun
Set
<
NullabilityQualifier
>.
select
(
own
:
NullabilityQualifier
?)
=
if
(
own
==
NullabilityQualifier
.
FORCE_FLEXIBILITY
)
NullabilityQualifier
.
FORCE_FLEXIBILITY
else
select
(
NullabilityQualifier
.
NOT_NULL
,
NullabilityQualifier
.
NULLABLE
,
own
)
val
ownNullability
=
own
.
takeIf
{
!
it
.
isNullabilityQualifierForWarning
}
?.
nullability
val
ownNullabilityForWarning
=
own
.
nullability
val
nullability
=
nullabilityFromSupertypes
.
select
(
ownNullability
)
val
mutability
=
mutabilityFromSupertypes
.
select
(
MutabilityQualifier
.
MUTABLE
,
MutabilityQualifier
.
READ_ONLY
,
own
.
mutability
)
val
isCovariantPosition
=
isCovariant
&&
isHeadTypeConstructor
val
nullability
=
nullabilityFromSupertypes
.
select
(
ownNullability
,
isCovariantPosition
)
val
mutability
=
mutabilityFromSupertypes
.
select
(
MutabilityQualifier
.
MUTABLE
,
MutabilityQualifier
.
READ_ONLY
,
own
.
mutability
,
isCovariantPosition
)
val
canChange
=
ownNullabilityForWarning
!=
ownNullability
||
nullabilityFromSupertypesWithWarning
!=
nullabilityFromSupertypes
val
isAnyNonNullTypeParameter
=
own
.
isNotNullTypeParameter
||
superQualifiers
.
any
{
it
.
isNotNullTypeParameter
}
if
(
nullability
==
null
&&
canChange
)
{
val
nullabilityWithWarning
=
nullabilityFromSupertypesWithWarning
.
select
(
ownNullabilityForWarning
)
nullabilityFromSupertypesWithWarning
.
select
(
ownNullabilityForWarning
,
isCovariantPosition
)
return
createJavaTypeQualifiers
(
nullabilityWithWarning
,
mutability
,
true
)
return
createJavaTypeQualifiers
(
nullabilityWithWarning
,
mutability
,
forWarning
=
true
,
isAnyNonNullTypeParameter
=
isAnyNonNullTypeParameter
)
}
return
createJavaTypeQualifiers
(
nullability
,
mutability
,
nullability
==
null
)
return
createJavaTypeQualifiers
(
nullability
,
mutability
,
forWarning
=
nullability
==
null
,
isAnyNonNullTypeParameter
=
isAnyNonNullTypeParameter
)
}
}
private
data class
PartEnhancementResult
(
val
type
:
KotlinType
,
val
wereChanges
:
Boolean
)
...
...
@@ -391,3 +370,35 @@ class SignatureEnhancement(private val annotationTypeQualifierResolver: Annotati
}
}
private
fun
createJavaTypeQualifiers
(
nullability
:
NullabilityQualifier
?,
mutability
:
MutabilityQualifier
?,
forWarning
:
Boolean
,
isAnyNonNullTypeParameter
:
Boolean
):
JavaTypeQualifiers
{
if
(!
isAnyNonNullTypeParameter
||
nullability
!=
NullabilityQualifier
.
NOT_NULL
)
{
return
JavaTypeQualifiers
(
nullability
,
mutability
,
false
,
forWarning
)
}
return
JavaTypeQualifiers
(
nullability
,
mutability
,
true
,
forWarning
)
}
private
fun
<
T
:
Any
>
Set
<
T
>.
select
(
low
:
T
,
high
:
T
,
own
:
T
?,
isCovariant
:
Boolean
):
T
?
{
if
(
isCovariant
)
{
val
supertypeQualifier
=
if
(
low
in
this
)
low
else
if
(
high
in
this
)
high
else
null
return
if
(
supertypeQualifier
==
low
&&
own
==
high
)
null
else
own
?:
supertypeQualifier
}
// isInvariant
val
effectiveSet
=
own
?.
let
{
(
this
+
own
).
toSet
()
}
?:
this
// if this set contains exactly one element, it is the qualifier everybody agrees upon,
// otherwise (no qualifiers, or multiple qualifiers), there's no single such qualifier
// and all qualifiers are discarded
return
effectiveSet
.
singleOrNull
()
}
private
fun
Set
<
NullabilityQualifier
>.
select
(
own
:
NullabilityQualifier
?,
isCovariant
:
Boolean
)
=
if
(
own
==
NullabilityQualifier
.
FORCE_FLEXIBILITY
)
NullabilityQualifier
.
FORCE_FLEXIBILITY
else
select
(
NullabilityQualifier
.
NOT_NULL
,
NullabilityQualifier
.
NULLABLE
,
own
,
isCovariant
)
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录