Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
硅谷海盗
kotlin
提交
fd32e918
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,发现更多精彩内容 >>
提交
fd32e918
编写于
6月 09, 2020
作者:
J
Jinseong Jeon
提交者:
Mikhail Glukhikh
6月 11, 2020
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
FIR deserializer: signature-aware annotation loading for property accessors
上级
2d55b8db
变更
7
隐藏空白更改
内联
并排
Showing
7 changed file
with
160 addition
and
13 deletion
+160
-13
compiler/fir/analysis-tests/testData/loadCompiledKotlin/annotations/classMembers/Getter.txt
...ta/loadCompiledKotlin/annotations/classMembers/Getter.txt
+1
-1
compiler/fir/analysis-tests/testData/loadCompiledKotlin/annotations/classMembers/Setter.txt
...ta/loadCompiledKotlin/annotations/classMembers/Setter.txt
+1
-1
compiler/fir/analysis-tests/testData/loadCompiledKotlin/annotations/withUseSiteTarget/PropertyAndAccessor.txt
...lin/annotations/withUseSiteTarget/PropertyAndAccessor.txt
+4
-4
compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/JvmBinaryAnnotationDeserializer.kt
...r/java/deserialization/JvmBinaryAnnotationDeserializer.kt
+144
-2
compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/KotlinDeserializedJvmSymbolsProvider.kt
...a/deserialization/KotlinDeserializedJvmSymbolsProvider.kt
+1
-1
compiler/fir/resolve/src/org/jetbrains/kotlin/fir/deserialization/AbstractAnnotationDeserializer.kt
...lin/fir/deserialization/AbstractAnnotationDeserializer.kt
+5
-2
compiler/fir/resolve/src/org/jetbrains/kotlin/fir/deserialization/FirMemberDeserializer.kt
...rains/kotlin/fir/deserialization/FirMemberDeserializer.kt
+4
-2
未找到文件。
compiler/fir/analysis-tests/testData/loadCompiledKotlin/annotations/classMembers/Getter.txt
浏览文件 @
fd32e918
...
...
@@ -5,7 +5,7 @@ public final annotation class Anno : R|kotlin/Annotation| {
public final class Class : R|kotlin/Any| {
public final val property: R|kotlin/Int|
public get(): R|kotlin/Int|
@R|test/Anno|()
public get(): R|kotlin/Int|
public constructor(): R|test/Class|
...
...
compiler/fir/analysis-tests/testData/loadCompiledKotlin/annotations/classMembers/Setter.txt
浏览文件 @
fd32e918
...
...
@@ -6,7 +6,7 @@ public final annotation class Anno : R|kotlin/Annotation| {
public final class Class : R|kotlin/Any| {
public final var property: R|kotlin/Int|
public get(): R|kotlin/Int|
public set(value: R|kotlin/Int|): R|kotlin/Unit|
@R|test/Anno|()
public set(value: R|kotlin/Int|): R|kotlin/Unit|
public constructor(): R|test/Class|
...
...
compiler/fir/analysis-tests/testData/loadCompiledKotlin/annotations/withUseSiteTarget/PropertyAndAccessor.txt
浏览文件 @
fd32e918
...
...
@@ -16,15 +16,15 @@ public final annotation class B : R|kotlin/Annotation| {
public abstract interface I : R|kotlin/Any| {
public abstract var getterAndSetter: R|kotlin/Int|
public get(): R|kotlin/Int|
public set(<set-?>: R|kotlin/Int|): R|kotlin/Unit|
@R|test/A|(value = String(getter))
public get(): R|kotlin/Int|
@R|test/B|(value = <implicitArrayOf>(String(setter)))
public set(<set-?>: R|kotlin/Int|): R|kotlin/Unit|
public abstract var propertyAndGetter: R|kotlin/Int|
public get(): R|kotlin/Int|
@R|test/B|(value = <implicitArrayOf>(String(getter)))
public get(): R|kotlin/Int|
public set(value: R|kotlin/Int|): R|kotlin/Unit|
public abstract var propertyAndSetter: R|kotlin/Int|
public get(): R|kotlin/Int|
public set(<set-?>: R|kotlin/Int|): R|kotlin/Unit|
@R|test/B|(value = <implicitArrayOf>(String(setter)))
public set(<set-?>: R|kotlin/Int|): R|kotlin/Unit|
}
compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/JvmBinaryAnnotationDeserializer.kt
浏览文件 @
fd32e918
...
...
@@ -5,18 +5,160 @@
package
org.jetbrains.kotlin.fir.java.deserialization
import
org.jetbrains.kotlin.descriptors.SourceElement
import
org.jetbrains.kotlin.fir.FirSession
import
org.jetbrains.kotlin.fir.deserialization.AbstractAnnotationDeserializer
import
org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
import
org.jetbrains.kotlin.fir.resolve.firSymbolProvider
import
org.jetbrains.kotlin.fir.resolve.providers.impl.FirCompositeSymbolProvider
import
org.jetbrains.kotlin.load.kotlin.JvmPackagePartSource
import
org.jetbrains.kotlin.load.kotlin.KotlinJvmBinaryClass
import
org.jetbrains.kotlin.load.kotlin.KotlinJvmBinarySourceElement
import
org.jetbrains.kotlin.load.kotlin.MemberSignature
import
org.jetbrains.kotlin.metadata.ProtoBuf
import
org.jetbrains.kotlin.metadata.deserialization.NameResolver
import
org.jetbrains.kotlin.metadata.deserialization.getExtensionOrNull
import
org.jetbrains.kotlin.metadata.jvm.JvmProtoBuf
import
org.jetbrains.kotlin.name.ClassId
import
org.jetbrains.kotlin.name.Name
import
org.jetbrains.kotlin.protobuf.MessageLite
import
org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource
class
JvmBinaryAnnotationDeserializer
(
session
:
FirSession
val
session
:
FirSession
)
:
AbstractAnnotationDeserializer
(
session
)
{
private
val
storage
:
MutableMap
<
KotlinJvmBinaryClass
,
MemberAnnotations
>
=
mutableMapOf
()
// TODO: Rename this once property constants are recorded as well
private
data class
MemberAnnotations
(
val
memberAnnotations
:
Map
<
MemberSignature
,
MutableList
<
FirAnnotationCall
>>)
private
enum
class
CallableKind
{
PROPERTY_GETTER
,
PROPERTY_SETTER
}
override
fun
loadTypeAnnotations
(
typeProto
:
ProtoBuf
.
Type
,
nameResolver
:
NameResolver
):
List
<
FirAnnotationCall
>
{
val
annotations
=
typeProto
.
getExtension
(
JvmProtoBuf
.
typeAnnotation
).
orEmpty
()
return
annotations
.
map
{
deserializeAnnotation
(
it
,
nameResolver
)
}
}
}
\ No newline at end of file
override
fun
loadPropertyGetterAnnotations
(
containerSource
:
DeserializedContainerSource
?,
propertyProto
:
ProtoBuf
.
Property
,
nameResolver
:
NameResolver
,
getterFlags
:
Int
):
List
<
FirAnnotationCall
>
{
val
signature
=
getCallableSignature
(
propertyProto
,
nameResolver
,
CallableKind
.
PROPERTY_GETTER
)
?:
return
emptyList
()
val
kotlinClass
=
containerSource
?.
toKotlinJvmBinaryClass
()
?:
return
emptyList
()
return
loadMemberAnnotations
(
kotlinClass
).
memberAnnotations
[
signature
]
?:
emptyList
()
}
override
fun
loadPropertySetterAnnotations
(
containerSource
:
DeserializedContainerSource
?,
propertyProto
:
ProtoBuf
.
Property
,
nameResolver
:
NameResolver
,
setterFlags
:
Int
):
List
<
FirAnnotationCall
>
{
val
signature
=
getCallableSignature
(
propertyProto
,
nameResolver
,
CallableKind
.
PROPERTY_SETTER
)
?:
return
emptyList
()
val
kotlinClass
=
containerSource
?.
toKotlinJvmBinaryClass
()
?:
return
emptyList
()
return
loadMemberAnnotations
(
kotlinClass
).
memberAnnotations
[
signature
]
?:
emptyList
()
}
private
fun
getCallableSignature
(
proto
:
MessageLite
,
nameResolver
:
NameResolver
,
kind
:
CallableKind
):
MemberSignature
?
{
return
when
(
proto
)
{
// TODO: ProtoBuf.Constructor
// TODO: ProtoBuf.Function
is
ProtoBuf
.
Property
->
{
val
signature
=
proto
.
getExtensionOrNull
(
JvmProtoBuf
.
propertySignature
)
?:
return
null
when
(
kind
)
{
CallableKind
.
PROPERTY_GETTER
->
if
(
signature
.
hasGetter
())
MemberSignature
.
fromMethod
(
nameResolver
,
signature
.
getter
)
else
null
CallableKind
.
PROPERTY_SETTER
->
if
(
signature
.
hasSetter
())
MemberSignature
.
fromMethod
(
nameResolver
,
signature
.
setter
)
else
null
// TODO: PROPERTY
}
}
else
->
null
}
}
private
fun
DeserializedContainerSource
.
toKotlinJvmBinaryClass
():
KotlinJvmBinaryClass
?
=
when
(
this
)
{
is
JvmPackagePartSource
->
this
.
knownJvmBinaryClass
is
KotlinJvmBinarySourceElement
->
this
.
binaryClass
else
->
null
}
// TODO: better to be in KotlinDeserializedJvmSymbolsProvider?
private
fun
loadMemberAnnotations
(
kotlinClass
:
KotlinJvmBinaryClass
):
MemberAnnotations
{
if
(
storage
.
containsKey
(
kotlinClass
))
{
return
storage
[
kotlinClass
]
?:
error
(
"$kotlinClass should have been visited and cached."
)
}
val
memberAnnotations
=
hashMapOf
<
MemberSignature
,
MutableList
<
FirAnnotationCall
>>()
kotlinClass
.
visitMembers
(
object
:
KotlinJvmBinaryClass
.
MemberVisitor
{
override
fun
visitMethod
(
name
:
Name
,
desc
:
String
):
KotlinJvmBinaryClass
.
MethodAnnotationVisitor
?
{
return
AnnotationVisitorForMethod
(
MemberSignature
.
fromMethodNameAndDesc
(
name
.
asString
(),
desc
))
}
override
fun
visitField
(
name
:
Name
,
desc
:
String
,
initializer
:
Any
?):
KotlinJvmBinaryClass
.
AnnotationVisitor
?
{
val
signature
=
MemberSignature
.
fromFieldNameAndDesc
(
name
.
asString
(),
desc
)
if
(
initializer
!=
null
)
{
// TODO: load constant
}
return
MemberAnnotationVisitor
(
signature
)
}
inner
class
AnnotationVisitorForMethod
(
signature
:
MemberSignature
)
:
MemberAnnotationVisitor
(
signature
),
KotlinJvmBinaryClass
.
MethodAnnotationVisitor
{
override
fun
visitParameterAnnotation
(
index
:
Int
,
classId
:
ClassId
,
source
:
SourceElement
):
KotlinJvmBinaryClass
.
AnnotationArgumentVisitor
?
{
val
paramSignature
=
MemberSignature
.
fromMethodSignatureAndParameterIndex
(
signature
,
index
)
var
result
=
memberAnnotations
[
paramSignature
]
if
(
result
==
null
)
{
result
=
arrayListOf
()
memberAnnotations
[
paramSignature
]
=
result
}
return
loadAnnotationIfNotSpecial
(
classId
,
result
)
}
}
open
inner
class
MemberAnnotationVisitor
(
protected
val
signature
:
MemberSignature
)
:
KotlinJvmBinaryClass
.
AnnotationVisitor
{
private
val
result
=
arrayListOf
<
FirAnnotationCall
>()
override
fun
visitAnnotation
(
classId
:
ClassId
,
source
:
SourceElement
):
KotlinJvmBinaryClass
.
AnnotationArgumentVisitor
?
{
return
loadAnnotationIfNotSpecial
(
classId
,
result
)
}
override
fun
visitEnd
()
{
if
(
result
.
isNotEmpty
())
{
memberAnnotations
[
signature
]
=
result
}
}
}
},
null
)
// TODO: cached file content?
val
result
=
MemberAnnotations
(
memberAnnotations
)
storage
[
kotlinClass
]
=
result
return
result
}
// TODO: Or, better to migrate annotation deserialization in KotlinDeserializedJvmSymbolsProvider to here?
private
fun
loadAnnotationIfNotSpecial
(
annotationClassId
:
ClassId
,
result
:
MutableList
<
FirAnnotationCall
>
):
KotlinJvmBinaryClass
.
AnnotationArgumentVisitor
?
=
(
session
.
firSymbolProvider
as
?
FirCompositeSymbolProvider
)
?.
providers
?.
filterIsInstance
<
KotlinDeserializedJvmSymbolsProvider
>()
?.
singleOrNull
()
?.
loadAnnotationIfNotSpecial
(
annotationClassId
,
result
)
}
compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/KotlinDeserializedJvmSymbolsProvider.kt
浏览文件 @
fd32e918
...
...
@@ -290,7 +290,7 @@ class KotlinDeserializedJvmSymbolsProvider(
}
}
private
fun
loadAnnotationIfNotSpecial
(
internal
fun
loadAnnotationIfNotSpecial
(
annotationClassId
:
ClassId
,
result
:
MutableList
<
FirAnnotationCall
>,
):
KotlinJvmBinaryClass
.
AnnotationArgumentVisitor
?
{
if
(
annotationClassId
in
AbstractBinaryClassAnnotationAndConstantLoader
.
SPECIAL_ANNOTATIONS
)
return
null
...
...
compiler/fir/resolve/src/org/jetbrains/kotlin/fir/deserialization/AbstractAnnotationDeserializer.kt
浏览文件 @
fd32e918
...
...
@@ -30,6 +30,7 @@ import org.jetbrains.kotlin.metadata.ProtoBuf.Annotation.Argument.Value.Type.*
import
org.jetbrains.kotlin.metadata.deserialization.Flags
import
org.jetbrains.kotlin.metadata.deserialization.NameResolver
import
org.jetbrains.kotlin.serialization.deserialization.builtins.BuiltInSerializerProtocol
import
org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource
import
org.jetbrains.kotlin.serialization.deserialization.getClassId
import
org.jetbrains.kotlin.serialization.deserialization.getName
...
...
@@ -56,7 +57,8 @@ abstract class AbstractAnnotationDeserializer(
return
annotations
.
map
{
deserializeAnnotation
(
it
,
nameResolver
)
}
}
fun
loadPropertyGetterAnnotations
(
open
fun
loadPropertyGetterAnnotations
(
containerSource
:
DeserializedContainerSource
?,
propertyProto
:
ProtoBuf
.
Property
,
nameResolver
:
NameResolver
,
getterFlags
:
Int
...
...
@@ -66,7 +68,8 @@ abstract class AbstractAnnotationDeserializer(
return
annotations
.
map
{
deserializeAnnotation
(
it
,
nameResolver
)
}
}
fun
loadPropertySetterAnnotations
(
open
fun
loadPropertySetterAnnotations
(
containerSource
:
DeserializedContainerSource
?,
propertyProto
:
ProtoBuf
.
Property
,
nameResolver
:
NameResolver
,
setterFlags
:
Int
...
...
compiler/fir/resolve/src/org/jetbrains/kotlin/fir/deserialization/FirMemberDeserializer.kt
浏览文件 @
fd32e918
...
...
@@ -195,7 +195,8 @@ class FirMemberDeserializer(private val c: FirDeserializationContext) {
this
.
returnTypeRef
=
returnTypeRef
isGetter
=
true
status
=
FirDeclarationStatusImpl
(
visibility
,
modality
)
annotations
+=
c
.
annotationDeserializer
.
loadPropertyGetterAnnotations
(
proto
,
local
.
nameResolver
,
getterFlags
)
annotations
+=
c
.
annotationDeserializer
.
loadPropertyGetterAnnotations
(
c
.
containerSource
,
proto
,
local
.
nameResolver
,
getterFlags
)
this
.
symbol
=
FirPropertyAccessorSymbol
()
}
}
else
{
...
...
@@ -216,7 +217,8 @@ class FirMemberDeserializer(private val c: FirDeserializationContext) {
this
.
returnTypeRef
=
FirImplicitUnitTypeRef
(
source
)
isGetter
=
false
status
=
FirDeclarationStatusImpl
(
visibility
,
modality
)
annotations
+=
c
.
annotationDeserializer
.
loadPropertySetterAnnotations
(
proto
,
local
.
nameResolver
,
setterFlags
)
annotations
+=
c
.
annotationDeserializer
.
loadPropertySetterAnnotations
(
c
.
containerSource
,
proto
,
local
.
nameResolver
,
setterFlags
)
this
.
symbol
=
FirPropertyAccessorSymbol
()
valueParameters
+=
proto
.
setterValueParameter
.
let
{
val
parameterFlags
=
if
(
it
.
hasFlags
())
it
.
flags
else
0
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录