KT-9389 Code completion inserts annotation FQN into annotation list
#KT-9389 Fixed
This commit is contained in:
@@ -144,7 +144,6 @@ public class ResolveElementCache(
|
||||
partialResolveMap[statementToResolve ?: resolveElement]
|
||||
?.check { it.isUpToDate(file) }
|
||||
?.let { return it.bindingContext } // partial resolve is already cached for this statement
|
||||
|
||||
val (bindingContext, statementFilter) = performElementAdditionalResolve(resolveElement, contextElement, BodyResolveMode.PARTIAL)
|
||||
|
||||
if (statementFilter == StatementFilter.NONE) { // partial resolve is not supported for the given declaration - full resolve performed instead
|
||||
@@ -412,33 +411,37 @@ public class ResolveElementCache(
|
||||
return trace
|
||||
}
|
||||
|
||||
private fun propertyAdditionalResolve(resolveSession: ResolveSession, jetProperty: KtProperty, file: KtFile, statementFilter: StatementFilter): BindingTrace {
|
||||
val trace = createDelegatingTrace(jetProperty)
|
||||
val propertyResolutionScope = resolveSession.getDeclarationScopeProvider().getResolutionScopeForDeclaration(jetProperty)
|
||||
private fun propertyAdditionalResolve(resolveSession: ResolveSession, property: KtProperty, file: KtFile, statementFilter: StatementFilter): BindingTrace {
|
||||
val trace = createDelegatingTrace(property)
|
||||
val propertyResolutionScope = resolveSession.getDeclarationScopeProvider().getResolutionScopeForDeclaration(property)
|
||||
|
||||
val bodyResolver = createBodyResolver(resolveSession, trace, file, statementFilter)
|
||||
val descriptor = resolveSession.resolveToDescriptor(jetProperty) as PropertyDescriptor
|
||||
val descriptor = resolveSession.resolveToDescriptor(property) as PropertyDescriptor
|
||||
ForceResolveUtil.forceResolveAllContents(descriptor)
|
||||
|
||||
val propertyInitializer = jetProperty.getInitializer()
|
||||
val propertyInitializer = property.getInitializer()
|
||||
if (propertyInitializer != null) {
|
||||
bodyResolver.resolvePropertyInitializer(DataFlowInfo.EMPTY, jetProperty, descriptor, propertyInitializer, propertyResolutionScope)
|
||||
bodyResolver.resolvePropertyInitializer(DataFlowInfo.EMPTY, property, descriptor, propertyInitializer, propertyResolutionScope)
|
||||
}
|
||||
|
||||
val propertyDelegate = jetProperty.getDelegateExpression()
|
||||
val propertyDelegate = property.getDelegateExpression()
|
||||
if (propertyDelegate != null) {
|
||||
bodyResolver.resolvePropertyDelegate(DataFlowInfo.EMPTY, jetProperty, descriptor, propertyDelegate, propertyResolutionScope, propertyResolutionScope)
|
||||
bodyResolver.resolvePropertyDelegate(DataFlowInfo.EMPTY, property, descriptor, propertyDelegate, propertyResolutionScope, propertyResolutionScope)
|
||||
}
|
||||
|
||||
val bodyResolveContext = BodyResolveContextForLazy(TopDownAnalysisMode.LocalDeclarations, { declaration ->
|
||||
assert(declaration.getParent() == jetProperty) { "Must be called only for property accessors, but called for $declaration" }
|
||||
assert(declaration.getParent() == property) { "Must be called only for property accessors, but called for $declaration" }
|
||||
resolveSession.getDeclarationScopeProvider().getResolutionScopeForDeclaration(declaration)
|
||||
})
|
||||
|
||||
bodyResolver.resolvePropertyAccessors(bodyResolveContext, jetProperty, descriptor)
|
||||
bodyResolver.resolvePropertyAccessors(bodyResolveContext, property, descriptor)
|
||||
|
||||
for (accessor in jetProperty.getAccessors()) {
|
||||
forceResolveAnnotations(property)
|
||||
|
||||
for (accessor in property.getAccessors()) {
|
||||
JetFlowInformationProvider(accessor, trace).checkDeclaration()
|
||||
|
||||
forceResolveAnnotations(accessor)
|
||||
}
|
||||
|
||||
return trace
|
||||
@@ -454,6 +457,8 @@ public class ResolveElementCache(
|
||||
val bodyResolver = createBodyResolver(resolveSession, trace, file, statementFilter)
|
||||
bodyResolver.resolveFunctionBody(DataFlowInfo.EMPTY, trace, namedFunction, functionDescriptor, scope)
|
||||
|
||||
forceResolveAnnotations(namedFunction)
|
||||
|
||||
return trace
|
||||
}
|
||||
|
||||
@@ -467,6 +472,8 @@ public class ResolveElementCache(
|
||||
val bodyResolver = createBodyResolver(resolveSession, trace, file, statementFilter)
|
||||
bodyResolver.resolveSecondaryConstructorBody(DataFlowInfo.EMPTY, trace, constructor, constructorDescriptor, scope)
|
||||
|
||||
forceResolveAnnotations(constructor)
|
||||
|
||||
return trace
|
||||
}
|
||||
|
||||
@@ -493,9 +500,18 @@ public class ResolveElementCache(
|
||||
val bodyResolver = createBodyResolver(resolveSession, trace, file, statementFilter)
|
||||
bodyResolver.resolveAnonymousInitializer(DataFlowInfo.EMPTY, classInitializer, classOrObjectDescriptor)
|
||||
|
||||
forceResolveAnnotations(classInitializer)
|
||||
|
||||
return trace
|
||||
}
|
||||
|
||||
private fun forceResolveAnnotations(declaration: KtModifierListOwner) {
|
||||
for (annotationEntry in declaration.annotationEntries) {
|
||||
val annotationDescriptor = resolveSession.bindingContext[BindingContext.ANNOTATION, annotationEntry] ?: continue
|
||||
ForceResolveUtil.forceResolveAllContents(annotationDescriptor)
|
||||
}
|
||||
}
|
||||
|
||||
private fun createBodyResolver(
|
||||
resolveSession: ResolveSession,
|
||||
trace: BindingTrace,
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
package some
|
||||
|
||||
annotation class AnnComplete
|
||||
|
||||
class Multiplier {
|
||||
@get:[A<caret>]
|
||||
var property = 0
|
||||
}
|
||||
|
||||
// ELEMENT: AnnComplete
|
||||
@@ -0,0 +1,10 @@
|
||||
package some
|
||||
|
||||
annotation class AnnComplete
|
||||
|
||||
class Multiplier {
|
||||
@get:[AnnComplete<caret>]
|
||||
var property = 0
|
||||
}
|
||||
|
||||
// ELEMENT: AnnComplete
|
||||
+6
@@ -35,6 +35,12 @@ public class BasicCompletionHandlerTestGenerated extends AbstractBasicCompletion
|
||||
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/idea-completion/testData/handlers/basic"), Pattern.compile("^(.+)\\.kt$"), true);
|
||||
}
|
||||
|
||||
@TestMetadata("AnnotationInBrackets.kt")
|
||||
public void testAnnotationInBrackets() throws Exception {
|
||||
String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/handlers/basic/AnnotationInBrackets.kt");
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("AnnotationInClassAddImport.kt")
|
||||
public void testAnnotationInClassAddImport() throws Exception {
|
||||
String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/handlers/basic/AnnotationInClassAddImport.kt");
|
||||
|
||||
Reference in New Issue
Block a user