Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
硅谷海盗
kotlin
提交
84a46444
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,发现更多精彩内容 >>
提交
84a46444
编写于
6月 10, 2020
作者:
D
Dmitriy Dolovov
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
[Commonizer] Speed-up serialization of commonized member scopes
上级
974e01ec
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
62 addition
and
25 deletion
+62
-25
native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/CommonizedMemberScope.kt
...n/descriptors/commonizer/builder/CommonizedMemberScope.kt
+62
-25
未找到文件。
native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/CommonizedMemberScope.kt
浏览文件 @
84a46444
...
...
@@ -5,42 +5,74 @@
package
org.jetbrains.kotlin.descriptors.commonizer.builder
import
org.jetbrains.kotlin.descriptors.ClassifierDescriptor
import
org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import
org.jetbrains.kotlin.descriptors.PropertyDescriptor
import
org.jetbrains.kotlin.descriptors.SimpleFunctionDescriptor
import
org.jetbrains.kotlin.descriptors.*
import
org.jetbrains.kotlin.incremental.components.LookupLocation
import
org.jetbrains.kotlin.name.Name
import
org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter
import
org.jetbrains.kotlin.resolve.scopes.MemberScope
Impl
import
org.jetbrains.kotlin.resolve.scopes.MemberScope
import
org.jetbrains.kotlin.utils.Printer
class
CommonizedMemberScope
:
MemberScopeImpl
()
{
private
val
members
=
ArrayList
<
DeclarationDescriptor
>()
class
CommonizedMemberScope
:
MemberScope
{
private
val
functions
=
HashMap
<
Name
,
MutableList
<
SimpleFunctionDescriptor
>>()
private
val
variables
=
HashMap
<
Name
,
MutableList
<
PropertyDescriptor
>>()
private
val
classifiers
=
HashMap
<
Name
,
ClassifierDescriptorWithTypeParameters
>()
operator
fun
plusAssign
(
member
:
DeclarationDescriptor
)
{
this
.
members
+=
member
private
fun
addMember
(
member
:
DeclarationDescriptor
)
{
when
(
member
)
{
is
SimpleFunctionDescriptor
->
functions
.
computeIfAbsent
(
member
.
name
)
{
ArrayList
(
INITIAL_CAPACITY_FOR_CALLABLES
)
}
+=
member
is
PropertyDescriptor
->
variables
.
computeIfAbsent
(
member
.
name
)
{
ArrayList
(
INITIAL_CAPACITY_FOR_CALLABLES
)
}
+=
member
is
ClassifierDescriptorWithTypeParameters
->
classifiers
[
member
.
name
]
=
member
else
->
error
(
"Unsupported member type: ${member::class.java}, $member"
)
}
}
override
fun
getContributedClassifier
(
name
:
Name
,
location
:
LookupLocation
):
ClassifierDescriptor
?
=
members
.
filteredBy
<
ClassifierDescriptor
>(
name
).
firstOrNull
()
override
fun
getFunctionNames
():
Set
<
Name
>
=
functions
.
keys
override
fun
getVariableNames
():
Set
<
Name
>
=
variables
.
keys
override
fun
getClassifierNames
():
Set
<
Name
>
=
classifiers
.
keys
override
fun
getContributedFunctions
(
name
:
Name
,
location
:
LookupLocation
):
Collection
<
SimpleFunctionDescriptor
>
=
functions
[
name
].
orEmpty
()
override
fun
getContributedVariables
(
name
:
Name
,
location
:
LookupLocation
):
Collection
<
PropertyDescriptor
>
=
members
.
filteredBy
<
PropertyDescriptor
>(
name
).
toList
()
variables
[
name
].
orEmpty
()
override
fun
getContributed
Functions
(
name
:
Name
,
location
:
LookupLocation
):
Collection
<
SimpleFunctionDescriptor
>
=
members
.
filteredBy
<
SimpleFunctionDescriptor
>(
name
).
toList
()
override
fun
getContributed
Classifier
(
name
:
Name
,
location
:
LookupLocation
):
ClassifierDescriptor
?
=
classifiers
[
name
]
override
fun
getContributedDescriptors
(
kindFilter
:
DescriptorKindFilter
,
nameFilter
:
(
Name
)
->
Boolean
):
Collection
<
DeclarationDescriptor
>
=
members
.
filter
{
kindFilter
.
accepts
(
it
)
&&
nameFilter
(
it
.
name
)
}
):
Collection
<
DeclarationDescriptor
>
{
val
result
=
ArrayList
<
DeclarationDescriptor
>(
INITIAL_CAPACITY_FOR_CONTRIBUTED_DESCRIPTORS
)
if
(
kindFilter
.
acceptsKinds
(
DescriptorKindFilter
.
CLASSIFIERS_MASK
))
{
classifiers
.
values
.
filterTo
(
result
)
{
nameFilter
(
it
.
name
)
}
}
if
(
kindFilter
.
acceptsKinds
(
DescriptorKindFilter
.
FUNCTIONS_MASK
))
{
functions
.
forEach
{
(
name
,
callables
)
->
if
(
nameFilter
(
name
))
result
.
addAll
(
callables
)
}
}
if
(
kindFilter
.
acceptsKinds
(
DescriptorKindFilter
.
VARIABLES_MASK
))
{
variables
.
forEach
{
(
name
,
callables
)
->
if
(
nameFilter
(
name
))
result
.
addAll
(
callables
)
}
}
return
result
}
override
fun
printScopeStructure
(
p
:
Printer
)
{
p
.
println
(
this
::
class
.
java
.
simpleName
,
" {"
)
p
.
pushIndent
()
p
.
println
(
"declarations = $members"
)
p
.
println
(
"functions = $functions"
)
p
.
println
(
"variables = $variables"
)
p
.
println
(
"classifiers = $classifiers"
)
p
.
popIndent
()
p
.
println
(
"}"
)
...
...
@@ -51,21 +83,26 @@ class CommonizedMemberScope : MemberScopeImpl() {
operator
fun
Array
<
CommonizedMemberScope
>.
plusAssign
(
members
:
List
<
DeclarationDescriptor
?
>)
{
members
.
forEachIndexed
{
index
,
member
->
if
(
member
!=
null
)
{
this
[
index
]
+=
member
}
if
(
member
!=
null
)
this
[
index
].
addMember
(
member
)
}
}
operator
fun
List
<
CommonizedMemberScope
?>.
plusAssign
(
members
:
List
<
DeclarationDescriptor
?
>)
{
members
.
forEachIndexed
{
index
,
member
->
if
(
member
!=
null
)
{
this
[
index
]
?.
run
{
this
+=
member
}
}
if
(
member
!=
null
)
this
[
index
]
?.
addMember
(
member
)
}
}
// Heuristic memory usage optimization. During commonization of ios_x64 and ios_arm64 only about 3% of functions are overloaded
// (and therefore have the same name in the same scope). For the remaining 97% the capacity of 1 is enough.
private
const
val
INITIAL_CAPACITY_FOR_CALLABLES
=
1
// Heuristic memory usage optimization. During commonization of ios_x64 and ios_arm64 the getContributedDescriptors() call
// returns empty list in 27% times and list of size 1 in 63% times. The default capacity of 0 looks reasonable.
private
const
val
INITIAL_CAPACITY_FOR_CONTRIBUTED_DESCRIPTORS
=
0
internal
val
STATS
=
HashMap
<
Int
,
Int
>()
}
}
private
inline
fun
<
reified
T
:
DeclarationDescriptor
>
List
<*>.
filteredBy
(
name
:
Name
):
Sequence
<
T
>
=
this
.
asSequence
().
filterIsInstance
<
T
>().
filter
{
it
.
name
==
name
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录