ArrayAccess supported in CF
This commit is contained in:
@@ -10,7 +10,7 @@ import org.jetbrains.jet.lang.psi.JetThrowExpression;
|
||||
* @author abreslav
|
||||
*/
|
||||
public interface JetControlFlowBuilder {
|
||||
void readNode(@NotNull JetExpression expression);
|
||||
void read(@NotNull JetExpression expression);
|
||||
void readUnit(@NotNull JetExpression expression);
|
||||
|
||||
// General label management
|
||||
@@ -52,7 +52,7 @@ public interface JetControlFlowBuilder {
|
||||
|
||||
void returnNoValue(@NotNull JetElement returnExpression, @NotNull JetElement subroutine);
|
||||
|
||||
void writeNode(@NotNull JetElement assignment, @NotNull JetElement lValue);
|
||||
void write(@NotNull JetElement assignment, @NotNull JetElement lValue);
|
||||
|
||||
// Other
|
||||
void unsupported(JetElement element);
|
||||
|
||||
@@ -17,8 +17,8 @@ public class JetControlFlowBuilderAdapter implements JetControlFlowBuilder {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void readNode(@NotNull JetExpression expression) {
|
||||
builder.readNode(expression);
|
||||
public void read(@NotNull JetExpression expression) {
|
||||
builder.read(expression);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -130,7 +130,7 @@ public class JetControlFlowBuilderAdapter implements JetControlFlowBuilder {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeNode(@NotNull JetElement assignment, @NotNull JetElement lValue) {
|
||||
builder.writeNode(assignment, lValue);
|
||||
public void write(@NotNull JetElement assignment, @NotNull JetElement lValue) {
|
||||
builder.write(assignment, lValue);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -118,17 +118,17 @@ public class JetControlFlowProcessor {
|
||||
|
||||
@Override
|
||||
public void visitThisExpression(JetThisExpression expression) {
|
||||
builder.readNode(expression);
|
||||
builder.read(expression);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void visitConstantExpression(JetConstantExpression expression) {
|
||||
builder.readNode(expression);
|
||||
builder.read(expression);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void visitSimpleNameExpression(JetSimpleNameExpression expression) {
|
||||
builder.readNode(expression);
|
||||
builder.read(expression);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -161,7 +161,7 @@ public class JetControlFlowProcessor {
|
||||
}
|
||||
builder.bindLabel(resultLabel);
|
||||
if (!inCondition) {
|
||||
builder.readNode(expression);
|
||||
builder.read(expression);
|
||||
}
|
||||
}
|
||||
else if (operationType == JetTokens.OROR) {
|
||||
@@ -173,18 +173,26 @@ public class JetControlFlowProcessor {
|
||||
}
|
||||
builder.bindLabel(resultLabel);
|
||||
if (!inCondition) {
|
||||
builder.readNode(expression);
|
||||
builder.read(expression);
|
||||
}
|
||||
}
|
||||
else if (operationType == JetTokens.EQ) {
|
||||
JetExpression left = expression.getLeft();
|
||||
JetExpression left = JetPsiUtil.deparenthesize(expression.getLeft());
|
||||
if (right != null) {
|
||||
value(right, false, false);
|
||||
}
|
||||
if (left instanceof JetSimpleNameExpression) {
|
||||
builder.writeNode(expression, left);
|
||||
builder.write(expression, left);
|
||||
}
|
||||
else {
|
||||
else if (left instanceof JetArrayAccessExpression) {
|
||||
JetArrayAccessExpression arrayAccessExpression = (JetArrayAccessExpression) left;
|
||||
for (JetExpression index : arrayAccessExpression.getIndexExpressions()) {
|
||||
value(index, false, false);
|
||||
}
|
||||
value(arrayAccessExpression.getArrayExpression(), false, false);
|
||||
value(expression.getOperationReference(), false, false);
|
||||
builder.write(expression, left); // TODO : ???
|
||||
} else {
|
||||
builder.unsupported(expression);
|
||||
}
|
||||
}
|
||||
@@ -195,7 +203,7 @@ public class JetControlFlowProcessor {
|
||||
value(right, false, false);
|
||||
}
|
||||
if (left instanceof JetSimpleNameExpression) {
|
||||
builder.writeNode(expression, left);
|
||||
builder.write(expression, left);
|
||||
}
|
||||
else {
|
||||
builder.unsupported(expression);
|
||||
@@ -207,7 +215,7 @@ public class JetControlFlowProcessor {
|
||||
value(right, false, false);
|
||||
}
|
||||
value(expression.getOperationReference(), false, false);
|
||||
builder.readNode(expression);
|
||||
builder.read(expression);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -227,10 +235,10 @@ public class JetControlFlowProcessor {
|
||||
|
||||
boolean incrementOrDecrement = isIncrementOrDecrement(operationType);
|
||||
if (incrementOrDecrement) {
|
||||
builder.writeNode(expression, baseExpression);
|
||||
builder.write(expression, baseExpression);
|
||||
}
|
||||
|
||||
builder.readNode(expression);
|
||||
builder.read(expression);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -472,7 +480,7 @@ public class JetControlFlowProcessor {
|
||||
if (selectorExpression != null) {
|
||||
value(selectorExpression, false, false);
|
||||
}
|
||||
builder.readNode(expression);
|
||||
builder.read(expression);
|
||||
}
|
||||
|
||||
private void visitCall(JetCall call) {
|
||||
@@ -497,7 +505,7 @@ public class JetControlFlowProcessor {
|
||||
visitCall(expression);
|
||||
|
||||
value(expression.getCalleeExpression(), false, false);
|
||||
builder.readNode(expression);
|
||||
builder.read(expression);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -505,7 +513,7 @@ public class JetControlFlowProcessor {
|
||||
// TODO : Instantiated class is loaded
|
||||
// TODO : type arguments?
|
||||
visitCall(expression);
|
||||
builder.readNode(expression);
|
||||
builder.read(expression);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -513,7 +521,7 @@ public class JetControlFlowProcessor {
|
||||
JetExpression initializer = property.getInitializer();
|
||||
if (initializer != null) {
|
||||
value(initializer, false, false);
|
||||
builder.writeNode(property, property);
|
||||
builder.write(property, property);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -522,7 +530,7 @@ public class JetControlFlowProcessor {
|
||||
for (JetExpression entry : expression.getEntries()) {
|
||||
value(entry, false, false);
|
||||
}
|
||||
builder.readNode(expression);
|
||||
builder.read(expression);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -536,11 +544,6 @@ public class JetControlFlowProcessor {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void visitTypeProjection(JetTypeProjection typeProjection) {
|
||||
// TODO : Support Type Arguments. Class object may be initialized at this point");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void visitThrowExpression(JetThrowExpression expression) {
|
||||
JetExpression thrownExpression = expression.getThrownExpression();
|
||||
@@ -550,6 +553,42 @@ public class JetControlFlowProcessor {
|
||||
builder.jumpToError(expression);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void visitArrayAccessExpression(JetArrayAccessExpression expression) {
|
||||
for (JetExpression index : expression.getIndexExpressions()) {
|
||||
value(index, false, false);
|
||||
}
|
||||
value(expression.getArrayExpression(), false, false);
|
||||
// TODO : read 'get' or 'set' function
|
||||
builder.read(expression);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void visitTypeofExpression(JetTypeofExpression expression) {
|
||||
value(expression.getBaseExpression(), false, false);
|
||||
builder.read(expression);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void visitObjectLiteralExpression(JetObjectLiteralExpression expression) {
|
||||
List<JetDelegationSpecifier> delegationSpecifiers = expression.getDelegationSpecifiers();
|
||||
for (JetDelegationSpecifier delegationSpecifier : delegationSpecifiers) {
|
||||
if (delegationSpecifier instanceof JetDelegatorByExpressionSpecifier) {
|
||||
JetDelegatorByExpressionSpecifier specifier = (JetDelegatorByExpressionSpecifier) delegationSpecifier;
|
||||
JetExpression delegateExpression = specifier.getDelegateExpression();
|
||||
if (delegateExpression != null) {
|
||||
value(delegateExpression, false, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
builder.read(expression);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void visitTypeProjection(JetTypeProjection typeProjection) {
|
||||
// TODO : Support Type Arguments. Class object may be initialized at this point");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void visitJetElement(JetElement elem) {
|
||||
builder.unsupported(elem);
|
||||
|
||||
+2
-2
@@ -200,12 +200,12 @@ public class JetControlFlowInstructionsGenerator extends JetControlFlowBuilderAd
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeNode(@NotNull JetElement assignment, @NotNull JetElement lValue) {
|
||||
public void write(@NotNull JetElement assignment, @NotNull JetElement lValue) {
|
||||
add(new WriteValueInstruction(assignment, lValue));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void readNode(@NotNull JetExpression expression) {
|
||||
public void read(@NotNull JetExpression expression) {
|
||||
add(new ReadValueInstruction(expression));
|
||||
}
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@ package org.jetbrains.jet.lang.psi;
|
||||
|
||||
import com.intellij.lang.ASTNode;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
/**
|
||||
* @author max
|
||||
@@ -15,4 +16,9 @@ public class JetDelegatorByExpressionSpecifier extends JetDelegationSpecifier {
|
||||
public void accept(JetVisitor visitor) {
|
||||
visitor.visitDelegationByExpressionSpecifier(this);
|
||||
}
|
||||
|
||||
@Nullable @IfNotParsed
|
||||
public JetExpression getDelegateExpression() {
|
||||
return findChildByClass(JetExpression.class);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -593,7 +593,7 @@ public class JetTypeInferrer {
|
||||
|
||||
@Override
|
||||
public void visitTypeofExpression(JetTypeofExpression expression) {
|
||||
throw new UnsupportedOperationException("Return some reflection interface"); // TODO
|
||||
semanticServices.getErrorHandler().genericError(expression.getNode(), "Return some reflection interface"); // TODO
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
== foo ==
|
||||
fun foo() {
|
||||
val a = new Array<Int>
|
||||
3
|
||||
a[10] = 4
|
||||
2
|
||||
a[10]
|
||||
}
|
||||
---------------------
|
||||
l0:
|
||||
<START>
|
||||
r(new Array<Int>)
|
||||
w(a)
|
||||
r(3)
|
||||
r(4)
|
||||
r(10)
|
||||
r(a)
|
||||
r(=)
|
||||
w(a[10])
|
||||
r(2)
|
||||
r(10)
|
||||
r(a)
|
||||
r(a[10])
|
||||
l1:
|
||||
<END>
|
||||
error:
|
||||
<ERROR>
|
||||
=====================
|
||||
@@ -0,0 +1,7 @@
|
||||
fun foo() {
|
||||
val a = new Array<Int>
|
||||
3
|
||||
a[10] = 4
|
||||
2
|
||||
a[10]
|
||||
}
|
||||
Reference in New Issue
Block a user