KT-9389 Code completion inserts annotation FQN into annotation list

#KT-9389 Fixed
This commit is contained in:
Valentin Kipyatkov
2015-10-20 17:43:44 +03:00
parent 66310806ca
commit 197218a512
4 changed files with 54 additions and 12 deletions
@@ -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
@@ -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");