From fff278e1c64addb8acb46f0cb721a0fb5d5bd31c Mon Sep 17 00:00:00 2001 From: Natalia Ukhorskaya Date: Thu, 15 May 2014 17:13:16 +0400 Subject: [PATCH] Support block code fragments in KotlinResolveCache --- .../caches/resolve/KotlinResolveCache.kt | 22 +++++++++++------ .../jet/plugin/highlighter/JetPsiChecker.java | 24 +++++-------------- 2 files changed, 21 insertions(+), 25 deletions(-) diff --git a/idea/src/org/jetbrains/jet/plugin/caches/resolve/KotlinResolveCache.kt b/idea/src/org/jetbrains/jet/plugin/caches/resolve/KotlinResolveCache.kt index 8f72794a798..82fcae21458 100644 --- a/idea/src/org/jetbrains/jet/plugin/caches/resolve/KotlinResolveCache.kt +++ b/idea/src/org/jetbrains/jet/plugin/caches/resolve/KotlinResolveCache.kt @@ -58,12 +58,13 @@ import org.jetbrains.jet.lang.psi.JetDelegationSpecifierList import org.jetbrains.jet.lang.psi.JetTypeParameter import org.jetbrains.jet.lang.psi.JetClassOrObject import org.jetbrains.jet.lang.psi.JetCallableDeclaration -import org.jetbrains.jet.lang.psi.JetExpressionCodeFragment +import org.jetbrains.jet.lang.psi.JetCodeFragment import org.jetbrains.jet.lang.psi.JetExpression import org.jetbrains.jet.lang.resolve.calls.autocasts.DataFlowInfo import org.jetbrains.jet.analyzer.analyzeInContext import org.jetbrains.jet.lang.resolve.BindingTraceContext import org.jetbrains.jet.lang.types.TypeUtils +import org.jetbrains.jet.lang.resolve.scopes.ChainedScope public trait CacheExtension { val platform: TargetPlatform @@ -198,7 +199,7 @@ private object KotlinResolveDataProvider { javaClass(), javaClass(), javaClass(), - javaClass(), + javaClass(), // TODO: Non-analyzable so far, add more granular analysis javaClass(), javaClass(), @@ -228,7 +229,7 @@ private object KotlinResolveDataProvider { fun analyze(project: Project, resolveSession: ResolveSessionForBodies, analyzableElement: JetElement): AnalyzeExhaust { try { - if (analyzableElement is JetExpressionCodeFragment) { + if (analyzableElement is JetCodeFragment) { return AnalyzeExhaust.success( analyzeExpressionCodeFragment(resolveSession, analyzableElement), resolveSession.getModuleDescriptor() @@ -278,9 +279,9 @@ private object KotlinResolveDataProvider { } } - private fun analyzeExpressionCodeFragment(resolveSession: ResolveSessionForBodies, codeFragment: JetExpressionCodeFragment): BindingContext { - val codeFragmentExpression = codeFragment.getExpression() - if (codeFragmentExpression == null) return BindingContext.EMPTY + private fun analyzeExpressionCodeFragment(resolveSession: ResolveSessionForBodies, codeFragment: JetCodeFragment): BindingContext { + val codeFragmentExpression = codeFragment.getSignificantElement() + if (!(codeFragmentExpression is JetExpression)) return BindingContext.EMPTY val contextElement = codeFragment.getContext() if (contextElement !is JetExpression) return BindingContext.EMPTY @@ -289,10 +290,17 @@ private object KotlinResolveDataProvider { val scopeForContextElement = contextForElement[BindingContext.RESOLUTION_SCOPE, contextElement] if (scopeForContextElement == null) return BindingContext.EMPTY + + val codeFragmentScope = resolveSession.getScopeProvider().getFileScope(codeFragment) + val chainedScope = ChainedScope( + scopeForContextElement.getContainingDeclaration(), + "Scope for resolve code fragment", + scopeForContextElement, codeFragmentScope) + val dataFlowInfoForContextElement = contextForElement[BindingContext.EXPRESSION_DATA_FLOW_INFO, contextElement] val dataFlowInfo = dataFlowInfoForContextElement ?: DataFlowInfo.EMPTY return codeFragmentExpression.analyzeInContext( - scopeForContextElement, + chainedScope, BindingTraceContext(), dataFlowInfo, TypeUtils.NO_EXPECTED_TYPE, diff --git a/idea/src/org/jetbrains/jet/plugin/highlighter/JetPsiChecker.java b/idea/src/org/jetbrains/jet/plugin/highlighter/JetPsiChecker.java index 5962440cde7..9809b2b53dd 100644 --- a/idea/src/org/jetbrains/jet/plugin/highlighter/JetPsiChecker.java +++ b/idea/src/org/jetbrains/jet/plugin/highlighter/JetPsiChecker.java @@ -104,27 +104,15 @@ public class JetPsiChecker implements Annotator, HighlightRangeExtension { JetFile file = (JetFile) element.getContainingFile(); - BindingContext bindingContext; - if (file instanceof JetCodeFragment) { - if (element instanceof JetElement) { - ResolveSessionForBodies resolveSession = ResolvePackage.getLazyResolveSession((JetElement) element); - bindingContext = resolveSession.resolveToElement((JetElement) element); - } - else { - return; - } - } - else { - AnalyzeExhaust analyzeExhaust = ResolvePackage.getAnalysisResults(file); - if (analyzeExhaust.isError()) { - HighlighterPackage.updateHighlightingResult(file, true); + AnalyzeExhaust analyzeExhaust = ResolvePackage.getAnalysisResults(file); + if (analyzeExhaust.isError()) { + HighlighterPackage.updateHighlightingResult(file, true); - throw new ProcessCanceledException(analyzeExhaust.getError()); - } - - bindingContext = analyzeExhaust.getBindingContext(); + throw new ProcessCanceledException(analyzeExhaust.getError()); } + BindingContext bindingContext = analyzeExhaust.getBindingContext(); + for (HighlightingVisitor visitor : getAfterAnalysisVisitor(holder, bindingContext)) { element.accept(visitor); }