ResolveElementCache: script can now be analyzable parent

So #KT-20096 Fixed
This commit is contained in:
Mikhail Glukhikh
2017-10-20 13:18:11 +03:00
parent cace6624e6
commit d0e8f99d60
6 changed files with 233 additions and 188 deletions
@@ -713,7 +713,7 @@ fun main(args: Array<String>) {
}
testClass<AbstractIntentionTest> {
model("intentions", pattern = "^([\\w\\-_]+)\\.kt$")
model("intentions", pattern = "^([\\w\\-_]+)\\.(kt|kts)$")
}
testClass<AbstractIntentionTest2> {
@@ -238,7 +238,8 @@ class ResolveElementCache(
KtTypeConstraint::class.java,
KtPackageDirective::class.java,
KtCodeFragment::class.java,
KtTypeAlias::class.java) as KtElement?
KtTypeAlias::class.java
) as KtElement?
when (elementOfAdditionalResolve) {
null -> {
@@ -251,7 +252,8 @@ class ResolveElementCache(
return element
}
return null
// Case of pure script element, like val (x, y) = ... on top of the script
return element.getParentOfType<KtScript>(strict = false)
}
is KtPackageDirective -> return element
@@ -334,6 +336,8 @@ class ResolveElementCache(
is KtCodeFragment -> codeFragmentAdditionalResolve(resolveElement, bodyResolveMode)
is KtScript -> scriptAdditionalResolve(resolveSession, resolveElement, bodyResolveMode.bindingTraceFilter)
else -> {
if (resolveElement.getParentOfType<KtPackageDirective>(true) != null) {
packageRefAdditionalResolve(resolveSession, resolveElement, bodyResolveMode.bindingTraceFilter)
@@ -487,6 +491,15 @@ class ResolveElementCache(
return trace
}
private fun scriptAdditionalResolve(resolveSession: ResolveSession, script: KtScript,
bindingTraceFilter: BindingTraceFilter): BindingTrace {
val trace = createDelegatingTrace(script, bindingTraceFilter)
val scriptDescriptor = resolveSession.resolveToDescriptor(script) as ScriptDescriptor
ForceResolveUtil.forceResolveAllContents(scriptDescriptor)
forceResolveAnnotationsInside(script)
return trace
}
private fun functionAdditionalResolve(resolveSession: ResolveSession, namedFunction: KtNamedFunction, file: KtFile,
statementFilter: StatementFilter,
bindingTraceFilter: BindingTraceFilter): BindingTrace {
@@ -0,0 +1,10 @@
// IS_APPLICABLE: false
// WITH_RUNTIME
// SKIP_ERRORS_BEFORE
// SKIP_ERRORS_AFTER
val (x, y) = run <caret>{
}
fun run(f: () -> Unit) = f()
@@ -0,0 +1,10 @@
// IS_APPLICABLE: false
// WITH_RUNTIME
// SKIP_ERRORS_BEFORE
// SKIP_ERRORS_AFTER
run <caret>{
}
fun run(f: () -> Unit) = f()
@@ -186,7 +186,7 @@ abstract class AbstractIntentionTest : KotlinLightCodeInsightFixtureTestCase() {
}
companion object {
private val EXTENSIONS = arrayOf(".kt", ".java", ".groovy")
private val EXTENSIONS = arrayOf(".kt", ".kts", ".java", ".groovy")
}
}
File diff suppressed because it is too large Load Diff