A bug caused by side-effects in assertions fixed. A new test (checks the code for suspicious asserts) added.

This commit is contained in:
Andrey Breslav
2011-01-03 23:59:28 +03:00
parent 64c76ab226
commit 27c4494d69
11 changed files with 244 additions and 141 deletions
+1
View File
@@ -3,6 +3,7 @@
<component name="CodeStyleSettingsManager">
<option name="PER_PROJECT_SETTINGS">
<value>
<option name="LINE_SEPARATOR" value="&#10;" />
<option name="ELSE_ON_NEW_LINE" value="true" />
<option name="ALIGN_GROUP_FIELD_DECLARATIONS" value="true" />
<option name="IF_BRACE_FORCE" value="1" />
+1 -1
View File
@@ -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 }
}
}
*/
+1 -1
View File
@@ -139,7 +139,7 @@ equalityOperation
assignmentOperator
: "="
: "+=" : "-=" : "*=" : "/=" : "%="// TODO: |=, %= and <<= make more sense than |, % or << alone, and so for others
: "+=" : "-=" : "*=" : "/=" : "%="
;
unOpExpression
+1 -1
View File
@@ -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
-1
View File
@@ -24,7 +24,6 @@ memberModifier
: "override"
: "virtual"
: "abstract"
: // TODO: inline
;
accessModifier
+88 -88
View File
@@ -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());
}
}
}