Complete Completion using Types and Weights
Tihomir Gvero, Viktor Kuncak, Ivan Kuraj and Ruzica Piskac
1
Complete Completion using Types and Weights Tihomir Gvero, Viktor - - PowerPoint PPT Presentation
Complete Completion using Types and Weights Tihomir Gvero, Viktor Kuncak, Ivan Kuraj and Ruzica Piskac 1 Motivation Large APIs and libraries ~4000 classes in Java 6.0 standard library Using those APIs (for the first time) can be
1
2
3
def main(args:Array[String]) = { var body:String = "email.txt" var sig:String = "signature.txt" var inStream:SeqInStr = … }
4
def main(args:Array[String]) = { var body:String = "email.txt" var sig:String = "signature.txt" var inStream:SeqInStr = … }
new SeqInStr(new FileInStr(sig), new FileInStr(sig)) new SeqInStr(new FileInStr(sig), new FileInStr(body)) new SeqInStr(new FileInStr(body), new FileInStr(sig)) new SeqInStr(new FileInStr(body), new FileInStr(body)) new SeqInStr(new FileInStr(sig), System.in)
5
def main(args:Array[String]) = { var body:String = "email.txt" var sig:String = "signature.txt" var inStream:SeqInStr = … }
new SeqInStr(new FileInStr(sig), new FileInStr(sig)) new SeqInStr(new FileInStr(sig), new FileInStr(body)) new SeqInStr(new FileInStr(body), new FileInStr(sig)) new SeqInStr(new FileInStr(body), new FileInStr(body)) new SeqInStr(new FileInStr(sig), System.in)
6
def main(args:Array[String]) = { var body:String = "email.txt" var sig:String = "signature.txt" var inStream:SeqInStr = new SeqInStr(new FileInStr(sig), new FileInStr(body)) … }
7
def main(args:Array[String]) = { var body:String = "email.txt" var sig:String = "signature.txt" var inStream:SeqInStr = new SeqInStr(new FileInStr(sig), new FileInStr(body)) … }
8
def filter(p: Tree => Boolean): List[Tree] = { val ft:FilterTreeTraverser = ft.traverse(tree) ft.hits.toList }
9
def filter(p: Tree => Boolean): List[Tree] = { val ft:FilterTreeTraverser = ft.traverse(tree) ft.hits.toList }
new FilterTreeTraverser(x => p(x)) new FilterTreeTraverser(x => isType) new FilterTreeTraverser(x => p(tree)) new FilterTreeTraverser(x => new Wrapper(x).isType) new FilterTreeTraverser(x => p(new Wrapper(x).tree))
10
def filter(p: Tree => Boolean): List[Tree] = { val ft:FilterTreeTraverser = ft.traverse(tree) ft.hits.toList }
new FilterTreeTraverser(x => p(x)) new FilterTreeTraverser(x => isType) new FilterTreeTraverser(x => p(tree)) new FilterTreeTraverser(x => new Wrapper(x).isType) new FilterTreeTraverser(x => p(new Wrapper(x).tree))
11
def filter(p: Tree => Boolean): List[Tree] = { val ft:FilterTreeTraverser = new FilterTreeTraverser(x => p(x)) ft.traverse(tree) ft.hits.toList }
12
def filter(p: Tree => Boolean): List[Tree] = { val ft:FilterTreeTraverser = new FilterTreeTraverser(x => p(x)) ft.traverse(tree) ft.hits.toList }
13
14
15
16
17
18
19
⊢ x : T AX x : T ⊢ e1(e2) : T APP ⊢ e1 : T1T ⊢ e2 : T1 ⊢ λx.t : T1 T ABS , x : T1 ⊢ t : T
20
21
⊢ ? : T
22
⊢ ? : T
23
⊢ ? : T APP ⊢ ? : T1T ⊢ ? : T1
24
⊢ ? : T APP ⊢ ? : T1T ⊢ ? : T1
25
⊢ ? : T APP ⊢ ? : T1T ⊢ ? : T1
26
⊢ f(a1,…,an):T APP f : T1…TnT ∈ ⊢ a1: T1 … ⊢ an: Tn ⊢ λ x1:T1 ,…, xn:Tn.t: T1 … Tn T
ABS
, x1:T1 ,…, xn:Tn ⊢ t: T
27
⊢ f(a1,…,an):T APP f : T1…TnT ∈ ⊢ a1: T1 … ⊢ an: Tn
28
⊢ e1(e2) : T APP ⊢ e1 : T1T ⊢ e2 : T1
⊢ f(a1,…,an):T APP f : T1…TnT ∈ ⊢ a1: T1 … ⊢ an: Tn
29
⊢ e1(e2) : T APP ⊢ e1 : T1T ⊢ e2 : T1
⊢ f(a1,…,an):T APP f : T1…TnT ∈ ⊢ a1: T1 … ⊢ an: Tn
30
⊢ e1(e2) : T APP ⊢ e1 : T1T ⊢ e2 : T1
31
⊢ ? :T
32
APP f : (T1 T2)T ∈ ⊢ ? : T1 T2 ⊢ f(?):T
33
APP f : (T1 T2)T ∈ ⊢ ? : T1 T2
⊢ f(?):T
34
APP f : (T1 T2)T ∈ ⊢ λ x1:T1.? : T1 T2 , x1:T1 ⊢ ? : T2 ABS ⊢ f(λ x1:T1.?):T
35
APP f : (T1 T2)T ∈ ⊢ λ x1:T1.e : T1 T2 , x1:T1 ⊢ e : T2 . . . . ABS APP ⊢ f(λ x1:T1.e):T
36
APP f : (T1 T2)T ∈ ⊢ λ x1:T1.e : T1 T2 , x1:T1 ⊢ e : T2 . . . . ABS APP
⊢ f(λ x1:T1.e):T
37
38
A <: B
39
A <: B
coerc: A B
40
A <: B class FileInStr extends InStr {…}
coerc: A B coerc: FileInStr InStr
41
A <: B class FileInStr extends InStr {…}
coerc: A B coerc: FileInStr InStr new SeqInStr(coerc(new FileInStr(sig)), coerc(new FileInStr(body)))
42
A <: B class FileInStr extends InStr {…}
coerc: A B coerc: FileInStr InStr new SeqInStr(new FileInStr(sig), new FileInStr(body))
43
Int, Bool, String, List[Int]
44
Int, Bool, String, List[Int]
Int, Bool, String, List[Int]
45
Int, Bool, String, List[Int]
Int Int Bool Long
Int, Bool, String, List[Int]
46
Int, Bool, String, List[Int]
Int Int Bool Long
Int, Bool, String, List[Int]
{Int, Bool} Long
47
48
Local symbols Method and field symbols API symbols
Low High
49
APP f : (T1 T2)T ∈ ⊢ λ x1:T1.e : T1 T2 , x1:T1 ⊢ e : T2 . . . . ABS APP ⊢ f(λ x1:T1.e):T
50
APP f : (T1 T2)T ∈ ⊢ λ x1:T1.e : T1 T2 , x1:T1 ⊢ e : T2 . . . . ABS APP ⊢ f(λ x1:T1.e):T
51
APP f : (T1 T2)T ∈ ⊢ λ x1:T1.e : T1 T2 , x1:T1 ⊢ e : T2 . . . . ABS APP ⊢ f(λ x1:T1.e):T
52
53
54
55
56
57
⊢ @{T1,…,Tn}:T APP {T1,…,Tn} T ∈ ⊢ T1 … ⊢ Tn ⊢ S T
ABS
∪ S ⊢ t: T
58