Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
硅谷海盗
kotlin
提交
96526603
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,发现更多精彩内容 >>
提交
96526603
编写于
4月 13, 2011
作者:
A
Andrey Breslav
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Basic tests for dead code detection
上级
69ef281d
变更
17
隐藏空白更改
内联
并排
Showing
17 changed file
with
164 addition
and
26 deletion
+164
-26
.idea/runConfigurations/All_Tests.xml
.idea/runConfigurations/All_Tests.xml
+0
-1
idea/src/org/jetbrains/jet/lang/cfg/JetFlowInformationProvider.java
...rg/jetbrains/jet/lang/cfg/JetFlowInformationProvider.java
+8
-3
idea/src/org/jetbrains/jet/lang/cfg/pseudocode/AbstractJumpInstruction.java
...ains/jet/lang/cfg/pseudocode/AbstractJumpInstruction.java
+10
-0
idea/src/org/jetbrains/jet/lang/cfg/pseudocode/ConditionalJumpInstruction.java
...s/jet/lang/cfg/pseudocode/ConditionalJumpInstruction.java
+10
-0
idea/src/org/jetbrains/jet/lang/cfg/pseudocode/Instruction.java
...rc/org/jetbrains/jet/lang/cfg/pseudocode/Instruction.java
+4
-0
idea/src/org/jetbrains/jet/lang/cfg/pseudocode/InstructionWithNext.java
...etbrains/jet/lang/cfg/pseudocode/InstructionWithNext.java
+9
-0
idea/src/org/jetbrains/jet/lang/cfg/pseudocode/NondeterministicJumpInstruction.java
.../lang/cfg/pseudocode/NondeterministicJumpInstruction.java
+10
-0
idea/src/org/jetbrains/jet/lang/cfg/pseudocode/Pseudocode.java
...src/org/jetbrains/jet/lang/cfg/pseudocode/Pseudocode.java
+10
-0
idea/src/org/jetbrains/jet/lang/cfg/pseudocode/ReturnNoValueInstruction.java
...ins/jet/lang/cfg/pseudocode/ReturnNoValueInstruction.java
+1
-1
idea/src/org/jetbrains/jet/lang/cfg/pseudocode/ReturnValueInstruction.java
...rains/jet/lang/cfg/pseudocode/ReturnValueInstruction.java
+1
-1
idea/src/org/jetbrains/jet/lang/cfg/pseudocode/SubroutineExitInstruction.java
...ns/jet/lang/cfg/pseudocode/SubroutineExitInstruction.java
+9
-0
idea/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java
idea/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java
+42
-9
idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java
idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java
+3
-1
idea/testData/cfg/Nonlocals.instructions
idea/testData/cfg/Nonlocals.instructions
+4
-4
idea/testData/cfg/ReturnFromExpression.instructions
idea/testData/cfg/ReturnFromExpression.instructions
+4
-5
idea/testData/cfg/ReturnFromExpression.jet
idea/testData/cfg/ReturnFromExpression.jet
+1
-1
idea/testData/checker/UnreachableCode.jet
idea/testData/checker/UnreachableCode.jet
+38
-0
未找到文件。
.idea/runConfigurations/All_Tests.xml
浏览文件 @
96526603
...
...
@@ -16,7 +16,6 @@
<option
name=
"VM_PARAMETERS"
value=
""
/>
<option
name=
"PARAMETERS"
value=
""
/>
<option
name=
"WORKING_DIRECTORY"
value=
"file://$PROJECT_DIR$"
/>
<option
name=
"FORK_MODE"
/>
<option
name=
"ENV_VARIABLES"
/>
<option
name=
"PASS_PARENT_ENVS"
value=
"true"
/>
<option
name=
"TEST_SEARCH_SCOPE"
>
...
...
idea/src/org/jetbrains/jet/lang/cfg/JetFlowInformationProvider.java
浏览文件 @
96526603
...
...
@@ -3,7 +3,6 @@ package org.jetbrains.jet.lang.cfg;
import
org.jetbrains.annotations.NotNull
;
import
org.jetbrains.jet.lang.psi.JetElement
;
import
org.jetbrains.jet.lang.psi.JetExpression
;
import
org.jetbrains.jet.lang.psi.JetFunction
;
import
java.util.Collection
;
...
...
@@ -13,10 +12,16 @@ import java.util.Collection;
public
interface
JetFlowInformationProvider
{
JetFlowInformationProvider
ERROR
=
new
JetFlowInformationProvider
()
{
@Override
public
void
collectReturnedInformation
(
@NotNull
JetFunction
function
,
Collection
<
JetExpression
>
returnedExpressions
,
Collection
<
JetElement
>
elementsReturningUnit
)
{
public
void
collectReturnedInformation
(
@NotNull
JetElement
subroutine
,
Collection
<
JetExpression
>
returnedExpressions
,
Collection
<
JetElement
>
elementsReturningUnit
)
{
throw
new
UnsupportedOperationException
();
}
@Override
public
void
collectUnreachableExpressions
(
@NotNull
JetElement
subroutine
,
Collection
<
JetElement
>
unreachableElements
)
{
throw
new
UnsupportedOperationException
();
}
};
void
collectReturnedInformation
(
@NotNull
JetFunction
function
,
Collection
<
JetExpression
>
returnedExpressions
,
Collection
<
JetElement
>
elementsReturningUnit
);
void
collectReturnedInformation
(
@NotNull
JetElement
subroutine
,
Collection
<
JetExpression
>
returnedExpressions
,
Collection
<
JetElement
>
elementsReturningUnit
);
void
collectUnreachableExpressions
(
@NotNull
JetElement
subroutine
,
Collection
<
JetElement
>
unreachableElements
);
}
idea/src/org/jetbrains/jet/lang/cfg/pseudocode/AbstractJumpInstruction.java
浏览文件 @
96526603
package
org.jetbrains.jet.lang.cfg.pseudocode
;
import
org.jetbrains.annotations.NotNull
;
import
org.jetbrains.jet.lang.cfg.Label
;
import
java.util.Collection
;
import
java.util.Collections
;
/**
* @author abreslav
*/
...
...
@@ -21,6 +25,12 @@ public abstract class AbstractJumpInstruction extends Instruction {
return
resolvedTarget
;
}
@NotNull
@Override
public
Collection
<
Instruction
>
getNextInstructions
()
{
return
Collections
.
singleton
(
getResolvedTarget
());
}
public
void
setResolvedTarget
(
Instruction
resolvedTarget
)
{
this
.
resolvedTarget
=
outgoingEdgeTo
(
resolvedTarget
);
}
...
...
idea/src/org/jetbrains/jet/lang/cfg/pseudocode/ConditionalJumpInstruction.java
浏览文件 @
96526603
package
org.jetbrains.jet.lang.cfg.pseudocode
;
import
org.jetbrains.annotations.NotNull
;
import
org.jetbrains.jet.lang.cfg.Label
;
import
java.util.Arrays
;
import
java.util.Collection
;
/**
* @author abreslav
*/
...
...
@@ -35,6 +39,12 @@ public class ConditionalJumpInstruction extends AbstractJumpInstruction {
this
.
nextOnFalse
=
outgoingEdgeTo
(
nextOnFalse
);
}
@NotNull
@Override
public
Collection
<
Instruction
>
getNextInstructions
()
{
return
Arrays
.
asList
(
getNextOnFalse
(),
getNextOnTrue
());
}
@Override
public
void
accept
(
InstructionVisitor
visitor
)
{
visitor
.
visitConditionalJump
(
this
);
...
...
idea/src/org/jetbrains/jet/lang/cfg/pseudocode/Instruction.java
浏览文件 @
96526603
package
org.jetbrains.jet.lang.cfg.pseudocode
;
import
org.jetbrains.annotations.NotNull
;
import
org.jetbrains.annotations.Nullable
;
import
java.util.Collection
;
...
...
@@ -15,6 +16,9 @@ public abstract class Instruction {
return
previousInstructions
;
}
@NotNull
public
abstract
Collection
<
Instruction
>
getNextInstructions
();
@Nullable
protected
Instruction
outgoingEdgeTo
(
@Nullable
Instruction
target
)
{
if
(
target
!=
null
)
{
...
...
idea/src/org/jetbrains/jet/lang/cfg/pseudocode/InstructionWithNext.java
浏览文件 @
96526603
...
...
@@ -3,6 +3,9 @@ package org.jetbrains.jet.lang.cfg.pseudocode;
import
org.jetbrains.annotations.NotNull
;
import
org.jetbrains.jet.lang.psi.JetElement
;
import
java.util.Collection
;
import
java.util.Collections
;
/**
* @author abreslav
*/
...
...
@@ -17,6 +20,12 @@ public abstract class InstructionWithNext extends JetElementInstruction {
return
next
;
}
@NotNull
@Override
public
Collection
<
Instruction
>
getNextInstructions
()
{
return
Collections
.
singleton
(
next
);
}
public
void
setNext
(
Instruction
next
)
{
this
.
next
=
outgoingEdgeTo
(
next
);
}
...
...
idea/src/org/jetbrains/jet/lang/cfg/pseudocode/NondeterministicJumpInstruction.java
浏览文件 @
96526603
package
org.jetbrains.jet.lang.cfg.pseudocode
;
import
org.jetbrains.annotations.NotNull
;
import
org.jetbrains.jet.lang.cfg.Label
;
import
java.util.Arrays
;
import
java.util.Collection
;
/**
* @author abreslav
*/
...
...
@@ -26,6 +30,12 @@ public class NondeterministicJumpInstruction extends AbstractJumpInstruction {
this
.
next
=
next
;
}
@NotNull
@Override
public
Collection
<
Instruction
>
getNextInstructions
()
{
return
Arrays
.
asList
(
getResolvedTarget
(),
getNext
());
}
@Override
public
String
toString
()
{
return
"jmp?("
+
getTargetLabel
().
getName
()
+
")"
;
...
...
idea/src/org/jetbrains/jet/lang/cfg/pseudocode/Pseudocode.java
浏览文件 @
96526603
...
...
@@ -69,6 +69,11 @@ public class Pseudocode {
return
label
;
}
@NotNull
public
Collection
<
Instruction
>
getInstructions
()
{
return
instructions
;
}
public
void
addInstruction
(
Instruction
instruction
)
{
instructions
.
add
(
instruction
);
if
(
instruction
instanceof
SubroutineExitInstruction
)
{
...
...
@@ -83,6 +88,11 @@ public class Pseudocode {
return
exitInstruction
;
}
@NotNull
public
SubroutineEnterInstruction
getEnterInstruction
()
{
return
(
SubroutineEnterInstruction
)
instructions
.
get
(
0
);
}
public
void
bindLabel
(
Label
label
)
{
((
PseudocodeLabel
)
label
).
setTargetInstructionIndex
(
instructions
.
size
());
}
...
...
idea/src/org/jetbrains/jet/lang/cfg/pseudocode/ReturnNoValueInstruction.java
浏览文件 @
96526603
...
...
@@ -27,6 +27,6 @@ public class ReturnNoValueInstruction extends AbstractJumpInstruction {
@Override
public
String
toString
()
{
return
"ret
"
;
return
"ret
"
+
getTargetLabel
()
;
}
}
idea/src/org/jetbrains/jet/lang/cfg/pseudocode/ReturnValueInstruction.java
浏览文件 @
96526603
...
...
@@ -18,6 +18,6 @@ public class ReturnValueInstruction extends AbstractJumpInstruction {
@Override
public
String
toString
()
{
return
"ret(*)
"
;
return
"ret(*)
"
+
getTargetLabel
()
;
}
}
idea/src/org/jetbrains/jet/lang/cfg/pseudocode/SubroutineExitInstruction.java
浏览文件 @
96526603
...
...
@@ -3,6 +3,9 @@ package org.jetbrains.jet.lang.cfg.pseudocode;
import
org.jetbrains.annotations.NotNull
;
import
org.jetbrains.jet.lang.psi.JetElement
;
import
java.util.Collection
;
import
java.util.Collections
;
/**
* @author abreslav
*/
...
...
@@ -17,6 +20,12 @@ public class SubroutineExitInstruction extends Instruction {
return
subroutine
;
}
@NotNull
@Override
public
Collection
<
Instruction
>
getNextInstructions
()
{
return
Collections
.
emptyList
();
}
@Override
public
void
accept
(
InstructionVisitor
visitor
)
{
visitor
.
visitSubroutineExit
(
this
);
...
...
idea/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java
浏览文件 @
96526603
...
...
@@ -268,21 +268,27 @@ public class TopDownAnalyzer {
JetFunction
function
=
(
JetFunction
)
declaration
;
FunctionDescriptorImpl
functionDescriptorImpl
=
(
FunctionDescriptorImpl
)
descriptor
;
if
(
bodyExpression
!=
null
)
{
JetFlowInformationProvider
flowInformationProvider
=
computeFlowData
(
declara
tion
,
bodyExpression
);
JetFlowInformationProvider
flowInformationProvider
=
computeFlowData
(
func
tion
,
bodyExpression
);
JetTypeInferrer
typeInferrer
=
semanticServices
.
getTypeInferrer
(
trace
,
flowInformationProvider
);
assert
readyToProcessExpressions
:
"Must be ready collecting types"
;
if
(
function
.
getReturnTypeRef
()
!=
null
)
{
typeInferrer
.
checkFunctionReturnType
(
declaringScope
,
function
,
descriptor
);
typeInferrer
.
checkFunctionReturnType
(
declaringScope
,
function
,
functionDescriptorImpl
);
}
else
{
JetType
returnType
=
typeInferrer
.
getFunctionReturnType
(
declaringScope
,
function
,
descriptor
);
JetType
returnType
=
typeInferrer
.
getFunctionReturnType
(
declaringScope
,
function
,
functionDescriptorImpl
);
if
(
returnType
==
null
)
{
returnType
=
ErrorUtils
.
createErrorType
(
"Unable to infer body type"
);
}
functionDescriptorImpl
.
setUnsubstitutedReturnType
(
returnType
);
}
List
<
JetElement
>
unreachableElements
=
new
ArrayList
<
JetElement
>();
flowInformationProvider
.
collectUnreachableExpressions
(
function
,
unreachableElements
);
for
(
JetElement
unreachableElement
:
unreachableElements
)
{
semanticServices
.
getErrorHandler
().
genericError
(
unreachableElement
.
getNode
(),
"Unreachable code"
);
}
}
else
{
if
(
function
.
getReturnTypeRef
()
==
null
)
{
...
...
@@ -327,17 +333,44 @@ public class TopDownAnalyzer {
wrappedTrace
.
close
();
return
new
JetFlowInformationProvider
()
{
@Override
public
void
collectReturnedInformation
(
@NotNull
Jet
Function
function
,
Collection
<
JetExpression
>
returnedExpressions
,
Collection
<
JetElement
>
elementsReturningUnit
)
{
Pseudocode
pseudocode
=
pseudocodeMap
.
get
(
function
);
public
void
collectReturnedInformation
(
@NotNull
Jet
Element
subroutine
,
Collection
<
JetExpression
>
returnedExpressions
,
Collection
<
JetElement
>
elementsReturningUnit
)
{
Pseudocode
pseudocode
=
pseudocodeMap
.
get
(
subroutine
);
assert
pseudocode
!=
null
;
SubroutineExitInstruction
exitInstruction
=
pseudocode
.
getExitInstruction
();
processPreviousInstructions
(
exitInstruction
,
returnedExpressions
,
elementsReturningUnit
);
processPreviousInstructions
(
exitInstruction
,
new
HashSet
<
Instruction
>(),
returnedExpressions
,
elementsReturningUnit
);
}
@Override
public
void
collectUnreachableExpressions
(
@NotNull
JetElement
subroutine
,
Collection
<
JetElement
>
unreachableElements
)
{
Pseudocode
pseudocode
=
pseudocodeMap
.
get
(
subroutine
);
assert
pseudocode
!=
null
;
SubroutineEnterInstruction
enterInstruction
=
pseudocode
.
getEnterInstruction
();
Set
<
Instruction
>
visited
=
new
HashSet
<
Instruction
>();
collectReachable
(
enterInstruction
,
visited
);
for
(
Instruction
instruction
:
pseudocode
.
getInstructions
())
{
if
(!
visited
.
contains
(
instruction
)
&&
instruction
instanceof
JetElementInstruction
)
{
unreachableElements
.
add
(((
JetElementInstruction
)
instruction
).
getElement
());
}
}
}
};
}
private
void
processPreviousInstructions
(
Instruction
previousFor
,
final
Collection
<
JetExpression
>
returnedExpressions
,
final
Collection
<
JetElement
>
elementsReturningUnit
)
{
private
void
collectReachable
(
Instruction
current
,
Set
<
Instruction
>
visited
)
{
if
(!
visited
.
add
(
current
))
return
;
for
(
Instruction
nextInstruction
:
current
.
getNextInstructions
())
{
collectReachable
(
nextInstruction
,
visited
);
}
}
private
void
processPreviousInstructions
(
Instruction
previousFor
,
final
Set
<
Instruction
>
visited
,
final
Collection
<
JetExpression
>
returnedExpressions
,
final
Collection
<
JetElement
>
elementsReturningUnit
)
{
if
(!
visited
.
add
(
previousFor
))
return
;
Collection
<
Instruction
>
previousInstructions
=
previousFor
.
getPreviousInstructions
();
InstructionVisitor
visitor
=
new
InstructionVisitor
()
{
@Override
...
...
@@ -347,7 +380,7 @@ public class TopDownAnalyzer {
@Override
public
void
visitReturnValue
(
ReturnValueInstruction
instruction
)
{
processPreviousInstructions
(
instruction
,
returnedExpressions
,
elementsReturningUnit
);
processPreviousInstructions
(
instruction
,
visited
,
returnedExpressions
,
elementsReturningUnit
);
}
@Override
...
...
@@ -372,7 +405,7 @@ public class TopDownAnalyzer {
@Override
public
void
visitJump
(
AbstractJumpInstruction
instruction
)
{
processPreviousInstructions
(
instruction
,
returnedExpressions
,
elementsReturningUnit
);
processPreviousInstructions
(
instruction
,
visited
,
returnedExpressions
,
elementsReturningUnit
);
}
@Override
...
...
idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java
浏览文件 @
96526603
...
...
@@ -348,7 +348,9 @@ public class JetTypeInferrer {
}
private
JetType
getBlockReturnedTypeWithWritableScope
(
@NotNull
WritableScope
scope
,
@NotNull
List
<?
extends
JetElement
>
block
)
{
assert
!
block
.
isEmpty
();
if
(
block
.
isEmpty
())
{
return
JetStandardClasses
.
getUnitType
();
}
TypeInferrerVisitorWithWritableScope
blockLevelVisitor
=
new
TypeInferrerVisitorWithWritableScope
(
scope
,
true
);
...
...
idea/testData/cfg/Nonlocals.instructions
浏览文件 @
96526603
...
...
@@ -9,7 +9,7 @@ l6:
r(b)
jf(l8)
r(1)
ret(*)
ret(*)
l5
jmp(l9)
l8:
read (Unit)
...
...
@@ -32,7 +32,7 @@ l4:
<START>
r(2)
r(5)
ret(*)
ret(*)
l5
l5:
<END>
=====================
...
...
@@ -60,7 +60,7 @@ l0:
r(a)
jf(l2)
r(1)
ret(*)
ret(*)
l1
jmp(l3)
l2:
read (Unit)
...
...
@@ -84,7 +84,7 @@ l4:
<START>
r(2)
r(5)
ret(*)
ret(*)
l5
l5:
<END>
=====================
idea/testData/cfg/ReturnFromExpression.instructions
浏览文件 @
96526603
== blockAndAndMismatch ==
fun blockAndAndMismatch() : Boolean {
(return true)
|| (return false)
false
|| (return false)
}
---------------------
l0:
<START>
r(true)
ret(*)
r(false)
jt(l2)
r(false)
ret(*)
ret(*)
l1
l2:
r(
(return true)
|| (return false))
r(
false
|| (return false))
l1:
<END>
=====================
idea/testData/cfg/ReturnFromExpression.jet
浏览文件 @
96526603
fun blockAndAndMismatch() : Boolean {
(return true)
|| (return false)
false
|| (return false)
}
idea/testData/checker/UnreachableCode.jet
0 → 100644
浏览文件 @
96526603
fun t1() {
return
<error>1</error>
}
fun t2() {
if (1 > 2)
return
else return
<error>1</error>
}
fun t3() {
if (1 > 2)
return 2
else return ""
<error>1</error>
}
fun t4(a : Boolean) {
do {
return
}
while (<error>a</error>)
<error>1</error>
}
//fun t5() {
// do {
// return
// }
// while (1 > 2)
// 1
//}
//fun blockAndAndMismatch() : Boolean {
// (return true) || (return false)
//}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录