rsense-core 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +22 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +1 -0
- data/README.md +35 -0
- data/Rakefile +84 -0
- data/TypeAnnotation.tokens +41 -0
- data/build.xml +84 -0
- data/build_lib/antlr-3.2.jar +0 -0
- data/lib/jars/ant-1.7.0.jar +0 -0
- data/lib/jars/ant-launcher-1.7.0.jar +0 -0
- data/lib/jars/antlr-runtime-3.2.jar +0 -0
- data/lib/jars/bsf-2.3.0.jar +0 -0
- data/lib/rsense-core.rb +28 -0
- data/lib/rsense.jar +0 -0
- data/lib/rsense/core.rb +5 -0
- data/lib/rsense/core/version.rb +5 -0
- data/lib/rsense/parser.rb +6 -0
- data/lib/rsense/ruby.rb +19 -0
- data/lib/rsense/typing.rb +13 -0
- data/lib/rsense/typing/annotation.rb +20 -0
- data/lib/rsense/typing/runtime.rb +23 -0
- data/lib/rsense/typing/vertex.rb +15 -0
- data/lib/rsense/util.rb +9 -0
- data/rsense-core.gemspec +30 -0
- data/src/org/cx4a/rsense/CodeAssist.java +744 -0
- data/src/org/cx4a/rsense/CodeAssistError.java +31 -0
- data/src/org/cx4a/rsense/CodeAssistResult.java +42 -0
- data/src/org/cx4a/rsense/CodeCompletionResult.java +65 -0
- data/src/org/cx4a/rsense/FindDefinitionResult.java +24 -0
- data/src/org/cx4a/rsense/LoadResult.java +19 -0
- data/src/org/cx4a/rsense/Main.java +916 -0
- data/src/org/cx4a/rsense/Options.java +353 -0
- data/src/org/cx4a/rsense/Project.java +103 -0
- data/src/org/cx4a/rsense/TypeInferenceResult.java +25 -0
- data/src/org/cx4a/rsense/WhereResult.java +19 -0
- data/src/org/cx4a/rsense/parser/TypeAnnotation.g +221 -0
- data/src/org/cx4a/rsense/parser/TypeAnnotationLexer.java +1759 -0
- data/src/org/cx4a/rsense/parser/TypeAnnotationParser.java +2025 -0
- data/src/org/cx4a/rsense/ruby/Block.java +10 -0
- data/src/org/cx4a/rsense/ruby/Context.java +75 -0
- data/src/org/cx4a/rsense/ruby/DynamicMethod.java +10 -0
- data/src/org/cx4a/rsense/ruby/DynamicScope.java +51 -0
- data/src/org/cx4a/rsense/ruby/Frame.java +95 -0
- data/src/org/cx4a/rsense/ruby/IRubyObject.java +17 -0
- data/src/org/cx4a/rsense/ruby/LocalScope.java +43 -0
- data/src/org/cx4a/rsense/ruby/MetaClass.java +50 -0
- data/src/org/cx4a/rsense/ruby/Ruby.java +242 -0
- data/src/org/cx4a/rsense/ruby/RubyClass.java +146 -0
- data/src/org/cx4a/rsense/ruby/RubyModule.java +255 -0
- data/src/org/cx4a/rsense/ruby/RubyObject.java +94 -0
- data/src/org/cx4a/rsense/ruby/Scope.java +7 -0
- data/src/org/cx4a/rsense/ruby/SpecialObject.java +15 -0
- data/src/org/cx4a/rsense/ruby/Visibility.java +17 -0
- data/src/org/cx4a/rsense/typing/Graph.java +1690 -0
- data/src/org/cx4a/rsense/typing/Propagation.java +73 -0
- data/src/org/cx4a/rsense/typing/Template.java +84 -0
- data/src/org/cx4a/rsense/typing/TemplateAttribute.java +158 -0
- data/src/org/cx4a/rsense/typing/TypeSet.java +48 -0
- data/src/org/cx4a/rsense/typing/annotation/ClassType.java +57 -0
- data/src/org/cx4a/rsense/typing/annotation/MethodType.java +79 -0
- data/src/org/cx4a/rsense/typing/annotation/TypeAnnotation.java +4 -0
- data/src/org/cx4a/rsense/typing/annotation/TypeAny.java +7 -0
- data/src/org/cx4a/rsense/typing/annotation/TypeApplication.java +37 -0
- data/src/org/cx4a/rsense/typing/annotation/TypeConstraint.java +29 -0
- data/src/org/cx4a/rsense/typing/annotation/TypeExpression.java +11 -0
- data/src/org/cx4a/rsense/typing/annotation/TypeIdentity.java +59 -0
- data/src/org/cx4a/rsense/typing/annotation/TypeOptional.java +22 -0
- data/src/org/cx4a/rsense/typing/annotation/TypePragma.java +22 -0
- data/src/org/cx4a/rsense/typing/annotation/TypeSplat.java +22 -0
- data/src/org/cx4a/rsense/typing/annotation/TypeTuple.java +35 -0
- data/src/org/cx4a/rsense/typing/annotation/TypeUnion.java +23 -0
- data/src/org/cx4a/rsense/typing/annotation/TypeVariable.java +44 -0
- data/src/org/cx4a/rsense/typing/runtime/AliasMethod.java +94 -0
- data/src/org/cx4a/rsense/typing/runtime/AnnotationHelper.java +69 -0
- data/src/org/cx4a/rsense/typing/runtime/AnnotationResolver.java +523 -0
- data/src/org/cx4a/rsense/typing/runtime/Array.java +84 -0
- data/src/org/cx4a/rsense/typing/runtime/ClassTag.java +27 -0
- data/src/org/cx4a/rsense/typing/runtime/DefaultMethod.java +115 -0
- data/src/org/cx4a/rsense/typing/runtime/Hash.java +131 -0
- data/src/org/cx4a/rsense/typing/runtime/LoopTag.java +21 -0
- data/src/org/cx4a/rsense/typing/runtime/Method.java +32 -0
- data/src/org/cx4a/rsense/typing/runtime/MonomorphicObject.java +77 -0
- data/src/org/cx4a/rsense/typing/runtime/ObjectAllocator.java +40 -0
- data/src/org/cx4a/rsense/typing/runtime/PolymorphicObject.java +90 -0
- data/src/org/cx4a/rsense/typing/runtime/Proc.java +100 -0
- data/src/org/cx4a/rsense/typing/runtime/RuntimeHelper.java +1339 -0
- data/src/org/cx4a/rsense/typing/runtime/SpecialMethod.java +119 -0
- data/src/org/cx4a/rsense/typing/runtime/TypeVarMap.java +112 -0
- data/src/org/cx4a/rsense/typing/runtime/VertexHolder.java +48 -0
- data/src/org/cx4a/rsense/typing/vertex/CallVertex.java +122 -0
- data/src/org/cx4a/rsense/typing/vertex/MultipleAsgnVertex.java +23 -0
- data/src/org/cx4a/rsense/typing/vertex/PassThroughVertex.java +20 -0
- data/src/org/cx4a/rsense/typing/vertex/SValueVertex.java +24 -0
- data/src/org/cx4a/rsense/typing/vertex/SplatVertex.java +24 -0
- data/src/org/cx4a/rsense/typing/vertex/ToAryVertex.java +24 -0
- data/src/org/cx4a/rsense/typing/vertex/TypeVarVertex.java +22 -0
- data/src/org/cx4a/rsense/typing/vertex/Vertex.java +221 -0
- data/src/org/cx4a/rsense/typing/vertex/YieldVertex.java +70 -0
- data/src/org/cx4a/rsense/util/HereDocReader.java +48 -0
- data/src/org/cx4a/rsense/util/Logger.java +111 -0
- data/src/org/cx4a/rsense/util/NodeUtil.java +198 -0
- data/src/org/cx4a/rsense/util/SourceLocation.java +70 -0
- data/src/org/cx4a/rsense/util/StringUtil.java +63 -0
- data/src/resources/org/cx4a/rsense/rsense.properties +1 -0
- data/stubs/1.8/_builtin.rb +3006 -0
- data/stubs/1.8/bigdecimal.rb +131 -0
- data/stubs/1.8/cgi.rb +257 -0
- data/stubs/1.8/date.rb +147 -0
- data/stubs/1.8/optparse.rb +113 -0
- data/stubs/1.8/rational.rb +47 -0
- data/stubs/1.8/set.rb +94 -0
- data/stubs/1.8/socket.rb +461 -0
- data/stubs/1.8/stringio.rb +129 -0
- data/test/data/a file.rb +1 -0
- data/test/data/benchmark.rb +12 -0
- data/test/data/crlf.rb +5 -0
- data/test/data/test.rb +19 -0
- data/test/script/all.rsense +2 -0
- data/test/script/array_dynamic.rsense +25 -0
- data/test/script/block_nested.rsense +7 -0
- data/test/script/builtin.rsense +785 -0
- data/test/script/class_method_partial_update.rsense +52 -0
- data/test/script/class_partial_update.rsense +17 -0
- data/test/script/find-definition.rsense +72 -0
- data/test/script/method_arg_onearg.rsense +6 -0
- data/test/script/method_arg_optional.rsense +7 -0
- data/test/script/method_partial_update.rsense +14 -0
- data/test/script/method_yield_arrayarg.rsense +8 -0
- data/test/script/method_yield_arrayarg_expand.rsense +8 -0
- data/test/script/method_yield_arrayarg_splat.rsense +17 -0
- data/test/script/misc.rsense +2 -0
- data/test/script/proc_higher_order.rsense +22 -0
- data/test/script/regression.rsense +95 -0
- data/test/script/stdlib.rsense +66 -0
- data/test/script/where.rsense +41 -0
- metadata +315 -0
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
package org.cx4a.rsense.typing.runtime;
|
|
2
|
+
|
|
3
|
+
import org.cx4a.rsense.ruby.Ruby;
|
|
4
|
+
import org.cx4a.rsense.ruby.Block;
|
|
5
|
+
import org.cx4a.rsense.typing.TypeSet;
|
|
6
|
+
import org.cx4a.rsense.typing.vertex.Vertex;
|
|
7
|
+
|
|
8
|
+
public abstract class SpecialMethod {
|
|
9
|
+
public static class Result {
|
|
10
|
+
private Result prev;
|
|
11
|
+
private TypeSet accumulator;
|
|
12
|
+
private TypeSet resultTypeSet;
|
|
13
|
+
private boolean noReturn;
|
|
14
|
+
private boolean callNextMethod;
|
|
15
|
+
private boolean nextMethodChange;
|
|
16
|
+
private String nextMethodName;
|
|
17
|
+
private TypeSet nextMethodReceivers;
|
|
18
|
+
private Block nextMethodBlock;
|
|
19
|
+
private boolean nextMethodNoReturn;
|
|
20
|
+
private boolean neverCallAgain;
|
|
21
|
+
private boolean privateVisibility;
|
|
22
|
+
|
|
23
|
+
public Result(Result prev, TypeSet accumulator) {
|
|
24
|
+
this.prev = prev;
|
|
25
|
+
this.accumulator = accumulator;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
public Result setResultTypeSet(TypeSet resultTypeSet) {
|
|
29
|
+
this.resultTypeSet = resultTypeSet;
|
|
30
|
+
return this;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
public Result setCallNextMethod(boolean flag) {
|
|
34
|
+
this.callNextMethod = flag;
|
|
35
|
+
return this;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
public Result setNextMethodChange(boolean flag) {
|
|
39
|
+
this.nextMethodChange = flag;
|
|
40
|
+
return this;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
public Result setNextMethodName(String name) {
|
|
44
|
+
this.nextMethodName = name;
|
|
45
|
+
return this;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
public Result setNextMethodReceivers(TypeSet receivers) {
|
|
49
|
+
this.nextMethodReceivers = receivers;
|
|
50
|
+
return this;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
public Result setNextMethodBlock(Block block) {
|
|
54
|
+
this.nextMethodBlock = block;
|
|
55
|
+
return this;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
public Result setNextMethodNoReturn(boolean flag) {
|
|
59
|
+
this.nextMethodNoReturn = flag;
|
|
60
|
+
return this;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
public Result setNeverCallAgain(boolean neverCallAgain) {
|
|
64
|
+
this.neverCallAgain = neverCallAgain;
|
|
65
|
+
return this;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
public Result setPrivateVisibility(boolean privateVisibility) {
|
|
69
|
+
this.privateVisibility = privateVisibility;
|
|
70
|
+
return this;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
public Result getPrevious() {
|
|
74
|
+
return prev;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
public TypeSet getAccumulator() {
|
|
78
|
+
return accumulator;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
public TypeSet getResultTypeSet() {
|
|
82
|
+
return resultTypeSet;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
public boolean isCallNextMethod() {
|
|
86
|
+
return callNextMethod;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
public boolean isNextMethodChange() {
|
|
90
|
+
return nextMethodChange;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
public String getNextMethodName() {
|
|
94
|
+
return nextMethodName;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
public TypeSet getNextMethodReceivers() {
|
|
98
|
+
return nextMethodReceivers;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
public Block getNextMethodBlock() {
|
|
102
|
+
return nextMethodBlock;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
public boolean isNextMethodNoReturn() {
|
|
106
|
+
return nextMethodNoReturn;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
public boolean isNeverCallAgain() {
|
|
110
|
+
return neverCallAgain;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
public boolean hasPrivateVisibility() {
|
|
114
|
+
return privateVisibility;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
public abstract void call(Ruby runtime, TypeSet receivers, Vertex[] args, Block block, Result result);
|
|
119
|
+
}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
package org.cx4a.rsense.typing.runtime;
|
|
2
|
+
|
|
3
|
+
import java.util.Map;
|
|
4
|
+
import java.util.HashMap;
|
|
5
|
+
import java.util.Iterator;
|
|
6
|
+
|
|
7
|
+
import org.cx4a.rsense.ruby.IRubyObject;
|
|
8
|
+
import org.cx4a.rsense.typing.TypeSet;
|
|
9
|
+
import org.cx4a.rsense.typing.vertex.Vertex;
|
|
10
|
+
import org.cx4a.rsense.typing.annotation.TypeVariable;
|
|
11
|
+
|
|
12
|
+
public class TypeVarMap extends HashMap<TypeVariable, Vertex> {
|
|
13
|
+
private static final long serialVersionUID = 0L;
|
|
14
|
+
|
|
15
|
+
public TypeVarMap() {
|
|
16
|
+
super();
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
public TypeVarMap(int initialCapacity) {
|
|
20
|
+
super(initialCapacity);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
public TypeVarMap(TypeVarMap other) {
|
|
24
|
+
super(other);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
public TypeVarMap[] generateTuples() {
|
|
28
|
+
int size = 1;
|
|
29
|
+
for (Vertex vertex : values()) {
|
|
30
|
+
size *= vertex.getTypeSet().size();
|
|
31
|
+
}
|
|
32
|
+
if (size == 0) {
|
|
33
|
+
return new TypeVarMap[0];
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
int unit = size;
|
|
37
|
+
TypeVarMap[] result = new TypeVarMap[size];
|
|
38
|
+
for (int i = 0; i < size; i++) {
|
|
39
|
+
result[i] = new TypeVarMap(size());
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
for (Map.Entry<TypeVariable, Vertex> entry : entrySet()) {
|
|
43
|
+
TypeSet typeSet = entry.getValue().getTypeSet();
|
|
44
|
+
Iterator<IRubyObject> ite = typeSet.iterator();
|
|
45
|
+
int k = 0, n = typeSet.size();
|
|
46
|
+
int newUnit = unit / n;
|
|
47
|
+
IRubyObject v = ite.next();
|
|
48
|
+
for (int j = 0; j < size; j++) {
|
|
49
|
+
Vertex vertex = new Vertex(1);
|
|
50
|
+
vertex.addType(v);
|
|
51
|
+
result[j].put(entry.getKey(), vertex);
|
|
52
|
+
if (++k == newUnit) {
|
|
53
|
+
k = 0;
|
|
54
|
+
if (!ite.hasNext()) {
|
|
55
|
+
ite = typeSet.iterator();
|
|
56
|
+
}
|
|
57
|
+
v = ite.next();
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
unit = newUnit;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
return result;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
public TypeVarMap clone() {
|
|
67
|
+
TypeVarMap clone = new TypeVarMap();
|
|
68
|
+
for (Map.Entry<TypeVariable, Vertex> entry : entrySet()) {
|
|
69
|
+
clone.put(entry.getKey(), new Vertex(null, new TypeSet(entry.getValue().getTypeSet())));
|
|
70
|
+
}
|
|
71
|
+
return clone;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
@Override
|
|
75
|
+
public int hashCode() {
|
|
76
|
+
return hashCode(1);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
public int hashCode(int depth) {
|
|
80
|
+
int code = 0;
|
|
81
|
+
for (Map.Entry<TypeVariable, Vertex> entry : entrySet()) {
|
|
82
|
+
code = (code ^ entry.getKey().hashCode()) * 13;
|
|
83
|
+
code = (code ^ entry.getValue().getTypeSet().hashCode(depth)) * 13;
|
|
84
|
+
}
|
|
85
|
+
return code;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
@Override
|
|
89
|
+
public boolean equals(Object other) {
|
|
90
|
+
if (this == other)
|
|
91
|
+
return true;
|
|
92
|
+
|
|
93
|
+
if (!(other instanceof TypeVarMap))
|
|
94
|
+
return false;
|
|
95
|
+
|
|
96
|
+
TypeVarMap o = (TypeVarMap) other;
|
|
97
|
+
if (size() != o.size())
|
|
98
|
+
return false;
|
|
99
|
+
|
|
100
|
+
Iterator<Map.Entry<TypeVariable, Vertex>> i = entrySet().iterator();
|
|
101
|
+
Iterator<Map.Entry<TypeVariable, Vertex>> j = o.entrySet().iterator();
|
|
102
|
+
while (i.hasNext() && j.hasNext()) {
|
|
103
|
+
Map.Entry<TypeVariable, Vertex> x = i.next();
|
|
104
|
+
Map.Entry<TypeVariable, Vertex> y = j.next();
|
|
105
|
+
if (!x.getKey().equals(y.getKey())
|
|
106
|
+
|| !x.getValue().getTypeSet().equals(y.getValue().getTypeSet()))
|
|
107
|
+
return false;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
return true;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
package org.cx4a.rsense.typing.runtime;
|
|
2
|
+
|
|
3
|
+
import org.cx4a.rsense.ruby.Ruby;
|
|
4
|
+
import org.cx4a.rsense.ruby.IRubyObject;
|
|
5
|
+
import org.cx4a.rsense.ruby.RubyObject;
|
|
6
|
+
import org.cx4a.rsense.typing.vertex.Vertex;
|
|
7
|
+
|
|
8
|
+
public class VertexHolder extends RubyObject {
|
|
9
|
+
private Vertex vertex;
|
|
10
|
+
|
|
11
|
+
public VertexHolder(Ruby runtime, Vertex vertex) {
|
|
12
|
+
super(runtime, runtime.getObject());
|
|
13
|
+
this.vertex = vertex;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
public Vertex getVertex() {
|
|
17
|
+
return vertex;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
@Override
|
|
21
|
+
public String toString() {
|
|
22
|
+
return vertex.toString();
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
@Override
|
|
26
|
+
public int hashCode() {
|
|
27
|
+
int code = 0;
|
|
28
|
+
for (IRubyObject type : vertex.getTypeSet()) {
|
|
29
|
+
code ^= type.hashCode();
|
|
30
|
+
code *= 13;
|
|
31
|
+
}
|
|
32
|
+
return code;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
@Override
|
|
36
|
+
public boolean equals(Object object) {
|
|
37
|
+
if (this == object) {
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
if (!(object instanceof VertexHolder)) {
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
VertexHolder o = (VertexHolder) object;
|
|
46
|
+
return vertex.getTypeSet().equals(o.vertex.getTypeSet());
|
|
47
|
+
}
|
|
48
|
+
}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
package org.cx4a.rsense.typing.vertex;
|
|
2
|
+
|
|
3
|
+
import org.jrubyparser.ast.Node;
|
|
4
|
+
import org.jrubyparser.ast.INameNode;
|
|
5
|
+
|
|
6
|
+
import org.cx4a.rsense.ruby.Block;
|
|
7
|
+
import org.cx4a.rsense.typing.Propagation;
|
|
8
|
+
|
|
9
|
+
public class CallVertex extends Vertex {
|
|
10
|
+
private String name;
|
|
11
|
+
private Vertex receiverVertex;
|
|
12
|
+
private Vertex[] argVertices;
|
|
13
|
+
private Block block;
|
|
14
|
+
private boolean privateVisibility;
|
|
15
|
+
|
|
16
|
+
public CallVertex(Node node, Vertex receiverVertex, Vertex[] argVertices, Block block) {
|
|
17
|
+
this(node, null, receiverVertex, argVertices, block);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
public CallVertex(Node node, String name, Vertex receiverVertex, Vertex[] argVertices, Block block) {
|
|
21
|
+
super(node);
|
|
22
|
+
this.name = name;
|
|
23
|
+
this.receiverVertex = receiverVertex;
|
|
24
|
+
this.argVertices = argVertices;
|
|
25
|
+
this.block = block;
|
|
26
|
+
this.privateVisibility = false;
|
|
27
|
+
receiverVertex.addEdge(this);
|
|
28
|
+
if (argVertices != null) {
|
|
29
|
+
for (Vertex v : argVertices) {
|
|
30
|
+
v.addEdge(this);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
public void cutout() {
|
|
36
|
+
if (argVertices != null) {
|
|
37
|
+
for (Vertex v : argVertices) {
|
|
38
|
+
v.removeEdge(this);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
receiverVertex.removeEdge(this);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
public String getName() {
|
|
45
|
+
return name == null ? ((INameNode) node).getName() : name;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
public Vertex getReceiverVertex() {
|
|
49
|
+
return receiverVertex;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
public Vertex[] getArgVertices() {
|
|
53
|
+
return argVertices;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
public Block getBlock() {
|
|
57
|
+
return block;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
public boolean hasPrivateVisibility() {
|
|
61
|
+
return privateVisibility;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
public void setPrivateVisibility(boolean privateVisibility) {
|
|
65
|
+
this.privateVisibility = privateVisibility;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
public boolean isApplicable() {
|
|
69
|
+
if (receiverVertex == null || receiverVertex.isEmpty()) {
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
boolean applicable = true;
|
|
74
|
+
if (argVertices != null) {
|
|
75
|
+
for (Vertex v : argVertices) {
|
|
76
|
+
if (v.isEmpty()) {
|
|
77
|
+
applicable = false;
|
|
78
|
+
break;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
return applicable;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
@Override
|
|
87
|
+
public boolean isChanged() {
|
|
88
|
+
if (super.isChanged()
|
|
89
|
+
|| (receiverVertex != null
|
|
90
|
+
&& receiverVertex.isChanged())) {
|
|
91
|
+
return true;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
if (argVertices != null) {
|
|
95
|
+
for (Vertex v : argVertices) {
|
|
96
|
+
if (v.isChanged()) {
|
|
97
|
+
return true;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
return false;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
@Override
|
|
106
|
+
public void markUnchanged() {
|
|
107
|
+
super.markUnchanged();
|
|
108
|
+
if (receiverVertex != null) {
|
|
109
|
+
receiverVertex.markUnchanged();
|
|
110
|
+
}
|
|
111
|
+
if (argVertices != null) {
|
|
112
|
+
for (Vertex v : argVertices) {
|
|
113
|
+
v.markUnchanged();
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
@Override
|
|
119
|
+
public boolean accept(Propagation propagation, Vertex src) {
|
|
120
|
+
return propagation.getGraph().propagateCallVertex(propagation, this, src);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
package org.cx4a.rsense.typing.vertex;
|
|
2
|
+
|
|
3
|
+
import org.jrubyparser.ast.MultipleAsgnNode;
|
|
4
|
+
|
|
5
|
+
import org.cx4a.rsense.typing.Propagation;
|
|
6
|
+
|
|
7
|
+
public class MultipleAsgnVertex extends Vertex {
|
|
8
|
+
private Vertex valueVertex;
|
|
9
|
+
|
|
10
|
+
public MultipleAsgnVertex(MultipleAsgnNode node, Vertex valueVertex) {
|
|
11
|
+
super(node);
|
|
12
|
+
this.valueVertex = valueVertex;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
public Vertex getValueVertex() {
|
|
16
|
+
return valueVertex;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
@Override
|
|
20
|
+
public boolean accept(Propagation propagation, Vertex src) {
|
|
21
|
+
return propagation.getGraph().propagateMultipleAsgnVertex(propagation, this, src);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
package org.cx4a.rsense.typing.vertex;
|
|
2
|
+
|
|
3
|
+
import org.jrubyparser.ast.Node;
|
|
4
|
+
|
|
5
|
+
import org.cx4a.rsense.typing.Propagation;
|
|
6
|
+
|
|
7
|
+
public class PassThroughVertex extends Vertex {
|
|
8
|
+
public PassThroughVertex() {
|
|
9
|
+
super();
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
public PassThroughVertex(Node node) {
|
|
13
|
+
super(node);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
@Override
|
|
17
|
+
public boolean accept(Propagation propagation, Vertex src) {
|
|
18
|
+
return propagation.getGraph().propagatePassThroughVertex(propagation, this, src);
|
|
19
|
+
}
|
|
20
|
+
}
|