Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
硅谷海盗
kotlin
提交
cb19a86c
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 搜索 >>
提交
cb19a86c
编写于
6月 28, 2017
作者:
K
Kirill Rakhman
提交者:
Mikhail Glukhikh
7月 11, 2017
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Add "simplify if with constant" inspection #KT-17919 Fixed
上级
76346732
变更
23
隐藏空白更改
内联
并排
Showing
23 changed file
with
359 addition
and
0 deletion
+359
-0
idea/resources/inspectionDescriptions/ConstantConditionIf.html
...resources/inspectionDescriptions/ConstantConditionIf.html
+5
-0
idea/src/META-INF/plugin.xml
idea/src/META-INF/plugin.xml
+9
-0
idea/src/org/jetbrains/kotlin/idea/inspections/ConstantConditionIfInspection.kt
.../kotlin/idea/inspections/ConstantConditionIfInspection.kt
+127
-0
idea/testData/inspections/constantConditionIf/inspectionData/expected.xml
...spections/constantConditionIf/inspectionData/expected.xml
+42
-0
idea/testData/inspections/constantConditionIf/inspectionData/inspections.test
...tions/constantConditionIf/inspectionData/inspections.test
+1
-0
idea/testData/inspections/constantConditionIf/test.kt
idea/testData/inspections/constantConditionIf/test.kt
+28
-0
idea/testData/inspectionsLocal/constantConditionIf/.inspection
...testData/inspectionsLocal/constantConditionIf/.inspection
+1
-0
idea/testData/inspectionsLocal/constantConditionIf/delete.kt
idea/testData/inspectionsLocal/constantConditionIf/delete.kt
+8
-0
idea/testData/inspectionsLocal/constantConditionIf/delete.kt.after
...Data/inspectionsLocal/constantConditionIf/delete.kt.after
+4
-0
idea/testData/inspectionsLocal/constantConditionIf/expression.kt
...stData/inspectionsLocal/constantConditionIf/expression.kt
+11
-0
idea/testData/inspectionsLocal/constantConditionIf/expression.kt.after
.../inspectionsLocal/constantConditionIf/expression.kt.after
+11
-0
idea/testData/inspectionsLocal/constantConditionIf/noStatements.kt
...Data/inspectionsLocal/constantConditionIf/noStatements.kt
+6
-0
idea/testData/inspectionsLocal/constantConditionIf/noStatements.kt.after
...nspectionsLocal/constantConditionIf/noStatements.kt.after
+5
-0
idea/testData/inspectionsLocal/constantConditionIf/simpleBlock.kt
...tData/inspectionsLocal/constantConditionIf/simpleBlock.kt
+5
-0
idea/testData/inspectionsLocal/constantConditionIf/simpleBlock.kt.after
...inspectionsLocal/constantConditionIf/simpleBlock.kt.after
+5
-0
idea/testData/inspectionsLocal/constantConditionIf/simpleFalse.kt
...tData/inspectionsLocal/constantConditionIf/simpleFalse.kt
+5
-0
idea/testData/inspectionsLocal/constantConditionIf/simpleFalse.kt.after
...inspectionsLocal/constantConditionIf/simpleFalse.kt.after
+5
-0
idea/testData/inspectionsLocal/constantConditionIf/simpleTrue.kt
...stData/inspectionsLocal/constantConditionIf/simpleTrue.kt
+5
-0
idea/testData/inspectionsLocal/constantConditionIf/simpleTrue.kt.after
.../inspectionsLocal/constantConditionIf/simpleTrue.kt.after
+5
-0
idea/testData/inspectionsLocal/constantConditionIf/statement.kt
...estData/inspectionsLocal/constantConditionIf/statement.kt
+8
-0
idea/testData/inspectionsLocal/constantConditionIf/statement.kt.after
...a/inspectionsLocal/constantConditionIf/statement.kt.after
+6
-0
idea/tests/org/jetbrains/kotlin/idea/codeInsight/InspectionTestGenerated.java
...ains/kotlin/idea/codeInsight/InspectionTestGenerated.java
+6
-0
idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java
...kotlin/idea/inspections/LocalInspectionTestGenerated.java
+51
-0
未找到文件。
idea/resources/inspectionDescriptions/ConstantConditionIf.html
0 → 100644
浏览文件 @
cb19a86c
<html>
<body>
This inspection reports 'if' expressions whose condition is constant and therefore the expression can be simplified.
</body>
</html>
idea/src/META-INF/plugin.xml
浏览文件 @
cb19a86c
...
...
@@ -2387,6 +2387,15 @@
language=
"kotlin"
/>
<localInspection
implementationClass=
"org.jetbrains.kotlin.idea.inspections.ConstantConditionIfInspection"
displayName=
"Condition of 'if' expression is constant"
groupPath=
"Kotlin"
groupName=
"Redundant constructs"
enabledByDefault=
"true"
level=
"WEAK WARNING"
language=
"kotlin"
/>
<referenceImporter
implementation=
"org.jetbrains.kotlin.idea.quickfix.KotlinReferenceImporter"
/>
<fileType.fileViewProviderFactory
filetype=
"KJSM"
implementationClass=
"com.intellij.psi.ClassFileViewProviderFactory"
/>
...
...
idea/src/org/jetbrains/kotlin/idea/inspections/ConstantConditionIfInspection.kt
0 → 100644
浏览文件 @
cb19a86c
/*
* Copyright 2010-2017 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package
org.jetbrains.kotlin.idea.inspections
import
com.intellij.codeInspection.LocalQuickFix
import
com.intellij.codeInspection.ProblemDescriptor
import
com.intellij.codeInspection.ProblemsHolder
import
com.intellij.openapi.project.Project
import
com.intellij.psi.PsiElementVisitor
import
org.jetbrains.kotlin.idea.caches.resolve.analyze
import
org.jetbrains.kotlin.idea.core.replaced
import
org.jetbrains.kotlin.idea.intentions.branchedTransformations.unwrapBlockOrParenthesis
import
org.jetbrains.kotlin.psi.*
import
org.jetbrains.kotlin.psi.psiUtil.getParentOfType
import
org.jetbrains.kotlin.psi.psiUtil.startOffset
import
org.jetbrains.kotlin.resolve.BindingContext
import
org.jetbrains.kotlin.resolve.bindingContextUtil.isUsedAsExpression
import
org.jetbrains.kotlin.resolve.calls.callUtil.getType
import
org.jetbrains.kotlin.resolve.constants.evaluate.ConstantExpressionEvaluator
import
org.jetbrains.kotlin.resolve.lazy.BodyResolveMode
class
ConstantConditionIfInspection
:
AbstractKotlinInspection
()
{
override
fun
buildVisitor
(
holder
:
ProblemsHolder
,
isOnTheFly
:
Boolean
):
PsiElementVisitor
{
return
object
:
KtVisitorVoid
()
{
override
fun
visitIfExpression
(
expression
:
KtIfExpression
)
{
super
.
visitIfExpression
(
expression
)
val
condition
=
expression
.
condition
?:
return
val
context
=
condition
.
analyze
(
BodyResolveMode
.
PARTIAL
)
val
constantValue
=
condition
.
constantBooleanValue
(
context
)
?:
return
val
fixes
=
mutableListOf
<
LocalQuickFix
>()
if
(
expression
.
branch
(
constantValue
)
!=
null
)
{
fixes
+=
SimplifyFix
(
constantValue
,
expression
.
isUsedAsExpression
(
context
))
}
if
(!
constantValue
&&
expression
.
`else`
==
null
)
{
fixes
+=
RemoveFix
()
}
holder
.
registerProblem
(
condition
,
"Condition is always '$constantValue'"
,
*
fixes
.
toTypedArray
())
}
}
}
private
class
SimplifyFix
(
private
val
conditionValue
:
Boolean
,
private
val
isUsedAsExpression
:
Boolean
)
:
LocalQuickFix
{
override
fun
getFamilyName
()
=
name
override
fun
getName
()
=
"Simplify expression"
override
fun
applyFix
(
project
:
Project
,
descriptor
:
ProblemDescriptor
)
{
val
ifExpression
=
descriptor
.
psiElement
.
getParentOfType
<
KtIfExpression
>(
strict
=
true
)
?:
return
val
caretModel
=
ifExpression
.
findExistingEditor
()
?.
caretModel
val
branch
=
ifExpression
.
branch
(
conditionValue
)
?.
unwrapBlockOrParenthesis
()
?:
return
val
lastExpression
=
when
{
branch
!
is
KtBlockExpression
->
ifExpression
.
replaced
(
branch
)
isUsedAsExpression
->
{
val
factory
=
KtPsiFactory
(
ifExpression
)
ifExpression
.
replaced
(
factory
.
createExpressionByPattern
(
"run $0"
,
branch
.
text
))
}
else
->
{
val
firstChild
=
branch
.
firstChild
.
nextSibling
if
(
firstChild
==
branch
.
lastChild
)
{
ifExpression
.
delete
()
}
else
{
val
lastChild
=
branch
.
lastChild
.
prevSibling
val
parent
=
ifExpression
.
parent
parent
.
addRangeAfter
(
firstChild
,
lastChild
,
ifExpression
)
ifExpression
.
delete
()
}
null
}
}
caretModel
?.
moveToOffset
(
lastExpression
?.
startOffset
?:
return
)
}
}
private
class
RemoveFix
:
LocalQuickFix
{
override
fun
getFamilyName
()
=
name
override
fun
getName
()
=
"Delete expression"
override
fun
applyFix
(
project
:
Project
,
descriptor
:
ProblemDescriptor
)
{
val
ifExpression
=
descriptor
.
psiElement
.
getParentOfType
<
KtIfExpression
>(
strict
=
true
)
?:
return
ifExpression
.
delete
()
}
}
private
companion
object
{
private
fun
KtIfExpression
.
branch
(
thenBranch
:
Boolean
)
=
if
(
thenBranch
)
then
else
`else`
private
fun
KtExpression
.
constantBooleanValue
(
context
:
BindingContext
):
Boolean
?
{
val
type
=
getType
(
context
)
?:
return
null
val
constantValue
=
ConstantExpressionEvaluator
.
getConstant
(
this
,
context
)
?.
toConstantValue
(
type
)
return
constantValue
?.
value
as
?
Boolean
}
}
}
\ No newline at end of file
idea/testData/inspections/constantConditionIf/inspectionData/expected.xml
0 → 100644
浏览文件 @
cb19a86c
<problems>
<problem>
<file>
test.kt
</file>
<line>
7
</line>
<module>
light_idea_test_case
</module>
<entry_point
TYPE=
"file"
FQNAME=
"temp:///src/test.kt"
/>
<problem_class
severity=
"WARNING"
attribute_key=
"WARNING_ATTRIBUTES"
>
Condition of 'if' expression is constant
</problem_class>
<description>
Condition is always 'true'
</description>
</problem>
<problem>
<file>
test.kt
</file>
<line>
9
</line>
<module>
light_idea_test_case
</module>
<entry_point
TYPE=
"file"
FQNAME=
"temp:///src/test.kt"
/>
<problem_class
severity=
"WARNING"
attribute_key=
"WARNING_ATTRIBUTES"
>
Condition of 'if' expression is constant
</problem_class>
<description>
Condition is always 'false'
</description>
</problem>
<problem>
<file>
test.kt
</file>
<line>
14
</line>
<module>
light_idea_test_case
</module>
<entry_point
TYPE=
"file"
FQNAME=
"temp:///src/test.kt"
/>
<problem_class
severity=
"WARNING"
attribute_key=
"WARNING_ATTRIBUTES"
>
Condition of 'if' expression is constant
</problem_class>
<description>
Condition is always 'true'
</description>
</problem>
<problem>
<file>
test.kt
</file>
<line>
20
</line>
<module>
light_idea_test_case
</module>
<entry_point
TYPE=
"file"
FQNAME=
"temp:///src/test.kt"
/>
<problem_class
severity=
"WARNING"
attribute_key=
"WARNING_ATTRIBUTES"
>
Condition of 'if' expression is constant
</problem_class>
<description>
Condition is always 'false'
</description>
</problem>
<problem>
<file>
test.kt
</file>
<line>
24
</line>
<module>
light_idea_test_case
</module>
<entry_point
TYPE=
"file"
FQNAME=
"temp:///src/test.kt"
/>
<problem_class
severity=
"WARNING"
attribute_key=
"WARNING_ATTRIBUTES"
>
Condition of 'if' expression is constant
</problem_class>
<description>
Condition is always 'true'
</description>
</problem>
</problems>
\ No newline at end of file
idea/testData/inspections/constantConditionIf/inspectionData/inspections.test
0 → 100644
浏览文件 @
cb19a86c
// INSPECTION_CLASS: org.jetbrains.kotlin.idea.inspections.ConstantConditionIfInspection
\ No newline at end of file
idea/testData/inspections/constantConditionIf/test.kt
0 → 100644
浏览文件 @
cb19a86c
fun
foo
(
x
:
Int
)
{}
fun
baz
(
s
:
String
)
{}
const
val
TRUE
=
true
fun
bar
()
{
foo
(
if
(
TRUE
)
1
else
2
)
foo
(
if
(
false
&&
TRUE
)
{
baz
(
"a"
)
1
}
else
2
)
if
(
true
)
{
//asd
baz
(
"a"
)
baz
(
"b"
)
}
if
(
false
)
{
baz
(
"a"
)
}
foo
(
if
(
TRUE
)
{
baz
(
"a"
)
1
}
else
2
)
}
\ No newline at end of file
idea/testData/inspectionsLocal/constantConditionIf/.inspection
0 → 100644
浏览文件 @
cb19a86c
org.jetbrains.kotlin.idea.inspections.ConstantConditionIfInspection
\ No newline at end of file
idea/testData/inspectionsLocal/constantConditionIf/delete.kt
0 → 100644
浏览文件 @
cb19a86c
fun
foo
(
x
:
Int
)
{}
fun
bar
()
{
if
(<
caret
>
false
)
{
foo
(
1
)
foo
(
2
)
}
}
\ No newline at end of file
idea/testData/inspectionsLocal/constantConditionIf/delete.kt.after
0 → 100644
浏览文件 @
cb19a86c
fun foo(x: Int) {}
fun bar() {
}
\ No newline at end of file
idea/testData/inspectionsLocal/constantConditionIf/expression.kt
0 → 100644
浏览文件 @
cb19a86c
// WITH_RUNTIME
fun
foo
(
x
:
Int
)
{}
fun
bar
()
{
foo
(
if
(<
caret
>
true
)
{
foo
(
1
)
foo
(
2
)
1
}
else
2
)
}
\ No newline at end of file
idea/testData/inspectionsLocal/constantConditionIf/expression.kt.after
0 → 100644
浏览文件 @
cb19a86c
// WITH_RUNTIME
fun foo(x: Int) {}
fun bar() {
foo(run {
foo(1)
foo(2)
1
})
}
\ No newline at end of file
idea/testData/inspectionsLocal/constantConditionIf/noStatements.kt
0 → 100644
浏览文件 @
cb19a86c
fun
foo
(
s
:
String
)
{}
fun
bar
()
{
if
(<
caret
>
true
)
{
}
else
2
}
\ No newline at end of file
idea/testData/inspectionsLocal/constantConditionIf/noStatements.kt.after
0 → 100644
浏览文件 @
cb19a86c
fun foo(s: String) {}
fun bar() {
}
\ No newline at end of file
idea/testData/inspectionsLocal/constantConditionIf/simpleBlock.kt
0 → 100644
浏览文件 @
cb19a86c
fun
foo
(
x
:
Int
)
{}
fun
bar
()
{
foo
(
if
(<
caret
>
true
)
{
1
}
else
2
)
}
\ No newline at end of file
idea/testData/inspectionsLocal/constantConditionIf/simpleBlock.kt.after
0 → 100644
浏览文件 @
cb19a86c
fun foo(x: Int) {}
fun bar() {
foo(1)
}
\ No newline at end of file
idea/testData/inspectionsLocal/constantConditionIf/simpleFalse.kt
0 → 100644
浏览文件 @
cb19a86c
fun
foo
(
x
:
Int
)
{}
fun
bar
()
{
foo
(
if
(<
caret
>
false
)
1
else
2
)
}
\ No newline at end of file
idea/testData/inspectionsLocal/constantConditionIf/simpleFalse.kt.after
0 → 100644
浏览文件 @
cb19a86c
fun foo(x: Int) {}
fun bar() {
foo(2)
}
\ No newline at end of file
idea/testData/inspectionsLocal/constantConditionIf/simpleTrue.kt
0 → 100644
浏览文件 @
cb19a86c
fun
foo
(
x
:
Int
)
{}
fun
bar
()
{
foo
(
if
(<
caret
>
true
)
1
else
2
)
}
\ No newline at end of file
idea/testData/inspectionsLocal/constantConditionIf/simpleTrue.kt.after
0 → 100644
浏览文件 @
cb19a86c
fun foo(x: Int) {}
fun bar() {
foo(1)
}
\ No newline at end of file
idea/testData/inspectionsLocal/constantConditionIf/statement.kt
0 → 100644
浏览文件 @
cb19a86c
fun
foo
(
s
:
String
)
{}
fun
bar
()
{
if
(<
caret
>
true
)
{
foo
(
"a"
)
foo
(
"b"
)
}
else
2
}
\ No newline at end of file
idea/testData/inspectionsLocal/constantConditionIf/statement.kt.after
0 → 100644
浏览文件 @
cb19a86c
fun foo(s: String) {}
fun bar() {
foo("a")
foo("b")
}
\ No newline at end of file
idea/tests/org/jetbrains/kotlin/idea/codeInsight/InspectionTestGenerated.java
浏览文件 @
cb19a86c
...
...
@@ -161,6 +161,12 @@ public class InspectionTestGenerated extends AbstractInspectionTest {
doTest
(
fileName
);
}
@TestMetadata
(
"constantConditionIf/inspectionData/inspections.test"
)
public
void
testConstantConditionIf_inspectionData_Inspections_test
()
throws
Exception
{
String
fileName
=
KotlinTestUtils
.
navigationMetadata
(
"idea/testData/inspections/constantConditionIf/inspectionData/inspections.test"
);
doTest
(
fileName
);
}
@TestMetadata
(
"convertLambdaToReference/inspectionData/inspections.test"
)
public
void
testConvertLambdaToReference_inspectionData_Inspections_test
()
throws
Exception
{
String
fileName
=
KotlinTestUtils
.
navigationMetadata
(
"idea/testData/inspections/convertLambdaToReference/inspectionData/inspections.test"
);
...
...
idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java
浏览文件 @
cb19a86c
...
...
@@ -408,6 +408,57 @@ public class LocalInspectionTestGenerated extends AbstractLocalInspectionTest {
}
}
@TestMetadata
(
"idea/testData/inspectionsLocal/constantConditionIf"
)
@TestDataPath
(
"$PROJECT_ROOT"
)
@RunWith
(
JUnit3RunnerWithInners
.
class
)
public
static
class
ConstantConditionIf
extends
AbstractLocalInspectionTest
{
public
void
testAllFilesPresentInConstantConditionIf
()
throws
Exception
{
KotlinTestUtils
.
assertAllTestsPresentByMetadata
(
this
.
getClass
(),
new
File
(
"idea/testData/inspectionsLocal/constantConditionIf"
),
Pattern
.
compile
(
"^([\\w\\-_]+)\\.kt$"
),
TargetBackend
.
ANY
,
true
);
}
@TestMetadata
(
"delete.kt"
)
public
void
testDelete
()
throws
Exception
{
String
fileName
=
KotlinTestUtils
.
navigationMetadata
(
"idea/testData/inspectionsLocal/constantConditionIf/delete.kt"
);
doTest
(
fileName
);
}
@TestMetadata
(
"expression.kt"
)
public
void
testExpression
()
throws
Exception
{
String
fileName
=
KotlinTestUtils
.
navigationMetadata
(
"idea/testData/inspectionsLocal/constantConditionIf/expression.kt"
);
doTest
(
fileName
);
}
@TestMetadata
(
"noStatements.kt"
)
public
void
testNoStatements
()
throws
Exception
{
String
fileName
=
KotlinTestUtils
.
navigationMetadata
(
"idea/testData/inspectionsLocal/constantConditionIf/noStatements.kt"
);
doTest
(
fileName
);
}
@TestMetadata
(
"simpleBlock.kt"
)
public
void
testSimpleBlock
()
throws
Exception
{
String
fileName
=
KotlinTestUtils
.
navigationMetadata
(
"idea/testData/inspectionsLocal/constantConditionIf/simpleBlock.kt"
);
doTest
(
fileName
);
}
@TestMetadata
(
"simpleFalse.kt"
)
public
void
testSimpleFalse
()
throws
Exception
{
String
fileName
=
KotlinTestUtils
.
navigationMetadata
(
"idea/testData/inspectionsLocal/constantConditionIf/simpleFalse.kt"
);
doTest
(
fileName
);
}
@TestMetadata
(
"simpleTrue.kt"
)
public
void
testSimpleTrue
()
throws
Exception
{
String
fileName
=
KotlinTestUtils
.
navigationMetadata
(
"idea/testData/inspectionsLocal/constantConditionIf/simpleTrue.kt"
);
doTest
(
fileName
);
}
@TestMetadata
(
"statement.kt"
)
public
void
testStatement
()
throws
Exception
{
String
fileName
=
KotlinTestUtils
.
navigationMetadata
(
"idea/testData/inspectionsLocal/constantConditionIf/statement.kt"
);
doTest
(
fileName
);
}
}
@TestMetadata
(
"idea/testData/inspectionsLocal/copyWithoutNamedArguments"
)
@TestDataPath
(
"$PROJECT_ROOT"
)
@RunWith
(
JUnit3RunnerWithInners
.
class
)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录