JET-114 Do not allow an anonymous initializer on the same line after 'get' of a property

+
'Toggle Error Reporting' Action
This commit is contained in:
Andrey Breslav
2011-06-17 21:20:05 +04:00
parent 35ee989a70
commit 2c5c92c728
6 changed files with 122 additions and 40 deletions
+5
View File
@@ -19,6 +19,11 @@
<keyboard-shortcut keymap="$default" first-keystroke="control shift Q"/> <keyboard-shortcut keymap="$default" first-keystroke="control shift Q"/>
<add-to-group group-id="CodeMenu" anchor="last"/> <add-to-group group-id="CodeMenu" anchor="last"/>
</action> </action>
<action id="ToggleJetErrorReporting" class="org.jetbrains.jet.plugin.actions.ToggleErrorReportingAction"
text="Toggle Error Reporting">
<keyboard-shortcut keymap="$default" first-keystroke="control alt shift E"/>
<add-to-group group-id="CodeMenu" anchor="last"/>
</action>
</actions> </actions>
<extensions defaultExtensionNs="com.intellij"> <extensions defaultExtensionNs="com.intellij">
@@ -818,21 +818,36 @@ public class JetParsing extends AbstractJetParsing {
parseTypeRef(); parseTypeRef();
} }
if (local) {
if (at(EQ)) { if (at(EQ)) {
advance(); // EQ advance(); // EQ
myExpressionParsing.parseExpression(); myExpressionParsing.parseExpression();
if (!local) {
consumeIf(SEMICOLON);
} else {
// "val a = 1; b" must not be an infix call of b on "val ...;" // "val a = 1; b" must not be an infix call of b on "val ...;"
} }
} }
if (!local) { else {
if (at(EQ)) {
advance(); // EQ
myExpressionParsing.parseExpression();
consumeIf(SEMICOLON);
}
if (parsePropertyGetterOrSetter()) { if (parsePropertyGetterOrSetter()) {
parsePropertyGetterOrSetter(); parsePropertyGetterOrSetter();
} }
if (!atSet(EOL_OR_SEMICOLON, RBRACE)) {
int i = -1;
while (-i < myBuilder.getCurrentOffset() && WHITE_SPACE_OR_COMMENT_BIT_SET.contains(myBuilder.rawLookup(i))) {
i--;
}
if (myBuilder.rawLookup(i) != SEMICOLON) {
errorUntil("Property getter or setter expected", TokenSet.create(EOL_OR_SEMICOLON));
}
}
else {
consumeIf(SEMICOLON); consumeIf(SEMICOLON);
} }
}
return PROPERTY; return PROPERTY;
@@ -862,9 +877,16 @@ public class JetParsing extends AbstractJetParsing {
advance(); // GET_KEYWORD or SET_KEYWORD advance(); // GET_KEYWORD or SET_KEYWORD
if (!at(LPAR)) { if (!at(LPAR)) {
// Account for Jet-114 (val a : int get {...})
TokenSet ACCESSOR_FIRST_OR_PROPERTY_END = TokenSet.orSet(MODIFIER_KEYWORDS, TokenSet.create(LBRACKET, GET_KEYWORD, SET_KEYWORD, EOL_OR_SEMICOLON, RBRACE));
if (!atSet(ACCESSOR_FIRST_OR_PROPERTY_END)) {
errorUntil("Accessor body expected", TokenSet.orSet(ACCESSOR_FIRST_OR_PROPERTY_END, TokenSet.create(LBRACE, LPAR, EQ)));
}
else {
getterOrSetter.done(PROPERTY_ACCESSOR); getterOrSetter.done(PROPERTY_ACCESSOR);
return true; return true;
} }
}
myBuilder.disableNewlines(); myBuilder.disableNewlines();
expect(LPAR, "Expecting '('", TokenSet.create(RPAR, IDENTIFIER, COLON, LBRACE, EQ)); expect(LPAR, "Expecting '('", TokenSet.create(RPAR, IDENTIFIER, COLON, LBRACE, EQ));
@@ -0,0 +1,15 @@
package org.jetbrains.jet.plugin.actions;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import org.jetbrains.jet.plugin.annotations.JetPsiChecker;
/**
* @author yole
*/
public class ToggleErrorReportingAction extends AnAction {
@Override
public void actionPerformed(AnActionEvent e) {
JetPsiChecker.setErrorReportingEnabled(!JetPsiChecker.isErrorReportingEnabled());
}
}
@@ -28,6 +28,16 @@ import java.util.Set;
*/ */
public class JetPsiChecker implements Annotator { public class JetPsiChecker implements Annotator {
private static volatile boolean errorReportingEnabled = true;
public static void setErrorReportingEnabled(boolean value) {
errorReportingEnabled = value;
}
public static boolean isErrorReportingEnabled() {
return errorReportingEnabled;
}
@Override @Override
public void annotate(@NotNull PsiElement element, @NotNull final AnnotationHolder holder) { public void annotate(@NotNull PsiElement element, @NotNull final AnnotationHolder holder) {
if (element instanceof JetFile) { if (element instanceof JetFile) {
@@ -85,7 +95,9 @@ public class JetPsiChecker implements Annotator {
} }
}; };
if (errorReportingEnabled) {
AnalyzingUtils.applyHandler(errorHandler, bindingContext); AnalyzingUtils.applyHandler(errorHandler, bindingContext);
}
highlightBackingFields(holder, file, bindingContext); highlightBackingFields(holder, file, bindingContext);
@@ -0,0 +1,26 @@
class Foo() {
val a : Int get = 1
var b : Int get() = 1; set
var b1 : Int get() = 1; set {1}
val b2 : Int get
{
}
val b3 : Int get {
return 1
}
val b4 : Int get; {
}
var b5 : Int get abstract set
var b6 : Int get [a] abstract set
var b7 : Int get [a] abstract {}
}
class PublicVar() { public var foo = 0; }
class PublicVar() { public var foo = 0; var x : Int }
class PublicVar() { public var foo = 0 }
class PublicVar() { public var foo get set }
class PublicVar() { public var foo get set }
val now: Long get() = System.currentTimeMillis(); fun foo() = now
+14 -12
View File
@@ -6,9 +6,8 @@ JetFile: Properties_ERR.jet
PsiErrorElement:Expecting property name or receiver type PsiErrorElement:Expecting property name or receiver type
PsiElement(MINUS)('-') PsiElement(MINUS)('-')
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
PsiErrorElement:Expecting namespace or top level declaration PsiErrorElement:Property getter or setter expected
PsiElement(LBRACE)('{') PsiElement(LBRACE)('{')
PsiErrorElement:Expecting namespace or top level declaration
PsiElement(RBRACE)('}') PsiElement(RBRACE)('}')
PsiWhiteSpace('\n') PsiWhiteSpace('\n')
PROPERTY PROPERTY
@@ -16,9 +15,8 @@ JetFile: Properties_ERR.jet
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
PsiElement(IDENTIFIER)('f') PsiElement(IDENTIFIER)('f')
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
PsiErrorElement:Expecting namespace or top level declaration PsiErrorElement:Property getter or setter expected
PsiElement(LBRACE)('{') PsiElement(LBRACE)('{')
PsiErrorElement:Expecting namespace or top level declaration
PsiElement(RBRACE)('}') PsiElement(RBRACE)('}')
PsiWhiteSpace('\n') PsiWhiteSpace('\n')
PROPERTY PROPERTY
@@ -70,7 +68,7 @@ JetFile: Properties_ERR.jet
PsiElement(IDENTIFIER)('foo') PsiElement(IDENTIFIER)('foo')
PsiElement(DOT)('.') PsiElement(DOT)('.')
PsiElement(IDENTIFIER)('bar') PsiElement(IDENTIFIER)('bar')
PsiErrorElement:Expecting namespace or top level declaration PsiErrorElement:Property getter or setter expected
PsiElement(DOT)('.') PsiElement(DOT)('.')
PsiWhiteSpace('\n') PsiWhiteSpace('\n')
PROPERTY PROPERTY
@@ -167,12 +165,19 @@ JetFile: Properties_ERR.jet
PsiWhiteSpace('\n ') PsiWhiteSpace('\n ')
PROPERTY_ACCESSOR PROPERTY_ACCESSOR
PsiElement(set)('set') PsiElement(set)('set')
PsiErrorElement:Expecting namespace or top level declaration PsiErrorElement:Accessor body expected
PsiElement(RPAR)(')') PsiElement(RPAR)(')')
PsiErrorElement:Expecting '('
<empty list>
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
PsiErrorElement:Expecting namespace or top level declaration VALUE_PARAMETER_LIST
VALUE_PARAMETER
PsiErrorElement:Expecting parameter name
<empty list>
PsiErrorElement:Expecting ')'
<empty list>
BLOCK
PsiElement(LBRACE)('{') PsiElement(LBRACE)('{')
PsiErrorElement:Expecting namespace or top level declaration
PsiElement(RBRACE)('}') PsiElement(RBRACE)('}')
PsiWhiteSpace('\n ') PsiWhiteSpace('\n ')
PsiErrorElement:Expecting namespace or top level declaration PsiErrorElement:Expecting namespace or top level declaration
@@ -266,15 +271,12 @@ JetFile: Properties_ERR.jet
PsiElement(IDENTIFIER)('f') PsiElement(IDENTIFIER)('f')
PsiElement(DOT)('.') PsiElement(DOT)('.')
PsiElement(IDENTIFIER)('d') PsiElement(IDENTIFIER)('d')
PsiErrorElement:Expecting namespace or top level declaration PsiErrorElement:Property getter or setter expected
PsiElement(DOT)('.') PsiElement(DOT)('.')
PsiErrorElement:Expecting namespace or top level declaration
PsiElement(MINUS)('-') PsiElement(MINUS)('-')
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
PsiErrorElement:Expecting namespace or top level declaration
PsiElement(EQ)('=') PsiElement(EQ)('=')
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
PsiErrorElement:Expecting namespace or top level declaration
PsiElement(IDENTIFIER)('f') PsiElement(IDENTIFIER)('f')
PsiWhiteSpace('\n\n') PsiWhiteSpace('\n\n')
PROPERTY PROPERTY