ArrayAccess supported in CF
This commit is contained in:
@@ -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);
|
||||||
|
|||||||
+2
-2
@@ -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>
|
||||||
|
=====================
|
||||||
@@ -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