From b8119a57ab769b8a11a19db01a6240b0a0119eee Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Mon, 31 Mar 2014 17:26:38 +0400 Subject: [PATCH] Script parameters supported in LAZY mode --- .../di/InjectorForLazyResolveWithJava.java | 12 ++++ .../di/InjectorForTopDownAnalyzerForJvm.java | 2 - .../jet/di/InjectorForLazyResolve.java | 15 +++++ .../di/InjectorForTopDownAnalyzerBasic.java | 2 - .../lazy/descriptors/LazyClassDescriptor.java | 6 +- .../descriptors/LazyClassMemberScope.java | 36 +++++++++--- ...ClassByQualifiedNameResolverDummyImpl.java | 5 ++ .../descriptors/ScriptDescriptorImpl.java | 55 +++++++++++++------ .../generators/injectors/GenerateInjectors.kt | 2 + .../di/InjectorForTopDownAnalyzerForJs.java | 2 - 10 files changed, 102 insertions(+), 35 deletions(-) diff --git a/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForLazyResolveWithJava.java b/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForLazyResolveWithJava.java index 91071988025..5e84e3f9d51 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForLazyResolveWithJava.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForLazyResolveWithJava.java @@ -50,6 +50,8 @@ import org.jetbrains.jet.lang.resolve.calls.CallResolverExtensionProvider; import org.jetbrains.jet.lang.resolve.calls.CandidateResolver; import org.jetbrains.jet.lang.psi.JetImportsFactory; import org.jetbrains.jet.lang.resolve.lazy.ScopeProvider; +import org.jetbrains.jet.lang.resolve.ScriptBodyResolver; +import org.jetbrains.jet.lang.resolve.ScriptParameterResolver; import org.jetbrains.jet.lang.resolve.java.lazy.LazyJavaPackageFragmentProvider; import org.jetbrains.jet.lang.resolve.java.lazy.GlobalJavaResolverContext; import org.jetbrains.jet.lang.resolve.kotlin.DeserializedDescriptorResolver; @@ -98,6 +100,8 @@ public class InjectorForLazyResolveWithJava { private final CandidateResolver candidateResolver; private final JetImportsFactory jetImportsFactory; private final ScopeProvider scopeProvider; + private final ScriptBodyResolver scriptBodyResolver; + private final ScriptParameterResolver scriptParameterResolver; private final LazyJavaPackageFragmentProvider lazyJavaPackageFragmentProvider; private final GlobalJavaResolverContext globalJavaResolverContext; private final DeserializedDescriptorResolver deserializedDescriptorResolver; @@ -149,6 +153,8 @@ public class InjectorForLazyResolveWithJava { this.candidateResolver = new CandidateResolver(); this.jetImportsFactory = new JetImportsFactory(); this.scopeProvider = new ScopeProvider(getResolveSession()); + this.scriptBodyResolver = new ScriptBodyResolver(); + this.scriptParameterResolver = new ScriptParameterResolver(); this.descriptorDeserializers = new DescriptorDeserializers(); this.annotationDescriptorDeserializer = new AnnotationDescriptorDeserializer(); this.descriptorDeserializersStorage = new DescriptorDeserializersStorage(lockBasedStorageManager); @@ -159,6 +165,8 @@ public class InjectorForLazyResolveWithJava { this.resolveSession.setJetImportFactory(jetImportsFactory); this.resolveSession.setQualifiedExpressionResolver(qualifiedExpressionResolver); this.resolveSession.setScopeProvider(scopeProvider); + this.resolveSession.setScriptBodyResolver(scriptBodyResolver); + this.resolveSession.setScriptParameterResolver(scriptParameterResolver); this.resolveSession.setTypeResolver(typeResolver); javaClassFinder.setProject(project); @@ -224,6 +232,10 @@ public class InjectorForLazyResolveWithJava { jetImportsFactory.setProject(project); + scriptBodyResolver.setExpressionTypingServices(expressionTypingServices); + + scriptParameterResolver.setDependencyClassByQualifiedNameResolver(javaDescriptorResolver); + deserializedDescriptorResolver.setDeserializers(descriptorDeserializers); deserializedDescriptorResolver.setErrorReporter(traceBasedErrorReporter); deserializedDescriptorResolver.setJavaDescriptorResolver(javaDescriptorResolver); 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 76694c8ec99..49cb7fb66da 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerForJvm.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerForJvm.java @@ -195,8 +195,6 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly this.topDownAnalyzer.setOverrideResolver(overrideResolver); this.topDownAnalyzer.setPackageFragmentProvider(mutablePackageFragmentProvider); this.topDownAnalyzer.setProject(project); - this.topDownAnalyzer.setScriptBodyResolver(scriptBodyResolver); - this.topDownAnalyzer.setScriptParameterResolver(scriptParameterResolver); this.topDownAnalyzer.setTrace(bindingTrace); this.topDownAnalyzer.setTypeHierarchyResolver(typeHierarchyResolver); diff --git a/compiler/frontend/src/org/jetbrains/jet/di/InjectorForLazyResolve.java b/compiler/frontend/src/org/jetbrains/jet/di/InjectorForLazyResolve.java index b64170e828e..77bf8b6b59b 100644 --- a/compiler/frontend/src/org/jetbrains/jet/di/InjectorForLazyResolve.java +++ b/compiler/frontend/src/org/jetbrains/jet/di/InjectorForLazyResolve.java @@ -24,6 +24,7 @@ import org.jetbrains.jet.lang.PlatformToKotlinClassMap; import org.jetbrains.jet.lang.resolve.lazy.declarations.DeclarationProviderFactory; import org.jetbrains.jet.lang.resolve.BindingTrace; import org.jetbrains.jet.lang.resolve.lazy.ResolveSession; +import org.jetbrains.jet.lang.types.DependencyClassByQualifiedNameResolverDummyImpl; import org.jetbrains.jet.lang.resolve.AnnotationResolver; import org.jetbrains.jet.lang.resolve.calls.CallResolver; import org.jetbrains.jet.lang.resolve.calls.ArgumentTypeResolver; @@ -41,6 +42,8 @@ import org.jetbrains.jet.lang.resolve.calls.CallResolverExtensionProvider; import org.jetbrains.jet.lang.resolve.calls.CandidateResolver; import org.jetbrains.jet.lang.psi.JetImportsFactory; import org.jetbrains.jet.lang.resolve.lazy.ScopeProvider; +import org.jetbrains.jet.lang.resolve.ScriptBodyResolver; +import org.jetbrains.jet.lang.resolve.ScriptParameterResolver; import org.jetbrains.annotations.NotNull; import javax.annotation.PreDestroy; @@ -56,6 +59,7 @@ public class InjectorForLazyResolve { private final DeclarationProviderFactory declarationProviderFactory; private final BindingTrace bindingTrace; private final ResolveSession resolveSession; + private final DependencyClassByQualifiedNameResolverDummyImpl dependencyClassByQualifiedNameResolverDummy; private final AnnotationResolver annotationResolver; private final CallResolver callResolver; private final ArgumentTypeResolver argumentTypeResolver; @@ -73,6 +77,8 @@ public class InjectorForLazyResolve { private final CandidateResolver candidateResolver; private final JetImportsFactory jetImportsFactory; private final ScopeProvider scopeProvider; + private final ScriptBodyResolver scriptBodyResolver; + private final ScriptParameterResolver scriptParameterResolver; public InjectorForLazyResolve( @NotNull Project project, @@ -89,6 +95,7 @@ public class InjectorForLazyResolve { this.declarationProviderFactory = declarationProviderFactory; this.bindingTrace = bindingTrace; this.resolveSession = new ResolveSession(project, globalContext, moduleDescriptor, declarationProviderFactory, bindingTrace); + this.dependencyClassByQualifiedNameResolverDummy = new DependencyClassByQualifiedNameResolverDummyImpl(); this.annotationResolver = new AnnotationResolver(); this.callResolver = new CallResolver(); this.argumentTypeResolver = new ArgumentTypeResolver(); @@ -106,12 +113,16 @@ public class InjectorForLazyResolve { this.candidateResolver = new CandidateResolver(); this.jetImportsFactory = new JetImportsFactory(); this.scopeProvider = new ScopeProvider(getResolveSession()); + this.scriptBodyResolver = new ScriptBodyResolver(); + this.scriptParameterResolver = new ScriptParameterResolver(); this.resolveSession.setAnnotationResolve(annotationResolver); this.resolveSession.setDescriptorResolver(descriptorResolver); this.resolveSession.setJetImportFactory(jetImportsFactory); this.resolveSession.setQualifiedExpressionResolver(qualifiedExpressionResolver); this.resolveSession.setScopeProvider(scopeProvider); + this.resolveSession.setScriptBodyResolver(scriptBodyResolver); + this.resolveSession.setScriptParameterResolver(scriptParameterResolver); this.resolveSession.setTypeResolver(typeResolver); annotationResolver.setCallResolver(callResolver); @@ -165,6 +176,10 @@ public class InjectorForLazyResolve { jetImportsFactory.setProject(project); + scriptBodyResolver.setExpressionTypingServices(expressionTypingServices); + + scriptParameterResolver.setDependencyClassByQualifiedNameResolver(dependencyClassByQualifiedNameResolverDummy); + } @PreDestroy diff --git a/compiler/frontend/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerBasic.java b/compiler/frontend/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerBasic.java index 908103838b3..a96ac289e88 100644 --- a/compiler/frontend/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerBasic.java +++ b/compiler/frontend/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerBasic.java @@ -149,8 +149,6 @@ public class InjectorForTopDownAnalyzerBasic { this.topDownAnalyzer.setOverrideResolver(overrideResolver); this.topDownAnalyzer.setPackageFragmentProvider(mutablePackageFragmentProvider); this.topDownAnalyzer.setProject(project); - this.topDownAnalyzer.setScriptBodyResolver(scriptBodyResolver); - this.topDownAnalyzer.setScriptParameterResolver(scriptParameterResolver); this.topDownAnalyzer.setTrace(bindingTrace); this.topDownAnalyzer.setTypeHierarchyResolver(typeHierarchyResolver); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/LazyClassDescriptor.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/LazyClassDescriptor.java index 76c1b142160..18f820cc6d7 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/LazyClassDescriptor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/LazyClassDescriptor.java @@ -252,10 +252,10 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements ClassDes if (primaryConstructor == null) return getScopeForMemberDeclarationResolution(); WritableScopeImpl scope = new WritableScopeImpl(JetScope.EMPTY, primaryConstructor, RedeclarationHandler.DO_NOTHING, "Scope with constructor parameters in " + getName()); - for (ValueParameterDescriptor valueParameterDescriptor : primaryConstructor.getValueParameters()) { - JetParameter jetParameter = originalClassInfo.getPrimaryConstructorParameters().get(valueParameterDescriptor.getIndex()); + for (int i = 0; i < originalClassInfo.getPrimaryConstructorParameters().size(); i++) { + JetParameter jetParameter = originalClassInfo.getPrimaryConstructorParameters().get(i); if (jetParameter.getValOrVarNode() == null) { - scope.addVariableDescriptor(valueParameterDescriptor); + scope.addVariableDescriptor(primaryConstructor.getValueParameters().get(i)); } } scope.changeLockLevel(WritableScope.LockLevel.READING); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/LazyClassMemberScope.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/LazyClassMemberScope.java index 242b11e5813..cefa60192f8 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/LazyClassMemberScope.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/LazyClassMemberScope.java @@ -28,6 +28,7 @@ import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.resolve.*; import org.jetbrains.jet.lang.resolve.lazy.ResolveSession; import org.jetbrains.jet.lang.resolve.lazy.data.JetClassLikeInfo; +import org.jetbrains.jet.lang.resolve.lazy.data.JetScriptInfo; import org.jetbrains.jet.lang.resolve.lazy.declarations.ClassMemberDeclarationProvider; import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.resolve.scopes.JetScope; @@ -227,10 +228,20 @@ public class LazyClassMemberScope extends AbstractLazyMemberScope valueParameterDescriptors = primaryConstructor.getValueParameters(); List primaryConstructorParameters = classInfo.getPrimaryConstructorParameters(); - assert valueParameterDescriptors.size() == primaryConstructorParameters.size() : "From descriptor: " + valueParameterDescriptors.size() + " but from PSI: " + primaryConstructorParameters.size(); for (ValueParameterDescriptor valueParameterDescriptor : valueParameterDescriptors) { + if (!name.equals(valueParameterDescriptor.getName())) continue; + + // SCRIPT: Adding script parameters as properties + if (classInfo instanceof JetScriptInfo) { + result.add(ScriptDescriptorImpl.createPropertyFromScriptParameter( + resolveSession.getScriptDescriptor(((JetScriptInfo) classInfo).getScript()), valueParameterDescriptor) + ); + continue; + } + + assert valueParameterDescriptors.size() == primaryConstructorParameters.size() : "From descriptor: " + valueParameterDescriptors.size() + " but from PSI: " + primaryConstructorParameters.size(); JetParameter parameter = primaryConstructorParameters.get(valueParameterDescriptor.getIndex()); - if (parameter.getValOrVarNode() != null && name.equals(parameter.getNameAsName())) { + if (parameter.getValOrVarNode() != null) { PropertyDescriptor propertyDescriptor = resolveSession.getDescriptorResolver().resolvePrimaryConstructorParameterToAProperty( thisDescriptor, @@ -356,27 +367,36 @@ public class LazyClassMemberScope extends AbstractLazyMemberScope valueParameters) { this.valueParameters = valueParameters; - ConstructorDescriptorImpl constructorDescriptor = - ConstructorDescriptorImpl.create(classDescriptor, Annotations.EMPTY, true) - .initialize(Collections.emptyList(), valueParameters, Visibilities.PUBLIC, false); - constructorDescriptor.setReturnType(classDescriptor.getDefaultType()); + ConstructorDescriptorImpl constructorDescriptor = createConstructor(this, valueParameters); + constructorDescriptor.setReturnType(classDescriptor.getDefaultType()); classDescriptor.getConstructors().add(constructorDescriptor); classDescriptor.setPrimaryConstructor(constructorDescriptor); - for (ValueParameterDescriptor parameter : valueParameters) { - PropertyDescriptorImpl propertyDescriptor = PropertyDescriptorImpl.create(classDescriptor, - Annotations.EMPTY, - Modality.FINAL, - Visibilities.PUBLIC, - false, - parameter.getName(), - CallableMemberDescriptor.Kind.DECLARATION); - propertyDescriptor.setType( - parameter.getType(), - Collections.emptyList(), - classDescriptor.getThisAsReceiverParameter(), ReceiverParameterDescriptor.NO_RECEIVER_PARAMETER); - propertyDescriptor.initialize(null, null); - classScope.addPropertyDescriptor(propertyDescriptor); + for (ValueParameterDescriptor valueParameter : valueParameters) { + classScope.addPropertyDescriptor(createPropertyFromScriptParameter(this, valueParameter)); } } + @NotNull + public static ConstructorDescriptorImpl createConstructor( + @NotNull ScriptDescriptor scriptDescriptor, @NotNull List valueParameters + ) { + return ConstructorDescriptorImpl.create(scriptDescriptor.getClassDescriptor(), Annotations.EMPTY, true) + .initialize( + Collections.emptyList(), + valueParameters, + Visibilities.PUBLIC, + false + ); + } + + @NotNull + public static PropertyDescriptor createPropertyFromScriptParameter( + @NotNull ScriptDescriptor scriptDescriptor, + @NotNull ValueParameterDescriptor parameter + ) { + PropertyDescriptorImpl propertyDescriptor = PropertyDescriptorImpl.create(scriptDescriptor.getClassDescriptor(), + Annotations.EMPTY, + Modality.FINAL, + Visibilities.PUBLIC, + false, + parameter.getName(), + CallableMemberDescriptor.Kind.DECLARATION); + propertyDescriptor.setType( + parameter.getType(), + Collections.emptyList(), + scriptDescriptor.getThisAsReceiverParameter(), ReceiverParameterDescriptor.NO_RECEIVER_PARAMETER); + propertyDescriptor.initialize(null, null); + return propertyDescriptor; + } + @Override @NotNull public ClassDescriptor getClassDescriptor() { diff --git a/generators/src/org/jetbrains/jet/generators/injectors/GenerateInjectors.kt b/generators/src/org/jetbrains/jet/generators/injectors/GenerateInjectors.kt index 16b26f3eceb..33c7448c7a4 100644 --- a/generators/src/org/jetbrains/jet/generators/injectors/GenerateInjectors.kt +++ b/generators/src/org/jetbrains/jet/generators/injectors/GenerateInjectors.kt @@ -216,6 +216,8 @@ private fun generatorForLazyResolve() = parameter(javaClass()) publicField(javaClass()) + + field(javaClass()) } private fun generator( diff --git a/js/js.translator/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerForJs.java b/js/js.translator/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerForJs.java index c0c96c26676..416546add70 100644 --- a/js/js.translator/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerForJs.java +++ b/js/js.translator/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerForJs.java @@ -149,8 +149,6 @@ public class InjectorForTopDownAnalyzerForJs { this.topDownAnalyzer.setOverrideResolver(overrideResolver); this.topDownAnalyzer.setPackageFragmentProvider(mutablePackageFragmentProvider); this.topDownAnalyzer.setProject(project); - this.topDownAnalyzer.setScriptBodyResolver(scriptBodyResolver); - this.topDownAnalyzer.setScriptParameterResolver(scriptParameterResolver); this.topDownAnalyzer.setTrace(bindingTrace); this.topDownAnalyzer.setTypeHierarchyResolver(typeHierarchyResolver);