001 /* 002 * Copyright 2010-2015 JetBrains s.r.o. 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 017 package org.jetbrains.kotlin.load.java.components; 018 019 import com.intellij.openapi.project.Project; 020 import org.jetbrains.annotations.NotNull; 021 import org.jetbrains.annotations.Nullable; 022 import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor; 023 import org.jetbrains.kotlin.descriptors.ClassDescriptor; 024 import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor; 025 import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor; 026 import org.jetbrains.kotlin.load.java.JavaBindingContext; 027 import org.jetbrains.kotlin.load.java.structure.JavaConstructor; 028 import org.jetbrains.kotlin.load.java.structure.JavaField; 029 import org.jetbrains.kotlin.load.java.structure.JavaMember; 030 import org.jetbrains.kotlin.load.java.structure.JavaMethod; 031 import org.jetbrains.kotlin.resolve.BindingTrace; 032 import org.jetbrains.kotlin.resolve.jvm.JvmPackage; 033 import org.jetbrains.kotlin.resolve.jvm.kotlinSignature.AlternativeFieldSignatureData; 034 import org.jetbrains.kotlin.resolve.jvm.kotlinSignature.AlternativeMethodSignatureData; 035 import org.jetbrains.kotlin.resolve.jvm.kotlinSignature.SignaturesPropagationData; 036 import org.jetbrains.kotlin.types.JetType; 037 038 import java.util.Collections; 039 import java.util.List; 040 041 public class TraceBasedExternalSignatureResolver implements ExternalSignatureResolver { 042 @NotNull private final BindingTrace trace; 043 @NotNull private final ExternalAnnotationResolver externalAnnotationResolver; 044 @NotNull private final Project project; 045 046 public TraceBasedExternalSignatureResolver( 047 @NotNull ExternalAnnotationResolver externalAnnotationResolver, 048 @NotNull Project project, 049 @NotNull BindingTrace trace 050 ) { 051 this.externalAnnotationResolver = externalAnnotationResolver; 052 this.project = project; 053 this.trace = trace; 054 } 055 056 @Override 057 @NotNull 058 public PropagatedMethodSignature resolvePropagatedSignature( 059 @NotNull JavaMethod method, 060 @NotNull ClassDescriptor owner, 061 @NotNull JetType returnType, 062 @Nullable JetType receiverType, 063 @NotNull List<ValueParameterDescriptor> valueParameters, 064 @NotNull List<TypeParameterDescriptor> typeParameters 065 ) { 066 SignaturesPropagationData data = 067 new SignaturesPropagationData(owner, returnType, receiverType, valueParameters, typeParameters, method); 068 return new PropagatedMethodSignature(data.getModifiedReturnType(), data.getModifiedReceiverType(), 069 data.getModifiedValueParameters(), data.getModifiedTypeParameters(), data.getSignatureErrors(), 070 data.getModifiedHasStableParameterNames(), data.getSuperFunctions()); 071 } 072 073 @Override 074 @NotNull 075 public AlternativeMethodSignature resolveAlternativeMethodSignature( 076 @NotNull JavaMember methodOrConstructor, 077 boolean hasSuperMethods, 078 @Nullable JetType returnType, 079 @Nullable JetType receiverType, 080 @NotNull List<ValueParameterDescriptor> valueParameters, 081 @NotNull List<TypeParameterDescriptor> typeParameters, 082 boolean hasStableParameterNames 083 ) { 084 assert methodOrConstructor instanceof JavaMethod || methodOrConstructor instanceof JavaConstructor : 085 "Not a method or a constructor: " + methodOrConstructor.getName(); 086 087 AlternativeMethodSignatureData data = 088 new AlternativeMethodSignatureData(externalAnnotationResolver, methodOrConstructor, receiverType, project, valueParameters, 089 returnType, typeParameters, hasSuperMethods); 090 091 if (data.isAnnotated() && !data.hasErrors()) { 092 if (JvmPackage.getPLATFORM_TYPES()) { 093 // We only take parameter names from the @KotlinSignature 094 return new AlternativeMethodSignature(returnType, receiverType, 095 AlternativeMethodSignatureData.updateNames(valueParameters, data.getValueParameters()), 096 typeParameters, Collections.<String>emptyList(), true); 097 } 098 return new AlternativeMethodSignature(data.getReturnType(), receiverType, data.getValueParameters(), data.getTypeParameters(), 099 Collections.<String>emptyList(), true); 100 } 101 102 List<String> error = data.hasErrors() ? Collections.singletonList(data.getError()) : Collections.<String>emptyList(); 103 return new AlternativeMethodSignature(returnType, receiverType, valueParameters, typeParameters, error, hasStableParameterNames); 104 } 105 106 @Override 107 @NotNull 108 public AlternativeFieldSignature resolveAlternativeFieldSignature( 109 @NotNull JavaField field, 110 @NotNull JetType returnType, 111 boolean isVar 112 ) { 113 AlternativeFieldSignatureData data = 114 new AlternativeFieldSignatureData(externalAnnotationResolver, field, returnType, project, isVar); 115 116 if (data.isAnnotated() && !data.hasErrors()) { 117 if (JvmPackage.getPLATFORM_TYPES()) { 118 return new AlternativeFieldSignature(returnType, null); 119 } 120 return new AlternativeFieldSignature(data.getReturnType(), null); 121 } 122 123 String error = data.hasErrors() ? data.getError() : null; 124 return new AlternativeFieldSignature(returnType, error); 125 } 126 127 @Override 128 public void reportSignatureErrors(@NotNull CallableMemberDescriptor descriptor, @NotNull List<String> signatureErrors) { 129 trace.record(JavaBindingContext.LOAD_FROM_JAVA_SIGNATURE_ERRORS, descriptor.getOriginal(), signatureErrors); 130 } 131 }