Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
硅谷海盗
kotlin
提交
08de6d8d
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,发现更多精彩内容 >>
提交
08de6d8d
编写于
4月 28, 2012
作者:
A
Andrey Breslav
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
KT-1863 Wrong nullability for class derived from java classes.
#KT-1863 In progress
上级
dcc2728f
变更
6
隐藏空白更改
内联
并排
Showing
6 changed file
with
116 addition
and
21 deletion
+116
-21
compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java
...tbrains/jet/lang/resolve/java/JavaDescriptorResolver.java
+1
-1
compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaTypeTransformer.java
.../jetbrains/jet/lang/resolve/java/JavaTypeTransformer.java
+27
-20
compiler/testData/diagnostics/tests/j+k/SupertypeArgumentsNullability-NotNull-SpecialTypes.jet
...+k/SupertypeArgumentsNullability-NotNull-SpecialTypes.jet
+23
-0
compiler/testData/diagnostics/tests/j+k/SupertypeArgumentsNullability-NotNull-UserTypes.jet
...s/j+k/SupertypeArgumentsNullability-NotNull-UserTypes.jet
+23
-0
compiler/testData/diagnostics/tests/j+k/SupertypeArgumentsNullability-SpecialTypes.jet
.../tests/j+k/SupertypeArgumentsNullability-SpecialTypes.jet
+21
-0
compiler/testData/diagnostics/tests/j+k/SupertypeArgumentsNullability-UserTypes.jet
...ics/tests/j+k/SupertypeArgumentsNullability-UserTypes.jet
+21
-0
未找到文件。
compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java
浏览文件 @
08de6d8d
...
...
@@ -959,7 +959,7 @@ public class JavaDescriptorResolver {
continue
;
}
JetType
transform
=
semanticServices
.
getTypeTransformer
().
transformToType
(
type
,
typeVariableResolver
);
JetType
transform
=
semanticServices
.
getTypeTransformer
().
transformToType
(
type
,
JavaTypeTransformer
.
TypeUsage
.
SUPERTYPE
,
typeVariableResolver
);
result
.
add
(
TypeUtils
.
makeNotNullable
(
transform
));
}
...
...
compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaTypeTransformer.java
浏览文件 @
08de6d8d
...
...
@@ -33,11 +33,9 @@ import org.jetbrains.jet.lang.types.lang.PrimitiveType;
import
org.jetbrains.jet.rt.signature.JetSignatureReader
;
import
javax.inject.Inject
;
import
java.util.Collections
;
import
java.util.HashMap
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.Set
;
import
java.util.*
;
import
static
org
.
jetbrains
.
jet
.
lang
.
resolve
.
java
.
JavaTypeTransformer
.
TypeUsage
.*;
/**
* @author abreslav
...
...
@@ -66,9 +64,11 @@ public class JavaTypeTransformer {
@NotNull
p
ublic
TypeProjection
transformToTypeProjection
(
@NotNull
final
PsiType
javaType
,
p
rivate
TypeProjection
transformToTypeProjection
(
@NotNull
final
PsiType
javaType
,
@NotNull
final
TypeParameterDescriptor
typeParameterDescriptor
,
@NotNull
final
TypeVariableResolver
typeVariableByPsiResolver
)
{
@NotNull
final
TypeVariableResolver
typeVariableByPsiResolver
,
@NotNull
final
TypeUsage
howThisTypeIsUsed
)
{
TypeProjection
result
=
javaType
.
accept
(
new
PsiTypeVisitor
<
TypeProjection
>()
{
@Override
...
...
@@ -85,12 +85,12 @@ public class JavaTypeTransformer {
PsiType
bound
=
wildcardType
.
getBound
();
assert
bound
!=
null
;
return
new
TypeProjection
(
variance
,
transformToType
(
bound
,
TypeUsage
.
UPPER_BOUND
,
typeVariableByPsiResolver
));
return
new
TypeProjection
(
variance
,
transformToType
(
bound
,
UPPER_BOUND
,
typeVariableByPsiResolver
));
}
@Override
public
TypeProjection
visitType
(
PsiType
type
)
{
return
new
TypeProjection
(
transformToType
(
type
,
TypeUsage
.
TYPE_ARGUMENT
,
typeVariableByPsiResolver
));
return
new
TypeProjection
(
transformToType
(
type
,
howThisTypeIsUsed
,
typeVariableByPsiResolver
));
}
});
return
result
;
...
...
@@ -136,7 +136,7 @@ public class JavaTypeTransformer {
if
(
psiMethod
.
isConstructor
())
{
Set
<
JetType
>
supertypesJet
=
Sets
.
newHashSet
();
for
(
PsiClassType
supertype
:
typeParameter
.
getExtendsListTypes
())
{
supertypesJet
.
add
(
transformToType
(
supertype
,
TypeUsage
.
UPPER_BOUND
,
typeVariableResolver
));
supertypesJet
.
add
(
transformToType
(
supertype
,
UPPER_BOUND
,
typeVariableResolver
));
}
return
TypeUtils
.
intersect
(
JetTypeChecker
.
INSTANCE
,
supertypesJet
);
}
...
...
@@ -144,20 +144,24 @@ public class JavaTypeTransformer {
TypeParameterDescriptor
typeParameterDescriptor
=
typeVariableResolver
.
getTypeVariable
(
typeParameter
.
getName
());
if
(
howThisTypeIsUsed
==
TypeUsage
.
TYPE_ARGUMENT
||
howThisTypeIsUsed
==
TypeUsage
.
UPPER_BOUND
)
{
// In Java: ArrayList<T>
// In Kotlin: ArrayList<T>, not ArrayList<T?>
// nullability will be taken care of in individual member signatures
return
typeParameterDescriptor
.
getDefaultType
();
// In Java: ArrayList<T>
// In Kotlin: ArrayList<T>, not ArrayList<T?>
// nullability will be taken care of in individual member signatures
boolean
nullable
=
!
EnumSet
.
of
(
TYPE_ARGUMENT
,
UPPER_BOUND
,
SUPERTYPE_ARGUMENT
).
contains
(
howThisTypeIsUsed
);
if
(
nullable
)
{
return
TypeUtils
.
makeNullable
(
typeParameterDescriptor
.
getDefaultType
());
}
else
{
return
TypeUtils
.
makeNullable
(
typeParameterDescriptor
.
getDefaultType
()
);
return
typeParameterDescriptor
.
getDefaultType
(
);
}
}
else
{
// 'L extends List<T>' in Java is a List<T> in Kotlin, not a List<T?>
boolean
nullable
=
!
EnumSet
.
of
(
SUPERTYPE_ARGUMENT
,
SUPERTYPE
).
contains
(
howThisTypeIsUsed
);
JetType
jetAnalog
=
getKotlinAnalog
(
new
FqName
(
psiClass
.
getQualifiedName
()));
if
(
jetAnalog
!=
null
)
{
return
jetAnalog
;
return
TypeUtils
.
makeNullableAsSpecified
(
jetAnalog
,
nullable
)
;
}
final
ClassDescriptor
classData
=
...
...
@@ -187,13 +191,15 @@ public class JavaTypeTransformer {
PsiType
psiArgument
=
psiArguments
[
i
];
TypeParameterDescriptor
typeParameterDescriptor
=
parameters
.
get
(
i
);
arguments
.
add
(
transformToTypeProjection
(
psiArgument
,
typeParameterDescriptor
,
typeVariableResolver
));
TypeUsage
howTheProjectionIsUsed
=
howThisTypeIsUsed
==
SUPERTYPE
?
SUPERTYPE_ARGUMENT
:
TYPE_ARGUMENT
;
arguments
.
add
(
transformToTypeProjection
(
psiArgument
,
typeParameterDescriptor
,
typeVariableResolver
,
howTheProjectionIsUsed
));
}
}
return
new
JetTypeImpl
(
Collections
.<
AnnotationDescriptor
>
emptyList
(),
classData
.
getTypeConstructor
(),
tru
e
,
nullabl
e
,
arguments
,
classData
.
getMemberScope
(
arguments
));
}
...
...
@@ -291,6 +297,7 @@ public class JavaTypeTransformer {
MEMBER_SIGNATURE_COVARIANT
,
MEMBER_SIGNATURE_CONTRAVARIANT
,
MEMBER_SIGNATURE_INVARIANT
,
SUPERTYPE
SUPERTYPE
,
SUPERTYPE_ARGUMENT
}
}
compiler/testData/diagnostics/tests/j+k/SupertypeArgumentsNullability-NotNull-SpecialTypes.jet
0 → 100644
浏览文件 @
08de6d8d
// FILE: A.java
public class A {}
// FILE: X.java
import org.jetbrains.annotations.NotNull;
public class X<T> {
@NotNull T fooN() {return null;}
void barN(@NotNull T a) {}
}
// FILE: Y.java
public class Y extends X<String> {
}
// FILE: test.kt
fun main() {
Y().fooN() : Any
Y().barN(<!ERROR_COMPILE_TIME_VALUE!>null<!>);
}
compiler/testData/diagnostics/tests/j+k/SupertypeArgumentsNullability-NotNull-UserTypes.jet
0 → 100644
浏览文件 @
08de6d8d
// FILE: A.java
public class A {}
// FILE: X.java
import org.jetbrains.annotations.NotNull;
public class X<T> {
@NotNull T fooN() {return null;}
void barN(@NotNull T a) {}
}
// FILE: Y.java
public class Y extends X<A> {
}
// FILE: test.kt
fun main() {
Y().fooN() : Any
Y().barN(<!ERROR_COMPILE_TIME_VALUE!>null<!>);
}
compiler/testData/diagnostics/tests/j+k/SupertypeArgumentsNullability-SpecialTypes.jet
0 → 100644
浏览文件 @
08de6d8d
// FILE: A.java
public class A {}
// FILE: X.java
public class X<T> {
T foo() {return null;}
void bar(T a) {}
}
// FILE: Y.java
public class Y extends X<String> {
}
// FILE: test.kt
fun main() {
Y().foo()<!UNSAFE_CALL!>.<!>length
Y().bar(null)
}
compiler/testData/diagnostics/tests/j+k/SupertypeArgumentsNullability-UserTypes.jet
0 → 100644
浏览文件 @
08de6d8d
// FILE: A.java
public class A {}
// FILE: X.java
public class X<T> {
T foo() {return null;}
void bar(T a) {}
}
// FILE: Y.java
public class Y extends X<A> {
}
// FILE: test.kt
fun main() {
Y().foo()<!UNSAFE_CALL!>.<!>hashCode()
Y().bar(null)
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录