diff --git a/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForJavaDescriptorResolver.java b/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForJavaDescriptorResolver.java index 56a96d02eca..f4c64524a09 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForJavaDescriptorResolver.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForJavaDescriptorResolver.java @@ -19,6 +19,7 @@ package org.jetbrains.jet.di; import com.intellij.openapi.project.Project; import org.jetbrains.jet.lang.resolve.BindingTrace; import org.jetbrains.jet.lang.resolve.java.JavaClassFinderImpl; +import org.jetbrains.jet.lang.resolve.java.resolver.TraceBasedExternalSignatureResolver; import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver; import org.jetbrains.jet.lang.resolve.java.PsiClassFinderImpl; import org.jetbrains.jet.lang.resolve.java.vfilefinder.VirtualFileFinder; @@ -26,7 +27,6 @@ import org.jetbrains.jet.lang.resolve.java.resolver.JavaClassResolver; import org.jetbrains.jet.lang.resolve.java.resolver.JavaAnnotationResolver; import org.jetbrains.jet.lang.resolve.java.resolver.JavaAnnotationArgumentResolver; import org.jetbrains.jet.lang.resolve.java.resolver.JavaFunctionResolver; -import org.jetbrains.jet.lang.resolve.java.resolver.ExternalSignatureResolver; import org.jetbrains.jet.lang.resolve.java.resolver.JavaTypeParameterResolver; import org.jetbrains.jet.lang.resolve.java.resolver.JavaTypeTransformer; import org.jetbrains.jet.lang.resolve.java.resolver.JavaValueParameterResolver; @@ -45,6 +45,7 @@ public class InjectorForJavaDescriptorResolver { private final Project project; private final BindingTrace bindingTrace; private final JavaClassFinderImpl javaClassFinder; + private final TraceBasedExternalSignatureResolver traceBasedExternalSignatureResolver; private final JavaDescriptorResolver javaDescriptorResolver; private final PsiClassFinderImpl psiClassFinder; private final VirtualFileFinder virtualFileFinder; @@ -52,7 +53,6 @@ public class InjectorForJavaDescriptorResolver { private final JavaAnnotationResolver javaAnnotationResolver; private final JavaAnnotationArgumentResolver javaAnnotationArgumentResolver; private final JavaFunctionResolver javaFunctionResolver; - private final ExternalSignatureResolver externalSignatureResolver; private final JavaTypeParameterResolver javaTypeParameterResolver; private final JavaTypeTransformer javaTypeTransformer; private final JavaValueParameterResolver javaValueParameterResolver; @@ -70,6 +70,7 @@ public class InjectorForJavaDescriptorResolver { this.project = project; this.bindingTrace = bindingTrace; this.javaClassFinder = new JavaClassFinderImpl(); + this.traceBasedExternalSignatureResolver = new TraceBasedExternalSignatureResolver(); this.javaDescriptorResolver = new JavaDescriptorResolver(); this.psiClassFinder = new PsiClassFinderImpl(); this.virtualFileFinder = com.intellij.openapi.components.ServiceManager.getService(project, VirtualFileFinder.class); @@ -77,7 +78,6 @@ public class InjectorForJavaDescriptorResolver { this.javaAnnotationResolver = new JavaAnnotationResolver(); this.javaAnnotationArgumentResolver = new JavaAnnotationArgumentResolver(); this.javaFunctionResolver = new JavaFunctionResolver(); - this.externalSignatureResolver = new ExternalSignatureResolver(); this.javaTypeParameterResolver = new JavaTypeParameterResolver(); this.javaTypeTransformer = new JavaTypeTransformer(); this.javaValueParameterResolver = new JavaValueParameterResolver(); @@ -90,6 +90,8 @@ public class InjectorForJavaDescriptorResolver { javaClassFinder.setPsiClassFinder(psiClassFinder); + traceBasedExternalSignatureResolver.setTrace(bindingTrace); + this.javaDescriptorResolver.setClassResolver(javaClassResolver); this.javaDescriptorResolver.setConstructorResolver(javaConstructorResolver); this.javaDescriptorResolver.setFunctionResolver(javaFunctionResolver); @@ -116,14 +118,12 @@ public class InjectorForJavaDescriptorResolver { javaAnnotationArgumentResolver.setClassResolver(javaClassResolver); javaFunctionResolver.setAnnotationResolver(javaAnnotationResolver); - javaFunctionResolver.setExternalSignatureResolver(externalSignatureResolver); + javaFunctionResolver.setExternalSignatureResolver(traceBasedExternalSignatureResolver); javaFunctionResolver.setTrace(bindingTrace); javaFunctionResolver.setTypeParameterResolver(javaTypeParameterResolver); javaFunctionResolver.setTypeTransformer(javaTypeTransformer); javaFunctionResolver.setValueParameterResolver(javaValueParameterResolver); - externalSignatureResolver.setTrace(bindingTrace); - javaTypeParameterResolver.setTypeTransformer(javaTypeTransformer); javaTypeTransformer.setClassResolver(javaClassResolver); @@ -148,13 +148,13 @@ public class InjectorForJavaDescriptorResolver { javaSupertypeResolver.setTrace(bindingTrace); javaSupertypeResolver.setTypeTransformer(javaTypeTransformer); - javaConstructorResolver.setExternalSignatureResolver(externalSignatureResolver); + javaConstructorResolver.setExternalSignatureResolver(traceBasedExternalSignatureResolver); javaConstructorResolver.setTrace(bindingTrace); javaConstructorResolver.setTypeTransformer(javaTypeTransformer); javaConstructorResolver.setValueParameterResolver(javaValueParameterResolver); javaPropertyResolver.setAnnotationResolver(javaAnnotationResolver); - javaPropertyResolver.setExternalSignatureResolver(externalSignatureResolver); + javaPropertyResolver.setExternalSignatureResolver(traceBasedExternalSignatureResolver); javaPropertyResolver.setTrace(bindingTrace); javaPropertyResolver.setTypeTransformer(javaTypeTransformer); diff --git a/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerForJvm.java b/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerForJvm.java index 475347a7449..7b357d85d01 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerForJvm.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerForJvm.java @@ -31,6 +31,7 @@ import org.jetbrains.jet.lang.resolve.java.JavaBridgeConfiguration; import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver; import org.jetbrains.jet.lang.resolve.java.PsiClassFinderImpl; import org.jetbrains.jet.lang.resolve.java.JavaClassFinderImpl; +import org.jetbrains.jet.lang.resolve.java.resolver.TraceBasedExternalSignatureResolver; import org.jetbrains.jet.lang.resolve.NamespaceFactoryImpl; import org.jetbrains.jet.lang.resolve.java.vfilefinder.VirtualFileFinder; import org.jetbrains.jet.lang.resolve.DeclarationResolver; @@ -53,7 +54,6 @@ import org.jetbrains.jet.lang.resolve.java.resolver.JavaClassResolver; import org.jetbrains.jet.lang.resolve.java.resolver.JavaAnnotationResolver; import org.jetbrains.jet.lang.resolve.java.resolver.JavaAnnotationArgumentResolver; import org.jetbrains.jet.lang.resolve.java.resolver.JavaFunctionResolver; -import org.jetbrains.jet.lang.resolve.java.resolver.ExternalSignatureResolver; import org.jetbrains.jet.lang.resolve.java.resolver.JavaTypeParameterResolver; import org.jetbrains.jet.lang.resolve.java.resolver.JavaTypeTransformer; import org.jetbrains.jet.lang.resolve.java.resolver.JavaValueParameterResolver; @@ -84,6 +84,7 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly private final JavaDescriptorResolver javaDescriptorResolver; private final PsiClassFinderImpl psiClassFinder; private final JavaClassFinderImpl javaClassFinder; + private final TraceBasedExternalSignatureResolver traceBasedExternalSignatureResolver; private final NamespaceFactoryImpl namespaceFactory; private final VirtualFileFinder virtualFileFinder; private final DeclarationResolver declarationResolver; @@ -106,7 +107,6 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly private final JavaAnnotationResolver javaAnnotationResolver; private final JavaAnnotationArgumentResolver javaAnnotationArgumentResolver; private final JavaFunctionResolver javaFunctionResolver; - private final ExternalSignatureResolver externalSignatureResolver; private final JavaTypeParameterResolver javaTypeParameterResolver; private final JavaTypeTransformer javaTypeTransformer; private final JavaValueParameterResolver javaValueParameterResolver; @@ -138,6 +138,7 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly this.javaDescriptorResolver = new JavaDescriptorResolver(); this.psiClassFinder = new PsiClassFinderImpl(); this.javaClassFinder = new JavaClassFinderImpl(); + this.traceBasedExternalSignatureResolver = new TraceBasedExternalSignatureResolver(); this.namespaceFactory = new NamespaceFactoryImpl(); this.virtualFileFinder = com.intellij.openapi.components.ServiceManager.getService(project, VirtualFileFinder.class); this.declarationResolver = new DeclarationResolver(); @@ -160,7 +161,6 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly this.javaAnnotationResolver = new JavaAnnotationResolver(); this.javaAnnotationArgumentResolver = new JavaAnnotationArgumentResolver(); this.javaFunctionResolver = new JavaFunctionResolver(); - this.externalSignatureResolver = new ExternalSignatureResolver(); this.javaTypeParameterResolver = new JavaTypeParameterResolver(); this.javaTypeTransformer = new JavaTypeTransformer(); this.javaValueParameterResolver = new JavaValueParameterResolver(); @@ -216,6 +216,8 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly javaClassFinder.setPsiClassFinder(psiClassFinder); + traceBasedExternalSignatureResolver.setTrace(bindingTrace); + this.namespaceFactory.setModuleDescriptor(moduleDescriptor); this.namespaceFactory.setTrace(bindingTrace); @@ -303,14 +305,12 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly javaAnnotationArgumentResolver.setClassResolver(javaClassResolver); javaFunctionResolver.setAnnotationResolver(javaAnnotationResolver); - javaFunctionResolver.setExternalSignatureResolver(externalSignatureResolver); + javaFunctionResolver.setExternalSignatureResolver(traceBasedExternalSignatureResolver); javaFunctionResolver.setTrace(bindingTrace); javaFunctionResolver.setTypeParameterResolver(javaTypeParameterResolver); javaFunctionResolver.setTypeTransformer(javaTypeTransformer); javaFunctionResolver.setValueParameterResolver(javaValueParameterResolver); - externalSignatureResolver.setTrace(bindingTrace); - javaTypeParameterResolver.setTypeTransformer(javaTypeTransformer); javaTypeTransformer.setClassResolver(javaClassResolver); @@ -335,13 +335,13 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly javaSupertypeResolver.setTrace(bindingTrace); javaSupertypeResolver.setTypeTransformer(javaTypeTransformer); - javaConstructorResolver.setExternalSignatureResolver(externalSignatureResolver); + javaConstructorResolver.setExternalSignatureResolver(traceBasedExternalSignatureResolver); javaConstructorResolver.setTrace(bindingTrace); javaConstructorResolver.setTypeTransformer(javaTypeTransformer); javaConstructorResolver.setValueParameterResolver(javaValueParameterResolver); javaPropertyResolver.setAnnotationResolver(javaAnnotationResolver); - javaPropertyResolver.setExternalSignatureResolver(externalSignatureResolver); + javaPropertyResolver.setExternalSignatureResolver(traceBasedExternalSignatureResolver); javaPropertyResolver.setTrace(bindingTrace); javaPropertyResolver.setTypeTransformer(javaTypeTransformer); diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/ExternalSignatureResolver.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/ExternalSignatureResolver.java index 8f7ef582aae..ae628c2db21 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/ExternalSignatureResolver.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/ExternalSignatureResolver.java @@ -19,28 +19,15 @@ package org.jetbrains.jet.lang.resolve.java.resolver; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.*; -import org.jetbrains.jet.lang.resolve.BindingTrace; -import org.jetbrains.jet.lang.resolve.java.JavaBindingContext; -import org.jetbrains.jet.lang.resolve.java.kotlinSignature.AlternativeFieldSignatureData; -import org.jetbrains.jet.lang.resolve.java.kotlinSignature.AlternativeMethodSignatureData; -import org.jetbrains.jet.lang.resolve.java.kotlinSignature.SignaturesPropagationData; import org.jetbrains.jet.lang.resolve.java.structure.JavaField; import org.jetbrains.jet.lang.resolve.java.structure.JavaMethod; import org.jetbrains.jet.lang.types.JetType; -import javax.inject.Inject; import java.util.Collections; import java.util.List; -public class ExternalSignatureResolver { - private BindingTrace trace; - - @Inject - public void setTrace(BindingTrace trace) { - this.trace = trace; - } - - private abstract static class MemberSignature { +public interface ExternalSignatureResolver { + abstract class MemberSignature { private final List signatureErrors; protected MemberSignature(@NotNull List signatureErrors) { @@ -53,7 +40,7 @@ public class ExternalSignatureResolver { } } - public static class AlternativeMethodSignature extends MemberSignature { + class AlternativeMethodSignature extends MemberSignature { private final JetType returnType; private final JetType receiverType; private final List valueParameters; @@ -94,7 +81,7 @@ public class ExternalSignatureResolver { } } - public static class AlternativeFieldSignature extends MemberSignature { + class AlternativeFieldSignature extends MemberSignature { private final JetType returnType; public AlternativeFieldSignature(@NotNull JetType returnType, @Nullable String signatureError) { @@ -108,7 +95,7 @@ public class ExternalSignatureResolver { } } - public static class PropagatedMethodSignature extends AlternativeMethodSignature { + class PropagatedMethodSignature extends AlternativeMethodSignature { private final List superMethods; public PropagatedMethodSignature( @@ -130,61 +117,31 @@ public class ExternalSignatureResolver { } @NotNull - public PropagatedMethodSignature resolvePropagatedSignature( + PropagatedMethodSignature resolvePropagatedSignature( @NotNull JavaMethod method, @NotNull ClassDescriptor owner, @NotNull JetType returnType, @Nullable JetType receiverType, @NotNull List valueParameters, @NotNull List typeParameters - ) { - SignaturesPropagationData data = - new SignaturesPropagationData(owner, returnType, receiverType, valueParameters, typeParameters, method, trace); - return new PropagatedMethodSignature(data.getModifiedReturnType(), data.getModifiedReceiverType(), - data.getModifiedValueParameters(), data.getModifiedTypeParameters(), data.getSignatureErrors(), - data.getSuperFunctions()); - } + ); - @SuppressWarnings("MethodMayBeStatic") @NotNull - public AlternativeMethodSignature resolveAlternativeMethodSignature( + AlternativeMethodSignature resolveAlternativeMethodSignature( @NotNull JavaMethod method, boolean hasSuperMethods, @Nullable JetType returnType, @Nullable JetType receiverType, @NotNull List valueParameters, @NotNull List typeParameters - ) { - AlternativeMethodSignatureData data = - new AlternativeMethodSignatureData(method, receiverType, valueParameters, returnType, typeParameters, hasSuperMethods); + ); - if (data.isAnnotated() && !data.hasErrors()) { - return new AlternativeMethodSignature(data.getReturnType(), receiverType, data.getValueParameters(), data.getTypeParameters(), - Collections.emptyList()); - } - - List error = data.hasErrors() ? Collections.singletonList(data.getError()) : Collections.emptyList(); - return new AlternativeMethodSignature(returnType, receiverType, valueParameters, typeParameters, error); - } - - @SuppressWarnings("MethodMayBeStatic") @NotNull - public AlternativeFieldSignature resolveAlternativeFieldSignature( + AlternativeFieldSignature resolveAlternativeFieldSignature( @NotNull JavaField field, @NotNull JetType returnType, boolean isVar - ) { - AlternativeFieldSignatureData data = new AlternativeFieldSignatureData(field, returnType, isVar); + ); - if (data.isAnnotated() && !data.hasErrors()) { - return new AlternativeFieldSignature(data.getReturnType(), null); - } - - String error = data.hasErrors() ? data.getError() : null; - return new AlternativeFieldSignature(returnType, error); - } - - public void reportSignatureErrors(@NotNull CallableMemberDescriptor descriptor, @NotNull List signatureErrors) { - trace.record(JavaBindingContext.LOAD_FROM_JAVA_SIGNATURE_ERRORS, descriptor, signatureErrors); - } + void reportSignatureErrors(@NotNull CallableMemberDescriptor descriptor, @NotNull List signatureErrors); } diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/TraceBasedExternalSignatureResolver.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/TraceBasedExternalSignatureResolver.java new file mode 100644 index 00000000000..eb82102a7fc --- /dev/null +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/TraceBasedExternalSignatureResolver.java @@ -0,0 +1,103 @@ +/* + * Copyright 2010-2013 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.jet.lang.resolve.java.resolver; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.jet.lang.descriptors.*; +import org.jetbrains.jet.lang.resolve.BindingTrace; +import org.jetbrains.jet.lang.resolve.java.JavaBindingContext; +import org.jetbrains.jet.lang.resolve.java.kotlinSignature.AlternativeFieldSignatureData; +import org.jetbrains.jet.lang.resolve.java.kotlinSignature.AlternativeMethodSignatureData; +import org.jetbrains.jet.lang.resolve.java.kotlinSignature.SignaturesPropagationData; +import org.jetbrains.jet.lang.resolve.java.structure.JavaField; +import org.jetbrains.jet.lang.resolve.java.structure.JavaMethod; +import org.jetbrains.jet.lang.types.JetType; + +import javax.inject.Inject; +import java.util.Collections; +import java.util.List; + +public class TraceBasedExternalSignatureResolver implements ExternalSignatureResolver { + private BindingTrace trace; + + @Inject + public void setTrace(BindingTrace trace) { + this.trace = trace; + } + + @Override + @NotNull + public PropagatedMethodSignature resolvePropagatedSignature( + @NotNull JavaMethod method, + @NotNull ClassDescriptor owner, + @NotNull JetType returnType, + @Nullable JetType receiverType, + @NotNull List valueParameters, + @NotNull List typeParameters + ) { + SignaturesPropagationData data = + new SignaturesPropagationData(owner, returnType, receiverType, valueParameters, typeParameters, method, trace); + return new PropagatedMethodSignature(data.getModifiedReturnType(), data.getModifiedReceiverType(), + data.getModifiedValueParameters(), data.getModifiedTypeParameters(), data.getSignatureErrors(), + data.getSuperFunctions()); + } + + @Override + @NotNull + public AlternativeMethodSignature resolveAlternativeMethodSignature( + @NotNull JavaMethod method, + boolean hasSuperMethods, + @Nullable JetType returnType, + @Nullable JetType receiverType, + @NotNull List valueParameters, + @NotNull List typeParameters + ) { + AlternativeMethodSignatureData data = + new AlternativeMethodSignatureData(method, receiverType, valueParameters, returnType, typeParameters, hasSuperMethods); + + if (data.isAnnotated() && !data.hasErrors()) { + return new AlternativeMethodSignature(data.getReturnType(), receiverType, data.getValueParameters(), data.getTypeParameters(), + Collections.emptyList()); + } + + List error = data.hasErrors() ? Collections.singletonList(data.getError()) : Collections.emptyList(); + return new AlternativeMethodSignature(returnType, receiverType, valueParameters, typeParameters, error); + } + + @Override + @NotNull + public AlternativeFieldSignature resolveAlternativeFieldSignature( + @NotNull JavaField field, + @NotNull JetType returnType, + boolean isVar + ) { + AlternativeFieldSignatureData data = new AlternativeFieldSignatureData(field, returnType, isVar); + + if (data.isAnnotated() && !data.hasErrors()) { + return new AlternativeFieldSignature(data.getReturnType(), null); + } + + String error = data.hasErrors() ? data.getError() : null; + return new AlternativeFieldSignature(returnType, error); + } + + @Override + public void reportSignatureErrors(@NotNull CallableMemberDescriptor descriptor, @NotNull List signatureErrors) { + trace.record(JavaBindingContext.LOAD_FROM_JAVA_SIGNATURE_ERRORS, descriptor, signatureErrors); + } +} diff --git a/generators/org/jetbrains/jet/generators/injectors/GenerateInjectors.java b/generators/org/jetbrains/jet/generators/injectors/GenerateInjectors.java index 9a799c62210..6a8fefd997c 100644 --- a/generators/org/jetbrains/jet/generators/injectors/GenerateInjectors.java +++ b/generators/org/jetbrains/jet/generators/injectors/GenerateInjectors.java @@ -37,6 +37,7 @@ import org.jetbrains.jet.lang.resolve.java.JavaBridgeConfiguration; import org.jetbrains.jet.lang.resolve.java.JavaClassFinderImpl; import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver; import org.jetbrains.jet.lang.resolve.java.PsiClassFinderImpl; +import org.jetbrains.jet.lang.resolve.java.resolver.TraceBasedExternalSignatureResolver; import org.jetbrains.jet.lang.resolve.java.vfilefinder.VirtualFileFinder; import org.jetbrains.jet.lang.resolve.lazy.ResolveSession; import org.jetbrains.jet.lang.resolve.lazy.ScopeProvider; @@ -105,6 +106,7 @@ public class GenerateInjectors { generator.addField(JavaDescriptorResolver.class); generator.addField(PsiClassFinderImpl.class); generator.addField(JavaClassFinderImpl.class); + generator.addField(TraceBasedExternalSignatureResolver.class); generator.addPublicField(NamespaceFactoryImpl.class); generator.addField(false, VirtualFileFinder.class, "virtualFileFinder", new GivenExpression( @@ -122,6 +124,7 @@ public class GenerateInjectors { // Fields generator.addField(JavaClassFinderImpl.class); + generator.addField(TraceBasedExternalSignatureResolver.class); generator.addPublicField(JavaDescriptorResolver.class); generator.addPublicField(PsiClassFinderImpl.class); generator.addField(false, VirtualFileFinder.class, "virtualFileFinder",