ArrayAccess supported in CF

This commit is contained in:
Andrey Breslav
2011-04-14 21:13:49 +04:00
parent e2fbc5f792
commit 6e2fd76f53
8 changed files with 111 additions and 31 deletions
@@ -10,7 +10,7 @@ import org.jetbrains.jet.lang.psi.JetThrowExpression;
* @author abreslav * @author abreslav
*/ */
public interface JetControlFlowBuilder { public interface JetControlFlowBuilder {
void readNode(@NotNull JetExpression expression); void read(@NotNull JetExpression expression);
void readUnit(@NotNull JetExpression expression); void readUnit(@NotNull JetExpression expression);
// General label management // General label management
@@ -52,7 +52,7 @@ public interface JetControlFlowBuilder {
void returnNoValue(@NotNull JetElement returnExpression, @NotNull JetElement subroutine); 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 // Other
void unsupported(JetElement element); void unsupported(JetElement element);
@@ -17,8 +17,8 @@ public class JetControlFlowBuilderAdapter implements JetControlFlowBuilder {
} }
@Override @Override
public void readNode(@NotNull JetExpression expression) { public void read(@NotNull JetExpression expression) {
builder.readNode(expression); builder.read(expression);
} }
@Override @Override
@@ -130,7 +130,7 @@ public class JetControlFlowBuilderAdapter implements JetControlFlowBuilder {
} }
@Override @Override
public void writeNode(@NotNull JetElement assignment, @NotNull JetElement lValue) { public void write(@NotNull JetElement assignment, @NotNull JetElement lValue) {
builder.writeNode(assignment, lValue); builder.write(assignment, lValue);
} }
} }
@@ -118,17 +118,17 @@ public class JetControlFlowProcessor {
@Override @Override
public void visitThisExpression(JetThisExpression expression) { public void visitThisExpression(JetThisExpression expression) {
builder.readNode(expression); builder.read(expression);
} }
@Override @Override
public void visitConstantExpression(JetConstantExpression expression) { public void visitConstantExpression(JetConstantExpression expression) {
builder.readNode(expression); builder.read(expression);
} }
@Override @Override
public void visitSimpleNameExpression(JetSimpleNameExpression expression) { public void visitSimpleNameExpression(JetSimpleNameExpression expression) {
builder.readNode(expression); builder.read(expression);
} }
@Override @Override
@@ -161,7 +161,7 @@ public class JetControlFlowProcessor {
} }
builder.bindLabel(resultLabel); builder.bindLabel(resultLabel);
if (!inCondition) { if (!inCondition) {
builder.readNode(expression); builder.read(expression);
} }
} }
else if (operationType == JetTokens.OROR) { else if (operationType == JetTokens.OROR) {
@@ -173,18 +173,26 @@ public class JetControlFlowProcessor {
} }
builder.bindLabel(resultLabel); builder.bindLabel(resultLabel);
if (!inCondition) { if (!inCondition) {
builder.readNode(expression); builder.read(expression);
} }
} }
else if (operationType == JetTokens.EQ) { else if (operationType == JetTokens.EQ) {
JetExpression left = expression.getLeft(); JetExpression left = JetPsiUtil.deparenthesize(expression.getLeft());
if (right != null) { if (right != null) {
value(right, false, false); value(right, false, false);
} }
if (left instanceof JetSimpleNameExpression) { 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); builder.unsupported(expression);
} }
} }
@@ -195,7 +203,7 @@ public class JetControlFlowProcessor {
value(right, false, false); value(right, false, false);
} }
if (left instanceof JetSimpleNameExpression) { if (left instanceof JetSimpleNameExpression) {
builder.writeNode(expression, left); builder.write(expression, left);
} }
else { else {
builder.unsupported(expression); builder.unsupported(expression);
@@ -207,7 +215,7 @@ public class JetControlFlowProcessor {
value(right, false, false); value(right, false, false);
} }
value(expression.getOperationReference(), false, false); value(expression.getOperationReference(), false, false);
builder.readNode(expression); builder.read(expression);
} }
} }
@@ -227,10 +235,10 @@ public class JetControlFlowProcessor {
boolean incrementOrDecrement = isIncrementOrDecrement(operationType); boolean incrementOrDecrement = isIncrementOrDecrement(operationType);
if (incrementOrDecrement) { 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) { if (selectorExpression != null) {
value(selectorExpression, false, false); value(selectorExpression, false, false);
} }
builder.readNode(expression); builder.read(expression);
} }
private void visitCall(JetCall call) { private void visitCall(JetCall call) {
@@ -497,7 +505,7 @@ public class JetControlFlowProcessor {
visitCall(expression); visitCall(expression);
value(expression.getCalleeExpression(), false, false); value(expression.getCalleeExpression(), false, false);
builder.readNode(expression); builder.read(expression);
} }
@Override @Override
@@ -505,7 +513,7 @@ public class JetControlFlowProcessor {
// TODO : Instantiated class is loaded // TODO : Instantiated class is loaded
// TODO : type arguments? // TODO : type arguments?
visitCall(expression); visitCall(expression);
builder.readNode(expression); builder.read(expression);
} }
@Override @Override
@@ -513,7 +521,7 @@ public class JetControlFlowProcessor {
JetExpression initializer = property.getInitializer(); JetExpression initializer = property.getInitializer();
if (initializer != null) { if (initializer != null) {
value(initializer, false, false); value(initializer, false, false);
builder.writeNode(property, property); builder.write(property, property);
} }
} }
@@ -522,7 +530,7 @@ public class JetControlFlowProcessor {
for (JetExpression entry : expression.getEntries()) { for (JetExpression entry : expression.getEntries()) {
value(entry, false, false); value(entry, false, false);
} }
builder.readNode(expression); builder.read(expression);
} }
@Override @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 @Override
public void visitThrowExpression(JetThrowExpression expression) { public void visitThrowExpression(JetThrowExpression expression) {
JetExpression thrownExpression = expression.getThrownExpression(); JetExpression thrownExpression = expression.getThrownExpression();
@@ -550,6 +553,42 @@ public class JetControlFlowProcessor {
builder.jumpToError(expression); 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 @Override
public void visitJetElement(JetElement elem) { public void visitJetElement(JetElement elem) {
builder.unsupported(elem); builder.unsupported(elem);
@@ -200,12 +200,12 @@ public class JetControlFlowInstructionsGenerator extends JetControlFlowBuilderAd
} }
@Override @Override
public void writeNode(@NotNull JetElement assignment, @NotNull JetElement lValue) { public void write(@NotNull JetElement assignment, @NotNull JetElement lValue) {
add(new WriteValueInstruction(assignment, lValue)); add(new WriteValueInstruction(assignment, lValue));
} }
@Override @Override
public void readNode(@NotNull JetExpression expression) { public void read(@NotNull JetExpression expression) {
add(new ReadValueInstruction(expression)); add(new ReadValueInstruction(expression));
} }
@@ -2,6 +2,7 @@ package org.jetbrains.jet.lang.psi;
import com.intellij.lang.ASTNode; import com.intellij.lang.ASTNode;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/** /**
* @author max * @author max
@@ -15,4 +16,9 @@ public class JetDelegatorByExpressionSpecifier extends JetDelegationSpecifier {
public void accept(JetVisitor visitor) { public void accept(JetVisitor visitor) {
visitor.visitDelegationByExpressionSpecifier(this); visitor.visitDelegationByExpressionSpecifier(this);
} }
@Nullable @IfNotParsed
public JetExpression getDelegateExpression() {
return findChildByClass(JetExpression.class);
}
} }
@@ -593,7 +593,7 @@ public class JetTypeInferrer {
@Override @Override
public void visitTypeofExpression(JetTypeofExpression expression) { public void visitTypeofExpression(JetTypeofExpression expression) {
throw new UnsupportedOperationException("Return some reflection interface"); // TODO semanticServices.getErrorHandler().genericError(expression.getNode(), "Return some reflection interface"); // TODO
} }
@Override @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>
=====================
+7
View File
@@ -0,0 +1,7 @@
fun foo() {
val a = new Array<Int>
3
a[10] = 4
2
a[10]
}