Reformat: ReplaceWithAnnotationAnalyzer

This commit is contained in:
Mikhail Glukhikh
2018-05-22 18:06:13 +03:00
parent 75724c0240
commit 394a547084
@@ -47,29 +47,28 @@ data class ReplaceWith(val pattern: String, val imports: List<String>)
object ReplaceWithAnnotationAnalyzer { object ReplaceWithAnnotationAnalyzer {
fun analyzeCallableReplacement( fun analyzeCallableReplacement(
annotation: ReplaceWith, annotation: ReplaceWith,
symbolDescriptor: CallableDescriptor, symbolDescriptor: CallableDescriptor,
resolutionFacade: ResolutionFacade, resolutionFacade: ResolutionFacade,
reformat: Boolean reformat: Boolean
): CodeToInline? { ): CodeToInline? {
val originalDescriptor = (if (symbolDescriptor is CallableMemberDescriptor) val originalDescriptor = when (symbolDescriptor) {
DescriptorUtils.unwrapFakeOverride(symbolDescriptor) is CallableMemberDescriptor -> DescriptorUtils.unwrapFakeOverride(symbolDescriptor)
else else -> symbolDescriptor
symbolDescriptor).original }.original
return analyzeOriginal(annotation, originalDescriptor, resolutionFacade, reformat) return analyzeOriginal(annotation, originalDescriptor, resolutionFacade, reformat)
} }
private fun analyzeOriginal( private fun analyzeOriginal(
annotation: ReplaceWith, annotation: ReplaceWith,
symbolDescriptor: CallableDescriptor, symbolDescriptor: CallableDescriptor,
resolutionFacade: ResolutionFacade, resolutionFacade: ResolutionFacade,
reformat: Boolean reformat: Boolean
): CodeToInline? { ): CodeToInline? {
val psiFactory = KtPsiFactory(resolutionFacade.project) val psiFactory = KtPsiFactory(resolutionFacade.project)
val expression = try { val expression = try {
psiFactory.createExpression(annotation.pattern) psiFactory.createExpression(annotation.pattern)
} } catch (t: Throwable) {
catch(t: Throwable) {
return null return null
} }
@@ -78,27 +77,28 @@ object ReplaceWithAnnotationAnalyzer {
val defaultImportsScopes = buildDefaultImportsScopes(resolutionFacade, module) val defaultImportsScopes = buildDefaultImportsScopes(resolutionFacade, module)
val languageVersionSettings = resolutionFacade.getFrontendService(LanguageVersionSettings::class.java) val languageVersionSettings = resolutionFacade.getFrontendService(LanguageVersionSettings::class.java)
val scope = getResolutionScope(symbolDescriptor, symbolDescriptor, val scope = getResolutionScope(
listOf(explicitImportsScope) + defaultImportsScopes, languageVersionSettings) ?: return null symbolDescriptor, symbolDescriptor,
listOf(explicitImportsScope) + defaultImportsScopes, languageVersionSettings
) ?: return null
val expressionTypingServices = resolutionFacade.getFrontendService(module, ExpressionTypingServices::class.java) val expressionTypingServices = resolutionFacade.getFrontendService(module, ExpressionTypingServices::class.java)
fun analyzeExpression() = expression.analyzeInContext(scope, expressionTypingServices = expressionTypingServices) fun analyzeExpression() = expression.analyzeInContext(scope, expressionTypingServices = expressionTypingServices)
return CodeToInlineBuilder(symbolDescriptor, resolutionFacade) return CodeToInlineBuilder(symbolDescriptor, resolutionFacade)
.prepareCodeToInline(expression, emptyList(), ::analyzeExpression, reformat) .prepareCodeToInline(expression, emptyList(), ::analyzeExpression, reformat)
} }
fun analyzeClassifierReplacement( fun analyzeClassifierReplacement(
annotation: ReplaceWith, annotation: ReplaceWith,
symbolDescriptor: ClassifierDescriptorWithTypeParameters, symbolDescriptor: ClassifierDescriptorWithTypeParameters,
resolutionFacade: ResolutionFacade resolutionFacade: ResolutionFacade
): KtUserType? { ): KtUserType? {
val psiFactory = KtPsiFactory(resolutionFacade.project) val psiFactory = KtPsiFactory(resolutionFacade.project)
val typeReference = try { val typeReference = try {
psiFactory.createType(annotation.pattern) psiFactory.createType(annotation.pattern)
} } catch (e: Exception) {
catch(e: Exception) {
return null return null
} }
if (typeReference.typeElement !is KtUserType) return null if (typeReference.typeElement !is KtUserType) return null
@@ -108,10 +108,10 @@ object ReplaceWithAnnotationAnalyzer {
val explicitImportsScope = buildExplicitImportsScope(annotation, resolutionFacade, module) val explicitImportsScope = buildExplicitImportsScope(annotation, resolutionFacade, module)
val defaultImportScopes = buildDefaultImportsScopes(resolutionFacade, module) val defaultImportScopes = buildDefaultImportsScopes(resolutionFacade, module)
val scope = getResolutionScope( val scope = getResolutionScope(
symbolDescriptor, symbolDescriptor,
symbolDescriptor, symbolDescriptor,
listOf(explicitImportsScope) + defaultImportScopes, listOf(explicitImportsScope) + defaultImportScopes,
resolutionFacade.getFrontendService(LanguageVersionSettings::class.java) resolutionFacade.getFrontendService(LanguageVersionSettings::class.java)
) ?: return null ) ?: return null
val typeResolver = resolutionFacade.getFrontendService(TypeResolver::class.java) val typeResolver = resolutionFacade.getFrontendService(TypeResolver::class.java)
@@ -123,7 +123,8 @@ object ReplaceWithAnnotationAnalyzer {
typeReference.forEachDescendantOfType<KtNameReferenceExpression> { expression -> typeReference.forEachDescendantOfType<KtNameReferenceExpression> { expression ->
val parentType = expression.parent as? KtUserType ?: return@forEachDescendantOfType val parentType = expression.parent as? KtUserType ?: return@forEachDescendantOfType
if (parentType.qualifier != null) return@forEachDescendantOfType if (parentType.qualifier != null) return@forEachDescendantOfType
val targetClass = bindingTrace.bindingContext[BindingContext.REFERENCE_TARGET, expression] as? ClassDescriptor ?: return@forEachDescendantOfType val targetClass = bindingTrace.bindingContext[BindingContext.REFERENCE_TARGET, expression] as? ClassDescriptor
?: return@forEachDescendantOfType
val fqName = targetClass.fqNameUnsafe val fqName = targetClass.fqNameUnsafe
if (fqName.isSafe) { if (fqName.isSafe) {
typesToQualify.add(expression to fqName.toSafe()) typesToQualify.add(expression to fqName.toSafe())
@@ -143,52 +144,81 @@ object ReplaceWithAnnotationAnalyzer {
// TODO: Create import directives from ImportPath, create ImportResolver, create LazyResolverScope, see FileScopeProviderImpl // TODO: Create import directives from ImportPath, create ImportResolver, create LazyResolverScope, see FileScopeProviderImpl
return listOf(buildExplicitImportsScope(aliasImports.map { it.fqName }, resolutionFacade, module)) + return listOf(buildExplicitImportsScope(aliasImports.map { it.fqName }, resolutionFacade, module)) +
allUnderImports.map { module.getPackage(it.fqName).memberScope.memberScopeAsImportingScope() }.asReversed() allUnderImports.map { module.getPackage(it.fqName).memberScope.memberScopeAsImportingScope() }.asReversed()
} }
private fun buildExplicitImportsScope(annotation: ReplaceWith, resolutionFacade: ResolutionFacade, module: ModuleDescriptor): ExplicitImportsScope { private fun buildExplicitImportsScope(
annotation: ReplaceWith,
resolutionFacade: ResolutionFacade,
module: ModuleDescriptor
): ExplicitImportsScope {
return buildExplicitImportsScope(importFqNames(annotation), resolutionFacade, module) return buildExplicitImportsScope(importFqNames(annotation), resolutionFacade, module)
} }
private fun buildExplicitImportsScope(importFqNames: List<FqName>, resolutionFacade: ResolutionFacade, module: ModuleDescriptor): ExplicitImportsScope { private fun buildExplicitImportsScope(
importFqNames: List<FqName>,
resolutionFacade: ResolutionFacade,
module: ModuleDescriptor
): ExplicitImportsScope {
val importedSymbols = importFqNames.flatMap { resolutionFacade.resolveImportReference(module, it) } val importedSymbols = importFqNames.flatMap { resolutionFacade.resolveImportReference(module, it) }
return ExplicitImportsScope(importedSymbols) return ExplicitImportsScope(importedSymbols)
} }
private fun importFqNames(annotation: ReplaceWith): List<FqName> { private fun importFqNames(annotation: ReplaceWith): List<FqName> {
return annotation.imports return annotation.imports
.filter { FqNameUnsafe.isValid(it) } .filter { FqNameUnsafe.isValid(it) }
.map(::FqNameUnsafe) .map(::FqNameUnsafe)
.filter(FqNameUnsafe::isSafe) .filter(FqNameUnsafe::isSafe)
.map(FqNameUnsafe::toSafe) .map(FqNameUnsafe::toSafe)
} }
private fun getResolutionScope( private fun getResolutionScope(
descriptor: DeclarationDescriptor, descriptor: DeclarationDescriptor,
ownerDescriptor: DeclarationDescriptor, ownerDescriptor: DeclarationDescriptor,
additionalScopes: Collection<ImportingScope>, additionalScopes: Collection<ImportingScope>,
languageVersionSettings: LanguageVersionSettings languageVersionSettings: LanguageVersionSettings
): LexicalScope? { ): LexicalScope? {
return when (descriptor) { return when (descriptor) {
is PackageFragmentDescriptor -> { is PackageFragmentDescriptor -> {
val moduleDescriptor = descriptor.containingDeclaration val moduleDescriptor = descriptor.containingDeclaration
getResolutionScope(moduleDescriptor.getPackage(descriptor.fqName), ownerDescriptor, additionalScopes, languageVersionSettings) getResolutionScope(
moduleDescriptor.getPackage(descriptor.fqName),
ownerDescriptor,
additionalScopes,
languageVersionSettings
)
} }
is PackageViewDescriptor -> { is PackageViewDescriptor -> {
LexicalScope.Base( LexicalScope.Base(
chainImportingScopes(listOf(descriptor.memberScope.memberScopeAsImportingScope()) + additionalScopes)!!, chainImportingScopes(listOf(descriptor.memberScope.memberScopeAsImportingScope()) + additionalScopes)!!,
ownerDescriptor) ownerDescriptor
)
} }
is ClassDescriptor -> { is ClassDescriptor -> {
val outerScope = getResolutionScope(descriptor.containingDeclaration, ownerDescriptor, additionalScopes, languageVersionSettings) ?: return null val outerScope = getResolutionScope(
ClassResolutionScopesSupport(descriptor, LockBasedStorageManager.NO_LOCKS, languageVersionSettings, { outerScope }).scopeForMemberDeclarationResolution() descriptor.containingDeclaration, ownerDescriptor, additionalScopes, languageVersionSettings
) ?: return null
ClassResolutionScopesSupport(
descriptor,
LockBasedStorageManager.NO_LOCKS,
languageVersionSettings
) { outerScope }.scopeForMemberDeclarationResolution()
} }
is TypeAliasDescriptor -> { is TypeAliasDescriptor -> {
val outerScope = getResolutionScope(descriptor.containingDeclaration, ownerDescriptor, additionalScopes, languageVersionSettings) ?: return null val outerScope = getResolutionScope(
LexicalScopeImpl(outerScope, descriptor, false, null, LexicalScopeKind.TYPE_ALIAS_HEADER, LocalRedeclarationChecker.DO_NOTHING) { descriptor.containingDeclaration, ownerDescriptor, additionalScopes, languageVersionSettings
) ?: return null
LexicalScopeImpl(
outerScope,
descriptor,
false,
null,
LexicalScopeKind.TYPE_ALIAS_HEADER,
LocalRedeclarationChecker.DO_NOTHING
) {
for (typeParameter in descriptor.declaredTypeParameters) { for (typeParameter in descriptor.declaredTypeParameters) {
addClassifierDescriptor(typeParameter) addClassifierDescriptor(typeParameter)
} }
@@ -196,14 +226,24 @@ object ReplaceWithAnnotationAnalyzer {
} }
is FunctionDescriptor -> { is FunctionDescriptor -> {
val outerScope = getResolutionScope(descriptor.containingDeclaration, ownerDescriptor, additionalScopes, languageVersionSettings) ?: return null val outerScope = getResolutionScope(
descriptor.containingDeclaration, ownerDescriptor, additionalScopes, languageVersionSettings
) ?: return null
FunctionDescriptorUtil.getFunctionInnerScope(outerScope, descriptor, LocalRedeclarationChecker.DO_NOTHING) FunctionDescriptorUtil.getFunctionInnerScope(outerScope, descriptor, LocalRedeclarationChecker.DO_NOTHING)
} }
is PropertyDescriptor -> { is PropertyDescriptor -> {
val outerScope = getResolutionScope(descriptor.containingDeclaration, ownerDescriptor, additionalScopes, languageVersionSettings) ?: return null val outerScope = getResolutionScope(
descriptor.containingDeclaration, ownerDescriptor, additionalScopes, languageVersionSettings
) ?: return null
val propertyHeader = ScopeUtils.makeScopeForPropertyHeader(outerScope, descriptor) val propertyHeader = ScopeUtils.makeScopeForPropertyHeader(outerScope, descriptor)
LexicalScopeImpl(propertyHeader, descriptor, false, descriptor.extensionReceiverParameter, LexicalScopeKind.PROPERTY_ACCESSOR_BODY) LexicalScopeImpl(
propertyHeader,
descriptor,
false,
descriptor.extensionReceiverParameter,
LexicalScopeKind.PROPERTY_ACCESSOR_BODY
)
} }
else -> return null // something local, should not work with ReplaceWith else -> return null // something local, should not work with ReplaceWith