Support block code fragments in KotlinResolveCache
This commit is contained in:
@@ -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<T> {
|
||||
val platform: TargetPlatform
|
||||
@@ -198,7 +199,7 @@ private object KotlinResolveDataProvider {
|
||||
javaClass<JetProperty>(),
|
||||
javaClass<JetImportDirective>(),
|
||||
javaClass<JetPackageDirective>(),
|
||||
javaClass<JetExpressionCodeFragment>(),
|
||||
javaClass<JetCodeFragment>(),
|
||||
// TODO: Non-analyzable so far, add more granular analysis
|
||||
javaClass<JetAnnotationEntry>(),
|
||||
javaClass<JetTypeConstraint>(),
|
||||
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user