001 package org.jetbrains.jet.lang.resolve.calls;
002
003 import com.intellij.psi.PsiElement;
004 import org.jetbrains.annotations.NotNull;
005 import org.jetbrains.jet.lang.descriptors.CallableDescriptor;
006 import org.jetbrains.jet.lang.descriptors.TypeParameterDescriptor;
007 import org.jetbrains.jet.lang.diagnostics.Errors;
008 import org.jetbrains.jet.lang.psi.JetExpression;
009 import org.jetbrains.jet.lang.resolve.calls.context.BasicCallResolutionContext;
010 import org.jetbrains.jet.lang.resolve.calls.results.OverloadResolutionResultsImpl;
011 import org.jetbrains.jet.lang.types.JetType;
012
013 import java.util.Map;
014
015 public class TypeParameterAsReifiedCheck implements CallResolverExtension {
016 @Override
017 public <F extends CallableDescriptor> void run(
018 @NotNull OverloadResolutionResultsImpl<F> results, @NotNull BasicCallResolutionContext context
019 ) {
020 if (results.isSuccess()) {
021 Map<TypeParameterDescriptor, JetType> typeArguments = results.getResultingCall().getTypeArguments();
022 for (Map.Entry<TypeParameterDescriptor, JetType> entry : typeArguments.entrySet()) {
023 TypeParameterDescriptor parameter = entry.getKey();
024 JetType argument = entry.getValue();
025
026 if (parameter.isReified() && argument.getConstructor().getDeclarationDescriptor() instanceof TypeParameterDescriptor) {
027 JetExpression callee = context.call.getCalleeExpression();
028 PsiElement element = callee != null ? callee : context.call.getCallElement();
029 context.trace.report(Errors.TYPE_PARAMETER_AS_REIFIED.on(element, typeArguments.keySet().iterator().next()));
030 }
031 }
032 }
033 }
034 }