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    }