diff --git a/idea/src/org/jetbrains/jet/lang/parsing/AbstractJetParsing.java b/idea/src/org/jetbrains/jet/lang/parsing/AbstractJetParsing.java
index 847e45ccadb..3909b738c00 100644
--- a/idea/src/org/jetbrains/jet/lang/parsing/AbstractJetParsing.java
+++ b/idea/src/org/jetbrains/jet/lang/parsing/AbstractJetParsing.java
@@ -13,9 +13,9 @@ import static org.jetbrains.jet.lexer.JetTokens.*;
* @author abreslav
*/
/*package*/ class AbstractJetParsing {
- protected final SemanticWitespaceAwarePsiBuilder myBuilder;
+ protected final SemanticWhitespaceAwarePsiBuilder myBuilder;
- public AbstractJetParsing(SemanticWitespaceAwarePsiBuilder builder) {
+ public AbstractJetParsing(SemanticWhitespaceAwarePsiBuilder builder) {
this.myBuilder = builder;
}
diff --git a/idea/src/org/jetbrains/jet/lang/parsing/JetExpressionParsing.java b/idea/src/org/jetbrains/jet/lang/parsing/JetExpressionParsing.java
index 043e07cfe4c..8ba6432abd2 100644
--- a/idea/src/org/jetbrains/jet/lang/parsing/JetExpressionParsing.java
+++ b/idea/src/org/jetbrains/jet/lang/parsing/JetExpressionParsing.java
@@ -12,7 +12,7 @@ import static org.jetbrains.jet.lexer.JetTokens.*;
* @author abreslav
*/
public class JetExpressionParsing extends AbstractJetParsing {
- public JetExpressionParsing(SemanticWitespaceAwarePsiBuilder builder) {
+ public JetExpressionParsing(SemanticWhitespaceAwarePsiBuilder builder) {
super(builder);
}
diff --git a/idea/src/org/jetbrains/jet/lang/parsing/JetParser.java b/idea/src/org/jetbrains/jet/lang/parsing/JetParser.java
index edad43bdbae..f159894d94c 100644
--- a/idea/src/org/jetbrains/jet/lang/parsing/JetParser.java
+++ b/idea/src/org/jetbrains/jet/lang/parsing/JetParser.java
@@ -8,12 +8,11 @@ import com.intellij.lang.PsiBuilder;
import com.intellij.lang.PsiParser;
import com.intellij.psi.tree.IElementType;
import org.jetbrains.annotations.NotNull;
-import org.jetbrains.jet.JetNodeTypes;
public class JetParser implements PsiParser {
@NotNull
public ASTNode parse(IElementType iElementType, PsiBuilder psiBuilder) {
- new JetParsing(new SemanticWitespaceAwarePsiBuilder(psiBuilder)).parseFile();
+ new JetParsing(new SemanticWhitespaceAwarePsiBuilderImpl(psiBuilder)).parseFile();
return psiBuilder.getTreeBuilt();
}
}
diff --git a/idea/src/org/jetbrains/jet/lang/parsing/JetParsing.java b/idea/src/org/jetbrains/jet/lang/parsing/JetParsing.java
index 670bdfb8083..90c118421df 100644
--- a/idea/src/org/jetbrains/jet/lang/parsing/JetParsing.java
+++ b/idea/src/org/jetbrains/jet/lang/parsing/JetParsing.java
@@ -40,7 +40,7 @@ public class JetParsing extends AbstractJetParsing {
private final JetExpressionParsing myExpressionParsing;
- public JetParsing(SemanticWitespaceAwarePsiBuilder builder) {
+ public JetParsing(SemanticWhitespaceAwarePsiBuilder builder) {
super(builder);
this.myExpressionParsing = new JetExpressionParsing(builder);
}
@@ -300,8 +300,8 @@ public class JetParsing extends AbstractJetParsing {
while (!eof()) {
if (at(LBRACKET)) {
parseAttributeAnnotation();
- } else if (MODIFIER_KEYWORDS.contains(tt())) {
- advance();
+ } else if (atSet(MODIFIER_KEYWORDS)) {
+ advance(); // MODIFIER
}
else {
if (!parseModifierSoftKeyword()) break;
@@ -365,8 +365,8 @@ public class JetParsing extends AbstractJetParsing {
* ;
*/
private JetNodeType parseNamespaceBlock() {
- assert at(NAMESPACE);
- advance(); // NAMESPACE
+ assert at(NAMESPACE_KEYWORD);
+ advance(); // NAMESPACE_KEYWORD
if (at(LBRACE)) {
error("Expecting namespace name");
@@ -460,6 +460,8 @@ public class JetParsing extends AbstractJetParsing {
private void parseMemberDeclaration() {
PsiBuilder.Marker decl = mark();
+ parseModifierList();
+
IElementType keywordToken = tt();
JetNodeType declType = null;
if (keywordToken == CLASS_KEYWORD) {
@@ -490,7 +492,7 @@ public class JetParsing extends AbstractJetParsing {
}
if (declType == null) {
- errorAndAdvance("Expecting namespace or top level declaration");
+ errorAndAdvance("Expecting member declaration");
decl.drop();
}
else {
@@ -610,17 +612,18 @@ public class JetParsing extends AbstractJetParsing {
TokenSet propertyNameFollow = TokenSet.create(COLON, EQ, LBRACE, EOL_OR_SEMICOLON);
- int lastDot = findLastDotBefore(propertyNameFollow);
+ int lastDot = findLastBefore(TokenSet.create(DOT), propertyNameFollow, true);
if (lastDot == -1) {
parseAttributeList();
expect(IDENTIFIER, "Expecting property name or receiver type", propertyNameFollow);
}
else {
- // The code below is NOT REENTRANT
- myBuilder.setEOFPosition(lastDot);
- parseTypeRef();
- myBuilder.unSetEOFPosition();
+ createTruncatedBuilder(lastDot).parseTypeRef();
+// // The code below is NOT REENTRANT
+// myBuilder.setEOFPosition(lastDot);
+// parseTypeRef();
+// myBuilder.unSetEOFPosition();
expect(DOT, "Expecting '.' before a property name", propertyNameFollow);
expect(IDENTIFIER, "Expecting property name", propertyNameFollow);
@@ -661,6 +664,10 @@ public class JetParsing extends AbstractJetParsing {
return PROPERTY;
}
+ private JetParsing createTruncatedBuilder(int eofPosition) {
+ return new JetParsing(new TruncatedSemanticWhitespaceAwarePsiBuilder(myBuilder, eofPosition));
+ }
+
/*
* getter
* : modifiers
@@ -702,16 +709,17 @@ public class JetParsing extends AbstractJetParsing {
advance(); // FUN_KEYWORD
- int lastDot = findLastDotBefore(TokenSet.create(LPAR));
+ int lastDot = findLastBefore(TokenSet.create(DOT), TokenSet.create(LPAR), true);
if (lastDot == -1) { // There's no explicit receiver type specified
parseAttributeList();
expect(IDENTIFIER, "Expecting function name or receiver type");
} else {
- // The code below in NOT REENTRANT
- myBuilder.setEOFPosition(lastDot);
- parseTypeRef();
- myBuilder.unSetEOFPosition();
+ createTruncatedBuilder(lastDot).parseTypeRef();
+// // The code below in NOT REENTRANT
+// myBuilder.setEOFPosition(lastDot);
+// parseTypeRef();
+// myBuilder.unSetEOFPosition();
TokenSet functionNameFollow = TokenSet.create(LT, LPAR, COLON, EQ);
expect(DOT, "Expecting '.' before a function name", functionNameFollow);
@@ -744,21 +752,22 @@ public class JetParsing extends AbstractJetParsing {
* Looks for a the last top-level (not inside any {} [] () <>) '.' occurring before a
* top-level occurrence of a token from the stopSet
*/
- private int findLastDotBefore(TokenSet stopSet) {
+ private int findLastBefore(TokenSet lookFor, TokenSet stopAt, boolean dontStopRightAfterOccurrence) {
PsiBuilder.Marker currentPosition = mark();
- int lastDot = -1;
+ int lastOccurrence = -1;
int openAngleBrackets = 0;
int openBraces = 0;
int openParentheses = 0;
int openBrackets = 0;
IElementType previousToken = null;
while (!eof()) {
- if (atSet(stopSet)) {
+ if (atSet(stopAt)) {
if (openAngleBrackets == 0
&& openBrackets == 0
&& openBraces == 0
&& openParentheses == 0
- && previousToken != DOT) break;
+ && (!dontStopRightAfterOccurrence
+ || !lookFor.contains(previousToken))) break;
}
if (at(LPAR)) {
openParentheses++;
@@ -784,18 +793,18 @@ public class JetParsing extends AbstractJetParsing {
else if (at(RBRACKET)) {
openBrackets--;
}
- else if (at(DOT)
+ else if (atSet(lookFor)
&& openAngleBrackets == 0
&& openBrackets == 0
&& openBraces == 0
&& openParentheses == 0) {
- lastDot = myBuilder.getCurrentOffset();
+ lastOccurrence = myBuilder.getCurrentOffset();
}
previousToken = tt();
advance(); // skip token
}
currentPosition.rollbackTo();
- return lastDot;
+ return lastOccurrence ;
}
/*
@@ -1025,13 +1034,20 @@ public class JetParsing extends AbstractJetParsing {
* ;
*/
private void parseTypeParameter() {
- if (TYPE_PARAMETER_GT_RECOVERY_SET.contains(tt())) {
+ if (atSet(TYPE_PARAMETER_GT_RECOVERY_SET)) {
error("Type parameter declaration expected");
return;
}
PsiBuilder.Marker mark = mark();
- parseModifierList();
+
+ int lastId = findLastBefore(TokenSet.create(IDENTIFIER), TokenSet.create(COMMA, GT, COLON), false);
+ createTruncatedBuilder(lastId).parseModifierList();
+// // The code below is NOT REENTRANT
+// myBuilder.setEOFPosition(lastId);
+// parseModifierList();
+// myBuilder.unSetEOFPosition();
+
expect(IDENTIFIER, "Type parameter name expected", TokenSet.EMPTY);
// TODO : other constraints
@@ -1226,7 +1242,13 @@ public class JetParsing extends AbstractJetParsing {
if (!at(RPAR)) {
while (true) {
- if (at(COMMA)) errorAndAdvance("Expecting a parameter declaration");
+ if (at(COMMA)) {
+ errorAndAdvance("Expecting a parameter declaration");
+ }
+ else if (at(RPAR)) {
+ error("Expecting a parameter declaration");
+ break;
+ }
if (!parseValueParameter()) {
if (isFunctionTypeContents) {
parseModifierList(); // lazy, out, ref
@@ -1251,7 +1273,13 @@ public class JetParsing extends AbstractJetParsing {
private boolean parseValueParameter() {
PsiBuilder.Marker parameter = mark();
- parseModifierList();
+ int lastId = findLastBefore(TokenSet.create(IDENTIFIER), TokenSet.create(COMMA, RPAR, COLON), false);
+ createTruncatedBuilder(lastId).parseModifierList();
+// // The code below is NOT REENTRANT
+// myBuilder.setEOFPosition(lastId);
+// parseModifierList();
+// myBuilder.unSetEOFPosition();
+
if (!parseFunctionParameterRest()) {
parameter.rollbackTo();
return false;
diff --git a/idea/src/org/jetbrains/jet/lang/parsing/SemanticWhitespaceAwarePsiBuilder.java b/idea/src/org/jetbrains/jet/lang/parsing/SemanticWhitespaceAwarePsiBuilder.java
new file mode 100644
index 00000000000..c5bf1843936
--- /dev/null
+++ b/idea/src/org/jetbrains/jet/lang/parsing/SemanticWhitespaceAwarePsiBuilder.java
@@ -0,0 +1,10 @@
+package org.jetbrains.jet.lang.parsing;
+
+import com.intellij.lang.PsiBuilder;
+
+/**
+ * @author abreslav
+ */
+public interface SemanticWhitespaceAwarePsiBuilder extends PsiBuilder {
+ boolean eolInLastWhitespace();
+}
diff --git a/idea/src/org/jetbrains/jet/lang/parsing/SemanticWitespaceAwarePsiBuilder.java b/idea/src/org/jetbrains/jet/lang/parsing/SemanticWhitespaceAwarePsiBuilderImpl.java
similarity index 58%
rename from idea/src/org/jetbrains/jet/lang/parsing/SemanticWitespaceAwarePsiBuilder.java
rename to idea/src/org/jetbrains/jet/lang/parsing/SemanticWhitespaceAwarePsiBuilderImpl.java
index 6b41ea6a8d5..20fcd4361f6 100644
--- a/idea/src/org/jetbrains/jet/lang/parsing/SemanticWitespaceAwarePsiBuilder.java
+++ b/idea/src/org/jetbrains/jet/lang/parsing/SemanticWhitespaceAwarePsiBuilderImpl.java
@@ -8,7 +8,7 @@ import com.intellij.psi.tree.IElementType;
/**
* @author abreslav
*/
-public class SemanticWitespaceAwarePsiBuilder extends PsiBuilderAdapter {
+public class SemanticWhitespaceAwarePsiBuilderImpl extends PsiBuilderAdapter implements SemanticWhitespaceAwarePsiBuilder {
private final WhitespaceSkippedCallback myWhitespaceSkippedCallback = new WhitespaceSkippedCallback() {
public void onSkip(IElementType type, int start, int end) {
CharSequence whitespace = getOriginalText();
@@ -23,9 +23,8 @@ public class SemanticWitespaceAwarePsiBuilder extends PsiBuilderAdapter {
};
private boolean myEOLInLastWhitespace;
- private int myEOFPosition = -1;
- public SemanticWitespaceAwarePsiBuilder(final PsiBuilder delegate) {
+ public SemanticWhitespaceAwarePsiBuilderImpl(final PsiBuilder delegate) {
super(delegate);
delegate.setWhitespaceSkippedCallback(myWhitespaceSkippedCallback);
}
@@ -36,33 +35,8 @@ public class SemanticWitespaceAwarePsiBuilder extends PsiBuilderAdapter {
super.advanceLexer();
}
+ @Override
public boolean eolInLastWhitespace() {
return myEOLInLastWhitespace;
}
-
- @Override
- public boolean eof() {
- if (super.eof()) return true;
- return myEOFPosition >= 0 && getCurrentOffset() >= myEOFPosition;
- }
-
- @Override
- public String getTokenText() {
- if (eof()) return null;
- return super.getTokenText();
- }
-
- @Override
- public IElementType getTokenType() {
- if (eof()) return null;
- return super.getTokenType();
- }
-
- public void setEOFPosition(int myEOFPosition) {
- this.myEOFPosition = myEOFPosition;
- }
-
- public void unSetEOFPosition() {
- this.myEOFPosition = -1;
- }
}
diff --git a/idea/src/org/jetbrains/jet/lang/parsing/TruncatedSemanticWhitespaceAwarePsiBuilder.java b/idea/src/org/jetbrains/jet/lang/parsing/TruncatedSemanticWhitespaceAwarePsiBuilder.java
new file mode 100644
index 00000000000..7b9ad549118
--- /dev/null
+++ b/idea/src/org/jetbrains/jet/lang/parsing/TruncatedSemanticWhitespaceAwarePsiBuilder.java
@@ -0,0 +1,44 @@
+package org.jetbrains.jet.lang.parsing;
+
+import com.intellij.psi.tree.IElementType;
+
+/**
+ * @author abreslav
+ */
+public class TruncatedSemanticWhitespaceAwarePsiBuilder extends PsiBuilderAdapter implements SemanticWhitespaceAwarePsiBuilder {
+
+ private final SemanticWhitespaceAwarePsiBuilder myBuilder;
+ private final int myEOFPosition;
+
+
+ public TruncatedSemanticWhitespaceAwarePsiBuilder(SemanticWhitespaceAwarePsiBuilder myBuilder, int eofPosition) {
+ super(myBuilder);
+ this.myBuilder = myBuilder;
+ this.myEOFPosition = eofPosition;
+ }
+
+ @Override
+ public boolean eolInLastWhitespace() {
+ return myBuilder.eolInLastWhitespace();
+ }
+
+
+ @Override
+ public boolean eof() {
+ if (super.eof()) return true;
+ return myEOFPosition >= 0 && getCurrentOffset() >= myEOFPosition;
+ }
+
+ @Override
+ public String getTokenText() {
+ if (eof()) return null;
+ return super.getTokenText();
+ }
+
+ @Override
+ public IElementType getTokenType() {
+ if (eof()) return null;
+ return super.getTokenType();
+ }
+
+}
diff --git a/idea/testData/psi/FunctionTypes_ERR.txt b/idea/testData/psi/FunctionTypes_ERR.txt
index 9e92eabd063..0e711cb79c7 100644
--- a/idea/testData/psi/FunctionTypes_ERR.txt
+++ b/idea/testData/psi/FunctionTypes_ERR.txt
@@ -53,10 +53,9 @@ JetFile: FunctionTypes_ERR.jet
USER_TYPE
PsiElement(IDENTIFIER)('a')
PsiElement(COMMA)(',')
+ PsiErrorElement:Expecting a parameter declaration
+
PsiWhiteSpace(' ')
- TYPE_REFERENCE
- PsiErrorElement:Type expected
-
PsiElement(RPAR)(')')
PsiWhiteSpace(' ')
PsiElement(COLON)(':')
diff --git a/idea/testData/psi/SimpleModifiers.jet b/idea/testData/psi/SimpleModifiers.jet
index 70bfe942b2e..783a1d748ad 100644
--- a/idea/testData/psi/SimpleModifiers.jet
+++ b/idea/testData/psi/SimpleModifiers.jet
@@ -17,35 +17,32 @@ in
out
ref
class Bar {
-abstract
-virtual
-enum
-open
-attribute
-override
-virtual
-abstract
-private
-protected
-public
-internal
-in
-lazy
-out
-ref
+ virtual
+ enum
+ open
+ attribute
+ override
+ virtual
+ abstract
+ private
+ protected
+ public
+ internal
+ lazy
+ in
+ out
+ ref T> {
+ val abstract
+ val virtual
+ val enum
+ val open
+ val attribute
+ val override
+ val virtual
+ val abstract
+ val private
+ val protected
+ val public
+ val internal
+ val lazy
}
diff --git a/idea/testData/psi/SimpleModifiers.txt b/idea/testData/psi/SimpleModifiers.txt
index e1be966ca8d..6adfe55d13a 100644
--- a/idea/testData/psi/SimpleModifiers.txt
+++ b/idea/testData/psi/SimpleModifiers.txt
@@ -51,35 +51,35 @@ JetFile: SimpleModifiers.jet
TYPE_PARAMETER
MODIFIER_LIST
PsiElement(abstract)('abstract')
- PsiWhiteSpace('\n')
+ PsiWhiteSpace('\n ')
PsiElement(virtual)('virtual')
- PsiWhiteSpace('\n')
+ PsiWhiteSpace('\n ')
PsiElement(enum)('enum')
- PsiWhiteSpace('\n')
+ PsiWhiteSpace('\n ')
PsiElement(open)('open')
- PsiWhiteSpace('\n')
+ PsiWhiteSpace('\n ')
PsiElement(attribute)('attribute')
- PsiWhiteSpace('\n')
+ PsiWhiteSpace('\n ')
PsiElement(override)('override')
- PsiWhiteSpace('\n')
+ PsiWhiteSpace('\n ')
PsiElement(virtual)('virtual')
- PsiWhiteSpace('\n')
+ PsiWhiteSpace('\n ')
PsiElement(abstract)('abstract')
- PsiWhiteSpace('\n')
+ PsiWhiteSpace('\n ')
PsiElement(private)('private')
- PsiWhiteSpace('\n')
+ PsiWhiteSpace('\n ')
PsiElement(protected)('protected')
- PsiWhiteSpace('\n')
+ PsiWhiteSpace('\n ')
PsiElement(public)('public')
- PsiWhiteSpace('\n')
+ PsiWhiteSpace('\n ')
PsiElement(internal)('internal')
- PsiWhiteSpace('\n')
+ PsiWhiteSpace('\n ')
PsiElement(lazy)('lazy')
- PsiWhiteSpace('\n')
+ PsiWhiteSpace('\n ')
PsiElement(in)('in')
- PsiWhiteSpace('\n')
+ PsiWhiteSpace('\n ')
PsiElement(out)('out')
- PsiWhiteSpace('\n')
+ PsiWhiteSpace('\n ')
PsiElement(ref)('ref')
PsiWhiteSpace(' ')
PsiElement(IDENTIFIER)('T')
@@ -87,37 +87,70 @@ JetFile: SimpleModifiers.jet
PsiWhiteSpace(' ')
CLASS_BODY
PsiElement(LBRACE)('{')
- PsiWhiteSpace('\n')
- PsiElement(IDENTIFIER)('abstract')
- PsiWhiteSpace('\n')
- PsiElement(IDENTIFIER)('virtual')
- PsiWhiteSpace('\n')
- PsiElement(IDENTIFIER)('enum')
- PsiWhiteSpace('\n')
- PsiElement(IDENTIFIER)('open')
- PsiWhiteSpace('\n')
- PsiElement(IDENTIFIER)('attribute')
- PsiWhiteSpace('\n')
- PsiElement(IDENTIFIER)('override')
- PsiWhiteSpace('\n')
- PsiElement(IDENTIFIER)('virtual')
- PsiWhiteSpace('\n')
- PsiElement(IDENTIFIER)('abstract')
- PsiWhiteSpace('\n')
- PsiElement(IDENTIFIER)('private')
- PsiWhiteSpace('\n')
- PsiElement(IDENTIFIER)('protected')
- PsiWhiteSpace('\n')
- PsiElement(IDENTIFIER)('public')
- PsiWhiteSpace('\n')
- PsiElement(IDENTIFIER)('internal')
- PsiWhiteSpace('\n')
- PsiElement(in)('in')
- PsiWhiteSpace('\n')
- PsiElement(IDENTIFIER)('lazy')
- PsiWhiteSpace('\n')
- PsiElement(out)('out')
- PsiWhiteSpace('\n')
- PsiElement(ref)('ref')
+ PsiWhiteSpace('\n ')
+ PROPERTY
+ PsiElement(val)('val')
+ PsiWhiteSpace(' ')
+ PsiElement(IDENTIFIER)('abstract')
+ PsiWhiteSpace('\n ')
+ PROPERTY
+ PsiElement(val)('val')
+ PsiWhiteSpace(' ')
+ PsiElement(IDENTIFIER)('virtual')
+ PsiWhiteSpace('\n ')
+ PROPERTY
+ PsiElement(val)('val')
+ PsiWhiteSpace(' ')
+ PsiElement(IDENTIFIER)('enum')
+ PsiWhiteSpace('\n ')
+ PROPERTY
+ PsiElement(val)('val')
+ PsiWhiteSpace(' ')
+ PsiElement(IDENTIFIER)('open')
+ PsiWhiteSpace('\n ')
+ PROPERTY
+ PsiElement(val)('val')
+ PsiWhiteSpace(' ')
+ PsiElement(IDENTIFIER)('attribute')
+ PsiWhiteSpace('\n ')
+ PROPERTY
+ PsiElement(val)('val')
+ PsiWhiteSpace(' ')
+ PsiElement(IDENTIFIER)('override')
+ PsiWhiteSpace('\n ')
+ PROPERTY
+ PsiElement(val)('val')
+ PsiWhiteSpace(' ')
+ PsiElement(IDENTIFIER)('virtual')
+ PsiWhiteSpace('\n ')
+ PROPERTY
+ PsiElement(val)('val')
+ PsiWhiteSpace(' ')
+ PsiElement(IDENTIFIER)('abstract')
+ PsiWhiteSpace('\n ')
+ PROPERTY
+ PsiElement(val)('val')
+ PsiWhiteSpace(' ')
+ PsiElement(IDENTIFIER)('private')
+ PsiWhiteSpace('\n ')
+ PROPERTY
+ PsiElement(val)('val')
+ PsiWhiteSpace(' ')
+ PsiElement(IDENTIFIER)('protected')
+ PsiWhiteSpace('\n ')
+ PROPERTY
+ PsiElement(val)('val')
+ PsiWhiteSpace(' ')
+ PsiElement(IDENTIFIER)('public')
+ PsiWhiteSpace('\n ')
+ PROPERTY
+ PsiElement(val)('val')
+ PsiWhiteSpace(' ')
+ PsiElement(IDENTIFIER)('internal')
+ PsiWhiteSpace('\n ')
+ PROPERTY
+ PsiElement(val)('val')
+ PsiWhiteSpace(' ')
+ PsiElement(IDENTIFIER)('lazy')
PsiWhiteSpace('\n')
PsiElement(RBRACE)('}')
\ No newline at end of file
diff --git a/idea/testData/psi/SoftKeywords.jet b/idea/testData/psi/SoftKeywords.jet
new file mode 100644
index 00000000000..77316acb9a5
--- /dev/null
+++ b/idea/testData/psi/SoftKeywords.jet
@@ -0,0 +1,115 @@
+namespace foo.bar.goo
+
+import foo
+
+public protected private internal
+abstract
+virtual
+enum
+open
+attribute
+override
+virtual
+abstract
+private
+protected
+public
+internal
+lazy
+in
+out
+ref
+ class Bar wraps (a : B) : A by b {
+ public protected private internal val abstract
+ val virtual
+ val enum
+ val open
+ val attribute
+ val override
+ val virtual
+ val abstract
+ val private
+ val protected
+ val public
+ val internal
+ val lazy
+ val wraps
+ val import
+ val where
+ val by
+ val get
+ val set
+ val public
+ val private
+ val protected
+ val internal {
+ get() = a
+ set(S : s) {}
+ }
+
+ public protected private internal
+ fun abstract () : abstract
+ fun virtual () : virtual
+ fun enum () : enum
+ fun open () : open
+ fun attribute () : attribute
+ fun override () : override
+ fun virtual () : virtual
+ fun abstract () : abstract
+ fun private () : private
+ fun protected () : protected
+ fun public () : public
+ fun internal () : internal
+ fun lazy () : lazy
+ fun wraps () : wraps
+ fun import () : import
+ fun where () : where
+ fun by () : by
+ fun get () : get
+ fun set () : set
+ fun public () : public
+ fun private () : private
+ fun protected () : protected
+ fun internal () : internal
+
+ fun test(
+ abstract : t,
+ virtual : t,
+ enum : t,
+ open : t,
+ attribute : t,
+ override : t,
+ virtual : t,
+ abstract : t,
+ private : t,
+ protected : t,
+ public : t,
+ internal : t,
+ lazy : t,
+ wraps : t,
+ import : t,
+ where : t,
+ by : t,
+ get : t,
+ set : t,
+ public : t,
+ private : t,
+ protected : t,
+ internal : t
+ )
+
+}
diff --git a/idea/testData/psi/SoftKeywords.txt b/idea/testData/psi/SoftKeywords.txt
new file mode 100644
index 00000000000..970297e27f8
--- /dev/null
+++ b/idea/testData/psi/SoftKeywords.txt
@@ -0,0 +1,953 @@
+JetFile: SoftKeywords.jet
+ NAMESPACE
+ PsiElement(namespace)('namespace')
+ PsiWhiteSpace(' ')
+ NAMESPACE_NAME
+ PsiElement(IDENTIFIER)('foo')
+ PsiElement(DOT)('.')
+ PsiElement(IDENTIFIER)('bar')
+ PsiElement(DOT)('.')
+ PsiElement(IDENTIFIER)('goo')
+ PsiWhiteSpace('\n\n')
+ IMPORT_DIRECTIVE
+ PsiElement(import)('import')
+ PsiWhiteSpace(' ')
+ PsiElement(IDENTIFIER)('foo')
+ PsiWhiteSpace('\n\n')
+ CLASS
+ MODIFIER_LIST
+ PsiElement(public)('public')
+ PsiWhiteSpace(' ')
+ PsiElement(protected)('protected')
+ PsiWhiteSpace(' ')
+ PsiElement(private)('private')
+ PsiWhiteSpace(' ')
+ PsiElement(internal)('internal')
+ PsiWhiteSpace('\n')
+ PsiElement(abstract)('abstract')
+ PsiWhiteSpace('\n')
+ PsiElement(virtual)('virtual')
+ PsiWhiteSpace('\n')
+ PsiElement(enum)('enum')
+ PsiWhiteSpace('\n')
+ PsiElement(open)('open')
+ PsiWhiteSpace('\n')
+ PsiElement(attribute)('attribute')
+ PsiWhiteSpace('\n')
+ PsiElement(override)('override')
+ PsiWhiteSpace('\n')
+ PsiElement(virtual)('virtual')
+ PsiWhiteSpace('\n')
+ PsiElement(abstract)('abstract')
+ PsiWhiteSpace('\n')
+ PsiElement(private)('private')
+ PsiWhiteSpace('\n')
+ PsiElement(protected)('protected')
+ PsiWhiteSpace('\n')
+ PsiElement(public)('public')
+ PsiWhiteSpace('\n')
+ PsiElement(internal)('internal')
+ PsiWhiteSpace('\n')
+ PsiElement(lazy)('lazy')
+ PsiWhiteSpace('\n')
+ PsiElement(in)('in')
+ PsiWhiteSpace('\n')
+ PsiElement(out)('out')
+ PsiWhiteSpace('\n')
+ PsiElement(ref)('ref')
+ PsiWhiteSpace('\n ')
+ PsiElement(class)('class')
+ PsiWhiteSpace(' ')
+ PsiElement(IDENTIFIER)('Bar')
+ TYPE_PARAMETER_LIST
+ PsiElement(LT)('<')
+ TYPE_PARAMETER
+ PsiElement(IDENTIFIER)('abstract')
+ PsiElement(COMMA)(',')
+ PsiWhiteSpace(' ')
+ TYPE_PARAMETER
+ MODIFIER_LIST
+ PsiElement(abstract)('abstract')
+ PsiWhiteSpace(' ')
+ PsiElement(IDENTIFIER)('enum')
+ PsiWhiteSpace(' ')
+ PsiElement(COLON)(':')
+ PsiWhiteSpace(' ')
+ TYPE_REFERENCE
+ USER_TYPE
+ PsiElement(IDENTIFIER)('T')
+ PsiElement(COMMA)(',')
+ PsiWhiteSpace(' ')
+ TYPE_PARAMETER
+ MODIFIER_LIST
+ PsiElement(lazy)('lazy')
+ PsiWhiteSpace(' ')
+ PsiElement(IDENTIFIER)('virtual')
+ PsiElement(COMMA)(',')
+ PsiWhiteSpace('\n ')
+ TYPE_PARAMETER
+ MODIFIER_LIST
+ PsiElement(public)('public')
+ PsiWhiteSpace(' ')
+ PsiElement(protected)('protected')
+ PsiWhiteSpace(' ')
+ PsiElement(private)('private')
+ PsiWhiteSpace(' ')
+ PsiElement(internal)('internal')
+ PsiWhiteSpace(' ')
+ PsiElement(abstract)('abstract')
+ PsiWhiteSpace('\n ')
+ PsiElement(virtual)('virtual')
+ PsiWhiteSpace('\n ')
+ PsiElement(enum)('enum')
+ PsiWhiteSpace('\n ')
+ PsiElement(open)('open')
+ PsiWhiteSpace('\n ')
+ PsiElement(attribute)('attribute')
+ PsiWhiteSpace('\n ')
+ PsiElement(override)('override')
+ PsiWhiteSpace('\n ')
+ PsiElement(virtual)('virtual')
+ PsiWhiteSpace('\n ')
+ PsiElement(abstract)('abstract')
+ PsiWhiteSpace('\n ')
+ PsiElement(private)('private')
+ PsiWhiteSpace('\n ')
+ PsiElement(protected)('protected')
+ PsiWhiteSpace('\n ')
+ PsiElement(public)('public')
+ PsiWhiteSpace('\n ')
+ PsiElement(internal)('internal')
+ PsiWhiteSpace('\n ')
+ PsiElement(lazy)('lazy')
+ PsiWhiteSpace(' ')
+ PsiElement(IDENTIFIER)('open')
+ PsiWhiteSpace('\n ')
+ PsiElement(GT)('>')
+ PsiWhiteSpace(' ')
+ PsiElement(wraps)('wraps')
+ PsiWhiteSpace(' ')
+ PRIMARY_CONSTRUCTOR_PARAMETERS_LIST
+ PsiElement(LPAR)('(')
+ PRIMARY_CONSTRUCTOR_PARAMETER
+ PsiElement(IDENTIFIER)('a')
+ PsiWhiteSpace(' ')
+ PsiElement(COLON)(':')
+ PsiWhiteSpace(' ')
+ TYPE_REFERENCE
+ USER_TYPE
+ PsiElement(IDENTIFIER)('B')
+ PsiElement(RPAR)(')')
+ PsiWhiteSpace(' ')
+ PsiElement(COLON)(':')
+ PsiWhiteSpace(' ')
+ DELEGATION_SPECIFIER_LIST
+ DELEGATION_SPECIFIER
+ DELEGATOR_BY
+ TYPE_REFERENCE
+ USER_TYPE
+ PsiElement(IDENTIFIER)('A')
+ PsiWhiteSpace(' ')
+ PsiElement(by)('by')
+ PsiWhiteSpace(' ')
+ PsiElement(IDENTIFIER)('b')
+ PsiWhiteSpace(' ')
+ CLASS_BODY
+ PsiElement(LBRACE)('{')
+ PsiWhiteSpace('\n ')
+ PROPERTY
+ MODIFIER_LIST
+ PsiElement(public)('public')
+ PsiWhiteSpace(' ')
+ PsiElement(protected)('protected')
+ PsiWhiteSpace(' ')
+ PsiElement(private)('private')
+ PsiWhiteSpace(' ')
+ PsiElement(internal)('internal')
+ PsiWhiteSpace(' ')
+ PsiElement(val)('val')
+ PsiWhiteSpace(' ')
+ PsiElement(IDENTIFIER)('abstract')
+ PsiWhiteSpace('\n ')
+ PROPERTY
+ PsiElement(val)('val')
+ PsiWhiteSpace(' ')
+ PsiElement(IDENTIFIER)('virtual')
+ PsiWhiteSpace('\n ')
+ PROPERTY
+ PsiElement(val)('val')
+ PsiWhiteSpace(' ')
+ PsiElement(IDENTIFIER)('enum')
+ PsiWhiteSpace('\n ')
+ PROPERTY
+ PsiElement(val)('val')
+ PsiWhiteSpace(' ')
+ PsiElement(IDENTIFIER)('open')
+ PsiWhiteSpace('\n ')
+ PROPERTY
+ PsiElement(val)('val')
+ PsiWhiteSpace(' ')
+ PsiElement(IDENTIFIER)('attribute')
+ PsiWhiteSpace('\n ')
+ PROPERTY
+ PsiElement(val)('val')
+ PsiWhiteSpace(' ')
+ PsiElement(IDENTIFIER)('override')
+ PsiWhiteSpace('\n ')
+ PROPERTY
+ PsiElement(val)('val')
+ PsiWhiteSpace(' ')
+ PsiElement(IDENTIFIER)('virtual')
+ PsiWhiteSpace('\n ')
+ PROPERTY
+ PsiElement(val)('val')
+ PsiWhiteSpace(' ')
+ PsiElement(IDENTIFIER)('abstract')
+ PsiWhiteSpace('\n ')
+ PROPERTY
+ PsiElement(val)('val')
+ PsiWhiteSpace(' ')
+ PsiElement(IDENTIFIER)('private')
+ PsiWhiteSpace('\n ')
+ PROPERTY
+ PsiElement(val)('val')
+ PsiWhiteSpace(' ')
+ PsiElement(IDENTIFIER)('protected')
+ PsiWhiteSpace('\n ')
+ PROPERTY
+ PsiElement(val)('val')
+ PsiWhiteSpace(' ')
+ PsiElement(IDENTIFIER)('public')
+ PsiWhiteSpace('\n ')
+ PROPERTY
+ PsiElement(val)('val')
+ PsiWhiteSpace(' ')
+ PsiElement(IDENTIFIER)('internal')
+ PsiWhiteSpace('\n ')
+ PROPERTY
+ PsiElement(val)('val')
+ PsiWhiteSpace(' ')
+ PsiElement(IDENTIFIER)('lazy')
+ PsiWhiteSpace('\n ')
+ PROPERTY
+ PsiElement(val)('val')
+ PsiWhiteSpace(' ')
+ PsiElement(IDENTIFIER)('wraps')
+ PsiWhiteSpace('\n ')
+ PROPERTY
+ PsiElement(val)('val')
+ PsiWhiteSpace(' ')
+ PsiElement(IDENTIFIER)('import')
+ PsiWhiteSpace('\n ')
+ PROPERTY
+ PsiElement(val)('val')
+ PsiWhiteSpace(' ')
+ PsiElement(IDENTIFIER)('where')
+ PsiWhiteSpace('\n ')
+ PROPERTY
+ PsiElement(val)('val')
+ PsiWhiteSpace(' ')
+ PsiElement(IDENTIFIER)('by')
+ PsiWhiteSpace('\n ')
+ PROPERTY
+ PsiElement(val)('val')
+ PsiWhiteSpace(' ')
+ PsiElement(IDENTIFIER)('get')
+ PsiWhiteSpace('\n ')
+ PROPERTY
+ PsiElement(val)('val')
+ PsiWhiteSpace(' ')
+ PsiElement(IDENTIFIER)('set')
+ PsiWhiteSpace('\n ')
+ PROPERTY
+ PsiElement(val)('val')
+ PsiWhiteSpace(' ')
+ PsiElement(IDENTIFIER)('public')
+ PsiWhiteSpace('\n ')
+ PROPERTY
+ PsiElement(val)('val')
+ PsiWhiteSpace(' ')
+ PsiElement(IDENTIFIER)('private')
+ PsiWhiteSpace('\n ')
+ PROPERTY
+ PsiElement(val)('val')
+ PsiWhiteSpace(' ')
+ PsiElement(IDENTIFIER)('protected')
+ PsiWhiteSpace('\n ')
+ PROPERTY
+ PsiElement(val)('val')
+ PsiWhiteSpace(' ')
+ PsiElement(IDENTIFIER)('internal')
+ PsiWhiteSpace(' ')
+ PsiElement(LBRACE)('{')
+ PsiWhiteSpace('\n ')
+ PROPERTY_GETTER
+ PsiElement(get)('get')
+ VALUE_PARAMETER_LIST
+ PsiElement(LPAR)('(')
+ PsiElement(RPAR)(')')
+ PsiWhiteSpace(' ')
+ PsiElement(EQ)('=')
+ PsiWhiteSpace(' ')
+ PsiElement(IDENTIFIER)('a')
+ PsiWhiteSpace('\n ')
+ PROPERTY_GETTER
+ PsiElement(set)('set')
+ VALUE_PARAMETER_LIST
+ PsiElement(LPAR)('(')
+ VALUE_PARAMETER
+ PsiElement(IDENTIFIER)('S')
+ PsiWhiteSpace(' ')
+ PsiElement(COLON)(':')
+ PsiWhiteSpace(' ')
+ TYPE_REFERENCE
+ USER_TYPE
+ PsiElement(IDENTIFIER)('s')
+ PsiElement(RPAR)(')')
+ PsiWhiteSpace(' ')
+ PsiElement(LBRACE)('{')
+ PsiElement(RBRACE)('}')
+ PsiWhiteSpace('\n ')
+ PsiElement(RBRACE)('}')
+ PsiWhiteSpace('\n\n ')
+ FUN
+ MODIFIER_LIST
+ PsiElement(public)('public')
+ PsiWhiteSpace(' ')
+ PsiElement(protected)('protected')
+ PsiWhiteSpace(' ')
+ PsiElement(private)('private')
+ PsiWhiteSpace(' ')
+ PsiElement(internal)('internal')
+ PsiWhiteSpace('\n ')
+ PsiElement(fun)('fun')
+ PsiWhiteSpace(' ')
+ PsiElement(IDENTIFIER)('abstract')
+ PsiWhiteSpace(' ')
+ TYPE_PARAMETER_LIST
+
+ VALUE_PARAMETER_LIST
+ PsiElement(LPAR)('(')
+ PsiElement(RPAR)(')')
+ PsiWhiteSpace(' ')
+ PsiElement(COLON)(':')
+ PsiWhiteSpace(' ')
+ TYPE_REFERENCE
+ USER_TYPE
+ PsiElement(IDENTIFIER)('abstract')
+ PsiWhiteSpace('\n ')
+ FUN
+ PsiElement(fun)('fun')
+ PsiWhiteSpace(' ')
+ PsiElement(IDENTIFIER)('virtual')
+ PsiWhiteSpace(' ')
+ TYPE_PARAMETER_LIST
+
+ VALUE_PARAMETER_LIST
+ PsiElement(LPAR)('(')
+ PsiElement(RPAR)(')')
+ PsiWhiteSpace(' ')
+ PsiElement(COLON)(':')
+ PsiWhiteSpace(' ')
+ TYPE_REFERENCE
+ USER_TYPE
+ PsiElement(IDENTIFIER)('virtual')
+ PsiWhiteSpace('\n ')
+ FUN
+ PsiElement(fun)('fun')
+ PsiWhiteSpace(' ')
+ PsiElement(IDENTIFIER)('enum')
+ PsiWhiteSpace(' ')
+ TYPE_PARAMETER_LIST
+
+ VALUE_PARAMETER_LIST
+ PsiElement(LPAR)('(')
+ PsiElement(RPAR)(')')
+ PsiWhiteSpace(' ')
+ PsiElement(COLON)(':')
+ PsiWhiteSpace(' ')
+ TYPE_REFERENCE
+ USER_TYPE
+ PsiElement(IDENTIFIER)('enum')
+ PsiWhiteSpace('\n ')
+ FUN
+ PsiElement(fun)('fun')
+ PsiWhiteSpace(' ')
+ PsiElement(IDENTIFIER)('open')
+ PsiWhiteSpace(' ')
+ TYPE_PARAMETER_LIST
+
+ VALUE_PARAMETER_LIST
+ PsiElement(LPAR)('(')
+ PsiElement(RPAR)(')')
+ PsiWhiteSpace(' ')
+ PsiElement(COLON)(':')
+ PsiWhiteSpace(' ')
+ TYPE_REFERENCE
+ USER_TYPE
+ PsiElement(IDENTIFIER)('open')
+ PsiWhiteSpace('\n ')
+ FUN
+ PsiElement(fun)('fun')
+ PsiWhiteSpace(' ')
+ PsiElement(IDENTIFIER)('attribute')
+ PsiWhiteSpace(' ')
+ TYPE_PARAMETER_LIST
+
+ VALUE_PARAMETER_LIST
+ PsiElement(LPAR)('(')
+ PsiElement(RPAR)(')')
+ PsiWhiteSpace(' ')
+ PsiElement(COLON)(':')
+ PsiWhiteSpace(' ')
+ TYPE_REFERENCE
+ USER_TYPE
+ PsiElement(IDENTIFIER)('attribute')
+ PsiWhiteSpace('\n ')
+ FUN
+ PsiElement(fun)('fun')
+ PsiWhiteSpace(' ')
+ PsiElement(IDENTIFIER)('override')
+ PsiWhiteSpace(' ')
+ TYPE_PARAMETER_LIST
+
+ VALUE_PARAMETER_LIST
+ PsiElement(LPAR)('(')
+ PsiElement(RPAR)(')')
+ PsiWhiteSpace(' ')
+ PsiElement(COLON)(':')
+ PsiWhiteSpace(' ')
+ TYPE_REFERENCE
+ USER_TYPE
+ PsiElement(IDENTIFIER)('override')
+ PsiWhiteSpace('\n ')
+ FUN
+ PsiElement(fun)('fun')
+ PsiWhiteSpace(' ')
+ PsiElement(IDENTIFIER)('virtual')
+ PsiWhiteSpace(' ')
+ TYPE_PARAMETER_LIST
+
+ VALUE_PARAMETER_LIST
+ PsiElement(LPAR)('(')
+ PsiElement(RPAR)(')')
+ PsiWhiteSpace(' ')
+ PsiElement(COLON)(':')
+ PsiWhiteSpace(' ')
+ TYPE_REFERENCE
+ USER_TYPE
+ PsiElement(IDENTIFIER)('virtual')
+ PsiWhiteSpace('\n ')
+ FUN
+ PsiElement(fun)('fun')
+ PsiWhiteSpace(' ')
+ PsiElement(IDENTIFIER)('abstract')
+ PsiWhiteSpace(' ')
+ TYPE_PARAMETER_LIST
+
+ VALUE_PARAMETER_LIST
+ PsiElement(LPAR)('(')
+ PsiElement(RPAR)(')')
+ PsiWhiteSpace(' ')
+ PsiElement(COLON)(':')
+ PsiWhiteSpace(' ')
+ TYPE_REFERENCE
+ USER_TYPE
+ PsiElement(IDENTIFIER)('abstract')
+ PsiWhiteSpace('\n ')
+ FUN
+ PsiElement(fun)('fun')
+ PsiWhiteSpace(' ')
+ PsiElement(IDENTIFIER)('private')
+ PsiWhiteSpace(' ')
+ TYPE_PARAMETER_LIST
+
+ VALUE_PARAMETER_LIST
+ PsiElement(LPAR)('(')
+ PsiElement(RPAR)(')')
+ PsiWhiteSpace(' ')
+ PsiElement(COLON)(':')
+ PsiWhiteSpace(' ')
+ TYPE_REFERENCE
+ USER_TYPE
+ PsiElement(IDENTIFIER)('private')
+ PsiWhiteSpace('\n ')
+ FUN
+ PsiElement(fun)('fun')
+ PsiWhiteSpace(' ')
+ PsiElement(IDENTIFIER)('protected')
+ PsiWhiteSpace(' ')
+ TYPE_PARAMETER_LIST
+
+ VALUE_PARAMETER_LIST
+ PsiElement(LPAR)('(')
+ PsiElement(RPAR)(')')
+ PsiWhiteSpace(' ')
+ PsiElement(COLON)(':')
+ PsiWhiteSpace(' ')
+ TYPE_REFERENCE
+ USER_TYPE
+ PsiElement(IDENTIFIER)('protected')
+ PsiWhiteSpace('\n ')
+ FUN
+ PsiElement(fun)('fun')
+ PsiWhiteSpace(' ')
+ PsiElement(IDENTIFIER)('public')
+ PsiWhiteSpace(' ')
+ TYPE_PARAMETER_LIST
+
+ VALUE_PARAMETER_LIST
+ PsiElement(LPAR)('(')
+ PsiElement(RPAR)(')')
+ PsiWhiteSpace(' ')
+ PsiElement(COLON)(':')
+ PsiWhiteSpace(' ')
+ TYPE_REFERENCE
+ USER_TYPE
+ PsiElement(IDENTIFIER)('public')
+ PsiWhiteSpace('\n ')
+ FUN
+ PsiElement(fun)('fun')
+ PsiWhiteSpace(' ')
+ PsiElement(IDENTIFIER)('internal')
+ PsiWhiteSpace(' ')
+ TYPE_PARAMETER_LIST
+
+ VALUE_PARAMETER_LIST
+ PsiElement(LPAR)('(')
+ PsiElement(RPAR)(')')
+ PsiWhiteSpace(' ')
+ PsiElement(COLON)(':')
+ PsiWhiteSpace(' ')
+ TYPE_REFERENCE
+ USER_TYPE
+ PsiElement(IDENTIFIER)('internal')
+ PsiWhiteSpace('\n ')
+ FUN
+ PsiElement(fun)('fun')
+ PsiWhiteSpace(' ')
+ PsiElement(IDENTIFIER)('lazy')
+ PsiWhiteSpace(' ')
+ TYPE_PARAMETER_LIST
+
+ VALUE_PARAMETER_LIST
+ PsiElement(LPAR)('(')
+ PsiElement(RPAR)(')')
+ PsiWhiteSpace(' ')
+ PsiElement(COLON)(':')
+ PsiWhiteSpace(' ')
+ TYPE_REFERENCE
+ USER_TYPE
+ PsiElement(IDENTIFIER)('lazy')
+ PsiWhiteSpace('\n ')
+ FUN
+ PsiElement(fun)('fun')
+ PsiWhiteSpace(' ')
+ PsiElement(IDENTIFIER)('wraps')
+ PsiWhiteSpace(' ')
+ TYPE_PARAMETER_LIST
+
+ VALUE_PARAMETER_LIST
+ PsiElement(LPAR)('(')
+ PsiElement(RPAR)(')')
+ PsiWhiteSpace(' ')
+ PsiElement(COLON)(':')
+ PsiWhiteSpace(' ')
+ TYPE_REFERENCE
+ USER_TYPE
+ PsiElement(IDENTIFIER)('wraps')
+ PsiWhiteSpace('\n ')
+ FUN
+ PsiElement(fun)('fun')
+ PsiWhiteSpace(' ')
+ PsiElement(IDENTIFIER)('import')
+ PsiWhiteSpace(' ')
+ TYPE_PARAMETER_LIST
+
+ VALUE_PARAMETER_LIST
+ PsiElement(LPAR)('(')
+ PsiElement(RPAR)(')')
+ PsiWhiteSpace(' ')
+ PsiElement(COLON)(':')
+ PsiWhiteSpace(' ')
+ TYPE_REFERENCE
+ USER_TYPE
+ PsiElement(IDENTIFIER)('import')
+ PsiWhiteSpace('\n ')
+ FUN
+ PsiElement(fun)('fun')
+ PsiWhiteSpace(' ')
+ PsiElement(IDENTIFIER)('where')
+ PsiWhiteSpace(' ')
+ TYPE_PARAMETER_LIST
+
+ VALUE_PARAMETER_LIST
+ PsiElement(LPAR)('(')
+ PsiElement(RPAR)(')')
+ PsiWhiteSpace(' ')
+ PsiElement(COLON)(':')
+ PsiWhiteSpace(' ')
+ TYPE_REFERENCE
+ USER_TYPE
+ PsiElement(IDENTIFIER)('where')
+ PsiWhiteSpace('\n ')
+ FUN
+ PsiElement(fun)('fun')
+ PsiWhiteSpace(' ')
+ PsiElement(IDENTIFIER)('by')
+ PsiWhiteSpace(' ')
+ TYPE_PARAMETER_LIST
+
+ VALUE_PARAMETER_LIST
+ PsiElement(LPAR)('(')
+ PsiElement(RPAR)(')')
+ PsiWhiteSpace(' ')
+ PsiElement(COLON)(':')
+ PsiWhiteSpace(' ')
+ TYPE_REFERENCE
+ USER_TYPE
+ PsiElement(IDENTIFIER)('by')
+ PsiWhiteSpace('\n ')
+ FUN
+ PsiElement(fun)('fun')
+ PsiWhiteSpace(' ')
+ PsiElement(IDENTIFIER)('get')
+ PsiWhiteSpace(' ')
+ TYPE_PARAMETER_LIST
+
+ VALUE_PARAMETER_LIST
+ PsiElement(LPAR)('(')
+ PsiElement(RPAR)(')')
+ PsiWhiteSpace(' ')
+ PsiElement(COLON)(':')
+ PsiWhiteSpace(' ')
+ TYPE_REFERENCE
+ USER_TYPE
+ PsiElement(IDENTIFIER)('get')
+ PsiWhiteSpace('\n ')
+ FUN
+ PsiElement(fun)('fun')
+ PsiWhiteSpace(' ')
+ PsiElement(IDENTIFIER)('set')
+ PsiWhiteSpace(' ')
+ TYPE_PARAMETER_LIST
+
+ VALUE_PARAMETER_LIST
+ PsiElement(LPAR)('(')
+ PsiElement(RPAR)(')')
+ PsiWhiteSpace(' ')
+ PsiElement(COLON)(':')
+ PsiWhiteSpace(' ')
+ TYPE_REFERENCE
+ USER_TYPE
+ PsiElement(IDENTIFIER)('set')
+ PsiWhiteSpace('\n ')
+ FUN
+ PsiElement(fun)('fun')
+ PsiWhiteSpace(' ')
+ PsiElement(IDENTIFIER)('public')
+ PsiWhiteSpace(' ')
+ TYPE_PARAMETER_LIST
+
+ VALUE_PARAMETER_LIST
+ PsiElement(LPAR)('(')
+ PsiElement(RPAR)(')')
+ PsiWhiteSpace(' ')
+ PsiElement(COLON)(':')
+ PsiWhiteSpace(' ')
+ TYPE_REFERENCE
+ USER_TYPE
+ PsiElement(IDENTIFIER)('public')
+ PsiWhiteSpace('\n ')
+ FUN
+ PsiElement(fun)('fun')
+ PsiWhiteSpace(' ')
+ PsiElement(IDENTIFIER)('private')
+ PsiWhiteSpace(' ')
+ TYPE_PARAMETER_LIST
+
+ VALUE_PARAMETER_LIST
+ PsiElement(LPAR)('(')
+ PsiElement(RPAR)(')')
+ PsiWhiteSpace(' ')
+ PsiElement(COLON)(':')
+ PsiWhiteSpace(' ')
+ TYPE_REFERENCE
+ USER_TYPE
+ PsiElement(IDENTIFIER)('private')
+ PsiWhiteSpace('\n ')
+ FUN
+ PsiElement(fun)('fun')
+ PsiWhiteSpace(' ')
+ PsiElement(IDENTIFIER)('protected')
+ PsiWhiteSpace(' ')
+ TYPE_PARAMETER_LIST
+
+ VALUE_PARAMETER_LIST
+ PsiElement(LPAR)('(')
+ PsiElement(RPAR)(')')
+ PsiWhiteSpace(' ')
+ PsiElement(COLON)(':')
+ PsiWhiteSpace(' ')
+ TYPE_REFERENCE
+ USER_TYPE
+ PsiElement(IDENTIFIER)('protected')
+ PsiWhiteSpace('\n ')
+ FUN
+ PsiElement(fun)('fun')
+ PsiWhiteSpace(' ')
+ PsiElement(IDENTIFIER)('internal')
+ PsiWhiteSpace(' ')
+ TYPE_PARAMETER_LIST
+
+ VALUE_PARAMETER_LIST
+ PsiElement(LPAR)('(')
+ PsiElement(RPAR)(')')
+ PsiWhiteSpace(' ')
+ PsiElement(COLON)(':')
+ PsiWhiteSpace(' ')
+ TYPE_REFERENCE
+ USER_TYPE
+ PsiElement(IDENTIFIER)('internal')
+ PsiWhiteSpace('\n\n ')
+ FUN
+ PsiElement(fun)('fun')
+ PsiWhiteSpace(' ')
+ PsiElement(IDENTIFIER)('test')
+ TYPE_PARAMETER_LIST
+
+ VALUE_PARAMETER_LIST
+ PsiElement(LPAR)('(')
+ PsiWhiteSpace('\n ')
+ VALUE_PARAMETER
+ PsiElement(IDENTIFIER)('abstract')
+ PsiWhiteSpace(' ')
+ PsiElement(COLON)(':')
+ PsiWhiteSpace(' ')
+ TYPE_REFERENCE
+ USER_TYPE
+ PsiElement(IDENTIFIER)('t')
+ PsiElement(COMMA)(',')
+ PsiWhiteSpace('\n ')
+ VALUE_PARAMETER
+ PsiElement(IDENTIFIER)('virtual')
+ PsiWhiteSpace(' ')
+ PsiElement(COLON)(':')
+ PsiWhiteSpace(' ')
+ TYPE_REFERENCE
+ USER_TYPE
+ PsiElement(IDENTIFIER)('t')
+ PsiElement(COMMA)(',')
+ PsiWhiteSpace('\n ')
+ VALUE_PARAMETER
+ PsiElement(IDENTIFIER)('enum')
+ PsiWhiteSpace(' ')
+ PsiElement(COLON)(':')
+ PsiWhiteSpace(' ')
+ TYPE_REFERENCE
+ USER_TYPE
+ PsiElement(IDENTIFIER)('t')
+ PsiElement(COMMA)(',')
+ PsiWhiteSpace('\n ')
+ VALUE_PARAMETER
+ PsiElement(IDENTIFIER)('open')
+ PsiWhiteSpace(' ')
+ PsiElement(COLON)(':')
+ PsiWhiteSpace(' ')
+ TYPE_REFERENCE
+ USER_TYPE
+ PsiElement(IDENTIFIER)('t')
+ PsiElement(COMMA)(',')
+ PsiWhiteSpace('\n ')
+ VALUE_PARAMETER
+ PsiElement(IDENTIFIER)('attribute')
+ PsiWhiteSpace(' ')
+ PsiElement(COLON)(':')
+ PsiWhiteSpace(' ')
+ TYPE_REFERENCE
+ USER_TYPE
+ PsiElement(IDENTIFIER)('t')
+ PsiElement(COMMA)(',')
+ PsiWhiteSpace('\n ')
+ VALUE_PARAMETER
+ PsiElement(IDENTIFIER)('override')
+ PsiWhiteSpace(' ')
+ PsiElement(COLON)(':')
+ PsiWhiteSpace(' ')
+ TYPE_REFERENCE
+ USER_TYPE
+ PsiElement(IDENTIFIER)('t')
+ PsiElement(COMMA)(',')
+ PsiWhiteSpace('\n ')
+ VALUE_PARAMETER
+ PsiElement(IDENTIFIER)('virtual')
+ PsiWhiteSpace(' ')
+ PsiElement(COLON)(':')
+ PsiWhiteSpace(' ')
+ TYPE_REFERENCE
+ USER_TYPE
+ PsiElement(IDENTIFIER)('t')
+ PsiElement(COMMA)(',')
+ PsiWhiteSpace('\n ')
+ VALUE_PARAMETER
+ PsiElement(IDENTIFIER)('abstract')
+ PsiWhiteSpace(' ')
+ PsiElement(COLON)(':')
+ PsiWhiteSpace(' ')
+ TYPE_REFERENCE
+ USER_TYPE
+ PsiElement(IDENTIFIER)('t')
+ PsiElement(COMMA)(',')
+ PsiWhiteSpace('\n ')
+ VALUE_PARAMETER
+ PsiElement(IDENTIFIER)('private')
+ PsiWhiteSpace(' ')
+ PsiElement(COLON)(':')
+ PsiWhiteSpace(' ')
+ TYPE_REFERENCE
+ USER_TYPE
+ PsiElement(IDENTIFIER)('t')
+ PsiElement(COMMA)(',')
+ PsiWhiteSpace('\n ')
+ VALUE_PARAMETER
+ PsiElement(IDENTIFIER)('protected')
+ PsiWhiteSpace(' ')
+ PsiElement(COLON)(':')
+ PsiWhiteSpace(' ')
+ TYPE_REFERENCE
+ USER_TYPE
+ PsiElement(IDENTIFIER)('t')
+ PsiElement(COMMA)(',')
+ PsiWhiteSpace('\n ')
+ VALUE_PARAMETER
+ PsiElement(IDENTIFIER)('public')
+ PsiWhiteSpace(' ')
+ PsiElement(COLON)(':')
+ PsiWhiteSpace(' ')
+ TYPE_REFERENCE
+ USER_TYPE
+ PsiElement(IDENTIFIER)('t')
+ PsiElement(COMMA)(',')
+ PsiWhiteSpace('\n ')
+ VALUE_PARAMETER
+ PsiElement(IDENTIFIER)('internal')
+ PsiWhiteSpace(' ')
+ PsiElement(COLON)(':')
+ PsiWhiteSpace(' ')
+ TYPE_REFERENCE
+ USER_TYPE
+ PsiElement(IDENTIFIER)('t')
+ PsiElement(COMMA)(',')
+ PsiWhiteSpace('\n ')
+ VALUE_PARAMETER
+ PsiElement(IDENTIFIER)('lazy')
+ PsiWhiteSpace(' ')
+ PsiElement(COLON)(':')
+ PsiWhiteSpace(' ')
+ TYPE_REFERENCE
+ USER_TYPE
+ PsiElement(IDENTIFIER)('t')
+ PsiElement(COMMA)(',')
+ PsiWhiteSpace('\n ')
+ VALUE_PARAMETER
+ PsiElement(IDENTIFIER)('wraps')
+ PsiWhiteSpace(' ')
+ PsiElement(COLON)(':')
+ PsiWhiteSpace(' ')
+ TYPE_REFERENCE
+ USER_TYPE
+ PsiElement(IDENTIFIER)('t')
+ PsiElement(COMMA)(',')
+ PsiWhiteSpace('\n ')
+ VALUE_PARAMETER
+ PsiElement(IDENTIFIER)('import')
+ PsiWhiteSpace(' ')
+ PsiElement(COLON)(':')
+ PsiWhiteSpace(' ')
+ TYPE_REFERENCE
+ USER_TYPE
+ PsiElement(IDENTIFIER)('t')
+ PsiElement(COMMA)(',')
+ PsiWhiteSpace('\n ')
+ VALUE_PARAMETER
+ PsiElement(IDENTIFIER)('where')
+ PsiWhiteSpace(' ')
+ PsiElement(COLON)(':')
+ PsiWhiteSpace(' ')
+ TYPE_REFERENCE
+ USER_TYPE
+ PsiElement(IDENTIFIER)('t')
+ PsiElement(COMMA)(',')
+ PsiWhiteSpace('\n ')
+ VALUE_PARAMETER
+ PsiElement(IDENTIFIER)('by')
+ PsiWhiteSpace(' ')
+ PsiElement(COLON)(':')
+ PsiWhiteSpace(' ')
+ TYPE_REFERENCE
+ USER_TYPE
+ PsiElement(IDENTIFIER)('t')
+ PsiElement(COMMA)(',')
+ PsiWhiteSpace('\n ')
+ VALUE_PARAMETER
+ PsiElement(IDENTIFIER)('get')
+ PsiWhiteSpace(' ')
+ PsiElement(COLON)(':')
+ PsiWhiteSpace(' ')
+ TYPE_REFERENCE
+ USER_TYPE
+ PsiElement(IDENTIFIER)('t')
+ PsiElement(COMMA)(',')
+ PsiWhiteSpace('\n ')
+ VALUE_PARAMETER
+ PsiElement(IDENTIFIER)('set')
+ PsiWhiteSpace(' ')
+ PsiElement(COLON)(':')
+ PsiWhiteSpace(' ')
+ TYPE_REFERENCE
+ USER_TYPE
+ PsiElement(IDENTIFIER)('t')
+ PsiElement(COMMA)(',')
+ PsiWhiteSpace('\n ')
+ VALUE_PARAMETER
+ PsiElement(IDENTIFIER)('public')
+ PsiWhiteSpace(' ')
+ PsiElement(COLON)(':')
+ PsiWhiteSpace(' ')
+ TYPE_REFERENCE
+ USER_TYPE
+ PsiElement(IDENTIFIER)('t')
+ PsiElement(COMMA)(',')
+ PsiWhiteSpace('\n ')
+ VALUE_PARAMETER
+ PsiElement(IDENTIFIER)('private')
+ PsiWhiteSpace(' ')
+ PsiElement(COLON)(':')
+ PsiWhiteSpace(' ')
+ TYPE_REFERENCE
+ USER_TYPE
+ PsiElement(IDENTIFIER)('t')
+ PsiElement(COMMA)(',')
+ PsiWhiteSpace('\n ')
+ VALUE_PARAMETER
+ PsiElement(IDENTIFIER)('protected')
+ PsiWhiteSpace(' ')
+ PsiElement(COLON)(':')
+ PsiWhiteSpace(' ')
+ TYPE_REFERENCE
+ USER_TYPE
+ PsiElement(IDENTIFIER)('t')
+ PsiElement(COMMA)(',')
+ PsiWhiteSpace('\n ')
+ VALUE_PARAMETER
+ PsiElement(IDENTIFIER)('internal')
+ PsiWhiteSpace(' ')
+ PsiElement(COLON)(':')
+ PsiWhiteSpace(' ')
+ TYPE_REFERENCE
+ USER_TYPE
+ PsiElement(IDENTIFIER)('t')
+ PsiWhiteSpace('\n ')
+ PsiElement(RPAR)(')')
+ PsiWhiteSpace('\n\n')
+ PsiElement(RBRACE)('}')
\ No newline at end of file
diff --git a/idea/tests/org/jetbrains/jet/parsing/JetParsingTest.java b/idea/tests/org/jetbrains/jet/parsing/JetParsingTest.java
index 8ca0ff27999..dbf7c7a8754 100644
--- a/idea/tests/org/jetbrains/jet/parsing/JetParsingTest.java
+++ b/idea/tests/org/jetbrains/jet/parsing/JetParsingTest.java
@@ -52,4 +52,5 @@ public class JetParsingTest extends ParsingTestCase {
public void testFunctions_ERR() throws Exception {doTest(true);}
public void testExtensions() throws Exception {doTest(true);}
public void testExtensions_ERR() throws Exception {doTest(true);}
+ public void testSoftKeywords() throws Exception {doTest(true);}
}