A bug caused by side-effects in assertions fixed. A new test (checks the code for suspicious asserts) added.
This commit is contained in:
Generated
+1
@@ -3,6 +3,7 @@
|
||||
<component name="CodeStyleSettingsManager">
|
||||
<option name="PER_PROJECT_SETTINGS">
|
||||
<value>
|
||||
<option name="LINE_SEPARATOR" value=" " />
|
||||
<option name="ELSE_ON_NEW_LINE" value="true" />
|
||||
<option name="ALIGN_GROUP_FIELD_DECLARATIONS" value="true" />
|
||||
<option name="IF_BRACE_FORCE" value="1" />
|
||||
|
||||
@@ -23,7 +23,7 @@ class Example(a : Foo, i : Int) : Bar(i), Some {
|
||||
var y : Double = 7.0d
|
||||
var z : String = "SDfsdf" {
|
||||
get() = $z + "sdfsd"
|
||||
private set(s : String) { $z = s } // TODO: allow to omit the type here?
|
||||
private set(s : String) { $z = s }
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
@@ -139,7 +139,7 @@ equalityOperation
|
||||
|
||||
assignmentOperator
|
||||
: "="
|
||||
: "+=" : "-=" : "*=" : "/=" : "%="// TODO: |=, %= and <<= make more sense than |, % or << alone, and so for others
|
||||
: "+=" : "-=" : "*=" : "/=" : "%="
|
||||
;
|
||||
|
||||
unOpExpression
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
matchEntry
|
||||
: attributes "case" pattern ("if" "(" expression ")")? "=>" expression SEMI? // TODO: Consider other options than "=>"
|
||||
: attributes "case" pattern ("if" "(" expression ")")? "=>" expression SEMI?
|
||||
;
|
||||
|
||||
pattern
|
||||
|
||||
@@ -24,7 +24,6 @@ memberModifier
|
||||
: "override"
|
||||
: "virtual"
|
||||
: "abstract"
|
||||
: // TODO: inline
|
||||
;
|
||||
|
||||
accessModifier
|
||||
|
||||
@@ -12,104 +12,104 @@ import org.jetbrains.jet.lang.psi.*;
|
||||
public interface JetNodeTypes {
|
||||
IFileElementType JET_FILE = new IFileElementType(JetLanguage.INSTANCE);
|
||||
|
||||
JetNodeType NAMESPACE = new JetNodeType("NAMESPACE", JetNamespace.class);
|
||||
JetNodeType CLASS = new JetNodeType("CLASS", JetClass.class);
|
||||
JetNodeType PROPERTY = new JetNodeType("PROPERTY", JetProperty.class);
|
||||
JetNodeType FUN = new JetNodeType("FUN", JetFunction.class);
|
||||
JetNodeType EXTENSION = new JetNodeType("EXTENSION", JetExtension.class);
|
||||
JetNodeType TYPEDEF = new JetNodeType("TYPEDEF", JetTypedef.class);
|
||||
JetNodeType NAMESPACE = new JetNodeType("NAMESPACE", JetNamespace.class);
|
||||
JetNodeType CLASS = new JetNodeType("CLASS", JetClass.class);
|
||||
JetNodeType PROPERTY = new JetNodeType("PROPERTY", JetProperty.class);
|
||||
JetNodeType FUN = new JetNodeType("FUN", JetFunction.class);
|
||||
JetNodeType EXTENSION = new JetNodeType("EXTENSION", JetExtension.class);
|
||||
JetNodeType TYPEDEF = new JetNodeType("TYPEDEF", JetTypedef.class);
|
||||
JetNodeType DECOMPOSER = new JetNodeType("DECOMPOSER", JetDecomposer.class);
|
||||
|
||||
JetNodeType CLASS_OBJECT = new JetNodeType("CLASS_OBJECT", JetClassObject.class);
|
||||
JetNodeType CONSTRUCTOR = new JetNodeType("CONSTRUCTOR", JetConstructor.class);
|
||||
JetNodeType CONSTRUCTOR = new JetNodeType("CONSTRUCTOR", JetConstructor.class);
|
||||
|
||||
TokenSet DECLARATIONS = TokenSet.create(
|
||||
NAMESPACE, CLASS, PROPERTY, FUN, EXTENSION,
|
||||
TYPEDEF, DECOMPOSER, CLASS_OBJECT, CONSTRUCTOR);
|
||||
|
||||
JetNodeType TYPE_PARAMETER_LIST = new JetNodeType("TYPE_PARAMETER_LIST");
|
||||
JetNodeType TYPE_PARAMETER = new JetNodeType("TYPE_PARAMETER");
|
||||
JetNodeType TYPE_PARAMETER_LIST = new JetNodeType("TYPE_PARAMETER_LIST");
|
||||
JetNodeType TYPE_PARAMETER = new JetNodeType("TYPE_PARAMETER");
|
||||
JetNodeType PRIMARY_CONSTRUCTOR_PARAMETERS_LIST = new JetNodeType("PRIMARY_CONSTRUCTOR_PARAMETERS_LIST");
|
||||
JetNodeType PRIMARY_CONSTRUCTOR_PARAMETER = new JetNodeType("PRIMARY_CONSTRUCTOR_PARAMETER");
|
||||
JetNodeType DELEGATION_SPECIFIER_LIST = new JetNodeType("DELEGATION_SPECIFIER_LIST");
|
||||
JetNodeType DELEGATION_SPECIFIER = new JetNodeType("DELEGATION_SPECIFIER");
|
||||
JetNodeType DELEGATOR_BY = new JetNodeType("DELEGATOR_BY");
|
||||
JetNodeType DELEGATOR_SUPER_CALL = new JetNodeType("DELEGATOR_SUPER_CALL");
|
||||
JetNodeType DELEGATOR_SUPER_CLASS = new JetNodeType("DELEGATOR_SUPER_CLASS");
|
||||
JetNodeType VALUE_PARAMETER_LIST = new JetNodeType("VALUE_PARAMETER_LIST");
|
||||
JetNodeType NAMED_ARGUMENT = new JetNodeType("NAMED_ARGUMENT");
|
||||
JetNodeType CLASS_BODY = new JetNodeType("CLASS_BODY", JetClassBody.class);
|
||||
JetNodeType IMPORT_DIRECTIVE = new JetNodeType("IMPORT_DIRECTIVE", JetImportDirective.class);
|
||||
JetNodeType IMPORTED = new JetNodeType("IMPORTED");
|
||||
JetNodeType NAMESPACE_BODY = new JetNodeType("NAMESPACE_BODY");
|
||||
JetNodeType MODIFIER_LIST = new JetNodeType("MODIFIER_LIST");
|
||||
JetNodeType ATTRIBUTE_ANNOTATION = new JetNodeType("ATTRIBUTE_ANNOTATION");
|
||||
JetNodeType ATTRIBUTE = new JetNodeType("ATTRIBUTE");
|
||||
JetNodeType USER_TYPE = new JetNodeType("USER_TYPE");
|
||||
JetNodeType TYPE_ARGUMENT_LIST = new JetNodeType("TYPE_ARGUMENT_LIST");
|
||||
JetNodeType VALUE_ARGUMENT_LIST = new JetNodeType("VALUE_ARGUMENT_LIST");
|
||||
JetNodeType VALUE_ARGUMENT = new JetNodeType("VALUE_ARGUMENT");
|
||||
JetNodeType TYPE_REFERENCE = new JetNodeType("TYPE_REFERENCE");
|
||||
JetNodeType LABELED_TUPLE_ENTRY = new JetNodeType("LABELED_TUPLE_ENTRY");
|
||||
JetNodeType TUPLE_TYPE = new JetNodeType("TUPLE_TYPE");
|
||||
JetNodeType VALUE_PARAMETER = new JetNodeType("VALUE_PARAMETER");
|
||||
JetNodeType FUNCTION_TYPE = new JetNodeType("FUNCTION_TYPE");
|
||||
JetNodeType DECOMPOSER_PROPERTY_LIST = new JetNodeType("DECOMPOSER_PROPERTY_LIST");
|
||||
JetNodeType PRIMARY_CONSTRUCTOR_PARAMETER = new JetNodeType("PRIMARY_CONSTRUCTOR_PARAMETER");
|
||||
JetNodeType DELEGATION_SPECIFIER_LIST = new JetNodeType("DELEGATION_SPECIFIER_LIST");
|
||||
JetNodeType DELEGATION_SPECIFIER = new JetNodeType("DELEGATION_SPECIFIER");
|
||||
JetNodeType DELEGATOR_BY = new JetNodeType("DELEGATOR_BY");
|
||||
JetNodeType DELEGATOR_SUPER_CALL = new JetNodeType("DELEGATOR_SUPER_CALL");
|
||||
JetNodeType DELEGATOR_SUPER_CLASS = new JetNodeType("DELEGATOR_SUPER_CLASS");
|
||||
JetNodeType VALUE_PARAMETER_LIST = new JetNodeType("VALUE_PARAMETER_LIST");
|
||||
JetNodeType NAMED_ARGUMENT = new JetNodeType("NAMED_ARGUMENT");
|
||||
JetNodeType CLASS_BODY = new JetNodeType("CLASS_BODY", JetClassBody.class);
|
||||
JetNodeType IMPORT_DIRECTIVE = new JetNodeType("IMPORT_DIRECTIVE", JetImportDirective.class);
|
||||
JetNodeType IMPORTED = new JetNodeType("IMPORTED");
|
||||
JetNodeType NAMESPACE_BODY = new JetNodeType("NAMESPACE_BODY");
|
||||
JetNodeType MODIFIER_LIST = new JetNodeType("MODIFIER_LIST");
|
||||
JetNodeType ATTRIBUTE_ANNOTATION = new JetNodeType("ATTRIBUTE_ANNOTATION");
|
||||
JetNodeType ATTRIBUTE = new JetNodeType("ATTRIBUTE");
|
||||
JetNodeType USER_TYPE = new JetNodeType("USER_TYPE");
|
||||
JetNodeType TYPE_ARGUMENT_LIST = new JetNodeType("TYPE_ARGUMENT_LIST");
|
||||
JetNodeType VALUE_ARGUMENT_LIST = new JetNodeType("VALUE_ARGUMENT_LIST");
|
||||
JetNodeType VALUE_ARGUMENT = new JetNodeType("VALUE_ARGUMENT");
|
||||
JetNodeType TYPE_REFERENCE = new JetNodeType("TYPE_REFERENCE");
|
||||
JetNodeType LABELED_TUPLE_ENTRY = new JetNodeType("LABELED_TUPLE_ENTRY");
|
||||
JetNodeType TUPLE_TYPE = new JetNodeType("TUPLE_TYPE");
|
||||
JetNodeType VALUE_PARAMETER = new JetNodeType("VALUE_PARAMETER");
|
||||
JetNodeType FUNCTION_TYPE = new JetNodeType("FUNCTION_TYPE");
|
||||
JetNodeType DECOMPOSER_PROPERTY_LIST = new JetNodeType("DECOMPOSER_PROPERTY_LIST");
|
||||
// TODO: review
|
||||
JetNodeType RECEIVER_TYPE_ATTRIBUTES = new JetNodeType("RECEIVER_TYPE_ATTRIBUTES");
|
||||
JetNodeType PROPERTY_ACCESSOR = new JetNodeType("PROPERTY_ACCESSOR");
|
||||
JetNodeType INITIALIZER_LIST = new JetNodeType("INITIALIZER_LIST");
|
||||
JetNodeType THIS_CALL = new JetNodeType("THIS_CALL");
|
||||
JetNodeType BLOCK = new JetNodeType("BLOCK");
|
||||
JetNodeType TYPE_CONSTRAINT_LIST = new JetNodeType("TYPE_CONSTRAINT_LIST");
|
||||
JetNodeType TYPE_CONSTRAINT = new JetNodeType("TYPE_CONSTRAINT");
|
||||
JetNodeType ENUM_ENTRY = new JetNodeType("ENUM_ENTRY");
|
||||
JetNodeType NULL = new JetNodeType("NULL");
|
||||
JetNodeType BOOLEAN_CONSTANT = new JetNodeType("BOOLEAN_CONSTANT");
|
||||
JetNodeType FLOAT_CONSTANT = new JetNodeType("FLOAT_CONSTANT");
|
||||
JetNodeType CHARACTER_CONSTANT = new JetNodeType("CHARACTER_CONSTANT");
|
||||
JetNodeType STRING_CONSTANT = new JetNodeType("STRING_CONSTANT");
|
||||
JetNodeType INTEGER_CONSTANT = new JetNodeType("INTEGER_CONSTANT");
|
||||
JetNodeType SUPERTYE_QUALIFIER = new JetNodeType("SUPERTYE_QUALIFIER");
|
||||
JetNodeType LONG_CONSTANT = new JetNodeType("LONG_CONSTANT");
|
||||
JetNodeType TUPLE = new JetNodeType("TUPLE");
|
||||
JetNodeType TYPEOF = new JetNodeType("TYPEOF");
|
||||
JetNodeType NEW = new JetNodeType("NEW");
|
||||
JetNodeType RETURN = new JetNodeType("RETURN");
|
||||
JetNodeType THROW = new JetNodeType("THROW");
|
||||
JetNodeType CONTINUE = new JetNodeType("CONTINUE");
|
||||
JetNodeType BREAK = new JetNodeType("BREAK");
|
||||
JetNodeType IF = new JetNodeType("IF");
|
||||
JetNodeType CONDITION = new JetNodeType("CONDITION");
|
||||
JetNodeType THEN = new JetNodeType("THEN");
|
||||
JetNodeType ELSE = new JetNodeType("ELSE");
|
||||
JetNodeType TRY = new JetNodeType("TRY");
|
||||
JetNodeType CATCH = new JetNodeType("CATCH");
|
||||
JetNodeType FINALLY = new JetNodeType("FINALLY");
|
||||
JetNodeType FOR = new JetNodeType("FOR");
|
||||
JetNodeType WHILE = new JetNodeType("WHILE");
|
||||
JetNodeType DO_WHILE = new JetNodeType("DO_WHILE");
|
||||
JetNodeType LOOP_PARAMETER = new JetNodeType("LOOP_PARAMETER");
|
||||
JetNodeType LOOP_RANGE = new JetNodeType("LOOP_RANGE");
|
||||
JetNodeType BODY = new JetNodeType("BODY");
|
||||
JetNodeType RECEIVER_TYPE = new JetNodeType("RECEIVER_TYPE");
|
||||
JetNodeType FUNCTION_LITERAL = new JetNodeType("FUNCTION_LITERAL");
|
||||
JetNodeType ANNOTATED_EXPRESSION = new JetNodeType("ANNOTATED_EXPRESSION");
|
||||
// JetNodeType SIMPLE_NAME = new JetNodeType("SIMPLE_NAME");
|
||||
JetNodeType BINARY_EXPRESSION = new JetNodeType("BINARY_EXPRESSION");
|
||||
JetNodeType PREFIX_EXPRESSION = new JetNodeType("PREFIX_EXPRESSION");
|
||||
JetNodeType POSTFIX_EXPRESSION = new JetNodeType("POSTFIX_EXPRESSION");
|
||||
JetNodeType CALL_EXPRESSION = new JetNodeType("CALL_EXPRESSION");
|
||||
JetNodeType ARRAY_ACCESS_EXPRESSION = new JetNodeType("ARRAY_ACCESS_EXPRESSION");
|
||||
JetNodeType INDICES = new JetNodeType("INDICES");
|
||||
JetNodeType DOT_QIALIFIED_EXPRESSION = new JetNodeType("DOT_QIALIFIED_EXPRESSION");
|
||||
JetNodeType HASH_QIALIFIED_EXPRESSION = new JetNodeType("HASH_QIALIFIED_EXPRESSION");
|
||||
JetNodeType SAFE_ACCESS_EXPRESSION = new JetNodeType("SAFE_ACCESS_EXPRESSION");
|
||||
JetNodeType MATCH_ENTRY = new JetNodeType("MATCH_ENTRY");
|
||||
JetNodeType PATTERN = new JetNodeType("PATTERN");
|
||||
JetNodeType TUPLE_PATTERN = new JetNodeType("TUPLE_PATTERN");
|
||||
JetNodeType OBJECT_LITERAL = new JetNodeType("OBJECT_LITERAL");
|
||||
JetNodeType ROOT_NAMESPACE = new JetNodeType("ROOT_NAMESPACE");
|
||||
JetNodeType RECEIVER_TYPE_ATTRIBUTES = new JetNodeType("RECEIVER_TYPE_ATTRIBUTES");
|
||||
JetNodeType PROPERTY_ACCESSOR = new JetNodeType("PROPERTY_ACCESSOR");
|
||||
JetNodeType INITIALIZER_LIST = new JetNodeType("INITIALIZER_LIST");
|
||||
JetNodeType THIS_CALL = new JetNodeType("THIS_CALL");
|
||||
JetNodeType BLOCK = new JetNodeType("BLOCK");
|
||||
JetNodeType TYPE_CONSTRAINT_LIST = new JetNodeType("TYPE_CONSTRAINT_LIST");
|
||||
JetNodeType TYPE_CONSTRAINT = new JetNodeType("TYPE_CONSTRAINT");
|
||||
JetNodeType ENUM_ENTRY = new JetNodeType("ENUM_ENTRY");
|
||||
JetNodeType NULL = new JetNodeType("NULL");
|
||||
JetNodeType BOOLEAN_CONSTANT = new JetNodeType("BOOLEAN_CONSTANT");
|
||||
JetNodeType FLOAT_CONSTANT = new JetNodeType("FLOAT_CONSTANT");
|
||||
JetNodeType CHARACTER_CONSTANT = new JetNodeType("CHARACTER_CONSTANT");
|
||||
JetNodeType STRING_CONSTANT = new JetNodeType("STRING_CONSTANT");
|
||||
JetNodeType INTEGER_CONSTANT = new JetNodeType("INTEGER_CONSTANT");
|
||||
JetNodeType SUPERTYE_QUALIFIER = new JetNodeType("SUPERTYE_QUALIFIER");
|
||||
JetNodeType LONG_CONSTANT = new JetNodeType("LONG_CONSTANT");
|
||||
JetNodeType TUPLE = new JetNodeType("TUPLE");
|
||||
JetNodeType TYPEOF = new JetNodeType("TYPEOF");
|
||||
JetNodeType NEW = new JetNodeType("NEW");
|
||||
JetNodeType RETURN = new JetNodeType("RETURN");
|
||||
JetNodeType THROW = new JetNodeType("THROW");
|
||||
JetNodeType CONTINUE = new JetNodeType("CONTINUE");
|
||||
JetNodeType BREAK = new JetNodeType("BREAK");
|
||||
JetNodeType IF = new JetNodeType("IF");
|
||||
JetNodeType CONDITION = new JetNodeType("CONDITION");
|
||||
JetNodeType THEN = new JetNodeType("THEN");
|
||||
JetNodeType ELSE = new JetNodeType("ELSE");
|
||||
JetNodeType TRY = new JetNodeType("TRY");
|
||||
JetNodeType CATCH = new JetNodeType("CATCH");
|
||||
JetNodeType FINALLY = new JetNodeType("FINALLY");
|
||||
JetNodeType FOR = new JetNodeType("FOR");
|
||||
JetNodeType WHILE = new JetNodeType("WHILE");
|
||||
JetNodeType DO_WHILE = new JetNodeType("DO_WHILE");
|
||||
JetNodeType LOOP_PARAMETER = new JetNodeType("LOOP_PARAMETER");
|
||||
JetNodeType LOOP_RANGE = new JetNodeType("LOOP_RANGE");
|
||||
JetNodeType BODY = new JetNodeType("BODY");
|
||||
JetNodeType RECEIVER_TYPE = new JetNodeType("RECEIVER_TYPE");
|
||||
JetNodeType FUNCTION_LITERAL = new JetNodeType("FUNCTION_LITERAL");
|
||||
JetNodeType ANNOTATED_EXPRESSION = new JetNodeType("ANNOTATED_EXPRESSION");
|
||||
JetNodeType SIMPLE_NAME = new JetNodeType("SIMPLE_NAME");
|
||||
JetNodeType BINARY_EXPRESSION = new JetNodeType("BINARY_EXPRESSION");
|
||||
JetNodeType PREFIX_EXPRESSION = new JetNodeType("PREFIX_EXPRESSION");
|
||||
JetNodeType POSTFIX_EXPRESSION = new JetNodeType("POSTFIX_EXPRESSION");
|
||||
JetNodeType CALL_EXPRESSION = new JetNodeType("CALL_EXPRESSION");
|
||||
JetNodeType ARRAY_ACCESS_EXPRESSION = new JetNodeType("ARRAY_ACCESS_EXPRESSION");
|
||||
JetNodeType INDICES = new JetNodeType("INDICES");
|
||||
JetNodeType DOT_QIALIFIED_EXPRESSION = new JetNodeType("DOT_QIALIFIED_EXPRESSION");
|
||||
JetNodeType HASH_QIALIFIED_EXPRESSION = new JetNodeType("HASH_QIALIFIED_EXPRESSION");
|
||||
JetNodeType SAFE_ACCESS_EXPRESSION = new JetNodeType("SAFE_ACCESS_EXPRESSION");
|
||||
JetNodeType MATCH_ENTRY = new JetNodeType("MATCH_ENTRY");
|
||||
JetNodeType PATTERN = new JetNodeType("PATTERN");
|
||||
JetNodeType TUPLE_PATTERN = new JetNodeType("TUPLE_PATTERN");
|
||||
JetNodeType OBJECT_LITERAL = new JetNodeType("OBJECT_LITERAL");
|
||||
JetNodeType ROOT_NAMESPACE = new JetNodeType("ROOT_NAMESPACE");
|
||||
|
||||
IElementType NAMESPACE_NAME = new JetNodeType("NAMESPACE_NAME");
|
||||
}
|
||||
|
||||
@@ -25,6 +25,13 @@ import static org.jetbrains.jet.lexer.JetTokens.*;
|
||||
}
|
||||
}
|
||||
|
||||
static {
|
||||
for (IElementType token : JetTokens.KEYWORDS.getTypes()) {
|
||||
assert token instanceof JetKeywordToken : "Must be JetKeywordToken: " + token;
|
||||
assert !((JetKeywordToken) token).isSoft() : "Must not be soft: " + token;
|
||||
}
|
||||
}
|
||||
|
||||
protected final SemanticWhitespaceAwarePsiBuilder myBuilder;
|
||||
|
||||
public AbstractJetParsing(SemanticWhitespaceAwarePsiBuilder builder) {
|
||||
@@ -97,7 +104,10 @@ import static org.jetbrains.jet.lexer.JetTokens.*;
|
||||
return myBuilder.getTokenType();
|
||||
}
|
||||
|
||||
protected boolean at(final IElementType expectation) {
|
||||
/**
|
||||
* Side-effect-free version of at()
|
||||
*/
|
||||
protected boolean _at(IElementType expectation) {
|
||||
IElementType token = tt();
|
||||
if (token == expectation) return true;
|
||||
if (expectation == EOL_OR_SEMICOLON) {
|
||||
@@ -105,6 +115,12 @@ import static org.jetbrains.jet.lexer.JetTokens.*;
|
||||
if (token == SEMICOLON) return true;
|
||||
if (myBuilder.newlineBeforeCurrentToken()) return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
protected boolean at(final IElementType expectation) {
|
||||
if (_at(expectation)) return true;
|
||||
IElementType token = tt();
|
||||
if (token == IDENTIFIER && expectation instanceof JetKeywordToken) {
|
||||
JetKeywordToken expectedKeyword = (JetKeywordToken) expectation;
|
||||
if (expectedKeyword.isSoft() && expectedKeyword.getValue().equals(myBuilder.getTokenText())) {
|
||||
@@ -122,11 +138,17 @@ import static org.jetbrains.jet.lexer.JetTokens.*;
|
||||
return false;
|
||||
}
|
||||
|
||||
protected boolean atSet(IElementType... tokens) {
|
||||
return atSet(TokenSet.create(tokens));
|
||||
/**
|
||||
* Side-effect-free version of atSet()
|
||||
*/
|
||||
protected boolean _atSet(IElementType... tokens) {
|
||||
return _atSet(TokenSet.create(tokens));
|
||||
}
|
||||
|
||||
protected boolean atSet(final TokenSet set) {
|
||||
/**
|
||||
* Side-effect-free version of atSet()
|
||||
*/
|
||||
protected boolean _atSet(final TokenSet set) {
|
||||
IElementType token = tt();
|
||||
if (set.contains(token)) return true;
|
||||
if (set.contains(EOL_OR_SEMICOLON)) {
|
||||
@@ -134,12 +156,29 @@ import static org.jetbrains.jet.lexer.JetTokens.*;
|
||||
if (token == SEMICOLON) return true;
|
||||
if (myBuilder.newlineBeforeCurrentToken()) return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
protected boolean atSet(IElementType... tokens) {
|
||||
return atSet(TokenSet.create(tokens));
|
||||
}
|
||||
|
||||
protected boolean atSet(final TokenSet set) {
|
||||
if (_atSet(set)) return true;
|
||||
IElementType token = tt();
|
||||
if (token == IDENTIFIER) {
|
||||
JetKeywordToken keywordToken = SOFT_KEYWORD_TEXTS.get(myBuilder.getTokenText());
|
||||
if (keywordToken != null && set.contains(keywordToken)) {
|
||||
myBuilder.remapCurrentToken(keywordToken);
|
||||
return true;
|
||||
}
|
||||
} else {
|
||||
// We know at this point that <code>set</code> does not contain <code>token</code>
|
||||
if (set.contains(IDENTIFIER) && token instanceof JetKeywordToken) {
|
||||
if (((JetKeywordToken) token).isSoft()) {
|
||||
myBuilder.remapCurrentToken(IDENTIFIER);
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -275,7 +275,6 @@ public class JetExpressionParsing extends AbstractJetParsing {
|
||||
private void parseAtomicExpression() {
|
||||
// System.out.println("atom at " + myBuilder.getTokenText());
|
||||
|
||||
|
||||
if (at(LPAR)) {
|
||||
parseParenthesizedExpressionOrTuple();
|
||||
}
|
||||
@@ -464,7 +463,7 @@ public class JetExpressionParsing extends AbstractJetParsing {
|
||||
* ;
|
||||
*/
|
||||
private void parseBindingPattern() {
|
||||
assert at(QUEST);
|
||||
assert _at(QUEST);
|
||||
|
||||
advance(); // QUEST
|
||||
|
||||
@@ -483,7 +482,7 @@ public class JetExpressionParsing extends AbstractJetParsing {
|
||||
* ;
|
||||
*/
|
||||
private void parseTuplePattern() {
|
||||
assert at(LPAR);
|
||||
assert _at(LPAR);
|
||||
|
||||
PsiBuilder.Marker pattern = mark();
|
||||
advance(); // LPAR
|
||||
@@ -515,7 +514,7 @@ public class JetExpressionParsing extends AbstractJetParsing {
|
||||
* ;
|
||||
*/
|
||||
private void parseArrayAccess() {
|
||||
assert at(LBRACKET);
|
||||
assert _at(LBRACKET);
|
||||
|
||||
PsiBuilder.Marker indices = mark();
|
||||
|
||||
@@ -543,9 +542,8 @@ public class JetExpressionParsing extends AbstractJetParsing {
|
||||
* SimpleName
|
||||
*/
|
||||
private void parseSimpleName() {
|
||||
assert at(IDENTIFIER);
|
||||
// PsiBuilder.Marker simpleName = mark();
|
||||
advance(); // IDENTIFIER
|
||||
expect(IDENTIFIER, "Expecting an identifier [Interal error]");
|
||||
// simpleName.done(SIMPLE_NAME);
|
||||
}
|
||||
|
||||
@@ -576,7 +574,7 @@ public class JetExpressionParsing extends AbstractJetParsing {
|
||||
* ;
|
||||
*/
|
||||
private void parseFunctionLiteral() {
|
||||
assert at(LBRACE);
|
||||
assert _at(LBRACE);
|
||||
|
||||
PsiBuilder.Marker literal = mark();
|
||||
|
||||
@@ -598,7 +596,7 @@ public class JetExpressionParsing extends AbstractJetParsing {
|
||||
PsiBuilder.Marker receiverType = mark();
|
||||
createTruncatedBuilder(lastDot).parseTypeRef();
|
||||
receiverType.done(RECEIVER_TYPE);
|
||||
assert at(DOT);
|
||||
assert _at(DOT);
|
||||
advance(); // DOT;
|
||||
|
||||
if (!at(LPAR)) {
|
||||
@@ -756,7 +754,7 @@ public class JetExpressionParsing extends AbstractJetParsing {
|
||||
* ;
|
||||
*/
|
||||
private void parseDoWhile() {
|
||||
assert at(DO_KEYWORD);
|
||||
assert _at(DO_KEYWORD);
|
||||
|
||||
PsiBuilder.Marker loop = mark();
|
||||
|
||||
@@ -779,7 +777,7 @@ public class JetExpressionParsing extends AbstractJetParsing {
|
||||
* ;
|
||||
*/
|
||||
private void parseWhile() {
|
||||
assert at(WHILE_KEYWORD);
|
||||
assert _at(WHILE_KEYWORD);
|
||||
|
||||
PsiBuilder.Marker loop = mark();
|
||||
|
||||
@@ -798,7 +796,7 @@ public class JetExpressionParsing extends AbstractJetParsing {
|
||||
* ;
|
||||
*/
|
||||
private void parseFor() {
|
||||
assert at(FOR_KEYWORD);
|
||||
assert _at(FOR_KEYWORD);
|
||||
|
||||
PsiBuilder.Marker loop = mark();
|
||||
|
||||
@@ -853,7 +851,7 @@ public class JetExpressionParsing extends AbstractJetParsing {
|
||||
* ;
|
||||
*/
|
||||
private void parseTry() {
|
||||
assert at(TRY_KEYWORD);
|
||||
assert _at(TRY_KEYWORD);
|
||||
|
||||
PsiBuilder.Marker tryExpression = mark();
|
||||
|
||||
@@ -890,7 +888,7 @@ public class JetExpressionParsing extends AbstractJetParsing {
|
||||
* ;
|
||||
*/
|
||||
private void parseIf() {
|
||||
assert at(IF_KEYWORD);
|
||||
assert _at(IF_KEYWORD);
|
||||
|
||||
PsiBuilder.Marker marker = mark();
|
||||
|
||||
@@ -938,7 +936,7 @@ public class JetExpressionParsing extends AbstractJetParsing {
|
||||
* : "break" SimpleName
|
||||
*/
|
||||
private void parseJump(JetNodeType type) {
|
||||
assert at(BREAK_KEYWORD) || at(CONTINUE_KEYWORD);
|
||||
assert _at(BREAK_KEYWORD) || _at(CONTINUE_KEYWORD);
|
||||
|
||||
PsiBuilder.Marker marker = mark();
|
||||
|
||||
@@ -953,7 +951,7 @@ public class JetExpressionParsing extends AbstractJetParsing {
|
||||
* "return" expression?
|
||||
*/
|
||||
private void parseReturn() {
|
||||
assert at(RETURN_KEYWORD);
|
||||
assert _at(RETURN_KEYWORD);
|
||||
|
||||
PsiBuilder.Marker returnExpression = mark();
|
||||
|
||||
@@ -968,7 +966,7 @@ public class JetExpressionParsing extends AbstractJetParsing {
|
||||
* : "throw" expression
|
||||
*/
|
||||
private void parseThrow() {
|
||||
assert at(THROW_KEYWORD);
|
||||
assert _at(THROW_KEYWORD);
|
||||
|
||||
PsiBuilder.Marker marker = mark();
|
||||
|
||||
@@ -986,7 +984,7 @@ public class JetExpressionParsing extends AbstractJetParsing {
|
||||
* : userType valueArguments?
|
||||
*/
|
||||
private void parseNew() {
|
||||
assert at(NEW_KEYWORD);
|
||||
assert _at(NEW_KEYWORD);
|
||||
|
||||
PsiBuilder.Marker creation = mark();
|
||||
advance(); // NEW_KEYWORD
|
||||
@@ -1003,7 +1001,7 @@ public class JetExpressionParsing extends AbstractJetParsing {
|
||||
* "typeof" "(" expression ")"
|
||||
*/
|
||||
private void parseTypeOf() {
|
||||
assert at(TYPEOF_KEYWORD);
|
||||
assert _at(TYPEOF_KEYWORD);
|
||||
|
||||
PsiBuilder.Marker typeof = mark();
|
||||
advance(); // TYPEOF_KEYWORD
|
||||
@@ -1025,7 +1023,7 @@ public class JetExpressionParsing extends AbstractJetParsing {
|
||||
* TODO: duplication with valueArguments (but for the error messages)
|
||||
*/
|
||||
private void parseParenthesizedExpressionOrTuple() {
|
||||
assert at(LPAR);
|
||||
assert _at(LPAR);
|
||||
|
||||
PsiBuilder.Marker mark = mark();
|
||||
|
||||
@@ -1055,7 +1053,7 @@ public class JetExpressionParsing extends AbstractJetParsing {
|
||||
* "this" ("<" type ">")?
|
||||
*/
|
||||
private void parseThisExpression() {
|
||||
assert at(THIS_KEYWORD);
|
||||
assert _at(THIS_KEYWORD);
|
||||
advance(); // THIS_KEYWORD
|
||||
if (at(LT)) {
|
||||
// This may be "this < foo" or "this<foo>", thus the backtracking
|
||||
@@ -1129,7 +1127,7 @@ public class JetExpressionParsing extends AbstractJetParsing {
|
||||
* ;
|
||||
*/
|
||||
public void parseObjectLiteral() {
|
||||
assert at(OBJECT_KEYWORD);
|
||||
assert _at(OBJECT_KEYWORD);
|
||||
|
||||
PsiBuilder.Marker literal = mark();
|
||||
|
||||
|
||||
@@ -114,6 +114,7 @@ public class JetParsing extends AbstractJetParsing {
|
||||
* ;
|
||||
*/
|
||||
if (at(NAMESPACE_KEYWORD)) {
|
||||
// TODO: Modifiers
|
||||
advance(); // NAMESPACE_KEYWORD
|
||||
|
||||
parseNamespaceName();
|
||||
@@ -143,7 +144,7 @@ public class JetParsing extends AbstractJetParsing {
|
||||
* ;
|
||||
*/
|
||||
private void parseImportDirective() {
|
||||
assert at(IMPORT_KEYWORD);
|
||||
assert _at(IMPORT_KEYWORD);
|
||||
PsiBuilder.Marker importDirective = mark();
|
||||
advance(); // IMPORT_KEYWORD
|
||||
|
||||
@@ -238,7 +239,7 @@ public class JetParsing extends AbstractJetParsing {
|
||||
* ;
|
||||
*/
|
||||
public JetNodeType parseDecomposer() {
|
||||
assert at(DECOMPOSER_KEYWORD);
|
||||
assert _at(DECOMPOSER_KEYWORD);
|
||||
advance(); // DECOMPOSER_KEYWORD
|
||||
|
||||
boolean extenstion;
|
||||
@@ -337,7 +338,7 @@ public class JetParsing extends AbstractJetParsing {
|
||||
* ;
|
||||
*/
|
||||
private void parseAttributeAnnotation() {
|
||||
assert at(LBRACKET);
|
||||
assert _at(LBRACKET);
|
||||
PsiBuilder.Marker annotation = mark();
|
||||
|
||||
myBuilder.disableNewlines();
|
||||
@@ -383,7 +384,8 @@ public class JetParsing extends AbstractJetParsing {
|
||||
* ;
|
||||
*/
|
||||
private JetNodeType parseNamespaceBlock() {
|
||||
assert at(NAMESPACE_KEYWORD);
|
||||
// TODO: Modifiers
|
||||
assert _at(NAMESPACE_KEYWORD);
|
||||
advance(); // NAMESPACE_KEYWORD
|
||||
|
||||
if (at(LBRACE)) {
|
||||
@@ -422,7 +424,7 @@ public class JetParsing extends AbstractJetParsing {
|
||||
* ;
|
||||
*/
|
||||
public JetNodeType parseClass(boolean enumClass) {
|
||||
assert at(CLASS_KEYWORD);
|
||||
assert _at(CLASS_KEYWORD);
|
||||
advance(); // CLASS_KEYWORD
|
||||
|
||||
expect(IDENTIFIER, "Class name expected", CLASS_NAME_RECOVERY_SET);
|
||||
@@ -501,7 +503,7 @@ public class JetParsing extends AbstractJetParsing {
|
||||
* ;
|
||||
*/
|
||||
private void parseEnumEntry() {
|
||||
assert at(IDENTIFIER);
|
||||
assert _at(IDENTIFIER);
|
||||
|
||||
advance(); // IDENTIFIER
|
||||
|
||||
@@ -532,7 +534,7 @@ public class JetParsing extends AbstractJetParsing {
|
||||
*/
|
||||
/*package*/ void parseClassBody() {
|
||||
// TODO : anonymous initializer, like {...} in Java?
|
||||
assert at(LBRACE);
|
||||
assert _at(LBRACE);
|
||||
PsiBuilder.Marker body = mark();
|
||||
|
||||
myBuilder.enableNewlines();
|
||||
@@ -617,7 +619,7 @@ public class JetParsing extends AbstractJetParsing {
|
||||
* ;
|
||||
*/
|
||||
private JetNodeType parseConstructor() {
|
||||
assert at(THIS_KEYWORD);
|
||||
assert _at(THIS_KEYWORD);
|
||||
|
||||
advance(); // THIS_KEYWORD
|
||||
|
||||
@@ -687,7 +689,7 @@ public class JetParsing extends AbstractJetParsing {
|
||||
* ;
|
||||
*/
|
||||
private JetNodeType parseClassObject() {
|
||||
assert at(CLASS_KEYWORD) && lookahead(1) == OBJECT_KEYWORD;
|
||||
assert _at(CLASS_KEYWORD) && lookahead(1) == OBJECT_KEYWORD;
|
||||
|
||||
advance(); // CLASS_KEYWORD
|
||||
|
||||
@@ -703,7 +705,7 @@ public class JetParsing extends AbstractJetParsing {
|
||||
* ;
|
||||
*/
|
||||
public JetNodeType parseTypeDef() {
|
||||
assert at(TYPE_KEYWORD);
|
||||
assert _at(TYPE_KEYWORD);
|
||||
|
||||
advance(); // TYPE_KEYWORD
|
||||
|
||||
@@ -733,13 +735,13 @@ public class JetParsing extends AbstractJetParsing {
|
||||
public JetNodeType parseProperty(boolean local) {
|
||||
// TODO: how to write an extension ptoperty for a generic type? (val List<T>.i -- what is T?!)
|
||||
|
||||
assert at(VAL_KEYWORD) || at(VAR_KEYWORD);
|
||||
assert _at(VAL_KEYWORD) || _at(VAR_KEYWORD);
|
||||
|
||||
advance(); // VAL_KEYWORD or VAR_KEYWORD
|
||||
|
||||
TokenSet propertyNameFollow = TokenSet.create(COLON, EQ, LBRACE, SEMICOLON);
|
||||
|
||||
// TODO: constant
|
||||
// TODO: extract constant
|
||||
int lastDot = matchTokenStreamPredicate(new FirstBefore(
|
||||
new TokenStreamPredicate() {
|
||||
@Override
|
||||
@@ -861,7 +863,7 @@ public class JetParsing extends AbstractJetParsing {
|
||||
* ;
|
||||
*/
|
||||
public JetNodeType parseFunction() {
|
||||
assert at(FUN_KEYWORD);
|
||||
assert _at(FUN_KEYWORD);
|
||||
|
||||
advance(); // FUN_KEYWORD
|
||||
|
||||
@@ -945,7 +947,7 @@ public class JetParsing extends AbstractJetParsing {
|
||||
* ;
|
||||
*/
|
||||
public JetNodeType parseExtension() {
|
||||
assert at(EXTENSION_KEYWORD);
|
||||
assert _at(EXTENSION_KEYWORD);
|
||||
|
||||
advance(); // EXTENSION_KEYWORD
|
||||
|
||||
@@ -1035,7 +1037,7 @@ public class JetParsing extends AbstractJetParsing {
|
||||
* ("(" primaryConstructorParameter{","} ")")
|
||||
*/
|
||||
private void parsePrimaryConstructorParameterList() {
|
||||
assert at(LPAR);
|
||||
assert _at(LPAR);
|
||||
PsiBuilder.Marker cons = mark();
|
||||
|
||||
myBuilder.disableNewlines();
|
||||
@@ -1132,7 +1134,7 @@ public class JetParsing extends AbstractJetParsing {
|
||||
* typeConstraint{","}
|
||||
*/
|
||||
private void parseTypeConstraintList() {
|
||||
assert at(WHERE_KEYWORD);
|
||||
assert _at(WHERE_KEYWORD);
|
||||
|
||||
advance(); // WHERE_KEYWORD
|
||||
|
||||
@@ -1289,7 +1291,7 @@ public class JetParsing extends AbstractJetParsing {
|
||||
* ;
|
||||
*/
|
||||
private void parseTupleType() {
|
||||
assert at(LPAR);
|
||||
assert _at(LPAR);
|
||||
|
||||
PsiBuilder.Marker tuple = mark();
|
||||
|
||||
@@ -1333,7 +1335,7 @@ public class JetParsing extends AbstractJetParsing {
|
||||
* ;
|
||||
*/
|
||||
private void parseFunctionType() {
|
||||
assert at(LBRACE);
|
||||
assert _at(LBRACE);
|
||||
|
||||
PsiBuilder.Marker functionType = mark();
|
||||
|
||||
|
||||
@@ -8,6 +8,8 @@ import com.intellij.psi.tree.IElementType;
|
||||
import com.intellij.psi.tree.TokenSet;
|
||||
|
||||
public interface JetTokens {
|
||||
// TODO: $identifier as a separate token
|
||||
// TODO: `namespace` to escape Java identifiers that are keywords in Jet
|
||||
JetToken EOF = new JetToken("EOF");
|
||||
|
||||
JetToken BLOCK_COMMENT = new JetToken("BLOCK_COMMENT");
|
||||
@@ -98,13 +100,14 @@ public interface JetTokens {
|
||||
JetToken PERCEQ = new JetToken("PERCEQ");
|
||||
JetToken PLUSEQ = new JetToken("PLUSEQ");
|
||||
JetToken MINUSEQ = new JetToken("MINUSEQ");
|
||||
JetToken NOT_IN = new JetToken("NOT_IN");
|
||||
JetToken NOT_IS = new JetToken("NOT_IS");
|
||||
JetToken NOT_IN = JetKeywordToken.keyword("NOT_IN");
|
||||
JetToken NOT_IS = JetKeywordToken.keyword("NOT_IS");
|
||||
JetToken HASH = new JetToken("HASH");
|
||||
|
||||
JetToken COMMA = new JetToken("COMMA");
|
||||
|
||||
JetToken EOL_OR_SEMICOLON = new JetToken("EOL_OR_SEMICOLON");
|
||||
|
||||
JetKeywordToken WRAPS_KEYWORD = JetKeywordToken.softKeyword("wraps");
|
||||
JetKeywordToken IMPORT_KEYWORD = JetKeywordToken.softKeyword("import");
|
||||
JetKeywordToken WHERE_KEYWORD = JetKeywordToken.softKeyword("where");
|
||||
@@ -122,24 +125,24 @@ public interface JetTokens {
|
||||
JetKeywordToken PUBLIC_KEYWORD = JetKeywordToken.softKeyword("public");
|
||||
JetKeywordToken INTERNAL_KEYWORD = JetKeywordToken.softKeyword("internal");
|
||||
JetKeywordToken PROTECTED_KEYWORD = JetKeywordToken.softKeyword("protected");
|
||||
JetKeywordToken CATCH_KEYWORD = JetKeywordToken.softKeyword("catch");
|
||||
JetKeywordToken OUT_KEYWORD = JetKeywordToken.softKeyword("out");
|
||||
JetKeywordToken REF_KEYWORD = JetKeywordToken.softKeyword("ref");
|
||||
JetKeywordToken CATCH_KEYWORD = JetKeywordToken.softKeyword("catch");
|
||||
|
||||
JetKeywordToken FINALLY_KEYWORD = JetKeywordToken.softKeyword("finally");
|
||||
JetKeywordToken FINALLY_KEYWORD = JetKeywordToken.softKeyword("finally");
|
||||
|
||||
TokenSet KEYWORDS = TokenSet.create(NAMESPACE_KEYWORD, AS_KEYWORD, TYPE_KEYWORD, CLASS_KEYWORD,
|
||||
THIS_KEYWORD, VAL_KEYWORD, VAR_KEYWORD, FUN_KEYWORD, DECOMPOSER_KEYWORD, EXTENSION_KEYWORD, FOR_KEYWORD,
|
||||
NULL_KEYWORD, TYPEOF_KEYWORD, NEW_KEYWORD, TRUE_KEYWORD, FALSE_KEYWORD, IS_KEYWORD,
|
||||
IN_KEYWORD, THROW_KEYWORD, RETURN_KEYWORD, BREAK_KEYWORD, CONTINUE_KEYWORD, OBJECT_KEYWORD, IF_KEYWORD,
|
||||
ELSE_KEYWORD, WHILE_KEYWORD, DO_KEYWORD, MATCH_KEYWORD, REF_KEYWORD, OUT_KEYWORD, TRY_KEYWORD, CASE_KEYWORD,
|
||||
ELSE_KEYWORD, WHILE_KEYWORD, DO_KEYWORD, MATCH_KEYWORD, TRY_KEYWORD, CASE_KEYWORD,
|
||||
NOT_IN, NOT_IS
|
||||
);
|
||||
|
||||
TokenSet SOFT_KEYWORDS = TokenSet.create(WRAPS_KEYWORD, IMPORT_KEYWORD, WHERE_KEYWORD, BY_KEYWORD, LAZY_KEYWORD, GET_KEYWORD,
|
||||
SET_KEYWORD, ABSTRACT_KEYWORD, VIRTUAL_KEYWORD, ENUM_KEYWORD, OPEN_KEYWORD, ATTRIBUTE_KEYWORD,
|
||||
OVERRIDE_KEYWORD, PRIVATE_KEYWORD, PUBLIC_KEYWORD, INTERNAL_KEYWORD, PROTECTED_KEYWORD,
|
||||
CATCH_KEYWORD, FINALLY_KEYWORD
|
||||
CATCH_KEYWORD, FINALLY_KEYWORD, REF_KEYWORD, OUT_KEYWORD
|
||||
);
|
||||
|
||||
TokenSet MODIFIER_KEYWORDS = TokenSet.create(LAZY_KEYWORD, ABSTRACT_KEYWORD, VIRTUAL_KEYWORD, ENUM_KEYWORD,
|
||||
|
||||
@@ -0,0 +1,61 @@
|
||||
package org.jetbrains.jet.parsing;
|
||||
|
||||
import junit.framework.Test;
|
||||
import junit.framework.TestCase;
|
||||
import junit.framework.TestSuite;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileReader;
|
||||
import java.io.IOException;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
/**
|
||||
* @author abreslav
|
||||
*/
|
||||
public class JetCodeConformanceTest extends TestCase {
|
||||
|
||||
public static Test suite() {
|
||||
TestSuite suite = new TestSuite();
|
||||
TestSuite ats = new TestSuite("Side-effect-free at()'s in assertions");
|
||||
suite.addTest(ats);
|
||||
File parsingSourceDir = new File("./idea/src/org/jetbrains/jet/lang/parsing");
|
||||
for (File sourceFile : parsingSourceDir.listFiles()) {
|
||||
if (sourceFile.getName().endsWith(".java")) {
|
||||
ats.addTest(new JetCodeConformanceTest(sourceFile.getName(), sourceFile));
|
||||
}
|
||||
}
|
||||
return suite;
|
||||
}
|
||||
|
||||
private final File sourceFile;
|
||||
|
||||
public JetCodeConformanceTest(String name, File sourceFile) {
|
||||
super(name);
|
||||
this.sourceFile = sourceFile;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void runTest() throws Throwable {
|
||||
checkSourceFile(sourceFile);
|
||||
}
|
||||
|
||||
private void checkSourceFile(File sourceFile) throws IOException {
|
||||
FileReader reader = new FileReader(sourceFile);
|
||||
StringBuilder builder = new StringBuilder();
|
||||
int c;
|
||||
while ((c = reader.read()) >= 0) {
|
||||
builder.append((char) c);
|
||||
}
|
||||
String source = builder.toString();
|
||||
|
||||
Pattern atPattern = Pattern.compile("assert.*?[^_]at.*?$", Pattern.MULTILINE);
|
||||
Matcher matcher = atPattern.matcher(source);
|
||||
boolean match = matcher.find();
|
||||
if (match) {
|
||||
fail("An at-method with side-ffects is used inside assert: " + matcher.group());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user