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 }