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.model.ResolvedCall;
011    import org.jetbrains.jet.lang.resolve.calls.results.OverloadResolutionResultsImpl;
012    import org.jetbrains.jet.lang.types.JetType;
013    
014    import java.util.Map;
015    
016    public class TypeParameterAsReifiedCheck implements CallResolverExtension {
017        @Override
018        public <F extends CallableDescriptor> void run(
019                @NotNull ResolvedCall<F> resolvedCall, @NotNull BasicCallResolutionContext context
020        ) {
021            Map<TypeParameterDescriptor, JetType> typeArguments = resolvedCall.getTypeArguments();
022            for (Map.Entry<TypeParameterDescriptor, JetType> entry : typeArguments.entrySet()) {
023                TypeParameterDescriptor parameter = entry.getKey();
024                JetType argument = entry.getValue();
025                if (parameter.isReified() && argument.getConstructor().getDeclarationDescriptor() instanceof TypeParameterDescriptor) {
026                    JetExpression callee = context.call.getCalleeExpression();
027                    PsiElement element = callee != null ? callee : context.call.getCallElement();
028                    context.trace.report(Errors.TYPE_PARAMETER_AS_REIFIED.on(element, typeArguments.keySet().iterator().next()));
029                }
030            }
031        }
032    }