Reformat: ReplaceWithAnnotationAnalyzer
This commit is contained in:
+88
-48
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user