diff --git a/.idea/projectCodeStyle.xml b/.idea/projectCodeStyle.xml
index cdd7d881640..43813395c7f 100644
--- a/.idea/projectCodeStyle.xml
+++ b/.idea/projectCodeStyle.xml
@@ -127,6 +127,17 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java
index 7398c706c22..04e7ca0ebd6 100644
--- a/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java
+++ b/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java
@@ -1,8 +1,10 @@
package org.jetbrains.jet.codegen;
+import com.intellij.psi.*;
import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.types.DeclarationDescriptor;
+import org.jetbrains.jet.lang.types.FunctionDescriptor;
import org.objectweb.asm.Label;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;
@@ -257,7 +259,6 @@ public class ExpressionCodegen extends JetVisitor {
}
}
-/*
@Override
public void visitCallExpression(JetCallExpression expression) {
List args = expression.getValueArguments();
@@ -270,6 +271,19 @@ public class ExpressionCodegen extends JetVisitor {
if (callee instanceof JetSimpleNameExpression) {
DeclarationDescriptor funDescriptor = bindingContext.resolveReferenceExpression((JetSimpleNameExpression) callee);
if (funDescriptor instanceof FunctionDescriptor) {
+ PsiElement declarationPsiElement = bindingContext.getDeclarationPsiElement(funDescriptor);
+ if (declarationPsiElement instanceof PsiMethod) {
+ PsiMethod method = (PsiMethod) declarationPsiElement;
+ if (method.hasModifierProperty(PsiModifier.STATIC)) {
+ PsiClass containingClass = method.getContainingClass();
+ String owner = containingClass.getQualifiedName().replace(".", "/");
+ v.visitMethodInsn(Opcodes.INVOKESTATIC, owner, method.getName(), getMethodDescriptor(method));
+ boxIfNeeded(method.getReturnType());
+ }
+ else {
+ throw new UnsupportedOperationException("don't know how to generate instance method calls");
+ }
+ }
}
else {
throw new CompilationException();
@@ -280,10 +294,48 @@ public class ExpressionCodegen extends JetVisitor {
}
}
- @Override
- public void visitBinaryExpression(JetBinaryExpression expression) {
+ private void boxIfNeeded(PsiType type) {
+ if (type == PsiType.LONG) {
+ v.invokestatic("java/lang/Long", "valueOf", "(J)Ljava/lang/Long;");
+ }
+ else {
+ throw new UnsupportedOperationException("Don't know how to box type " + type);
+ }
}
-*/
+
+ private String getMethodDescriptor(PsiMethod method) {
+ Type returnType = psiTypeToAsm(method.getReturnType());
+ PsiParameter[] parameters = method.getParameterList().getParameters();
+ Type[] parameterTypes = new Type[parameters.length];
+ for (int i = 0; i < parameters.length; i++) {
+ parameterTypes[i] = psiTypeToAsm(parameters [i].getType());
+ }
+ return Type.getMethodDescriptor(returnType, parameterTypes);
+ }
+
+ private Type psiTypeToAsm(PsiType type) {
+ if (type instanceof PsiPrimitiveType) {
+ if (type == PsiType.VOID) {
+ return Type.VOID_TYPE;
+ }
+ if (type == PsiType.LONG) {
+ return Type.LONG_TYPE;
+ }
+ }
+ throw new UnsupportedOperationException("don't know how to map type " + type + " to ASM");
+ }
+
+ @Override
+ public void visitDotQualifiedExpression(JetDotQualifiedExpression expression) {
+// gen(expression.getReceiverExpression());
+ expression.getSelectorExpression().accept(this);
+ }
+
+ /*
+ @Override
+ public void visitBinaryExpression(JetBinaryExpression expression) {
+ }
+ */
private Type getType(JetProperty var) {
return InstructionAdapter.OBJECT_TYPE; // TODO:
diff --git a/idea/src/org/jetbrains/jet/codegen/FunctionCodegen.java b/idea/src/org/jetbrains/jet/codegen/FunctionCodegen.java
index 0dcb3498795..baa8d1bacc2 100644
--- a/idea/src/org/jetbrains/jet/codegen/FunctionCodegen.java
+++ b/idea/src/org/jetbrains/jet/codegen/FunctionCodegen.java
@@ -117,6 +117,9 @@ public class FunctionCodegen {
if ("Int".equals(name)) {
return Type.getType(Integer.class);
}
+ if ("Long".equals(name)) {
+ return Type.getType(Long.class);
+ }
throw new UnsupportedOperationException("Unknown type " + name);
}
diff --git a/idea/testData/codegen/currentTime.jet b/idea/testData/codegen/currentTime.jet
new file mode 100644
index 00000000000..3a19bf8c5c0
--- /dev/null
+++ b/idea/testData/codegen/currentTime.jet
@@ -0,0 +1,3 @@
+import java.lang.*
+
+fun f() : Long { return System.currentTimeMillis(); }
\ No newline at end of file
diff --git a/idea/tests/org/jetbrains/jet/JetLightProjectDescriptor.java b/idea/tests/org/jetbrains/jet/JetLightProjectDescriptor.java
new file mode 100644
index 00000000000..67c0f448e76
--- /dev/null
+++ b/idea/tests/org/jetbrains/jet/JetLightProjectDescriptor.java
@@ -0,0 +1,17 @@
+package org.jetbrains.jet;
+
+import com.intellij.openapi.projectRoots.Sdk;
+import com.intellij.testFramework.fixtures.DefaultLightProjectDescriptor;
+import org.jetbrains.jet.resolve.JetResolveTest;
+
+/**
+ * @author yole
+ */
+public class JetLightProjectDescriptor extends DefaultLightProjectDescriptor {
+ public static JetLightProjectDescriptor INSTANCE = new JetLightProjectDescriptor();
+
+ @Override
+ public Sdk getSdk() {
+ return JetResolveTest.jdkFromIdeaHome();
+ }
+}
diff --git a/idea/tests/org/jetbrains/jet/codegen/NamespaceGenTest.java b/idea/tests/org/jetbrains/jet/codegen/NamespaceGenTest.java
index 9a445057e8f..e2149f672ac 100644
--- a/idea/tests/org/jetbrains/jet/codegen/NamespaceGenTest.java
+++ b/idea/tests/org/jetbrains/jet/codegen/NamespaceGenTest.java
@@ -1,6 +1,9 @@
package org.jetbrains.jet.codegen;
+import com.intellij.testFramework.LightProjectDescriptor;
import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.jet.JetLightProjectDescriptor;
import org.jetbrains.jet.lang.psi.JetFile;
import org.jetbrains.jet.lang.psi.JetNamespace;
import org.jetbrains.jet.parsing.JetParsingTest;
@@ -24,7 +27,7 @@ public class NamespaceGenTest extends LightCodeInsightFixtureTestCase {
}
public void testPSVM() throws Exception {
- myFixture.configureByFile(JetParsingTest.getTestDataDir() + "/codegen/PSVM.jet");
+ loadFile("PSVM.jet");
final String text = generateToText();
System.out.println(text);
@@ -67,6 +70,19 @@ public class NamespaceGenTest extends LightCodeInsightFixtureTestCase {
assertEquals(new Integer(50), returnValue);
}
+ public void testCurrentTime() throws Exception {
+ loadFile("currentTime.jet");
+ final Class aClass = generateToClass();
+ final Method main = firstMethod(aClass);
+ final long returnValue = (Long) main.invoke(null);
+ long currentTime = System.currentTimeMillis();
+ assertTrue(Math.abs(returnValue - currentTime) <= 1L);
+ }
+
+ private void loadFile(final String name) {
+ myFixture.configureByFile(JetParsingTest.getTestDataDir() + "/codegen/" + name);
+ }
+
private String generateToText() {
StringWriter writer = new StringWriter();
JetFile jetFile = (JetFile) myFixture.getFile();
@@ -104,4 +120,10 @@ public class NamespaceGenTest extends LightCodeInsightFixtureTestCase {
return super.loadClass(name);
}
}
+
+ @NotNull
+ @Override
+ protected LightProjectDescriptor getProjectDescriptor() {
+ return JetLightProjectDescriptor.INSTANCE;
+ }
}
diff --git a/idea/tests/org/jetbrains/jet/resolve/JetResolveTest.java b/idea/tests/org/jetbrains/jet/resolve/JetResolveTest.java
index 02a36dcd496..ab7f5fad3fc 100644
--- a/idea/tests/org/jetbrains/jet/resolve/JetResolveTest.java
+++ b/idea/tests/org/jetbrains/jet/resolve/JetResolveTest.java
@@ -114,6 +114,10 @@ public class JetResolveTest extends ExtensibleResolveTestCase {
@Override
protected Sdk getProjectJDK() {
+ return jdkFromIdeaHome();
+ }
+
+ public static Sdk jdkFromIdeaHome() {
Properties properties = new Properties();
try {
FileReader reader = new FileReader(getHomeDirectory() + "/idea/idea.properties");