intrinsics methods are only callables

This commit is contained in:
Stepan Koltsov
2012-06-17 03:53:10 +04:00
parent 49178e6cff
commit b9c8637b47
3 changed files with 14 additions and 4 deletions
@@ -1015,7 +1015,10 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> {
// descriptor = ((VariableAsFunctionDescriptor) descriptor).getVariableDescriptor(); // descriptor = ((VariableAsFunctionDescriptor) descriptor).getVariableDescriptor();
//} //}
final IntrinsicMethod intrinsic = state.getInjector().getIntrinsics().getIntrinsic(descriptor); IntrinsicMethod intrinsic = null;
if (descriptor instanceof CallableMemberDescriptor) {
intrinsic = state.getInjector().getIntrinsics().getIntrinsic((CallableMemberDescriptor) descriptor);
}
if (intrinsic != null) { if (intrinsic != null) {
final Type expectedType = expressionType(expression); final Type expectedType = expressionType(expression);
return intrinsic.generate(this, v, expectedType, expression, Collections.<JetExpression>emptyList(), receiver, state); return intrinsic.generate(this, v, expectedType, expression, Collections.<JetExpression>emptyList(), receiver, state);
@@ -24,6 +24,8 @@ import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiMethod; import com.intellij.psi.PsiMethod;
import com.intellij.psi.search.DelegatingGlobalSearchScope; import com.intellij.psi.search.DelegatingGlobalSearchScope;
import com.intellij.psi.search.ProjectScope; import com.intellij.psi.search.ProjectScope;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor;
import org.jetbrains.jet.lang.resolve.java.JvmPrimitiveType; import org.jetbrains.jet.lang.resolve.java.JvmPrimitiveType;
@@ -72,7 +74,7 @@ public class IntrinsicMethods {
private Project myProject; private Project myProject;
private JetStandardLibrary myStdLib; private JetStandardLibrary myStdLib;
private final Map<DeclarationDescriptor, IntrinsicMethod> myMethods = new HashMap<DeclarationDescriptor, IntrinsicMethod>(); private final Map<CallableMemberDescriptor, IntrinsicMethod> myMethods = new HashMap<CallableMemberDescriptor, IntrinsicMethod>();
private final Map<String, IntrinsicMethod> namedMethods = new HashMap<String, IntrinsicMethod>(); private final Map<String, IntrinsicMethod> namedMethods = new HashMap<String, IntrinsicMethod>();
private static final IntrinsicMethod ARRAY_ITERATOR = new ArrayIterator(); private static final IntrinsicMethod ARRAY_ITERATOR = new ArrayIterator();
@@ -223,7 +225,7 @@ public class IntrinsicMethods {
final JetScope numberScope = getClassMemberScope(className); final JetScope numberScope = getClassMemberScope(className);
Collection<VariableDescriptor> properties = numberScope.getProperties(methodName); Collection<VariableDescriptor> properties = numberScope.getProperties(methodName);
assert properties.size() == 1; assert properties.size() == 1;
final VariableDescriptor property = properties.iterator().next(); final PropertyDescriptor property = (PropertyDescriptor) properties.iterator().next();
myMethods.put(property.getOriginal(), implementation); myMethods.put(property.getOriginal(), implementation);
} }
@@ -269,7 +271,8 @@ public class IntrinsicMethods {
return null; return null;
} }
public IntrinsicMethod getIntrinsic(DeclarationDescriptor descriptor) { @Nullable
public IntrinsicMethod getIntrinsic(@NotNull CallableMemberDescriptor descriptor) {
IntrinsicMethod intrinsicMethod = myMethods.get(descriptor.getOriginal()); IntrinsicMethod intrinsicMethod = myMethods.get(descriptor.getOriginal());
if (intrinsicMethod == null) { if (intrinsicMethod == null) {
List<AnnotationDescriptor> annotations = descriptor.getAnnotations(); List<AnnotationDescriptor> annotations = descriptor.getAnnotations();
@@ -28,6 +28,10 @@ public interface CallableMemberDescriptor extends CallableDescriptor, MemberDesc
@Override @Override
Set<? extends CallableMemberDescriptor> getOverriddenDescriptors(); Set<? extends CallableMemberDescriptor> getOverriddenDescriptors();
@NotNull
@Override
CallableMemberDescriptor getOriginal();
void addOverriddenDescriptor(@NotNull CallableMemberDescriptor overridden); void addOverriddenDescriptor(@NotNull CallableMemberDescriptor overridden);
enum Kind { enum Kind {