Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
硅谷海盗
kotlin
提交
6c81d984
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 搜索 >>
提交
6c81d984
编写于
2月 02, 2021
作者:
I
Ilya Kirillov
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
FIR IDE: introduce ChangeReturnTypeOnOverrideQuickFix
上级
93040569
变更
6
展开全部
隐藏空白更改
内联
并排
Showing
6 changed file
with
625 addition
and
315 deletion
+625
-315
generators/tests/org/jetbrains/kotlin/generators/tests/GenerateTests.kt
...ts/org/jetbrains/kotlin/generators/tests/GenerateTests.kt
+1
-0
idea/idea-fir/src/org/jetbrains/kotlin/idea/quickfix/KtQuickFixesList.kt
...rc/org/jetbrains/kotlin/idea/quickfix/KtQuickFixesList.kt
+10
-2
idea/idea-fir/src/org/jetbrains/kotlin/idea/quickfix/MainKtQuickFixRegistrar.kt
...jetbrains/kotlin/idea/quickfix/MainKtQuickFixRegistrar.kt
+9
-0
idea/idea-fir/src/org/jetbrains/kotlin/idea/quickfix/QuickFixesHLApiBasedFactory.kt
...rains/kotlin/idea/quickfix/QuickFixesHLApiBasedFactory.kt
+27
-0
idea/idea-fir/src/org/jetbrains/kotlin/idea/quickfix/fixes/ChangeReturnTypeOnOverrideQuickFix.kt
...idea/quickfix/fixes/ChangeReturnTypeOnOverrideQuickFix.kt
+149
-0
idea/idea-fir/tests/org/jetbrains/kotlin/idea/quickfix/HighLevelQuickFixTestGenerated.java
.../kotlin/idea/quickfix/HighLevelQuickFixTestGenerated.java
+429
-313
未找到文件。
generators/tests/org/jetbrains/kotlin/generators/tests/GenerateTests.kt
浏览文件 @
6c81d984
...
...
@@ -1106,6 +1106,7 @@ fun main(args: Array<String>) {
testClass
<
AbstractHighLevelQuickFixTest
>
{
val
pattern
=
"^([\\w\\-_]+)\\.kt$"
model
(
"quickfix/modifiers"
,
pattern
=
pattern
,
filenameStartsLowerCase
=
true
,
recursive
=
false
)
model
(
"quickfix/override/typeMismatchOnOverride"
,
pattern
=
pattern
,
filenameStartsLowerCase
=
true
,
recursive
=
false
)
}
}
...
...
idea/idea-fir/src/org/jetbrains/kotlin/idea/quickfix/KtQuickFixesList.kt
浏览文件 @
6c81d984
...
...
@@ -18,8 +18,16 @@ annotation class ForKtQuickFixesListBuilder()
class
KtQuickFixesListBuilder
private
constructor
()
{
val
quickFixes
=
mutableMapOf
<
KClass
<
out
KtDiagnosticWithPsi
<
*
>>,
MutableList
<
QuickFixFactory
>>()
inline
fun
<
reified
PSI
:
PsiElement
,
reified
D
:
KtDiagnosticWithPsi
<
PSI
>>
register
(
quickFixFactory
:
QuickFixFactory
)
{
quickFixes
.
getOrPut
(
D
::
class
)
{
mutableListOf
()
}.
add
(
quickFixFactory
)
inline
fun
<
reified
PSI
:
PsiElement
,
reified
DIAGNOSTIC
:
KtDiagnosticWithPsi
<
PSI
>>
register
(
quickFixFactory
:
QuickFixesPsiBasedFactory
<
PSI
>
)
{
quickFixes
.
getOrPut
(
DIAGNOSTIC
::
class
)
{
mutableListOf
()
}.
add
(
quickFixFactory
)
}
inline
fun
<
reified
PSI
:
PsiElement
,
reified
DIAGNOSTIC
:
KtDiagnosticWithPsi
<
PSI
>>
register
(
quickFixFactory
:
QuickFixesHLApiBasedFactory
<
PSI
,
DIAGNOSTIC
>
)
{
quickFixes
.
getOrPut
(
DIAGNOSTIC
::
class
)
{
mutableListOf
()
}.
add
(
quickFixFactory
)
}
@OptIn
(
ForKtQuickFixesListBuilder
::
class
)
...
...
idea/idea-fir/src/org/jetbrains/kotlin/idea/quickfix/MainKtQuickFixRegistrar.kt
浏览文件 @
6c81d984
...
...
@@ -12,6 +12,7 @@ import org.jetbrains.kotlin.lexer.KtToken
import
org.jetbrains.kotlin.lexer.KtTokens
import
org.jetbrains.kotlin.psi.KtCallableDeclaration
import
org.jetbrains.kotlin.psi.KtModifierListOwner
import
org.jetbrains.kotlin.psi.KtNamedDeclaration
class
MainKtQuickFixRegistrar
:
KtQuickFixRegistrar
()
{
private
val
modifiers
=
KtQuickFixesListBuilder
.
register
{
...
...
@@ -28,7 +29,15 @@ class MainKtQuickFixRegistrar : KtQuickFixRegistrar() {
)
}
private
val
overrides
=
KtQuickFixesListBuilder
.
register
{
register
(
ChangeTypeQuickFix
.
changeFunctionReturnTypeOnOverride
)
register
(
ChangeTypeQuickFix
.
changePropertyReturnTypeOnOverride
)
register
(
ChangeTypeQuickFix
.
changeVariableReturnTypeOnOverride
)
}
override
val
list
:
KtQuickFixesList
=
KtQuickFixesList
.
createCombined
(
modifiers
,
overrides
,
)
}
\ No newline at end of file
idea/idea-fir/src/org/jetbrains/kotlin/idea/quickfix/QuickFixesHLApiBasedFactory.kt
0 → 100644
浏览文件 @
6c81d984
/*
* Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package
org.jetbrains.kotlin.idea.quickfix
import
com.intellij.codeInsight.intention.IntentionAction
import
com.intellij.psi.PsiElement
import
org.jetbrains.kotlin.idea.frontend.api.KtAnalysisSession
import
org.jetbrains.kotlin.idea.frontend.api.diagnostics.KtDiagnosticWithPsi
abstract
class
QuickFixesHLApiBasedFactory
<
PSI
:
PsiElement
,
DIAGNOSTIC
:
KtDiagnosticWithPsi
<
PSI
>>
:
QuickFixFactory
{
final
override
fun
asKotlinIntentionActionsFactory
():
KotlinIntentionActionsFactory
{
error
(
"Should not be called. This function is not considered to bue used in FE10 plugin, from FIR plugin consider using createQuickFix"
)
}
abstract
fun
KtAnalysisSession
.
createQuickFix
(
diagnostic
:
DIAGNOSTIC
):
List
<
IntentionAction
>
}
inline
fun
<
PSI
:
PsiElement
,
DIAGNOSTIC
:
KtDiagnosticWithPsi
<
PSI
>>
quickFixesHLApiBasedFactory
(
crossinline
createQuickFix
:
KtAnalysisSession
.(
DIAGNOSTIC
)
->
List
<
IntentionAction
>
)
=
object
:
QuickFixesHLApiBasedFactory
<
PSI
,
DIAGNOSTIC
>()
{
override
fun
KtAnalysisSession
.
createQuickFix
(
diagnostic
:
DIAGNOSTIC
):
List
<
IntentionAction
>
=
createQuickFix
(
diagnostic
)
}
\ No newline at end of file
idea/idea-fir/src/org/jetbrains/kotlin/idea/quickfix/fixes/ChangeReturnTypeOnOverrideQuickFix.kt
0 → 100644
浏览文件 @
6c81d984
/*
* Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package
org.jetbrains.kotlin.idea.quickfix.fixes
import
com.intellij.openapi.editor.Editor
import
com.intellij.openapi.project.Project
import
com.intellij.psi.util.parentOfType
import
org.jetbrains.kotlin.idea.frontend.api.KtAnalysisSession
import
org.jetbrains.kotlin.idea.frontend.api.components.KtTypeRendererOptions
import
org.jetbrains.kotlin.idea.frontend.api.diagnostics.KtDiagnosticWithPsi
import
org.jetbrains.kotlin.idea.frontend.api.fir.diagnostics.KtFirDiagnostic
import
org.jetbrains.kotlin.idea.frontend.api.symbols.*
import
org.jetbrains.kotlin.idea.frontend.api.types.KtType
import
org.jetbrains.kotlin.idea.frontend.api.types.isUnit
import
org.jetbrains.kotlin.idea.quickfix.ChangeCallableReturnTypeFix
import
org.jetbrains.kotlin.idea.quickfix.KotlinQuickFixAction
import
org.jetbrains.kotlin.idea.quickfix.quickFixesHLApiBasedFactory
import
org.jetbrains.kotlin.psi.*
import
org.jetbrains.kotlin.types.checker.KotlinTypeChecker
class
ChangeTypeQuickFix
internal
constructor
(
declaration
:
KtCallableDeclaration
,
private
val
typeInfo
:
TypeInfo
,
private
val
updateBaseFunction
:
Boolean
)
:
KotlinQuickFixAction
<
KtCallableDeclaration
>(
declaration
)
{
override
fun
getText
():
String
{
val
element
=
element
?:
return
""
val
functionPresentation
=
when
{
updateBaseFunction
->
{
val
containerName
=
element
.
parentOfType
<
KtNamedDeclaration
>()
?.
nameAsName
?.
takeUnless
{
it
.
isSpecial
}
ChangeCallableReturnTypeFix
.
StringPresentation
.
baseFunctionOrConstructorParameterPresentation
(
element
,
containerName
)
}
else
->
null
}
return
ChangeCallableReturnTypeFix
.
StringPresentation
.
getTextForQuickFix
(
element
,
functionPresentation
,
typeInfo
.
isUnit
,
typeInfo
.
short
)
}
override
fun
getFamilyName
():
String
=
ChangeCallableReturnTypeFix
.
StringPresentation
.
familyName
()
override
fun
invoke
(
project
:
Project
,
editor
:
Editor
?,
file
:
KtFile
)
{
val
element
=
element
?:
return
if
(!
element
.
isProcedure
())
{
val
newTypeRef
=
KtPsiFactory
(
project
).
createType
(
typeInfo
.
short
)
element
.
typeReference
=
newTypeRef
}
else
{
element
.
typeReference
=
null
}
}
private
fun
KtCallableDeclaration
.
isProcedure
()
=
typeInfo
.
isUnit
&&
this
is
KtFunction
&&
hasBlockBody
()
internal
data class
TypeInfo
(
val
qualified
:
String
,
val
short
:
String
,
val
isUnit
:
Boolean
,
)
companion
object
{
val
changeFunctionReturnTypeOnOverride
=
ChangeTypeQuickFixFactory
.
changeReturnTypeOnOverride
<
KtNamedDeclaration
,
KtFirDiagnostic
.
ReturnTypeMismatchOnOverride
>
{
it
.
function
as
?
KtFunctionSymbol
}
val
changePropertyReturnTypeOnOverride
=
ChangeTypeQuickFixFactory
.
changeReturnTypeOnOverride
<
KtNamedDeclaration
,
KtFirDiagnostic
.
PropertyTypeMismatchOnOverride
>
{
it
.
property
as
?
KtPropertySymbol
}
val
changeVariableReturnTypeOnOverride
=
ChangeTypeQuickFixFactory
.
changeReturnTypeOnOverride
<
KtNamedDeclaration
,
KtFirDiagnostic
.
VarTypeMismatchOnOverride
>
{
it
.
variable
as
?
KtPropertySymbol
}
}
}
private
object
ChangeTypeQuickFixFactory
{
inline
fun
<
PSI
:
KtNamedDeclaration
,
DIAGNOSTIC
:
KtDiagnosticWithPsi
<
PSI
>>
changeReturnTypeOnOverride
(
crossinline
getCallableSymbol
:
(
DIAGNOSTIC
)
->
KtCallableSymbol
?
)
=
quickFixesHLApiBasedFactory
<
PSI
,
DIAGNOSTIC
>
{
diagnostic
->
val
declaration
=
diagnostic
.
psi
as
?
KtCallableDeclaration
?:
return
@quickFixesHLApiBasedFactory
emptyList
()
val
callable
=
getCallableSymbol
(
diagnostic
)
?:
return
@quickFixesHLApiBasedFactory
emptyList
()
listOfNotNull
(
createChangeCurrentDeclarationQuickFix
(
callable
,
declaration
),
createChangeOverriddenFunctionQuickFix
(
callable
),
)
}
fun
<
PSI
:
KtCallableDeclaration
>
KtAnalysisSession
.
createChangeCurrentDeclarationQuickFix
(
callable
:
KtCallableSymbol
,
declaration
:
PSI
):
ChangeTypeQuickFix
?
{
val
lowerSuperType
=
findLowerBoundOfOverriddenCallablesReturnTypes
(
callable
)
?:
return
null
val
changeToTypeInfo
=
createTypeInfo
(
lowerSuperType
)
return
ChangeTypeQuickFix
(
declaration
,
changeToTypeInfo
,
updateBaseFunction
=
false
)
}
fun
KtAnalysisSession
.
createChangeOverriddenFunctionQuickFix
(
callable
:
KtCallableSymbol
):
ChangeTypeQuickFix
?
{
val
type
=
callable
.
annotatedType
.
type
val
singleNonMatchingOverriddenFunction
=
findSingleNonMatchingOverriddenFunction
(
callable
,
type
)
?:
return
null
val
singleMatchingOverriddenFunctionPsi
=
singleNonMatchingOverriddenFunction
.
psiSafe
<
KtCallableDeclaration
>()
?:
return
null
val
changeToTypeInfo
=
createTypeInfo
(
type
)
return
ChangeTypeQuickFix
(
singleMatchingOverriddenFunctionPsi
,
changeToTypeInfo
,
updateBaseFunction
=
true
)
}
private
fun
KtAnalysisSession
.
findSingleNonMatchingOverriddenFunction
(
callable
:
KtCallableSymbol
,
type
:
KtType
):
KtCallableSymbol
?
{
val
overriddenSymbols
=
callable
.
getOverriddenSymbols
()
return
overriddenSymbols
.
singleOrNull
{
overridden
->
overridden
.
origin
!=
KtSymbolOrigin
.
INTERSECTION_OVERRIDE
&&
!
type
.
isSubTypeOf
(
overridden
.
annotatedType
.
type
)
}
}
fun
KtAnalysisSession
.
createTypeInfo
(
ktType
:
KtType
)
=
ChangeTypeQuickFix
.
TypeInfo
(
qualified
=
ktType
.
render
(),
short
=
ktType
.
render
(
KtTypeRendererOptions
.
SHORT_NAMES
),
isUnit
=
ktType
.
isUnit
)
private
fun
KtAnalysisSession
.
findLowerBoundOfOverriddenCallablesReturnTypes
(
symbol
:
KtCallableSymbol
):
KtType
?
{
var
lowestType
:
KtType
?
=
null
for
(
overridden
in
symbol
.
getOverriddenSymbols
())
{
val
overriddenType
=
overridden
.
annotatedType
.
type
when
{
lowestType
==
null
||
overriddenType
isSubTypeOf
lowestType
->
{
lowestType
=
overriddenType
}
lowestType
isNotSubTypeOf
overriddenType
->
{
return
null
}
}
}
return
lowestType
}
}
idea/idea-fir/tests/org/jetbrains/kotlin/idea/quickfix/HighLevelQuickFixTestGenerated.java
浏览文件 @
6c81d984
此差异已折叠。
点击以展开。
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录