From cc8d263f9e1d536322d26bf277feb1275a60da93 Mon Sep 17 00:00:00 2001 From: Alex Tkachman Date: Tue, 21 Feb 2012 20:37:23 +0200 Subject: [PATCH] preliminary support for intrinsics in std lib. javaClass --- .../codegen/intrinsics/IntrinsicMethods.java | 2 +- .../codegen/intrinsics/JavaClassFunction.java | 47 +++++++++++++++++++ .../resolve/java/JavaDescriptorResolver.java | 11 ++++- .../testData/codegen/regressions/kt715.kt | 3 ++ stdlib/ktSrc/JavaLang.kt | 4 +- 5 files changed, 62 insertions(+), 5 deletions(-) create mode 100644 compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/JavaClassFunction.java diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/IntrinsicMethods.java b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/IntrinsicMethods.java index 648f73a6d91..4e9db35f3e9 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/IntrinsicMethods.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/IntrinsicMethods.java @@ -72,7 +72,7 @@ public class IntrinsicMethods { myProject = project; myStdLib = stdlib; - namedMethods.put("std.javaClass.property", new JavaClassProperty()); + namedMethods.put("\"std.javaClass.function\"", new JavaClassFunction()); List primitiveCastMethods = OperatorConventions.NUMBER_CONVERSIONS.asList(); for (String method : primitiveCastMethods) { diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/JavaClassFunction.java b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/JavaClassFunction.java new file mode 100644 index 00000000000..eab5c17819f --- /dev/null +++ b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/JavaClassFunction.java @@ -0,0 +1,47 @@ +/* + * Copyright 2000-2012 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.jet.codegen.intrinsics; + +import com.intellij.psi.PsiElement; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.jet.codegen.ExpressionCodegen; +import org.jetbrains.jet.codegen.StackValue; +import org.jetbrains.jet.lang.descriptors.CallableDescriptor; +import org.jetbrains.jet.lang.psi.JetCallExpression; +import org.jetbrains.jet.lang.psi.JetExpression; +import org.jetbrains.jet.lang.resolve.BindingContext; +import org.jetbrains.jet.lang.resolve.calls.ResolvedCall; +import org.jetbrains.jet.lang.types.TypeProjection; +import org.objectweb.asm.Type; +import org.objectweb.asm.commons.InstructionAdapter; + +import java.util.List; + +/** + * @author alex.tkachman + */ +public class JavaClassFunction implements IntrinsicMethod { + @Override + public StackValue generate(ExpressionCodegen codegen, InstructionAdapter v, Type expectedType, @Nullable PsiElement element, @Nullable List arguments, StackValue receiver) { + JetCallExpression call = (JetCallExpression) element; + ResolvedCall resolvedCall = codegen.getBindingContext().get(BindingContext.RESOLVED_CALL, call.getCalleeExpression()); + CallableDescriptor resultingDescriptor = resolvedCall.getResultingDescriptor(); + Type type = codegen.getTypeMapper().mapType(resultingDescriptor.getReturnType().getArguments().get(0).getType()); + v.aconst(type); + return StackValue.onStack(type); + } +} diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java index 16d59a74abf..0bcae7a0512 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java @@ -34,7 +34,7 @@ import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.DescriptorUtils; import org.jetbrains.jet.lang.resolve.OverrideResolver; -import org.jetbrains.jet.lang.resolve.constants.CompileTimeConstant; +import org.jetbrains.jet.lang.resolve.constants.*; import org.jetbrains.jet.lang.resolve.java.alt.AltClassFinder; import org.jetbrains.jet.lang.resolve.java.kt.JetClassAnnotation; import org.jetbrains.jet.lang.types.*; @@ -1425,7 +1425,14 @@ public class JavaDescriptorResolver { return null; } annotation.setAnnotationType(clazz.getDefaultType()); - annotation.setValueArguments(new ArrayList>()); // TODO + ArrayList> valueArguments = new ArrayList>(); + if("jet.runtime.Intrinsic".equals(psiAnnotation.getQualifiedName())) { + // temporary hack + valueArguments.add(new StringValue(psiAnnotation.findAttributeValue("value").getText())); + annotation.setValueArguments(valueArguments); // TODO + } + else + annotation.setValueArguments(valueArguments); // TODO return annotation; } diff --git a/compiler/testData/codegen/regressions/kt715.kt b/compiler/testData/codegen/regressions/kt715.kt index d1ebe049154..9c65d8b9698 100644 --- a/compiler/testData/codegen/regressions/kt715.kt +++ b/compiler/testData/codegen/regressions/kt715.kt @@ -2,7 +2,10 @@ import std.* val test = "lala".javaClass +val test2 = javaClass> () + fun box(): String { if(test.getCanonicalName() != "java.lang.String") return "fail" + if(test2.getCanonicalName() != "jet.Iterator") return "fail" return "OK" } \ No newline at end of file diff --git a/stdlib/ktSrc/JavaLang.kt b/stdlib/ktSrc/JavaLang.kt index c9f7392ec61..d19ead76817 100644 --- a/stdlib/ktSrc/JavaLang.kt +++ b/stdlib/ktSrc/JavaLang.kt @@ -5,7 +5,7 @@ import java.lang.Object import jet.runtime.Intrinsic -val T.javaClass : Class +val T.javaClass : Class [Intrinsic("std.javaClass.property")] get() = (this as java.lang.Object).getClass() as Class -[Intrinsic("std.javaClass.function")] fun javaClass() : Class = null as Class +[Intrinsic("std.javaClass.function")] fun javaClass() : Class = null as Class