Added inline annotation check on local funs
This commit is contained in:
@@ -59,6 +59,7 @@ import org.jetbrains.jet.lang.resolve.calls.CallCompleter;
|
||||
import org.jetbrains.jet.lang.resolve.calls.CandidateResolver;
|
||||
import org.jetbrains.jet.lang.resolve.ControlFlowAnalyzer;
|
||||
import org.jetbrains.jet.lang.resolve.DeclarationsChecker;
|
||||
import org.jetbrains.jet.lang.resolve.ModifiersChecker;
|
||||
import org.jetbrains.jet.lang.resolve.FunctionAnalyzerExtension;
|
||||
import org.jetbrains.jet.lang.resolve.ScriptBodyResolver;
|
||||
import org.jetbrains.jet.lang.resolve.DeclarationResolver;
|
||||
@@ -125,6 +126,7 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly
|
||||
private final CandidateResolver candidateResolver;
|
||||
private final ControlFlowAnalyzer controlFlowAnalyzer;
|
||||
private final DeclarationsChecker declarationsChecker;
|
||||
private final ModifiersChecker modifiersChecker;
|
||||
private final FunctionAnalyzerExtension functionAnalyzerExtension;
|
||||
private final ScriptBodyResolver scriptBodyResolver;
|
||||
private final DeclarationResolver declarationResolver;
|
||||
@@ -197,6 +199,7 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly
|
||||
this.callCompleter = new CallCompleter(argumentTypeResolver, candidateResolver);
|
||||
this.controlFlowAnalyzer = new ControlFlowAnalyzer();
|
||||
this.declarationsChecker = new DeclarationsChecker();
|
||||
this.modifiersChecker = new ModifiersChecker(bindingTrace, additionalCheckerProvider);
|
||||
this.functionAnalyzerExtension = new FunctionAnalyzerExtension();
|
||||
this.scriptBodyResolver = new ScriptBodyResolver();
|
||||
this.declarationResolver = new DeclarationResolver();
|
||||
@@ -309,6 +312,7 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly
|
||||
|
||||
declarationsChecker.setAdditionalCheckerProvider(additionalCheckerProvider);
|
||||
declarationsChecker.setDescriptorResolver(descriptorResolver);
|
||||
declarationsChecker.setModifiersChecker(modifiersChecker);
|
||||
declarationsChecker.setTrace(bindingTrace);
|
||||
|
||||
functionAnalyzerExtension.setTrace(bindingTrace);
|
||||
|
||||
+21
-3
@@ -29,21 +29,39 @@ import org.jetbrains.jet.lexer.JetTokens
|
||||
import org.jetbrains.jet.lang.psi.JetProperty
|
||||
import org.jetbrains.jet.lang.descriptors.PropertyDescriptor
|
||||
import org.jetbrains.jet.lang.diagnostics.DiagnosticSink
|
||||
import org.jetbrains.jet.lang.descriptors.Visibilities
|
||||
import org.jetbrains.jet.lang.resolve.annotations.hasInlineAnnotation
|
||||
import org.jetbrains.jet.lang.descriptors.SimpleFunctionDescriptor
|
||||
import org.jetbrains.jet.lang.descriptors.FunctionDescriptor
|
||||
import org.jetbrains.jet.lang.diagnostics.Errors
|
||||
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor
|
||||
|
||||
public object JavaDeclarationCheckerProvider : AdditionalCheckerProvider {
|
||||
|
||||
override val annotationCheckers: List<AnnotationChecker> = listOf(PlatformStaticAnnotationChecker())
|
||||
override val annotationCheckers: List<AnnotationChecker> = listOf(PlatformStaticAnnotationChecker(), LocalFunInlineChecker())
|
||||
}
|
||||
|
||||
public class LocalFunInlineChecker : AnnotationChecker {
|
||||
|
||||
override fun check(declaration: JetDeclaration, descriptor: DeclarationDescriptor, diagnosticHolder: DiagnosticSink) {
|
||||
if (descriptor.hasInlineAnnotation() &&
|
||||
declaration is JetNamedFunction &&
|
||||
descriptor is FunctionDescriptor &&
|
||||
descriptor.getVisibility() == Visibilities.LOCAL) {
|
||||
diagnosticHolder.report(Errors.NOT_YET_SUPPORTED_IN_INLINE.on(declaration, declaration, descriptor))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public class PlatformStaticAnnotationChecker : AnnotationChecker {
|
||||
|
||||
override fun check(declaration: JetDeclaration, descriptor: MemberDescriptor, diagnosticHolder: DiagnosticSink) {
|
||||
override fun check(declaration: JetDeclaration, descriptor: DeclarationDescriptor, diagnosticHolder: DiagnosticSink) {
|
||||
if (descriptor.hasPlatformStaticAnnotation()) {
|
||||
if (declaration is JetNamedFunction) {
|
||||
val insideObject = DescriptorUtils.containerKindIs(descriptor, ClassKind.OBJECT)
|
||||
val insideClassObject = DescriptorUtils.containerKindIs(descriptor, ClassKind.CLASS_OBJECT)
|
||||
|
||||
if (!insideObject && !(insideClassObject && DescriptorUtils.containerKindIs(descriptor.getContainingDeclaration(), ClassKind.CLASS))) {
|
||||
if (!insideObject && !(insideClassObject && DescriptorUtils.containerKindIs(descriptor.getContainingDeclaration()!!, ClassKind.CLASS))) {
|
||||
diagnosticHolder.report(ErrorsJvm.PLATFORM_STATIC_NOT_IN_OBJECT.on(declaration, descriptor));
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user