From 4c7768b47d93942ba9fb7e93c31e74d52f50816d Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Fri, 20 May 2011 13:54:15 +0200 Subject: [PATCH] generate .size property for arrays --- .../jet/codegen/ExpressionCodegen.java | 19 +++++++++++++------ .../jet/codegen/NamespaceGenTest.java | 10 ++++++++++ 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index 5c83f20f4c4..8fdaa3b6d4a 100644 --- a/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -445,8 +445,8 @@ public class ExpressionCodegen extends JetVisitor { @Override public void visitSimpleNameExpression(JetSimpleNameExpression expression) { final DeclarationDescriptor descriptor = bindingContext.resolveReferenceExpression(expression); + final DeclarationDescriptor container = descriptor.getContainingDeclaration(); if (descriptor instanceof VariableDescriptor) { - final DeclarationDescriptor container = descriptor.getContainingDeclaration(); if (isClass(container, "Number")) { Type castType = getCastType(expression.getReferencedName()); if (castType != null) { @@ -493,13 +493,20 @@ public class ExpressionCodegen extends JetVisitor { } } - boolean isStatic = descriptor.getContainingDeclaration() instanceof NamespaceDescriptorImpl; - final boolean directToField = expression.getReferencedNameElementType() == JetTokens.FIELD_IDENTIFIER; - final StackValue iValue = intermediateValueForProperty(propertyDescriptor, directToField); - if (!isStatic) { + if (isClass(container, "Array") && propertyDescriptor.getName().equals("size")) { ensureReceiverOnStack(expression); + v.arraylength(); + myStack.push(StackValue.onStack(Type.INT_TYPE)); + } + else { + boolean isStatic = container instanceof NamespaceDescriptorImpl; + final boolean directToField = expression.getReferencedNameElementType() == JetTokens.FIELD_IDENTIFIER; + final StackValue iValue = intermediateValueForProperty(propertyDescriptor, directToField); + if (!isStatic) { + ensureReceiverOnStack(expression); + } + myStack.push(iValue); } - myStack.push(iValue); } else { throw new UnsupportedOperationException("don't know how to generate reference " + descriptor); diff --git a/idea/tests/org/jetbrains/jet/codegen/NamespaceGenTest.java b/idea/tests/org/jetbrains/jet/codegen/NamespaceGenTest.java index 5184b5afd97..675ec2ee193 100644 --- a/idea/tests/org/jetbrains/jet/codegen/NamespaceGenTest.java +++ b/idea/tests/org/jetbrains/jet/codegen/NamespaceGenTest.java @@ -367,6 +367,16 @@ public class NamespaceGenTest extends CodegenTestCase { assertEquals(4, result.length); } + public void testArraySize() throws Exception { + loadText("fun foo(a: Array) = a.size"); + System.out.println(generateToText()); + final Method main = generateFunction(); + Object[] args = new Object[] { new int[4] }; + int result = (Integer) main.invoke(null, args); + assertEquals(4, result); + + } + public void testIntRange() throws Exception { loadText("fun foo() = 1..10"); final Method main = generateFunction();