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 javax.inject.Inject; 039 import java.util.Collections; 040 import java.util.List; 041 042 public class TraceBasedExternalSignatureResolver implements ExternalSignatureResolver { 043 private BindingTrace trace; 044 private ExternalAnnotationResolver externalAnnotationResolver; 045 private Project project; 046 047 @Inject 048 public void setTrace(BindingTrace trace) { 049 this.trace = trace; 050 } 051 052 @Inject 053 public void setExternalAnnotationResolver(ExternalAnnotationResolver externalAnnotationResolver) { 054 this.externalAnnotationResolver = externalAnnotationResolver; 055 } 056 057 @Inject 058 public void setProject(Project project) { 059 this.project = project; 060 } 061 062 @Override 063 @NotNull 064 public PropagatedMethodSignature resolvePropagatedSignature( 065 @NotNull JavaMethod method, 066 @NotNull ClassDescriptor owner, 067 @NotNull JetType returnType, 068 @Nullable JetType receiverType, 069 @NotNull List<ValueParameterDescriptor> valueParameters, 070 @NotNull List<TypeParameterDescriptor> typeParameters 071 ) { 072 SignaturesPropagationData data = 073 new SignaturesPropagationData(owner, returnType, receiverType, valueParameters, typeParameters, method); 074 return new PropagatedMethodSignature(data.getModifiedReturnType(), data.getModifiedReceiverType(), 075 data.getModifiedValueParameters(), data.getModifiedTypeParameters(), data.getSignatureErrors(), 076 data.getModifiedHasStableParameterNames(), data.getSuperFunctions()); 077 } 078 079 @Override 080 @NotNull 081 public AlternativeMethodSignature resolveAlternativeMethodSignature( 082 @NotNull JavaMember methodOrConstructor, 083 boolean hasSuperMethods, 084 @Nullable JetType returnType, 085 @Nullable JetType receiverType, 086 @NotNull List<ValueParameterDescriptor> valueParameters, 087 @NotNull List<TypeParameterDescriptor> typeParameters, 088 boolean hasStableParameterNames 089 ) { 090 assert methodOrConstructor instanceof JavaMethod || methodOrConstructor instanceof JavaConstructor : 091 "Not a method or a constructor: " + methodOrConstructor.getName(); 092 093 AlternativeMethodSignatureData data = 094 new AlternativeMethodSignatureData(externalAnnotationResolver, methodOrConstructor, receiverType, project, valueParameters, 095 returnType, typeParameters, hasSuperMethods); 096 097 if (data.isAnnotated() && !data.hasErrors()) { 098 if (JvmPackage.getPLATFORM_TYPES()) { 099 // We only take parameter names from the @KotlinSignature 100 return new AlternativeMethodSignature(returnType, receiverType, 101 AlternativeMethodSignatureData.updateNames(valueParameters, data.getValueParameters()), 102 typeParameters, Collections.<String>emptyList(), true); 103 } 104 return new AlternativeMethodSignature(data.getReturnType(), receiverType, data.getValueParameters(), data.getTypeParameters(), 105 Collections.<String>emptyList(), true); 106 } 107 108 List<String> error = data.hasErrors() ? Collections.singletonList(data.getError()) : Collections.<String>emptyList(); 109 return new AlternativeMethodSignature(returnType, receiverType, valueParameters, typeParameters, error, hasStableParameterNames); 110 } 111 112 @Override 113 @NotNull 114 public AlternativeFieldSignature resolveAlternativeFieldSignature( 115 @NotNull JavaField field, 116 @NotNull JetType returnType, 117 boolean isVar 118 ) { 119 AlternativeFieldSignatureData data = 120 new AlternativeFieldSignatureData(externalAnnotationResolver, field, returnType, project, isVar); 121 122 if (data.isAnnotated() && !data.hasErrors()) { 123 if (JvmPackage.getPLATFORM_TYPES()) { 124 return new AlternativeFieldSignature(returnType, null); 125 } 126 return new AlternativeFieldSignature(data.getReturnType(), null); 127 } 128 129 String error = data.hasErrors() ? data.getError() : null; 130 return new AlternativeFieldSignature(returnType, error); 131 } 132 133 @Override 134 public void reportSignatureErrors(@NotNull CallableMemberDescriptor descriptor, @NotNull List<String> signatureErrors) { 135 trace.record(JavaBindingContext.LOAD_FROM_JAVA_SIGNATURE_ERRORS, descriptor, signatureErrors); 136 } 137 }