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,24 @@
|
|
|
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 SValueVertex extends Vertex {
|
|
8
|
+
Vertex vertex;
|
|
9
|
+
|
|
10
|
+
public SValueVertex(Node node, Vertex vertex) {
|
|
11
|
+
super(node);
|
|
12
|
+
this.vertex = vertex;
|
|
13
|
+
vertex.addEdge(this);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
public Vertex getValueVertex() {
|
|
17
|
+
return vertex;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
@Override
|
|
21
|
+
public boolean accept(Propagation propagation, Vertex src) {
|
|
22
|
+
return propagation.getGraph().propagateSValueVertex(propagation, this, src);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
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 SplatVertex extends Vertex {
|
|
8
|
+
private Vertex valueVertex;
|
|
9
|
+
|
|
10
|
+
public SplatVertex(Node node, Vertex valueVertex) {
|
|
11
|
+
super(node);
|
|
12
|
+
this.valueVertex = valueVertex;
|
|
13
|
+
valueVertex.addEdge(this);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
public Vertex getValueVertex() {
|
|
17
|
+
return valueVertex;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
@Override
|
|
21
|
+
public boolean accept(Propagation propagation, Vertex src) {
|
|
22
|
+
return propagation.getGraph().propagateSplatVertex(propagation, this, src);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
package org.cx4a.rsense.typing.vertex;
|
|
2
|
+
|
|
3
|
+
import org.jrubyparser.ast.ToAryNode;
|
|
4
|
+
|
|
5
|
+
import org.cx4a.rsense.typing.Propagation;
|
|
6
|
+
|
|
7
|
+
public class ToAryVertex extends Vertex {
|
|
8
|
+
private Vertex valueVertex;
|
|
9
|
+
|
|
10
|
+
public ToAryVertex(ToAryNode node, Vertex valueVertex) {
|
|
11
|
+
super(node);
|
|
12
|
+
this.valueVertex = valueVertex;
|
|
13
|
+
valueVertex.addEdge(this);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
public Vertex getValueVertex() {
|
|
17
|
+
return valueVertex;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
@Override
|
|
21
|
+
public boolean accept(Propagation propagation, Vertex src) {
|
|
22
|
+
return propagation.getGraph().propagateToAryVertex(propagation, this, src);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
package org.cx4a.rsense.typing.vertex;
|
|
2
|
+
|
|
3
|
+
import org.cx4a.rsense.typing.runtime.PolymorphicObject;
|
|
4
|
+
import org.cx4a.rsense.typing.Propagation;
|
|
5
|
+
|
|
6
|
+
public class TypeVarVertex extends Vertex {
|
|
7
|
+
private PolymorphicObject object;
|
|
8
|
+
|
|
9
|
+
public TypeVarVertex(PolymorphicObject object) {
|
|
10
|
+
super();
|
|
11
|
+
this.object = object;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
public PolymorphicObject getObject() {
|
|
15
|
+
return object;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
@Override
|
|
19
|
+
public boolean accept(Propagation propagation, Vertex src) {
|
|
20
|
+
return propagation.getGraph().propagateTypeVarVertex(propagation, this, src);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
package org.cx4a.rsense.typing.vertex;
|
|
2
|
+
|
|
3
|
+
import java.util.Collection;
|
|
4
|
+
import java.util.List;
|
|
5
|
+
import java.util.ArrayList;
|
|
6
|
+
import java.util.Collections;
|
|
7
|
+
|
|
8
|
+
import org.jrubyparser.ast.Node;
|
|
9
|
+
import org.jrubyparser.ast.FixnumNode;
|
|
10
|
+
import org.jrubyparser.ast.StrNode;
|
|
11
|
+
import org.jrubyparser.ast.SymbolNode;
|
|
12
|
+
import org.jrubyparser.ast.INameNode;
|
|
13
|
+
|
|
14
|
+
import org.cx4a.rsense.ruby.IRubyObject;
|
|
15
|
+
import org.cx4a.rsense.typing.TypeSet;
|
|
16
|
+
import org.cx4a.rsense.typing.Propagation;
|
|
17
|
+
import org.cx4a.rsense.typing.runtime.PolymorphicObject;
|
|
18
|
+
import org.cx4a.rsense.util.Logger;
|
|
19
|
+
|
|
20
|
+
public class Vertex {
|
|
21
|
+
public static final int MEGAMORPHIC_THRESHOLD = 5;
|
|
22
|
+
public static final Vertex EMPTY = new Vertex(null, TypeSet.EMPTY) {
|
|
23
|
+
@Override
|
|
24
|
+
public void addEdge(Vertex dest) {}
|
|
25
|
+
@Override
|
|
26
|
+
public void removeEdge(Vertex dest) {}
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
static {
|
|
30
|
+
EMPTY.edges = Collections.<Vertex>emptyList();
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
protected Node node;
|
|
34
|
+
protected int capacity = MEGAMORPHIC_THRESHOLD + 1;
|
|
35
|
+
protected TypeSet typeSet;
|
|
36
|
+
protected IRubyObject singleType;
|
|
37
|
+
protected boolean megamorphic;
|
|
38
|
+
protected List<Vertex> edges;
|
|
39
|
+
protected boolean changed = true;
|
|
40
|
+
protected long changedTime;
|
|
41
|
+
|
|
42
|
+
public Vertex() {}
|
|
43
|
+
|
|
44
|
+
public Vertex(int capacity) {
|
|
45
|
+
this.capacity = capacity;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
public Vertex(Node node) {
|
|
49
|
+
this.node = node;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
public Vertex(Node node, int capacity) {
|
|
53
|
+
this.node = node;
|
|
54
|
+
this.capacity = capacity;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
public Vertex(Node node, TypeSet typeSet) {
|
|
58
|
+
this.node = node;
|
|
59
|
+
this.typeSet = typeSet;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
public Node getNode() {
|
|
63
|
+
return node;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
public TypeSet getTypeSet() {
|
|
67
|
+
return typeSet != null ? typeSet : TypeSet.EMPTY;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
public List<Vertex> getEdges() {
|
|
71
|
+
return edges != null ? edges : Collections.<Vertex>emptyList();
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
public boolean isEmpty() {
|
|
75
|
+
return typeSet == null || typeSet.isEmpty();
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
public boolean addType(IRubyObject type) {
|
|
79
|
+
if (type == null)
|
|
80
|
+
throw new NullPointerException("type is null");
|
|
81
|
+
|
|
82
|
+
if (megamorphic)
|
|
83
|
+
return false;
|
|
84
|
+
|
|
85
|
+
if (typeSet().size() >= MEGAMORPHIC_THRESHOLD) {
|
|
86
|
+
Logger.info("megamorphic detected");
|
|
87
|
+
megamorphic = true;
|
|
88
|
+
|
|
89
|
+
// FIXME generalize
|
|
90
|
+
singleType = type.getRuntime().newInstance(type.getRuntime().getObject());
|
|
91
|
+
typeSet = new TypeSet(1);
|
|
92
|
+
typeSet.add(singleType);
|
|
93
|
+
|
|
94
|
+
return false;
|
|
95
|
+
} else {
|
|
96
|
+
if (singleType == null)
|
|
97
|
+
singleType = type;
|
|
98
|
+
if (typeSet().add(type))
|
|
99
|
+
return changed = true;
|
|
100
|
+
else
|
|
101
|
+
return false;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
public boolean addTypes(Collection<IRubyObject> types) {
|
|
106
|
+
boolean added = false;
|
|
107
|
+
for (IRubyObject type : types) {
|
|
108
|
+
if (addType(type))
|
|
109
|
+
added = true;
|
|
110
|
+
}
|
|
111
|
+
return added;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
public boolean update(Vertex other) {
|
|
115
|
+
return addTypes(other.getTypeSet());
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
public boolean isChanged() {
|
|
119
|
+
if (changed)
|
|
120
|
+
return true;
|
|
121
|
+
|
|
122
|
+
// Check to see if polymorphic objects are changed
|
|
123
|
+
if (typeSet != null && !megamorphic) {
|
|
124
|
+
for (IRubyObject obj : typeSet) {
|
|
125
|
+
if (obj instanceof PolymorphicObject) {
|
|
126
|
+
PolymorphicObject pobj = (PolymorphicObject) obj;
|
|
127
|
+
if (changedTime <= pobj.getModifiedTime())
|
|
128
|
+
return changed = true;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
return false;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
public void markUnchanged() {
|
|
137
|
+
if (changed)
|
|
138
|
+
changedTime = System.currentTimeMillis();
|
|
139
|
+
changed = false;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
public IRubyObject singleType() {
|
|
143
|
+
if (typeSet == null || typeSet.size() != 1)
|
|
144
|
+
return null;
|
|
145
|
+
else if (singleType != null)
|
|
146
|
+
return singleType;
|
|
147
|
+
else
|
|
148
|
+
return singleType = typeSet.iterator().next();
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
public void addEdge(Vertex dest) {
|
|
152
|
+
if (edges == null)
|
|
153
|
+
edges = new ArrayList<Vertex>(2);
|
|
154
|
+
edges.add(dest);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
public void removeEdge(Vertex dest) {
|
|
158
|
+
if (edges != null)
|
|
159
|
+
edges.remove(dest);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
public boolean accept(Propagation propagation, Vertex src) {
|
|
163
|
+
return propagation.getGraph().propagateVertex(propagation, this, src);
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
public boolean isFree() {
|
|
167
|
+
return node == null;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
@Override
|
|
171
|
+
public String toString() {
|
|
172
|
+
return getTypeSet().toString();
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
private TypeSet typeSet() {
|
|
176
|
+
if (typeSet == null)
|
|
177
|
+
typeSet = new TypeSet(capacity);
|
|
178
|
+
return typeSet;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
public static String getName(Vertex vertex) {
|
|
182
|
+
Node node = vertex.getNode();
|
|
183
|
+
if (node instanceof INameNode) {
|
|
184
|
+
return ((INameNode) node).getName();
|
|
185
|
+
} else {
|
|
186
|
+
return null;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
public static Integer getFixnum(Vertex vertex) {
|
|
191
|
+
Node node = vertex.getNode();
|
|
192
|
+
if (node instanceof FixnumNode) {
|
|
193
|
+
return Integer.valueOf((int) ((FixnumNode) node).getValue());
|
|
194
|
+
} else {
|
|
195
|
+
return null;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
public static String getString(Vertex vertex) {
|
|
200
|
+
Node node = vertex.getNode();
|
|
201
|
+
if (node instanceof StrNode) {
|
|
202
|
+
return ((StrNode) node).getValue().toString();
|
|
203
|
+
} else {
|
|
204
|
+
return null;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
public static String getSymbol(Vertex vertex) {
|
|
209
|
+
Node node = vertex.getNode();
|
|
210
|
+
if (node instanceof SymbolNode) {
|
|
211
|
+
return ((SymbolNode) node).getName();
|
|
212
|
+
} else {
|
|
213
|
+
return null;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
public static String getStringOrSymbol(Vertex vertex) {
|
|
218
|
+
String value = getString(vertex);
|
|
219
|
+
return value != null ? value : getSymbol(vertex);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
package org.cx4a.rsense.typing.vertex;
|
|
2
|
+
|
|
3
|
+
import org.jrubyparser.ast.Node;
|
|
4
|
+
|
|
5
|
+
import org.cx4a.rsense.ruby.Block;
|
|
6
|
+
import org.cx4a.rsense.typing.Propagation;
|
|
7
|
+
import org.cx4a.rsense.typing.Template;
|
|
8
|
+
|
|
9
|
+
public class YieldVertex extends Vertex {
|
|
10
|
+
private Template template;
|
|
11
|
+
private Block block;
|
|
12
|
+
private Vertex argsVertex;
|
|
13
|
+
private boolean expandArguments;
|
|
14
|
+
|
|
15
|
+
public YieldVertex(Node node, Template template, Block block, Vertex argsVertex, boolean expandArguments) {
|
|
16
|
+
super(node);
|
|
17
|
+
this.template = template;
|
|
18
|
+
this.block = block;
|
|
19
|
+
this.argsVertex = argsVertex;
|
|
20
|
+
this.expandArguments = expandArguments;
|
|
21
|
+
if (argsVertex != null) {
|
|
22
|
+
argsVertex.addEdge(this);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
public Template getTemplate() {
|
|
27
|
+
return template;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
public Block getBlock() {
|
|
31
|
+
return block;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
public Vertex getArgsVertex() {
|
|
35
|
+
return argsVertex;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
public boolean getExpandArguments() {
|
|
39
|
+
return expandArguments;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
@Override
|
|
43
|
+
public boolean accept(Propagation propagation, Vertex src) {
|
|
44
|
+
return propagation.getGraph().propagateYieldVertex(propagation, this, src);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
@Override
|
|
48
|
+
public int hashCode() {
|
|
49
|
+
return template == null ? block.hashCode() : template.getAttribute().hashCode();
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
@Override
|
|
53
|
+
public boolean equals(Object other) {
|
|
54
|
+
if (this == other) {
|
|
55
|
+
return true;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
if (!(other instanceof YieldVertex)) {
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
YieldVertex o = (YieldVertex) other;
|
|
63
|
+
return (template == null
|
|
64
|
+
&& o.template == null
|
|
65
|
+
&& block.equals(o.block))
|
|
66
|
+
|| (template != null
|
|
67
|
+
&& o.template != null
|
|
68
|
+
&& template.getAttribute().equals(o.template.getAttribute()));
|
|
69
|
+
}
|
|
70
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
package org.cx4a.rsense.util;
|
|
2
|
+
|
|
3
|
+
import java.io.Reader;
|
|
4
|
+
import java.io.IOException;
|
|
5
|
+
|
|
6
|
+
public class HereDocReader extends Reader {
|
|
7
|
+
private Reader reader;
|
|
8
|
+
private char[] end;
|
|
9
|
+
private int checked = 0;
|
|
10
|
+
|
|
11
|
+
public HereDocReader(Reader reader, String end) {
|
|
12
|
+
this.reader = reader;
|
|
13
|
+
this.end = end.toCharArray();
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
public void close() throws IOException {
|
|
17
|
+
reader.close();
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
public boolean markSupported() {
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
public int read(char[] cbuf, int off, int len) throws IOException {
|
|
25
|
+
if (checked == end.length) {
|
|
26
|
+
return -1;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
int read = 0;
|
|
30
|
+
int c;
|
|
31
|
+
while ((c = reader.read()) != -1) {
|
|
32
|
+
if (end[checked] == c) {
|
|
33
|
+
if (++checked == end.length) {
|
|
34
|
+
// here doc end detected
|
|
35
|
+
return read - checked;
|
|
36
|
+
}
|
|
37
|
+
} else {
|
|
38
|
+
checked = 0;
|
|
39
|
+
}
|
|
40
|
+
read++;
|
|
41
|
+
cbuf[off++] = (char) c;
|
|
42
|
+
if (read == len) {
|
|
43
|
+
return read - checked;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return -1;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
package org.cx4a.rsense.util;
|
|
2
|
+
|
|
3
|
+
import java.io.PrintStream;
|
|
4
|
+
|
|
5
|
+
public class Logger {
|
|
6
|
+
public enum Level {
|
|
7
|
+
FIXME, ERROR, WARN, MESSAGE, INFO, DEBUG
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
private PrintStream out;
|
|
11
|
+
private Level level = Level.MESSAGE;
|
|
12
|
+
|
|
13
|
+
private Logger() {
|
|
14
|
+
out = System.err;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
public PrintStream getOut() {
|
|
18
|
+
return out;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
public void setOut(PrintStream out) {
|
|
22
|
+
this.out = out;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
public Level getLevel() {
|
|
26
|
+
return level;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
public void setLevel(Level level) {
|
|
30
|
+
this.level = level;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
public void log(Level level, String format, Object... args) {
|
|
34
|
+
log(null, level, format, args);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
public void log(SourceLocation loc, Level level, String format, Object... args) {
|
|
38
|
+
if (needsToPrint(level)) {
|
|
39
|
+
printLocation(loc);
|
|
40
|
+
printLevel(level);
|
|
41
|
+
out.println(String.format(format, args));
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
private void printLocation(SourceLocation loc) {
|
|
46
|
+
if (loc != null) {
|
|
47
|
+
out.print(loc.toString() + ": ");
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
private void printLevel(Level level) {
|
|
52
|
+
out.print(level.toString().toLowerCase() + ": ");
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
private boolean needsToPrint(Level level) {
|
|
56
|
+
return this.level.ordinal() >= level.ordinal();
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
private static Logger instance = new Logger();
|
|
60
|
+
public static Logger getInstance() {
|
|
61
|
+
return instance;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
public static void error(String format, Object... args) {
|
|
65
|
+
error(null, format, args);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
public static void error(SourceLocation loc, String format, Object... args) {
|
|
69
|
+
getInstance().log(loc, Level.ERROR, format, args);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
public static void warn(String format, Object... args) {
|
|
73
|
+
warn(null, format, args);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
public static void warn(SourceLocation loc, String format, Object... args) {
|
|
77
|
+
getInstance().log(loc, Level.WARN, format, args);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
public static void message(String format, Object... args) {
|
|
81
|
+
message(null, format, args);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
public static void message(SourceLocation loc, String format, Object... args) {
|
|
85
|
+
getInstance().log(loc, Level.MESSAGE, format, args);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
public static void info(String format, Object... args) {
|
|
89
|
+
info(null, format, args);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
public static void info(SourceLocation loc, String format, Object... args) {
|
|
93
|
+
getInstance().log(loc, Level.INFO, format, args);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
public static void debug(String format, Object... args) {
|
|
97
|
+
debug(null, format, args);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
public static void debug(SourceLocation loc, String format, Object... args) {
|
|
101
|
+
getInstance().log(loc, Level.DEBUG, format, args);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
public static void fixme(String format, Object... args) {
|
|
105
|
+
fixme(null, format, args);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
public static void fixme(SourceLocation loc, String format, Object... args) {
|
|
109
|
+
getInstance().log(loc, Level.FIXME, format, args);
|
|
110
|
+
}
|
|
111
|
+
}
|