Refactoring of repeatable on retention SOURCE check (correct additional checker usage)
This commit is contained in:
@@ -185,7 +185,7 @@ public abstract class AnnotationCodegen {
|
|||||||
private void generateTargetAnnotation(@NotNull ClassDescriptor classDescriptor, @NotNull Set<String> annotationDescriptorsAlreadyPresent) {
|
private void generateTargetAnnotation(@NotNull ClassDescriptor classDescriptor, @NotNull Set<String> annotationDescriptorsAlreadyPresent) {
|
||||||
String descriptor = Type.getType(Target.class).getDescriptor();
|
String descriptor = Type.getType(Target.class).getDescriptor();
|
||||||
if (!annotationDescriptorsAlreadyPresent.add(descriptor)) return;
|
if (!annotationDescriptorsAlreadyPresent.add(descriptor)) return;
|
||||||
Set<KotlinTarget> targets = AnnotationChecker.INSTANCE$.possibleTargetSet(classDescriptor);
|
Set<KotlinTarget> targets = AnnotationChecker.Companion.possibleTargetSet(classDescriptor);
|
||||||
Set<ElementType> javaTargets;
|
Set<ElementType> javaTargets;
|
||||||
if (targets == null) {
|
if (targets == null) {
|
||||||
javaTargets = getJavaTargetList(classDescriptor);
|
javaTargets = getJavaTargetList(classDescriptor);
|
||||||
|
|||||||
+1
-1
@@ -82,7 +82,7 @@ public object JvmPlatformConfigurator : PlatformConfigurator(
|
|||||||
|
|
||||||
additionalSymbolUsageValidators = listOf(),
|
additionalSymbolUsageValidators = listOf(),
|
||||||
|
|
||||||
additionalAnnotationChecker = RepeatableAnnotationChecker
|
additionalAnnotationCheckers = listOf(RepeatableAnnotationChecker)
|
||||||
) {
|
) {
|
||||||
|
|
||||||
override fun configure(container: StorageComponentContainer) {
|
override fun configure(container: StorageComponentContainer) {
|
||||||
|
|||||||
@@ -29,9 +29,7 @@ import org.jetbrains.kotlin.descriptors.annotations.KotlinTarget
|
|||||||
import org.jetbrains.kotlin.resolve.descriptorUtil.isRepeatableAnnotation
|
import org.jetbrains.kotlin.resolve.descriptorUtil.isRepeatableAnnotation
|
||||||
import org.jetbrains.kotlin.descriptors.annotations.KotlinTarget.*
|
import org.jetbrains.kotlin.descriptors.annotations.KotlinTarget.*
|
||||||
|
|
||||||
public object AnnotationChecker {
|
public class AnnotationChecker(private val additionalCheckers: Iterable<AdditionalAnnotationChecker>) {
|
||||||
|
|
||||||
public var additionalChecker: AdditionalAnnotationChecker? = null
|
|
||||||
|
|
||||||
public fun check(annotated: JetAnnotated, trace: BindingTrace, descriptor: ClassDescriptor? = null) {
|
public fun check(annotated: JetAnnotated, trace: BindingTrace, descriptor: ClassDescriptor? = null) {
|
||||||
if (annotated is JetTypeParameter) return // TODO: support type parameter annotations
|
if (annotated is JetTypeParameter) return // TODO: support type parameter annotations
|
||||||
@@ -71,25 +69,7 @@ public object AnnotationChecker {
|
|||||||
trace.report(Errors.REPEATED_ANNOTATION.on(entry));
|
trace.report(Errors.REPEATED_ANNOTATION.on(entry));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
additionalChecker?.checkEntries(entries, actualTargets, trace)
|
additionalCheckers.forEach { it.checkEntries(entries, actualTargets, trace) }
|
||||||
}
|
|
||||||
|
|
||||||
public fun possibleTargetSet(classDescriptor: ClassDescriptor): Set<KotlinTarget>? {
|
|
||||||
val targetEntryDescriptor = classDescriptor.annotations.findAnnotation(KotlinBuiltIns.FQ_NAMES.target)
|
|
||||||
?: return null
|
|
||||||
val valueArguments = targetEntryDescriptor.allValueArguments
|
|
||||||
val valueArgument = valueArguments.entrySet().firstOrNull()?.getValue() as? ArrayValue ?: return null
|
|
||||||
return valueArgument.value.filterIsInstance<EnumValue>().map {
|
|
||||||
KotlinTarget.valueOrNull(it.value.name.asString())
|
|
||||||
}.filterNotNull().toSet()
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun possibleTargetSet(entry: JetAnnotationEntry, trace: BindingTrace): Set<KotlinTarget> {
|
|
||||||
val descriptor = trace.get(BindingContext.ANNOTATION, entry) ?: return KotlinTarget.DEFAULT_TARGET_SET
|
|
||||||
// For descriptor with error type, all targets are considered as possible
|
|
||||||
if (descriptor.type.isError) return KotlinTarget.ALL_TARGET_SET
|
|
||||||
val classDescriptor = TypeUtils.getClassDescriptor(descriptor.type) ?: return KotlinTarget.DEFAULT_TARGET_SET
|
|
||||||
return possibleTargetSet(classDescriptor) ?: KotlinTarget.DEFAULT_TARGET_SET
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun checkAnnotationEntry(entry: JetAnnotationEntry, actualTargets: List<KotlinTarget>, trace: BindingTrace) {
|
private fun checkAnnotationEntry(entry: JetAnnotationEntry, actualTargets: List<KotlinTarget>, trace: BindingTrace) {
|
||||||
@@ -98,39 +78,60 @@ public object AnnotationChecker {
|
|||||||
trace.report(Errors.WRONG_ANNOTATION_TARGET.on(entry, actualTargets.firstOrNull()?.description ?: "unidentified target"))
|
trace.report(Errors.WRONG_ANNOTATION_TARGET.on(entry, actualTargets.firstOrNull()?.description ?: "unidentified target"))
|
||||||
}
|
}
|
||||||
|
|
||||||
public fun getActualTargetList(annotated: JetElement, descriptor: ClassDescriptor?): List<KotlinTarget> {
|
companion object {
|
||||||
return when (annotated) {
|
|
||||||
is JetClassOrObject -> descriptor?.let { KotlinTarget.classActualTargets(it) } ?: listOf(CLASSIFIER)
|
private fun possibleTargetSet(entry: JetAnnotationEntry, trace: BindingTrace): Set<KotlinTarget> {
|
||||||
is JetProperty ->
|
val descriptor = trace.get(BindingContext.ANNOTATION, entry) ?: return KotlinTarget.DEFAULT_TARGET_SET
|
||||||
if (annotated.isLocal) {
|
// For descriptor with error type, all targets are considered as possible
|
||||||
listOf(LOCAL_VARIABLE)
|
if (descriptor.type.isError) return KotlinTarget.ALL_TARGET_SET
|
||||||
}
|
val classDescriptor = TypeUtils.getClassDescriptor(descriptor.type) ?: return KotlinTarget.DEFAULT_TARGET_SET
|
||||||
else if (annotated.parent is JetClassOrObject || annotated.parent is JetClassBody) {
|
return possibleTargetSet(classDescriptor) ?: KotlinTarget.DEFAULT_TARGET_SET
|
||||||
listOf(MEMBER_PROPERTY, PROPERTY, FIELD)
|
}
|
||||||
}
|
|
||||||
else {
|
public fun possibleTargetSet(classDescriptor: ClassDescriptor): Set<KotlinTarget>? {
|
||||||
listOf(TOP_LEVEL_PROPERTY, PROPERTY, FIELD)
|
val targetEntryDescriptor = classDescriptor.annotations.findAnnotation(KotlinBuiltIns.FQ_NAMES.target)
|
||||||
}
|
?: return null
|
||||||
is JetParameter -> if (annotated.hasValOrVar()) listOf(PROPERTY_PARAMETER, MEMBER_PROPERTY, PROPERTY, FIELD) else listOf(VALUE_PARAMETER)
|
val valueArguments = targetEntryDescriptor.allValueArguments
|
||||||
is JetConstructor<*> -> listOf(CONSTRUCTOR)
|
val valueArgument = valueArguments.entrySet().firstOrNull()?.getValue() as? ArrayValue ?: return null
|
||||||
is JetFunction ->
|
return valueArgument.value.filterIsInstance<EnumValue>().map {
|
||||||
if (annotated.isLocal) {
|
KotlinTarget.valueOrNull(it.value.name.asString())
|
||||||
listOf(LOCAL_FUNCTION, FUNCTION)
|
}.filterNotNull().toSet()
|
||||||
}
|
}
|
||||||
else if (annotated.parent is JetClassOrObject || annotated.parent is JetClassBody) {
|
|
||||||
listOf(MEMBER_FUNCTION, FUNCTION)
|
public fun getActualTargetList(annotated: JetElement, descriptor: ClassDescriptor?): List<KotlinTarget> {
|
||||||
}
|
return when (annotated) {
|
||||||
else {
|
is JetClassOrObject -> descriptor?.let { KotlinTarget.classActualTargets(it) } ?: listOf(CLASSIFIER)
|
||||||
listOf(TOP_LEVEL_FUNCTION, FUNCTION)
|
is JetProperty ->
|
||||||
}
|
if (annotated.isLocal) {
|
||||||
is JetPropertyAccessor -> if (annotated.isGetter) listOf(PROPERTY_GETTER) else listOf(PROPERTY_SETTER)
|
listOf(LOCAL_VARIABLE)
|
||||||
is JetPackageDirective -> listOf(PACKAGE)
|
}
|
||||||
is JetTypeReference -> listOf(TYPE)
|
else if (annotated.parent is JetClassOrObject || annotated.parent is JetClassBody) {
|
||||||
is JetFile -> listOf(FILE)
|
listOf(MEMBER_PROPERTY, PROPERTY, FIELD)
|
||||||
is JetTypeParameter -> listOf(TYPE_PARAMETER)
|
}
|
||||||
is JetTypeProjection -> if (annotated.projectionKind == JetProjectionKind.STAR) listOf(STAR_PROJECTION) else listOf(TYPE_PROJECTION)
|
else {
|
||||||
is JetClassInitializer -> listOf(INITIALIZER)
|
listOf(TOP_LEVEL_PROPERTY, PROPERTY, FIELD)
|
||||||
else -> listOf()
|
}
|
||||||
|
is JetParameter -> if (annotated.hasValOrVar()) listOf(PROPERTY_PARAMETER, MEMBER_PROPERTY, PROPERTY, FIELD) else listOf(VALUE_PARAMETER)
|
||||||
|
is JetConstructor<*> -> listOf(CONSTRUCTOR)
|
||||||
|
is JetFunction ->
|
||||||
|
if (annotated.isLocal) {
|
||||||
|
listOf(LOCAL_FUNCTION, FUNCTION)
|
||||||
|
}
|
||||||
|
else if (annotated.parent is JetClassOrObject || annotated.parent is JetClassBody) {
|
||||||
|
listOf(MEMBER_FUNCTION, FUNCTION)
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
listOf(TOP_LEVEL_FUNCTION, FUNCTION)
|
||||||
|
}
|
||||||
|
is JetPropertyAccessor -> if (annotated.isGetter) listOf(PROPERTY_GETTER) else listOf(PROPERTY_SETTER)
|
||||||
|
is JetPackageDirective -> listOf(PACKAGE)
|
||||||
|
is JetTypeReference -> listOf(TYPE)
|
||||||
|
is JetFile -> listOf(FILE)
|
||||||
|
is JetTypeParameter -> listOf(TYPE_PARAMETER)
|
||||||
|
is JetTypeProjection -> if (annotated.projectionKind == JetProjectionKind.STAR) listOf(STAR_PROJECTION) else listOf(TYPE_PROJECTION)
|
||||||
|
is JetClassInitializer -> listOf(INITIALIZER)
|
||||||
|
else -> listOf()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -54,7 +54,7 @@ import static org.jetbrains.kotlin.types.TypeUtils.NO_EXPECTED_TYPE;
|
|||||||
|
|
||||||
public class BodyResolver {
|
public class BodyResolver {
|
||||||
@NotNull private final ScriptBodyResolver scriptBodyResolverResolver;
|
@NotNull private final ScriptBodyResolver scriptBodyResolverResolver;
|
||||||
@NotNull private final ModifiersChecker modifiersChecker;
|
@NotNull private final AnnotationChecker annotationChecker;
|
||||||
@NotNull private final ExpressionTypingServices expressionTypingServices;
|
@NotNull private final ExpressionTypingServices expressionTypingServices;
|
||||||
@NotNull private final CallResolver callResolver;
|
@NotNull private final CallResolver callResolver;
|
||||||
@NotNull private final ObservableBindingTrace trace;
|
@NotNull private final ObservableBindingTrace trace;
|
||||||
@@ -78,7 +78,7 @@ public class BodyResolver {
|
|||||||
@NotNull ScriptBodyResolver scriptBodyResolverResolver,
|
@NotNull ScriptBodyResolver scriptBodyResolverResolver,
|
||||||
@NotNull BindingTrace trace,
|
@NotNull BindingTrace trace,
|
||||||
@NotNull ValueParameterResolver valueParameterResolver,
|
@NotNull ValueParameterResolver valueParameterResolver,
|
||||||
@NotNull ModifiersChecker modifiersChecker
|
@NotNull AnnotationChecker annotationChecker
|
||||||
) {
|
) {
|
||||||
this.annotationResolver = annotationResolver;
|
this.annotationResolver = annotationResolver;
|
||||||
this.bodyResolveCache = bodyResolveCache;
|
this.bodyResolveCache = bodyResolveCache;
|
||||||
@@ -89,7 +89,7 @@ public class BodyResolver {
|
|||||||
this.expressionTypingServices = expressionTypingServices;
|
this.expressionTypingServices = expressionTypingServices;
|
||||||
this.functionAnalyzerExtension = functionAnalyzerExtension;
|
this.functionAnalyzerExtension = functionAnalyzerExtension;
|
||||||
this.scriptBodyResolverResolver = scriptBodyResolverResolver;
|
this.scriptBodyResolverResolver = scriptBodyResolverResolver;
|
||||||
this.modifiersChecker = modifiersChecker;
|
this.annotationChecker = annotationChecker;
|
||||||
this.trace = new ObservableBindingTrace(trace);
|
this.trace = new ObservableBindingTrace(trace);
|
||||||
this.valueParameterResolver = valueParameterResolver;
|
this.valueParameterResolver = valueParameterResolver;
|
||||||
}
|
}
|
||||||
@@ -507,7 +507,7 @@ public class BodyResolver {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void processModifiersOnInitializer(@NotNull JetModifierListOwner owner, @NotNull JetScope scope) {
|
private void processModifiersOnInitializer(@NotNull JetModifierListOwner owner, @NotNull JetScope scope) {
|
||||||
AnnotationChecker.INSTANCE$.check(owner, trace, null);
|
annotationChecker.check(owner, trace, null);
|
||||||
ModifierCheckerCore.INSTANCE$.check(owner, trace, null);
|
ModifierCheckerCore.INSTANCE$.check(owner, trace, null);
|
||||||
JetModifierList modifierList = owner.getModifierList();
|
JetModifierList modifierList = owner.getModifierList();
|
||||||
if (modifierList == null) return;
|
if (modifierList == null) return;
|
||||||
|
|||||||
@@ -47,21 +47,24 @@ public class DeclarationsChecker {
|
|||||||
@NotNull private final BindingTrace trace;
|
@NotNull private final BindingTrace trace;
|
||||||
@NotNull private final ModifiersChecker.ModifiersCheckingProcedure modifiersChecker;
|
@NotNull private final ModifiersChecker.ModifiersCheckingProcedure modifiersChecker;
|
||||||
@NotNull private final DescriptorResolver descriptorResolver;
|
@NotNull private final DescriptorResolver descriptorResolver;
|
||||||
|
@NotNull private final AnnotationChecker annotationChecker;
|
||||||
|
|
||||||
public DeclarationsChecker(
|
public DeclarationsChecker(
|
||||||
@NotNull DescriptorResolver descriptorResolver,
|
@NotNull DescriptorResolver descriptorResolver,
|
||||||
@NotNull ModifiersChecker modifiersChecker,
|
@NotNull ModifiersChecker modifiersChecker,
|
||||||
|
@NotNull AnnotationChecker annotationChecker,
|
||||||
@NotNull BindingTrace trace
|
@NotNull BindingTrace trace
|
||||||
) {
|
) {
|
||||||
this.descriptorResolver = descriptorResolver;
|
this.descriptorResolver = descriptorResolver;
|
||||||
this.modifiersChecker = modifiersChecker.withTrace(trace);
|
this.modifiersChecker = modifiersChecker.withTrace(trace);
|
||||||
|
this.annotationChecker = annotationChecker;
|
||||||
this.trace = trace;
|
this.trace = trace;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void process(@NotNull BodiesResolveContext bodiesResolveContext) {
|
public void process(@NotNull BodiesResolveContext bodiesResolveContext) {
|
||||||
for (JetFile file : bodiesResolveContext.getFiles()) {
|
for (JetFile file : bodiesResolveContext.getFiles()) {
|
||||||
checkModifiersAndAnnotationsInPackageDirective(file);
|
checkModifiersAndAnnotationsInPackageDirective(file);
|
||||||
AnnotationChecker.INSTANCE$.check(file, trace, null);
|
annotationChecker.check(file, trace, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
Map<JetClassOrObject, ClassDescriptorWithResolutionScopes> classes = bodiesResolveContext.getDeclaredClasses();
|
Map<JetClassOrObject, ClassDescriptorWithResolutionScopes> classes = bodiesResolveContext.getDeclaredClasses();
|
||||||
@@ -133,7 +136,7 @@ public class DeclarationsChecker {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
AnnotationChecker.INSTANCE$.check(packageDirective, trace, null);
|
annotationChecker.check(packageDirective, trace, null);
|
||||||
ModifierCheckerCore.INSTANCE$.check(packageDirective, trace, null);
|
ModifierCheckerCore.INSTANCE$.check(packageDirective, trace, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -279,7 +282,7 @@ public class DeclarationsChecker {
|
|||||||
if (typeParameter != null) {
|
if (typeParameter != null) {
|
||||||
DescriptorResolver.checkConflictingUpperBounds(trace, typeParameter, jetTypeParameter);
|
DescriptorResolver.checkConflictingUpperBounds(trace, typeParameter, jetTypeParameter);
|
||||||
}
|
}
|
||||||
AnnotationChecker.INSTANCE$.check(jetTypeParameter, trace, null);
|
annotationChecker.check(jetTypeParameter, trace, null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -192,7 +192,7 @@ public class ModifiersChecker {
|
|||||||
checkPlatformNameApplicability(descriptor);
|
checkPlatformNameApplicability(descriptor);
|
||||||
runDeclarationCheckers(modifierListOwner, descriptor);
|
runDeclarationCheckers(modifierListOwner, descriptor);
|
||||||
ClassDescriptor classDescriptor = descriptor instanceof ClassDescriptor ? (ClassDescriptor) descriptor : null;
|
ClassDescriptor classDescriptor = descriptor instanceof ClassDescriptor ? (ClassDescriptor) descriptor : null;
|
||||||
AnnotationChecker.INSTANCE$.check(modifierListOwner, trace, classDescriptor);
|
annotationChecker.check(modifierListOwner, trace, classDescriptor);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void checkModifiersForLocalDeclaration(
|
public void checkModifiersForLocalDeclaration(
|
||||||
@@ -201,7 +201,7 @@ public class ModifiersChecker {
|
|||||||
) {
|
) {
|
||||||
checkPlatformNameApplicability(descriptor);
|
checkPlatformNameApplicability(descriptor);
|
||||||
runDeclarationCheckers(modifierListOwner, descriptor);
|
runDeclarationCheckers(modifierListOwner, descriptor);
|
||||||
AnnotationChecker.INSTANCE$.check(modifierListOwner, trace,
|
annotationChecker.check(modifierListOwner, trace,
|
||||||
descriptor instanceof ClassDescriptor ? (ClassDescriptor) descriptor : null);
|
descriptor instanceof ClassDescriptor ? (ClassDescriptor) descriptor : null);
|
||||||
ModifierCheckerCore.INSTANCE$.check(modifierListOwner, trace, descriptor);
|
ModifierCheckerCore.INSTANCE$.check(modifierListOwner, trace, descriptor);
|
||||||
}
|
}
|
||||||
@@ -285,10 +285,14 @@ public class ModifiersChecker {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
private final AnnotationChecker annotationChecker;
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
private final Iterable<DeclarationChecker> declarationCheckers;
|
private final Iterable<DeclarationChecker> declarationCheckers;
|
||||||
|
|
||||||
public ModifiersChecker(@NotNull Iterable<DeclarationChecker> declarationCheckers) {
|
public ModifiersChecker(@NotNull AnnotationChecker annotationChecker, @NotNull Iterable<DeclarationChecker> declarationCheckers) {
|
||||||
|
this.annotationChecker = annotationChecker;
|
||||||
this.declarationCheckers = declarationCheckers;
|
this.declarationCheckers = declarationCheckers;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ public abstract class TargetPlatform(
|
|||||||
public abstract val platformConfigurator: PlatformConfigurator
|
public abstract val platformConfigurator: PlatformConfigurator
|
||||||
|
|
||||||
public object Default : TargetPlatform("Default") {
|
public object Default : TargetPlatform("Default") {
|
||||||
override val platformConfigurator = PlatformConfigurator(DynamicTypesSettings(), listOf(), listOf(), listOf(), listOf())
|
override val platformConfigurator = PlatformConfigurator(DynamicTypesSettings(), listOf(), listOf(), listOf(), listOf(), listOf())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -49,7 +49,7 @@ public open class PlatformConfigurator(
|
|||||||
additionalCallCheckers: List<CallChecker>,
|
additionalCallCheckers: List<CallChecker>,
|
||||||
additionalTypeCheckers: List<AdditionalTypeChecker>,
|
additionalTypeCheckers: List<AdditionalTypeChecker>,
|
||||||
additionalSymbolUsageValidators: List<SymbolUsageValidator>,
|
additionalSymbolUsageValidators: List<SymbolUsageValidator>,
|
||||||
private val additionalAnnotationChecker: AdditionalAnnotationChecker? = null
|
private val additionalAnnotationCheckers: List<AdditionalAnnotationChecker>
|
||||||
) {
|
) {
|
||||||
|
|
||||||
private val declarationCheckers: List<DeclarationChecker> = DEFAULT_DECLARATION_CHECKERS + additionalDeclarationCheckers
|
private val declarationCheckers: List<DeclarationChecker> = DEFAULT_DECLARATION_CHECKERS + additionalDeclarationCheckers
|
||||||
@@ -64,7 +64,7 @@ public open class PlatformConfigurator(
|
|||||||
callCheckers.forEach { useInstance(it) }
|
callCheckers.forEach { useInstance(it) }
|
||||||
typeCheckers.forEach { useInstance(it) }
|
typeCheckers.forEach { useInstance(it) }
|
||||||
useInstance(symbolUsageValidator)
|
useInstance(symbolUsageValidator)
|
||||||
|
additionalAnnotationCheckers.forEach { useInstance(it) }
|
||||||
}
|
}
|
||||||
AnnotationChecker.additionalChecker = additionalAnnotationChecker
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+6
-2
@@ -49,14 +49,17 @@ public class ExpressionTypingServices {
|
|||||||
private final ExpressionTypingFacade expressionTypingFacade;
|
private final ExpressionTypingFacade expressionTypingFacade;
|
||||||
private final ExpressionTypingComponents expressionTypingComponents;
|
private final ExpressionTypingComponents expressionTypingComponents;
|
||||||
|
|
||||||
|
@NotNull AnnotationChecker annotationChecker;
|
||||||
@NotNull private final StatementFilter statementFilter;
|
@NotNull private final StatementFilter statementFilter;
|
||||||
|
|
||||||
public ExpressionTypingServices(
|
public ExpressionTypingServices(
|
||||||
@NotNull ExpressionTypingComponents components,
|
@NotNull ExpressionTypingComponents components,
|
||||||
|
@NotNull AnnotationChecker annotationChecker,
|
||||||
@NotNull StatementFilter statementFilter,
|
@NotNull StatementFilter statementFilter,
|
||||||
@NotNull ExpressionTypingVisitorDispatcher.ForDeclarations facade
|
@NotNull ExpressionTypingVisitorDispatcher.ForDeclarations facade
|
||||||
) {
|
) {
|
||||||
this.expressionTypingComponents = components;
|
this.expressionTypingComponents = components;
|
||||||
|
this.annotationChecker = annotationChecker;
|
||||||
this.statementFilter = statementFilter;
|
this.statementFilter = statementFilter;
|
||||||
this.expressionTypingFacade = facade;
|
this.expressionTypingFacade = facade;
|
||||||
}
|
}
|
||||||
@@ -227,7 +230,8 @@ public class ExpressionTypingServices {
|
|||||||
return TypeInfoFactoryPackage.createTypeInfo(expressionTypingComponents.builtIns.getUnitType(), context);
|
return TypeInfoFactoryPackage.createTypeInfo(expressionTypingComponents.builtIns.getUnitType(), context);
|
||||||
}
|
}
|
||||||
|
|
||||||
ExpressionTypingInternals blockLevelVisitor = new ExpressionTypingVisitorDispatcher.ForBlock(expressionTypingComponents, scope);
|
ExpressionTypingInternals blockLevelVisitor = new ExpressionTypingVisitorDispatcher.ForBlock(
|
||||||
|
expressionTypingComponents, annotationChecker, scope);
|
||||||
ExpressionTypingContext newContext = context.replaceScope(scope).replaceExpectedType(NO_EXPECTED_TYPE);
|
ExpressionTypingContext newContext = context.replaceScope(scope).replaceExpectedType(NO_EXPECTED_TYPE);
|
||||||
|
|
||||||
JetTypeInfo result = TypeInfoFactoryPackage.noTypeInfo(context);
|
JetTypeInfo result = TypeInfoFactoryPackage.noTypeInfo(context);
|
||||||
@@ -260,7 +264,7 @@ public class ExpressionTypingServices {
|
|||||||
newContext = newContext.replaceDataFlowInfo(newDataFlowInfo);
|
newContext = newContext.replaceDataFlowInfo(newDataFlowInfo);
|
||||||
// We take current data flow info if jump there is not possible
|
// We take current data flow info if jump there is not possible
|
||||||
}
|
}
|
||||||
blockLevelVisitor = new ExpressionTypingVisitorDispatcher.ForBlock(expressionTypingComponents, scope);
|
blockLevelVisitor = new ExpressionTypingVisitorDispatcher.ForBlock(expressionTypingComponents, annotationChecker, scope);
|
||||||
}
|
}
|
||||||
return result.replaceJumpOutPossible(jumpOutPossible).replaceJumpFlowInfo(beforeJumpInfo);
|
return result.replaceJumpOutPossible(jumpOutPossible).replaceJumpFlowInfo(beforeJumpInfo);
|
||||||
}
|
}
|
||||||
|
|||||||
+9
-5
@@ -46,8 +46,8 @@ public abstract class ExpressionTypingVisitorDispatcher extends JetVisitor<JetTy
|
|||||||
private static final Logger LOG = Logger.getInstance(ExpressionTypingVisitor.class);
|
private static final Logger LOG = Logger.getInstance(ExpressionTypingVisitor.class);
|
||||||
|
|
||||||
public static class ForDeclarations extends ExpressionTypingVisitorDispatcher {
|
public static class ForDeclarations extends ExpressionTypingVisitorDispatcher {
|
||||||
public ForDeclarations(@NotNull ExpressionTypingComponents components) {
|
public ForDeclarations(@NotNull ExpressionTypingComponents components, @NotNull AnnotationChecker annotationChecker) {
|
||||||
super(components);
|
super(components, annotationChecker);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -64,9 +64,10 @@ public abstract class ExpressionTypingVisitorDispatcher extends JetVisitor<JetTy
|
|||||||
|
|
||||||
public ForBlock(
|
public ForBlock(
|
||||||
@NotNull ExpressionTypingComponents components,
|
@NotNull ExpressionTypingComponents components,
|
||||||
|
@NotNull AnnotationChecker annotationChecker,
|
||||||
@NotNull WritableScope writableScope
|
@NotNull WritableScope writableScope
|
||||||
) {
|
) {
|
||||||
super(components);
|
super(components, annotationChecker);
|
||||||
this.visitorForBlock = new ExpressionTypingVisitorForStatements(
|
this.visitorForBlock = new ExpressionTypingVisitorForStatements(
|
||||||
this, writableScope, basic, controlStructures, patterns, functions
|
this, writableScope, basic, controlStructures, patterns, functions
|
||||||
);
|
);
|
||||||
@@ -79,15 +80,18 @@ public abstract class ExpressionTypingVisitorDispatcher extends JetVisitor<JetTy
|
|||||||
}
|
}
|
||||||
|
|
||||||
private final ExpressionTypingComponents components;
|
private final ExpressionTypingComponents components;
|
||||||
|
@NotNull private final AnnotationChecker annotationChecker;
|
||||||
protected final BasicExpressionTypingVisitor basic;
|
protected final BasicExpressionTypingVisitor basic;
|
||||||
protected final FunctionsTypingVisitor functions;
|
protected final FunctionsTypingVisitor functions;
|
||||||
protected final ControlStructureTypingVisitor controlStructures;
|
protected final ControlStructureTypingVisitor controlStructures;
|
||||||
protected final PatternMatchingTypingVisitor patterns;
|
protected final PatternMatchingTypingVisitor patterns;
|
||||||
|
|
||||||
private ExpressionTypingVisitorDispatcher(
|
private ExpressionTypingVisitorDispatcher(
|
||||||
@NotNull ExpressionTypingComponents components
|
@NotNull ExpressionTypingComponents components,
|
||||||
|
@NotNull AnnotationChecker annotationChecker
|
||||||
) {
|
) {
|
||||||
this.components = components;
|
this.components = components;
|
||||||
|
this.annotationChecker = annotationChecker;
|
||||||
this.basic = new BasicExpressionTypingVisitor(this);
|
this.basic = new BasicExpressionTypingVisitor(this);
|
||||||
this.controlStructures = new ControlStructureTypingVisitor(this);
|
this.controlStructures = new ControlStructureTypingVisitor(this);
|
||||||
this.patterns = new PatternMatchingTypingVisitor(this);
|
this.patterns = new PatternMatchingTypingVisitor(this);
|
||||||
@@ -128,7 +132,7 @@ public abstract class ExpressionTypingVisitorDispatcher extends JetVisitor<JetTy
|
|||||||
@NotNull
|
@NotNull
|
||||||
public final JetTypeInfo getTypeInfo(@NotNull JetExpression expression, ExpressionTypingContext context) {
|
public final JetTypeInfo getTypeInfo(@NotNull JetExpression expression, ExpressionTypingContext context) {
|
||||||
JetTypeInfo result = getTypeInfo(expression, context, this);
|
JetTypeInfo result = getTypeInfo(expression, context, this);
|
||||||
AnnotationChecker.INSTANCE$.checkExpression(expression, context.trace);
|
annotationChecker.checkExpression(expression, context.trace);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,8 @@ public object JsPlatformConfigurator : PlatformConfigurator(
|
|||||||
additionalDeclarationCheckers = listOf(NativeInvokeChecker(), NativeGetterChecker(), NativeSetterChecker(), ClassDeclarationChecker()),
|
additionalDeclarationCheckers = listOf(NativeInvokeChecker(), NativeGetterChecker(), NativeSetterChecker(), ClassDeclarationChecker()),
|
||||||
additionalCallCheckers = listOf(),
|
additionalCallCheckers = listOf(),
|
||||||
additionalTypeCheckers = listOf(),
|
additionalTypeCheckers = listOf(),
|
||||||
additionalSymbolUsageValidators = listOf()
|
additionalSymbolUsageValidators = listOf(),
|
||||||
|
additionalAnnotationCheckers = listOf()
|
||||||
) {
|
) {
|
||||||
override fun configure(container: StorageComponentContainer) {
|
override fun configure(container: StorageComponentContainer) {
|
||||||
super.configure(container)
|
super.configure(container)
|
||||||
|
|||||||
Reference in New Issue
Block a user