FIR IDE: add completion support to classes and to type aliases

This commit is contained in:
Ilya Kirillov
2021-04-19 20:15:21 +02:00
committed by TeamCityServer
parent a5c33c8d42
commit da6c5e13d5
30 changed files with 504 additions and 34 deletions
@@ -31,7 +31,6 @@ class RawFirFragmentForLazyBodiesBuilder private constructor(
designation: List<FirDeclaration>,
declaration: KtDeclaration,
): FirDeclaration {
require(declaration is KtNamedFunction || declaration is KtProperty) { "Not implemented for ${declaration::class.qualifiedName}" }
val builder = RawFirFragmentForLazyBodiesBuilder(session, baseScopeProvider, declaration)
builder.context.packageFqName = declaration.containingKtFile.packageFqName
return builder.moveNext(designation.iterator())
@@ -365,6 +365,7 @@ open class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransfor
}
doTransformTypeParameters(typeAlias)
typeAlias.transformAnnotations(transformer, data)
transformer.onBeforeDeclarationContentResolve(typeAlias)
typeAlias.transformExpandedTypeRef(transformer, data)
return typeAlias
}
@@ -81,3 +81,27 @@ inline fun buildRegularClass(init: FirRegularClassBuilder.() -> Unit): FirRegula
}
return FirRegularClassBuilder().apply(init).build()
}
@OptIn(ExperimentalContracts::class)
inline fun buildRegularClassCopy(original: FirRegularClass, init: FirRegularClassBuilder.() -> Unit): FirRegularClass {
contract {
callsInPlace(init, kotlin.contracts.InvocationKind.EXACTLY_ONCE)
}
val copyBuilder = FirRegularClassBuilder()
copyBuilder.source = original.source
copyBuilder.session = original.session
copyBuilder.resolvePhase = original.resolvePhase
copyBuilder.origin = original.origin
copyBuilder.attributes = original.attributes.copy()
copyBuilder.annotations.addAll(original.annotations)
copyBuilder.typeParameters.addAll(original.typeParameters)
copyBuilder.status = original.status
copyBuilder.classKind = original.classKind
copyBuilder.declarations.addAll(original.declarations)
copyBuilder.scopeProvider = original.scopeProvider
copyBuilder.name = original.name
copyBuilder.symbol = original.symbol
copyBuilder.companionObject = original.companionObject
copyBuilder.superTypeRefs.addAll(original.superTypeRefs)
return copyBuilder.apply(init).build()
}
@@ -68,3 +68,23 @@ inline fun buildTypeAlias(init: FirTypeAliasBuilder.() -> Unit): FirTypeAlias {
}
return FirTypeAliasBuilder().apply(init).build()
}
@OptIn(ExperimentalContracts::class)
inline fun buildTypeAliasCopy(original: FirTypeAlias, init: FirTypeAliasBuilder.() -> Unit): FirTypeAlias {
contract {
callsInPlace(init, kotlin.contracts.InvocationKind.EXACTLY_ONCE)
}
val copyBuilder = FirTypeAliasBuilder()
copyBuilder.source = original.source
copyBuilder.session = original.session
copyBuilder.resolvePhase = original.resolvePhase
copyBuilder.origin = original.origin
copyBuilder.attributes = original.attributes.copy()
copyBuilder.status = original.status
copyBuilder.typeParameters.addAll(original.typeParameters)
copyBuilder.name = original.name
copyBuilder.symbol = original.symbol
copyBuilder.expandedTypeRef = original.expandedTypeRef
copyBuilder.annotations.addAll(original.annotations)
return copyBuilder.apply(init).build()
}
@@ -28,7 +28,7 @@ inline fun <reified T : ConeKotlinType> FirTypeRef.coneTypeSafe(): T? {
return (this as? FirResolvedTypeRef)?.type as? T
}
inline val FirTypeRef.coneType: ConeKotlinType
val FirTypeRef.coneType: ConeKotlinType
get() = coneTypeSafe()
?: error("Expected FirResolvedTypeRef with ConeKotlinType but was ${this::class.simpleName} ${render()}")
@@ -37,6 +37,7 @@ object BuilderConfigurator : AbstractBuilderConfigurator<FirTreeBuilder>(FirTree
parents += typeParameterRefsOwnerBuilder
defaultNull("companionObject")
openBuilder()
withCopy()
}
val qualifiedAccessBuilder by builder {
@@ -95,6 +96,7 @@ object BuilderConfigurator : AbstractBuilderConfigurator<FirTreeBuilder>(FirTree
builder(typeAlias) {
parents += typeParametersOwnerBuilder
withCopy()
}
builder(annotationCall) {