From b5503f3acf374a5d7d064e02fa96f197523825ca Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Tue, 20 Jan 2015 21:32:38 +0300 Subject: [PATCH] DeclarationScopeProviderImpl extracted --- .../di/InjectorForLazyResolveWithJava.java | 6 ++ .../kotlin/di/InjectorForReplWithJava.java | 6 ++ .../di/InjectorForTopDownAnalyzerForJvm.java | 6 ++ .../kotlin/di/InjectorForLazyResolve.java | 6 ++ .../InjectorForLazyTopDownAnalyzerBasic.java | 6 ++ .../kotlin/resolve/DeclarationResolver.java | 4 +- .../lazy/DeclarationScopeProviderImpl.java | 83 +++++++++++++++++++ .../kotlin/resolve/lazy/FileScopeProvider.kt | 24 ++++++ .../kotlin/resolve/lazy/ScopeProvider.java | 57 ++++--------- .../di/InjectorForTopDownAnalyzerForJs.java | 6 ++ 10 files changed, 159 insertions(+), 45 deletions(-) create mode 100644 compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/DeclarationScopeProviderImpl.java create mode 100644 compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/FileScopeProvider.kt diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/di/InjectorForLazyResolveWithJava.java b/compiler/frontend.java/src/org/jetbrains/kotlin/di/InjectorForLazyResolveWithJava.java index 46d61d85534..695d5c295a9 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/di/InjectorForLazyResolveWithJava.java +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/di/InjectorForLazyResolveWithJava.java @@ -65,6 +65,7 @@ import org.jetbrains.kotlin.resolve.calls.tasks.TaskPrioritizer; import org.jetbrains.kotlin.psi.JetImportsFactory; import org.jetbrains.kotlin.resolve.lazy.ScopeProvider; import org.jetbrains.kotlin.resolve.lazy.ScopeProvider.AdditionalFileScopeProvider; +import org.jetbrains.kotlin.resolve.lazy.DeclarationScopeProviderImpl; import org.jetbrains.kotlin.resolve.ScriptBodyResolver; import org.jetbrains.kotlin.load.java.lazy.LazyJavaPackageFragmentProvider; import org.jetbrains.kotlin.load.java.lazy.GlobalJavaResolverContext; @@ -128,6 +129,7 @@ public class InjectorForLazyResolveWithJava { private final JetImportsFactory jetImportsFactory; private final ScopeProvider scopeProvider; private final AdditionalFileScopeProvider additionalFileScopeProvider; + private final DeclarationScopeProviderImpl declarationScopeProvider; private final ScriptBodyResolver scriptBodyResolver; private final LazyJavaPackageFragmentProvider lazyJavaPackageFragmentProvider; private final GlobalJavaResolverContext globalJavaResolverContext; @@ -197,6 +199,7 @@ public class InjectorForLazyResolveWithJava { this.jetImportsFactory = new JetImportsFactory(); this.scopeProvider = new ScopeProvider(getResolveSession()); this.additionalFileScopeProvider = new AdditionalFileScopeProvider(); + this.declarationScopeProvider = new DeclarationScopeProviderImpl(getResolveSession()); this.scriptBodyResolver = new ScriptBodyResolver(); this.javaClassDataFinder = new JavaClassDataFinder(virtualFileFinder, deserializedDescriptorResolver); this.binaryClassAnnotationAndConstantLoader = new BinaryClassAnnotationAndConstantLoaderImpl(module, storageManager, virtualFileFinder, traceBasedErrorReporter); @@ -289,6 +292,9 @@ public class InjectorForLazyResolveWithJava { jetImportsFactory.setProject(project); scopeProvider.setAdditionalFileScopesProvider(additionalFileScopeProvider); + scopeProvider.setDeclarationScopeProvider(declarationScopeProvider); + + declarationScopeProvider.setFileScopeProvider(scopeProvider); scriptBodyResolver.setExpressionTypingServices(expressionTypingServices); diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/di/InjectorForReplWithJava.java b/compiler/frontend.java/src/org/jetbrains/kotlin/di/InjectorForReplWithJava.java index ecf566e59e2..5a1f705a41c 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/di/InjectorForReplWithJava.java +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/di/InjectorForReplWithJava.java @@ -67,6 +67,7 @@ import org.jetbrains.kotlin.resolve.calls.CandidateResolver; import org.jetbrains.kotlin.resolve.calls.tasks.TaskPrioritizer; import org.jetbrains.kotlin.psi.JetImportsFactory; import org.jetbrains.kotlin.resolve.lazy.ScopeProvider; +import org.jetbrains.kotlin.resolve.lazy.DeclarationScopeProviderImpl; import org.jetbrains.kotlin.resolve.ScriptBodyResolver; import org.jetbrains.kotlin.resolve.BodyResolver; import org.jetbrains.kotlin.resolve.ControlFlowAnalyzer; @@ -141,6 +142,7 @@ public class InjectorForReplWithJava { private final TaskPrioritizer taskPrioritizer; private final JetImportsFactory jetImportsFactory; private final ScopeProvider scopeProvider; + private final DeclarationScopeProviderImpl declarationScopeProvider; private final ScriptBodyResolver scriptBodyResolver; private final BodyResolver bodyResolver; private final ControlFlowAnalyzer controlFlowAnalyzer; @@ -223,6 +225,7 @@ public class InjectorForReplWithJava { this.taskPrioritizer = new TaskPrioritizer(storageManager); this.jetImportsFactory = new JetImportsFactory(); this.scopeProvider = new ScopeProvider(getResolveSession()); + this.declarationScopeProvider = new DeclarationScopeProviderImpl(getResolveSession()); this.scriptBodyResolver = new ScriptBodyResolver(); this.bodyResolver = new BodyResolver(); this.controlFlowAnalyzer = new ControlFlowAnalyzer(); @@ -333,6 +336,9 @@ public class InjectorForReplWithJava { jetImportsFactory.setProject(project); scopeProvider.setAdditionalFileScopesProvider(additionalFileScopeProvider); + scopeProvider.setDeclarationScopeProvider(declarationScopeProvider); + + declarationScopeProvider.setFileScopeProvider(scopeProvider); scriptBodyResolver.setExpressionTypingServices(expressionTypingServices); diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/di/InjectorForTopDownAnalyzerForJvm.java b/compiler/frontend.java/src/org/jetbrains/kotlin/di/InjectorForTopDownAnalyzerForJvm.java index 5dc35e4404c..1c45686f4ea 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/di/InjectorForTopDownAnalyzerForJvm.java +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/di/InjectorForTopDownAnalyzerForJvm.java @@ -67,6 +67,7 @@ import org.jetbrains.kotlin.resolve.calls.tasks.TaskPrioritizer; import org.jetbrains.kotlin.psi.JetImportsFactory; import org.jetbrains.kotlin.resolve.lazy.ScopeProvider; import org.jetbrains.kotlin.resolve.lazy.ScopeProvider.AdditionalFileScopeProvider; +import org.jetbrains.kotlin.resolve.lazy.DeclarationScopeProviderImpl; import org.jetbrains.kotlin.resolve.ScriptBodyResolver; import org.jetbrains.kotlin.resolve.BodyResolver; import org.jetbrains.kotlin.resolve.ControlFlowAnalyzer; @@ -141,6 +142,7 @@ public class InjectorForTopDownAnalyzerForJvm { private final JetImportsFactory jetImportsFactory; private final ScopeProvider scopeProvider; private final AdditionalFileScopeProvider additionalFileScopeProvider; + private final DeclarationScopeProviderImpl declarationScopeProvider; private final ScriptBodyResolver scriptBodyResolver; private final BodyResolver bodyResolver; private final ControlFlowAnalyzer controlFlowAnalyzer; @@ -222,6 +224,7 @@ public class InjectorForTopDownAnalyzerForJvm { this.jetImportsFactory = new JetImportsFactory(); this.scopeProvider = new ScopeProvider(getResolveSession()); this.additionalFileScopeProvider = new AdditionalFileScopeProvider(); + this.declarationScopeProvider = new DeclarationScopeProviderImpl(getResolveSession()); this.scriptBodyResolver = new ScriptBodyResolver(); this.bodyResolver = new BodyResolver(); this.controlFlowAnalyzer = new ControlFlowAnalyzer(); @@ -332,6 +335,9 @@ public class InjectorForTopDownAnalyzerForJvm { jetImportsFactory.setProject(project); scopeProvider.setAdditionalFileScopesProvider(additionalFileScopeProvider); + scopeProvider.setDeclarationScopeProvider(declarationScopeProvider); + + declarationScopeProvider.setFileScopeProvider(scopeProvider); scriptBodyResolver.setExpressionTypingServices(expressionTypingServices); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/di/InjectorForLazyResolve.java b/compiler/frontend/src/org/jetbrains/kotlin/di/InjectorForLazyResolve.java index d68fecfb3b5..084d6a75b09 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/di/InjectorForLazyResolve.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/di/InjectorForLazyResolve.java @@ -51,6 +51,7 @@ import org.jetbrains.kotlin.resolve.calls.tasks.TaskPrioritizer; import org.jetbrains.kotlin.psi.JetImportsFactory; import org.jetbrains.kotlin.resolve.lazy.ScopeProvider; import org.jetbrains.kotlin.resolve.lazy.ScopeProvider.AdditionalFileScopeProvider; +import org.jetbrains.kotlin.resolve.lazy.DeclarationScopeProviderImpl; import org.jetbrains.kotlin.resolve.ScriptBodyResolver; import org.jetbrains.annotations.NotNull; import javax.annotation.PreDestroy; @@ -94,6 +95,7 @@ public class InjectorForLazyResolve { private final JetImportsFactory jetImportsFactory; private final ScopeProvider scopeProvider; private final AdditionalFileScopeProvider additionalFileScopeProvider; + private final DeclarationScopeProviderImpl declarationScopeProvider; private final ScriptBodyResolver scriptBodyResolver; public InjectorForLazyResolve( @@ -140,6 +142,7 @@ public class InjectorForLazyResolve { this.jetImportsFactory = new JetImportsFactory(); this.scopeProvider = new ScopeProvider(getResolveSession()); this.additionalFileScopeProvider = new AdditionalFileScopeProvider(); + this.declarationScopeProvider = new DeclarationScopeProviderImpl(getResolveSession()); this.scriptBodyResolver = new ScriptBodyResolver(); this.resolveSession.setAnnotationResolve(annotationResolver); @@ -210,6 +213,9 @@ public class InjectorForLazyResolve { jetImportsFactory.setProject(project); scopeProvider.setAdditionalFileScopesProvider(additionalFileScopeProvider); + scopeProvider.setDeclarationScopeProvider(declarationScopeProvider); + + declarationScopeProvider.setFileScopeProvider(scopeProvider); scriptBodyResolver.setExpressionTypingServices(expressionTypingServices); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/di/InjectorForLazyTopDownAnalyzerBasic.java b/compiler/frontend/src/org/jetbrains/kotlin/di/InjectorForLazyTopDownAnalyzerBasic.java index 632ae7e8deb..557b3e7ec5d 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/di/InjectorForLazyTopDownAnalyzerBasic.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/di/InjectorForLazyTopDownAnalyzerBasic.java @@ -52,6 +52,7 @@ import org.jetbrains.kotlin.resolve.calls.tasks.TaskPrioritizer; import org.jetbrains.kotlin.psi.JetImportsFactory; import org.jetbrains.kotlin.resolve.lazy.ScopeProvider; import org.jetbrains.kotlin.resolve.lazy.ScopeProvider.AdditionalFileScopeProvider; +import org.jetbrains.kotlin.resolve.lazy.DeclarationScopeProviderImpl; import org.jetbrains.kotlin.resolve.ScriptBodyResolver; import org.jetbrains.kotlin.resolve.BodyResolver; import org.jetbrains.kotlin.resolve.ControlFlowAnalyzer; @@ -106,6 +107,7 @@ public class InjectorForLazyTopDownAnalyzerBasic { private final JetImportsFactory jetImportsFactory; private final ScopeProvider scopeProvider; private final AdditionalFileScopeProvider additionalFileScopeProvider; + private final DeclarationScopeProviderImpl declarationScopeProvider; private final ScriptBodyResolver scriptBodyResolver; private final BodyResolver bodyResolver; private final ControlFlowAnalyzer controlFlowAnalyzer; @@ -161,6 +163,7 @@ public class InjectorForLazyTopDownAnalyzerBasic { this.jetImportsFactory = new JetImportsFactory(); this.scopeProvider = new ScopeProvider(getResolveSession()); this.additionalFileScopeProvider = new AdditionalFileScopeProvider(); + this.declarationScopeProvider = new DeclarationScopeProviderImpl(getResolveSession()); this.scriptBodyResolver = new ScriptBodyResolver(); this.bodyResolver = new BodyResolver(); this.controlFlowAnalyzer = new ControlFlowAnalyzer(); @@ -250,6 +253,9 @@ public class InjectorForLazyTopDownAnalyzerBasic { jetImportsFactory.setProject(project); scopeProvider.setAdditionalFileScopesProvider(additionalFileScopeProvider); + scopeProvider.setDeclarationScopeProvider(declarationScopeProvider); + + declarationScopeProvider.setFileScopeProvider(scopeProvider); scriptBodyResolver.setExpressionTypingServices(expressionTypingServices); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeclarationResolver.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeclarationResolver.java index 7732e8cd700..301fa029477 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeclarationResolver.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeclarationResolver.java @@ -36,8 +36,8 @@ import org.jetbrains.kotlin.name.FqName; import org.jetbrains.kotlin.name.Name; import org.jetbrains.kotlin.psi.*; import org.jetbrains.kotlin.renderer.DescriptorRenderer; +import org.jetbrains.kotlin.resolve.lazy.FileScopeProvider; import org.jetbrains.kotlin.resolve.lazy.KotlinCodeAnalyzer; -import org.jetbrains.kotlin.resolve.lazy.ScopeProvider; import org.jetbrains.kotlin.resolve.lazy.descriptors.LazyPackageDescriptor; import org.jetbrains.kotlin.resolve.resolveUtil.ResolveUtilPackage; import org.jetbrains.kotlin.resolve.scopes.JetScope; @@ -96,7 +96,7 @@ public class DeclarationResolver { checkRedeclarationsInInnerClassNames(c); } - public void resolveAnnotationsOnFiles(@NotNull TopDownAnalysisContext c, @NotNull final ScopeProvider scopeProvider) { + public void resolveAnnotationsOnFiles(@NotNull TopDownAnalysisContext c, @NotNull final FileScopeProvider scopeProvider) { Map file2scope = UtilsPackage.keysToMap(c.getFiles(), new Function1() { @Override public JetScope invoke(JetFile file) { diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/DeclarationScopeProviderImpl.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/DeclarationScopeProviderImpl.java new file mode 100644 index 00000000000..a87c2c0a8c4 --- /dev/null +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/DeclarationScopeProviderImpl.java @@ -0,0 +1,83 @@ +/* + * Copyright 2010-2015 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.kotlin.resolve.lazy; + +import com.intellij.psi.PsiElement; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.kotlin.psi.*; +import org.jetbrains.kotlin.resolve.lazy.descriptors.LazyClassDescriptor; +import org.jetbrains.kotlin.resolve.scopes.JetScope; + +import javax.inject.Inject; + +public class DeclarationScopeProviderImpl implements DeclarationScopeProvider { + + private final ResolveSession resolveSession; + + private FileScopeProvider fileScopeProvider; + + @Inject + public void setFileScopeProvider(@NotNull FileScopeProvider fileScopeProvider) { + this.fileScopeProvider = fileScopeProvider; + } + + public DeclarationScopeProviderImpl(@NotNull ResolveSession resolveSession) { + this.resolveSession = resolveSession; + } + + @Override + @NotNull + public JetScope getResolutionScopeForDeclaration(@NotNull PsiElement elementOfDeclaration) { + JetDeclaration jetDeclaration = JetStubbedPsiUtil.getPsiOrStubParent(elementOfDeclaration, JetDeclaration.class, false); + + assert !(elementOfDeclaration instanceof JetDeclaration) || jetDeclaration == elementOfDeclaration : + "For JetDeclaration element getParentOfType() should return itself."; + assert jetDeclaration != null : "Should be contained inside declaration."; + + JetDeclaration parentDeclaration = JetStubbedPsiUtil.getContainingDeclaration(jetDeclaration); + + if (jetDeclaration instanceof JetPropertyAccessor) { + parentDeclaration = JetStubbedPsiUtil.getContainingDeclaration(parentDeclaration, JetDeclaration.class); + } + + if (parentDeclaration == null) { + return fileScopeProvider.getFileScope((JetFile) elementOfDeclaration.getContainingFile()); + } + + if (parentDeclaration instanceof JetClassOrObject) { + JetClassOrObject classOrObject = (JetClassOrObject) parentDeclaration; + LazyClassDescriptor classDescriptor = (LazyClassDescriptor) resolveSession.getClassDescriptor(classOrObject); + if (jetDeclaration instanceof JetClassInitializer || jetDeclaration instanceof JetProperty) { + return classDescriptor.getScopeForInitializerResolution(); + } + return classDescriptor.getScopeForMemberDeclarationResolution(); + } + + if (parentDeclaration instanceof JetClassObject) { + assert jetDeclaration instanceof JetObjectDeclaration : "Should be situation for getting scope for object in class [object {...}]"; + + JetClassObject classObject = (JetClassObject) parentDeclaration; + LazyClassDescriptor classObjectDescriptor = + (LazyClassDescriptor) resolveSession.getClassObjectDescriptor(classObject).getContainingDeclaration(); + + return classObjectDescriptor.getScopeForMemberDeclarationResolution(); + } + + throw new IllegalStateException("Don't call this method for local declarations: " + jetDeclaration + "\n" + + JetPsiUtil.getElementTextWithContext(jetDeclaration)); + } +} diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/FileScopeProvider.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/FileScopeProvider.kt new file mode 100644 index 00000000000..0aa65dc5187 --- /dev/null +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/FileScopeProvider.kt @@ -0,0 +1,24 @@ +/* + * Copyright 2010-2015 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.kotlin.resolve.lazy + +import org.jetbrains.kotlin.psi.JetFile +import org.jetbrains.kotlin.resolve.scopes.JetScope + +public trait FileScopeProvider { + fun getFileScope(jetFile: JetFile): JetScope +} \ No newline at end of file diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/ScopeProvider.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/ScopeProvider.java index 0b6f76a94dd..0abab9220f5 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/ScopeProvider.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/ScopeProvider.java @@ -22,10 +22,11 @@ import kotlin.Function1; import org.jetbrains.annotations.NotNull; import org.jetbrains.kotlin.descriptors.PackageViewDescriptor; import org.jetbrains.kotlin.name.FqName; -import org.jetbrains.kotlin.psi.*; +import org.jetbrains.kotlin.psi.JetFile; +import org.jetbrains.kotlin.psi.JetImportDirective; +import org.jetbrains.kotlin.psi.JetImportsFactory; import org.jetbrains.kotlin.resolve.ImportPath; import org.jetbrains.kotlin.resolve.TemporaryBindingTrace; -import org.jetbrains.kotlin.resolve.lazy.descriptors.LazyClassDescriptor; import org.jetbrains.kotlin.resolve.scopes.JetScope; import org.jetbrains.kotlin.storage.MemoizedFunctionToNotNull; import org.jetbrains.kotlin.storage.NotNullLazyValue; @@ -35,7 +36,7 @@ import java.util.Collection; import java.util.Collections; import java.util.List; -public class ScopeProvider implements DeclarationScopeProvider { +public class ScopeProvider implements DeclarationScopeProvider, FileScopeProvider { public static class AdditionalFileScopeProvider { @NotNull public List scopes(@NotNull JetFile file) { @@ -49,14 +50,19 @@ public class ScopeProvider implements DeclarationScopeProvider { private final MemoizedFunctionToNotNull fileScopes; - @SuppressWarnings("ConstantConditions") @NotNull - private AdditionalFileScopeProvider additionalFileScopeProvider = null; + private AdditionalFileScopeProvider additionalFileScopeProvider; + private DeclarationScopeProvider declarationScopeProvider; @Inject public void setAdditionalFileScopesProvider(@NotNull AdditionalFileScopeProvider additionalFileScopeProvider) { this.additionalFileScopeProvider = additionalFileScopeProvider; } + @Inject + public void setDeclarationScopeProvider(@NotNull DeclarationScopeProviderImpl declarationScopeProvider) { + this.declarationScopeProvider = declarationScopeProvider; + } + public ScopeProvider(@NotNull final ResolveSession resolveSession) { this.resolveSession = resolveSession; @@ -84,6 +90,7 @@ public class ScopeProvider implements DeclarationScopeProvider { }); } + @Override @NotNull public LazyFileScope getFileScope(@NotNull JetFile file) { return fileScopes.invoke(file); @@ -101,45 +108,9 @@ public class ScopeProvider implements DeclarationScopeProvider { "LazyFileScope for file " + file.getName()); } - @Override @NotNull + @Override public JetScope getResolutionScopeForDeclaration(@NotNull PsiElement elementOfDeclaration) { - JetDeclaration jetDeclaration = JetStubbedPsiUtil.getPsiOrStubParent(elementOfDeclaration, JetDeclaration.class, false); - - assert !(elementOfDeclaration instanceof JetDeclaration) || jetDeclaration == elementOfDeclaration : - "For JetDeclaration element getParentOfType() should return itself."; - assert jetDeclaration != null : "Should be contained inside declaration."; - - JetDeclaration parentDeclaration = JetStubbedPsiUtil.getContainingDeclaration(jetDeclaration); - - if (jetDeclaration instanceof JetPropertyAccessor) { - parentDeclaration = JetStubbedPsiUtil.getContainingDeclaration(parentDeclaration, JetDeclaration.class); - } - - if (parentDeclaration == null) { - return getFileScope((JetFile) elementOfDeclaration.getContainingFile()); - } - - if (parentDeclaration instanceof JetClassOrObject) { - JetClassOrObject classOrObject = (JetClassOrObject) parentDeclaration; - LazyClassDescriptor classDescriptor = (LazyClassDescriptor) resolveSession.getClassDescriptor(classOrObject); - if (jetDeclaration instanceof JetClassInitializer || jetDeclaration instanceof JetProperty) { - return classDescriptor.getScopeForInitializerResolution(); - } - return classDescriptor.getScopeForMemberDeclarationResolution(); - } - - if (parentDeclaration instanceof JetClassObject) { - assert jetDeclaration instanceof JetObjectDeclaration : "Should be situation for getting scope for object in class [object {...}]"; - - JetClassObject classObject = (JetClassObject) parentDeclaration; - LazyClassDescriptor classObjectDescriptor = - (LazyClassDescriptor) resolveSession.getClassObjectDescriptor(classObject).getContainingDeclaration(); - - return classObjectDescriptor.getScopeForMemberDeclarationResolution(); - } - - throw new IllegalStateException("Don't call this method for local declarations: " + jetDeclaration + "\n" + - JetPsiUtil.getElementTextWithContext(jetDeclaration)); + return declarationScopeProvider.getResolutionScopeForDeclaration(elementOfDeclaration); } } diff --git a/js/js.frontend/src/org/jetbrains/kotlin/di/InjectorForTopDownAnalyzerForJs.java b/js/js.frontend/src/org/jetbrains/kotlin/di/InjectorForTopDownAnalyzerForJs.java index 577700f399d..7cbf4cd8b8e 100644 --- a/js/js.frontend/src/org/jetbrains/kotlin/di/InjectorForTopDownAnalyzerForJs.java +++ b/js/js.frontend/src/org/jetbrains/kotlin/di/InjectorForTopDownAnalyzerForJs.java @@ -52,6 +52,7 @@ import org.jetbrains.kotlin.resolve.calls.tasks.TaskPrioritizer; import org.jetbrains.kotlin.psi.JetImportsFactory; import org.jetbrains.kotlin.resolve.lazy.ScopeProvider; import org.jetbrains.kotlin.resolve.lazy.ScopeProvider.AdditionalFileScopeProvider; +import org.jetbrains.kotlin.resolve.lazy.DeclarationScopeProviderImpl; import org.jetbrains.kotlin.resolve.ScriptBodyResolver; import org.jetbrains.kotlin.resolve.BodyResolver; import org.jetbrains.kotlin.resolve.ControlFlowAnalyzer; @@ -106,6 +107,7 @@ public class InjectorForTopDownAnalyzerForJs { private final JetImportsFactory jetImportsFactory; private final ScopeProvider scopeProvider; private final AdditionalFileScopeProvider additionalFileScopeProvider; + private final DeclarationScopeProviderImpl declarationScopeProvider; private final ScriptBodyResolver scriptBodyResolver; private final BodyResolver bodyResolver; private final ControlFlowAnalyzer controlFlowAnalyzer; @@ -161,6 +163,7 @@ public class InjectorForTopDownAnalyzerForJs { this.jetImportsFactory = new JetImportsFactory(); this.scopeProvider = new ScopeProvider(getResolveSession()); this.additionalFileScopeProvider = new AdditionalFileScopeProvider(); + this.declarationScopeProvider = new DeclarationScopeProviderImpl(getResolveSession()); this.scriptBodyResolver = new ScriptBodyResolver(); this.bodyResolver = new BodyResolver(); this.controlFlowAnalyzer = new ControlFlowAnalyzer(); @@ -250,6 +253,9 @@ public class InjectorForTopDownAnalyzerForJs { jetImportsFactory.setProject(project); scopeProvider.setAdditionalFileScopesProvider(additionalFileScopeProvider); + scopeProvider.setDeclarationScopeProvider(declarationScopeProvider); + + declarationScopeProvider.setFileScopeProvider(scopeProvider); scriptBodyResolver.setExpressionTypingServices(expressionTypingServices);