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.JavaDescriptorResolverKt; 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.KotlinType; 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 Project project; 044 045 public TraceBasedExternalSignatureResolver( 046 @NotNull Project project, 047 @NotNull BindingTrace trace 048 ) { 049 this.project = project; 050 this.trace = trace; 051 } 052 053 @Override 054 @NotNull 055 public PropagatedMethodSignature resolvePropagatedSignature( 056 @NotNull JavaMethod method, 057 @NotNull ClassDescriptor owner, 058 @NotNull KotlinType returnType, 059 @Nullable KotlinType receiverType, 060 @NotNull List<ValueParameterDescriptor> valueParameters, 061 @NotNull List<TypeParameterDescriptor> typeParameters 062 ) { 063 SignaturesPropagationData data = 064 new SignaturesPropagationData(owner, returnType, receiverType, valueParameters, typeParameters, method); 065 return new PropagatedMethodSignature(data.getModifiedReturnType(), data.getModifiedReceiverType(), 066 data.getModifiedValueParameters(), data.getModifiedTypeParameters(), data.getSignatureErrors(), 067 data.getModifiedHasStableParameterNames(), data.getSuperFunctions()); 068 } 069 070 @Override 071 @NotNull 072 public AlternativeMethodSignature resolveAlternativeMethodSignature( 073 @NotNull JavaMember methodOrConstructor, 074 boolean hasSuperMethods, 075 @Nullable KotlinType returnType, 076 @Nullable KotlinType receiverType, 077 @NotNull List<ValueParameterDescriptor> valueParameters, 078 @NotNull List<TypeParameterDescriptor> typeParameters, 079 boolean hasStableParameterNames 080 ) { 081 assert methodOrConstructor instanceof JavaMethod || methodOrConstructor instanceof JavaConstructor : 082 "Not a method or a constructor: " + methodOrConstructor.getName(); 083 084 AlternativeMethodSignatureData data = new AlternativeMethodSignatureData( 085 methodOrConstructor, receiverType, project, valueParameters, returnType, typeParameters, hasSuperMethods 086 ); 087 088 if (data.isAnnotated() && !data.hasErrors()) { 089 if (JavaDescriptorResolverKt.getPLATFORM_TYPES()) { 090 return new AlternativeMethodSignature(returnType, receiverType, valueParameters, 091 typeParameters, Collections.<String>emptyList(), hasStableParameterNames); 092 } 093 return new AlternativeMethodSignature(data.getReturnType(), receiverType, data.getValueParameters(), data.getTypeParameters(), 094 Collections.<String>emptyList(), true); 095 } 096 097 List<String> error = data.hasErrors() ? Collections.singletonList(data.getError()) : Collections.<String>emptyList(); 098 return new AlternativeMethodSignature(returnType, receiverType, valueParameters, typeParameters, error, hasStableParameterNames); 099 } 100 101 @Override 102 @NotNull 103 public AlternativeFieldSignature resolveAlternativeFieldSignature( 104 @NotNull JavaField field, 105 @NotNull KotlinType returnType, 106 boolean isVar 107 ) { 108 AlternativeFieldSignatureData data = new AlternativeFieldSignatureData(field, returnType, project, isVar); 109 110 if (data.isAnnotated() && !data.hasErrors()) { 111 if (JavaDescriptorResolverKt.getPLATFORM_TYPES()) { 112 return new AlternativeFieldSignature(returnType, null); 113 } 114 return new AlternativeFieldSignature(data.getReturnType(), null); 115 } 116 117 String error = data.hasErrors() ? data.getError() : null; 118 return new AlternativeFieldSignature(returnType, error); 119 } 120 121 @Override 122 public void reportSignatureErrors(@NotNull CallableMemberDescriptor descriptor, @NotNull List<String> signatureErrors) { 123 trace.record(JavaBindingContext.LOAD_FROM_JAVA_SIGNATURE_ERRORS, descriptor.getOriginal(), signatureErrors); 124 } 125 }