Add warning for initializers with obsolete syntax

Expected 'init' keyword before class initializer
This commit is contained in:
Denis Zharkov
2015-02-18 12:05:26 +03:00
parent 0dc155d8c9
commit f07566d30d
61 changed files with 175 additions and 131 deletions
@@ -159,6 +159,7 @@ public interface Errors {
DiagnosticFactory0<JetSecondaryConstructor> SECONDARY_CONSTRUCTOR_IN_OBJECT = DiagnosticFactory0.create(ERROR);
DiagnosticFactory0<JetDelegatorToSuperCall> SUPERTYPE_INITIALIZED_WITHOUT_PRIMARY_CONSTRUCTOR = DiagnosticFactory0.create(ERROR);
DiagnosticFactory0<JetConstructorDelegationCall> PRIMARY_CONSTRUCTOR_DELEGATION_CALL_EXPECTED = DiagnosticFactory0.create(ERROR);
DiagnosticFactory0<PsiElement> INIT_KEYWORD_BEFORE_CLASS_INITIALIZER_EXPECTED = DiagnosticFactory0.create(WARNING);
// Trait-specific
@@ -418,6 +418,8 @@ public class DefaultErrorMessages {
MAP.put(SUPERTYPE_INITIALIZED_WITHOUT_PRIMARY_CONSTRUCTOR, "Supertype initialization is impossible without primary constructor");
MAP.put(PRIMARY_CONSTRUCTOR_DELEGATION_CALL_EXPECTED, "Primary constructor call expected");
MAP.put(INIT_KEYWORD_BEFORE_CLASS_INITIALIZER_EXPECTED, "Expecting 'init' keyword before class initializer");
MAP.put(ILLEGAL_SELECTOR, "Expression ''{0}'' cannot be a selector (occur after a dot)", STRING);
MAP.put(NO_TAIL_CALLS_FOUND, "A function is marked as tail-recursive but no tail calls are found");
@@ -20,6 +20,7 @@ import com.intellij.lang.ASTNode;
import com.intellij.psi.PsiElement;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.kotlin.lexer.JetTokens;
import org.jetbrains.kotlin.psi.stubs.KotlinPlaceHolderStub;
import org.jetbrains.kotlin.psi.stubs.elements.JetStubElementTypes;
@@ -49,4 +50,14 @@ public class JetClassInitializer extends JetDeclarationStub<KotlinPlaceHolderStu
JetExpression body = getBody();
return (body instanceof JetBlockExpression) ? ((JetBlockExpression) body).getLBrace() : null;
}
@NotNull
public PsiElement getOpenBraceNodeOrSelf() {
PsiElement result = getOpenBraceNode();
return result != null ? result : this;
}
public boolean hasInitKeyword() {
return findChildByType(JetTokens.INIT_KEYWORD) != null;
}
}
@@ -451,6 +451,10 @@ public class BodyResolver {
@NotNull JetClassInitializer anonymousInitializer,
@NotNull ClassDescriptorWithResolutionScopes classDescriptor
) {
if (!anonymousInitializer.hasInitKeyword()) {
trace.report(INIT_KEYWORD_BEFORE_CLASS_INITIALIZER_EXPECTED.on(anonymousInitializer.getOpenBraceNodeOrSelf()));
}
JetScope scopeForInitializers = classDescriptor.getScopeForInitializerResolution();
if (!classDescriptor.getConstructors().isEmpty()) {
expressionTypingServices.getType(scopeForInitializers, anonymousInitializer.getBody(), NO_EXPECTED_TYPE, c.getOuterDataFlowInfo(), trace);