Class objects
This commit is contained in:
@@ -188,7 +188,8 @@ arrayAccess
|
|||||||
;
|
;
|
||||||
|
|
||||||
objectLiteral
|
objectLiteral
|
||||||
: "object" delegationSpecifier{","}? classBody?
|
: "object" delegationSpecifier{","} classBody?
|
||||||
|
: "object" classBody
|
||||||
;
|
;
|
||||||
|
|
||||||
/* Factory methods:
|
/* Factory methods:
|
||||||
|
|||||||
@@ -51,6 +51,7 @@ public interface JetNodeTypes {
|
|||||||
JetNodeType INITIALIZER_LIST = new JetNodeType("INITIALIZER_LIST");
|
JetNodeType INITIALIZER_LIST = new JetNodeType("INITIALIZER_LIST");
|
||||||
JetNodeType THIS_CALL = new JetNodeType("THIS_CALL");
|
JetNodeType THIS_CALL = new JetNodeType("THIS_CALL");
|
||||||
JetNodeType BLOCK = new JetNodeType("BLOCK");
|
JetNodeType BLOCK = new JetNodeType("BLOCK");
|
||||||
|
JetNodeType CLASS_OBJECT = new JetNodeType("CLASS_OBJECT");
|
||||||
|
|
||||||
IElementType NAMESPACE_NAME = new JetNodeType("NAMESPACE_NAME");
|
IElementType NAMESPACE_NAME = new JetNodeType("NAMESPACE_NAME");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,8 +11,11 @@ import static org.jetbrains.jet.lexer.JetTokens.*;
|
|||||||
* @author abreslav
|
* @author abreslav
|
||||||
*/
|
*/
|
||||||
public class JetExpressionParsing extends AbstractJetParsing {
|
public class JetExpressionParsing extends AbstractJetParsing {
|
||||||
public JetExpressionParsing(SemanticWhitespaceAwarePsiBuilder builder) {
|
private final JetParsing myJetParsing;
|
||||||
|
|
||||||
|
public JetExpressionParsing(SemanticWhitespaceAwarePsiBuilder builder, JetParsing jetParsing) {
|
||||||
super(builder);
|
super(builder);
|
||||||
|
myJetParsing = jetParsing;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -82,6 +85,25 @@ public class JetExpressionParsing extends AbstractJetParsing {
|
|||||||
argument.done(type);
|
argument.done(type);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* objectLiteral
|
||||||
|
* : "object" delegationSpecifier{","} classBody?
|
||||||
|
* : "object" classBody
|
||||||
|
* ;
|
||||||
|
*/
|
||||||
|
public void parseObjectLiteral() {
|
||||||
|
assert at(OBJECT_KEYWORD);
|
||||||
|
|
||||||
|
advance(); // OBJECT_KEYWORD
|
||||||
|
|
||||||
|
if (at(LBRACE)) {
|
||||||
|
myJetParsing.parseClassBody();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
myJetParsing.parseDelegationSpecifierList();
|
||||||
|
if (at(LBRACE)) {
|
||||||
|
myJetParsing.parseClassBody();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -36,13 +36,13 @@ public class JetParsing extends AbstractJetParsing {
|
|||||||
private static final TokenSet TYPE_PARAMETER_GT_RECOVERY_SET = TokenSet.create(WHERE_KEYWORD, WRAPS_KEYWORD, LPAR, COLON, LBRACE, GT);
|
private static final TokenSet TYPE_PARAMETER_GT_RECOVERY_SET = TokenSet.create(WHERE_KEYWORD, WRAPS_KEYWORD, LPAR, COLON, LBRACE, GT);
|
||||||
private static final TokenSet PARAMETER_NAME_RECOVERY_SET = TokenSet.create(COLON, EQ, COMMA, RPAR);
|
private static final TokenSet PARAMETER_NAME_RECOVERY_SET = TokenSet.create(COLON, EQ, COMMA, RPAR);
|
||||||
private static final TokenSet NAMESPACE_NAME_RECOVERY_SET = TokenSet.create(DOT, EOL_OR_SEMICOLON);
|
private static final TokenSet NAMESPACE_NAME_RECOVERY_SET = TokenSet.create(DOT, EOL_OR_SEMICOLON);
|
||||||
private static final TokenSet TYPE_REF_FIRST = TokenSet.create(LBRACKET, IDENTIFIER, LBRACE, LPAR);
|
/*package*/ static final TokenSet TYPE_REF_FIRST = TokenSet.create(LBRACKET, IDENTIFIER, LBRACE, LPAR);
|
||||||
|
|
||||||
private final JetExpressionParsing myExpressionParsing;
|
private final JetExpressionParsing myExpressionParsing;
|
||||||
|
|
||||||
public JetParsing(SemanticWhitespaceAwarePsiBuilder builder) {
|
public JetParsing(SemanticWhitespaceAwarePsiBuilder builder) {
|
||||||
super(builder);
|
super(builder);
|
||||||
this.myExpressionParsing = new JetExpressionParsing(builder);
|
this.myExpressionParsing = new JetExpressionParsing(builder, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -430,7 +430,7 @@ public class JetParsing extends AbstractJetParsing {
|
|||||||
* : ("{" memberDeclaration{","} "}")?
|
* : ("{" memberDeclaration{","} "}")?
|
||||||
* ;
|
* ;
|
||||||
*/
|
*/
|
||||||
private void parseClassBody() {
|
/*package*/ void parseClassBody() {
|
||||||
// TODO: enum classes
|
// TODO: enum classes
|
||||||
assert at(LBRACE);
|
assert at(LBRACE);
|
||||||
PsiBuilder.Marker body = mark();
|
PsiBuilder.Marker body = mark();
|
||||||
@@ -577,8 +577,14 @@ public class JetParsing extends AbstractJetParsing {
|
|||||||
* ;
|
* ;
|
||||||
*/
|
*/
|
||||||
private JetNodeType parseClassObject() {
|
private JetNodeType parseClassObject() {
|
||||||
// TODO
|
assert at(CLASS_KEYWORD) && lookahead(1) == OBJECT_KEYWORD;
|
||||||
return null;
|
|
||||||
|
advance(); // CLASS_KEYWORD
|
||||||
|
|
||||||
|
myExpressionParsing.parseObjectLiteral();
|
||||||
|
|
||||||
|
|
||||||
|
return CLASS_OBJECT;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -877,7 +883,7 @@ public class JetParsing extends AbstractJetParsing {
|
|||||||
/*
|
/*
|
||||||
* delegationSpecifier{","}
|
* delegationSpecifier{","}
|
||||||
*/
|
*/
|
||||||
private void parseDelegationSpecifierList() {
|
/*package*/ void parseDelegationSpecifierList() {
|
||||||
PsiBuilder.Marker list = mark();
|
PsiBuilder.Marker list = mark();
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
@@ -1024,7 +1030,7 @@ public class JetParsing extends AbstractJetParsing {
|
|||||||
}
|
}
|
||||||
|
|
||||||
expect(GT, "Missing '>'", recoverySet);
|
expect(GT, "Missing '>'", recoverySet);
|
||||||
// TODO : where an stuff
|
// TODO : where and stuff
|
||||||
}
|
}
|
||||||
list.done(TYPE_PARAMETER_LIST);
|
list.done(TYPE_PARAMETER_LIST);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,7 +22,23 @@ class foo {
|
|||||||
|
|
||||||
class Bar {
|
class Bar {
|
||||||
extension foo for X {
|
extension foo for X {
|
||||||
|
class object {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private class object {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private class object Fooo {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private class object Fooo, Bar by foo {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private class object Fooo, Bar by foo, Goo()
|
||||||
}
|
}
|
||||||
|
|
||||||
class Bar {}
|
class Bar {}
|
||||||
@@ -56,4 +72,23 @@ class foo {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class object {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private class object {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private class object Fooo {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private class object Fooo, Bar by foo {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private class object Fooo, Bar by foo, Goo()
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -171,7 +171,117 @@ JetFile: SimpleClassMembers.jet
|
|||||||
PsiWhiteSpace(' ')
|
PsiWhiteSpace(' ')
|
||||||
CLASS_BODY
|
CLASS_BODY
|
||||||
PsiElement(LBRACE)('{')
|
PsiElement(LBRACE)('{')
|
||||||
PsiWhiteSpace('\n\n ')
|
PsiWhiteSpace('\n ')
|
||||||
|
CLASS_OBJECT
|
||||||
|
PsiElement(class)('class')
|
||||||
|
PsiWhiteSpace(' ')
|
||||||
|
PsiElement(object)('object')
|
||||||
|
PsiWhiteSpace(' ')
|
||||||
|
CLASS_BODY
|
||||||
|
PsiElement(LBRACE)('{')
|
||||||
|
PsiWhiteSpace('\n\n ')
|
||||||
|
PsiElement(RBRACE)('}')
|
||||||
|
PsiWhiteSpace('\n\n ')
|
||||||
|
CLASS_OBJECT
|
||||||
|
MODIFIER_LIST
|
||||||
|
PsiElement(private)('private')
|
||||||
|
PsiWhiteSpace(' ')
|
||||||
|
PsiElement(class)('class')
|
||||||
|
PsiWhiteSpace(' ')
|
||||||
|
PsiElement(object)('object')
|
||||||
|
PsiWhiteSpace(' ')
|
||||||
|
CLASS_BODY
|
||||||
|
PsiElement(LBRACE)('{')
|
||||||
|
PsiWhiteSpace('\n\n ')
|
||||||
|
PsiElement(RBRACE)('}')
|
||||||
|
PsiWhiteSpace('\n\n ')
|
||||||
|
CLASS_OBJECT
|
||||||
|
MODIFIER_LIST
|
||||||
|
PsiElement(private)('private')
|
||||||
|
PsiWhiteSpace(' ')
|
||||||
|
PsiElement(class)('class')
|
||||||
|
PsiWhiteSpace(' ')
|
||||||
|
PsiElement(object)('object')
|
||||||
|
PsiWhiteSpace(' ')
|
||||||
|
DELEGATION_SPECIFIER_LIST
|
||||||
|
DELEGATION_SPECIFIER
|
||||||
|
DELEGATOR_SUPER_CLASS
|
||||||
|
TYPE_REFERENCE
|
||||||
|
USER_TYPE
|
||||||
|
PsiElement(IDENTIFIER)('Fooo')
|
||||||
|
PsiWhiteSpace(' ')
|
||||||
|
CLASS_BODY
|
||||||
|
PsiElement(LBRACE)('{')
|
||||||
|
PsiWhiteSpace('\n\n ')
|
||||||
|
PsiElement(RBRACE)('}')
|
||||||
|
PsiWhiteSpace('\n\n ')
|
||||||
|
CLASS_OBJECT
|
||||||
|
MODIFIER_LIST
|
||||||
|
PsiElement(private)('private')
|
||||||
|
PsiWhiteSpace(' ')
|
||||||
|
PsiElement(class)('class')
|
||||||
|
PsiWhiteSpace(' ')
|
||||||
|
PsiElement(object)('object')
|
||||||
|
PsiWhiteSpace(' ')
|
||||||
|
DELEGATION_SPECIFIER_LIST
|
||||||
|
DELEGATION_SPECIFIER
|
||||||
|
DELEGATOR_SUPER_CLASS
|
||||||
|
TYPE_REFERENCE
|
||||||
|
USER_TYPE
|
||||||
|
PsiElement(IDENTIFIER)('Fooo')
|
||||||
|
PsiElement(COMMA)(',')
|
||||||
|
PsiWhiteSpace(' ')
|
||||||
|
DELEGATION_SPECIFIER
|
||||||
|
DELEGATOR_BY
|
||||||
|
TYPE_REFERENCE
|
||||||
|
USER_TYPE
|
||||||
|
PsiElement(IDENTIFIER)('Bar')
|
||||||
|
PsiWhiteSpace(' ')
|
||||||
|
PsiElement(by)('by')
|
||||||
|
PsiWhiteSpace(' ')
|
||||||
|
PsiElement(IDENTIFIER)('foo')
|
||||||
|
PsiWhiteSpace(' ')
|
||||||
|
CLASS_BODY
|
||||||
|
PsiElement(LBRACE)('{')
|
||||||
|
PsiWhiteSpace('\n\n ')
|
||||||
|
PsiElement(RBRACE)('}')
|
||||||
|
PsiWhiteSpace('\n\n ')
|
||||||
|
CLASS_OBJECT
|
||||||
|
MODIFIER_LIST
|
||||||
|
PsiElement(private)('private')
|
||||||
|
PsiWhiteSpace(' ')
|
||||||
|
PsiElement(class)('class')
|
||||||
|
PsiWhiteSpace(' ')
|
||||||
|
PsiElement(object)('object')
|
||||||
|
PsiWhiteSpace(' ')
|
||||||
|
DELEGATION_SPECIFIER_LIST
|
||||||
|
DELEGATION_SPECIFIER
|
||||||
|
DELEGATOR_SUPER_CLASS
|
||||||
|
TYPE_REFERENCE
|
||||||
|
USER_TYPE
|
||||||
|
PsiElement(IDENTIFIER)('Fooo')
|
||||||
|
PsiElement(COMMA)(',')
|
||||||
|
PsiWhiteSpace(' ')
|
||||||
|
DELEGATION_SPECIFIER
|
||||||
|
DELEGATOR_BY
|
||||||
|
TYPE_REFERENCE
|
||||||
|
USER_TYPE
|
||||||
|
PsiElement(IDENTIFIER)('Bar')
|
||||||
|
PsiWhiteSpace(' ')
|
||||||
|
PsiElement(by)('by')
|
||||||
|
PsiWhiteSpace(' ')
|
||||||
|
PsiElement(IDENTIFIER)('foo')
|
||||||
|
PsiElement(COMMA)(',')
|
||||||
|
PsiWhiteSpace(' ')
|
||||||
|
DELEGATION_SPECIFIER
|
||||||
|
DELEGATOR_SUPER_CALL
|
||||||
|
TYPE_REFERENCE
|
||||||
|
USER_TYPE
|
||||||
|
PsiElement(IDENTIFIER)('Goo')
|
||||||
|
VALUE_ARGUMENT_LIST
|
||||||
|
PsiElement(LPAR)('(')
|
||||||
|
PsiElement(RPAR)(')')
|
||||||
|
PsiWhiteSpace('\n ')
|
||||||
PsiElement(RBRACE)('}')
|
PsiElement(RBRACE)('}')
|
||||||
PsiWhiteSpace('\n\n ')
|
PsiWhiteSpace('\n\n ')
|
||||||
CLASS
|
CLASS
|
||||||
@@ -411,5 +521,115 @@ JetFile: SimpleClassMembers.jet
|
|||||||
PsiElement(LBRACE)('{')
|
PsiElement(LBRACE)('{')
|
||||||
PsiWhiteSpace('\n\n ')
|
PsiWhiteSpace('\n\n ')
|
||||||
PsiElement(RBRACE)('}')
|
PsiElement(RBRACE)('}')
|
||||||
PsiWhiteSpace('\n\n')
|
PsiWhiteSpace('\n\n ')
|
||||||
|
CLASS_OBJECT
|
||||||
|
PsiElement(class)('class')
|
||||||
|
PsiWhiteSpace(' ')
|
||||||
|
PsiElement(object)('object')
|
||||||
|
PsiWhiteSpace(' ')
|
||||||
|
CLASS_BODY
|
||||||
|
PsiElement(LBRACE)('{')
|
||||||
|
PsiWhiteSpace('\n\n ')
|
||||||
|
PsiElement(RBRACE)('}')
|
||||||
|
PsiWhiteSpace('\n\n ')
|
||||||
|
CLASS_OBJECT
|
||||||
|
MODIFIER_LIST
|
||||||
|
PsiElement(private)('private')
|
||||||
|
PsiWhiteSpace(' ')
|
||||||
|
PsiElement(class)('class')
|
||||||
|
PsiWhiteSpace(' ')
|
||||||
|
PsiElement(object)('object')
|
||||||
|
PsiWhiteSpace(' ')
|
||||||
|
CLASS_BODY
|
||||||
|
PsiElement(LBRACE)('{')
|
||||||
|
PsiWhiteSpace('\n\n ')
|
||||||
|
PsiElement(RBRACE)('}')
|
||||||
|
PsiWhiteSpace('\n\n ')
|
||||||
|
CLASS_OBJECT
|
||||||
|
MODIFIER_LIST
|
||||||
|
PsiElement(private)('private')
|
||||||
|
PsiWhiteSpace(' ')
|
||||||
|
PsiElement(class)('class')
|
||||||
|
PsiWhiteSpace(' ')
|
||||||
|
PsiElement(object)('object')
|
||||||
|
PsiWhiteSpace(' ')
|
||||||
|
DELEGATION_SPECIFIER_LIST
|
||||||
|
DELEGATION_SPECIFIER
|
||||||
|
DELEGATOR_SUPER_CLASS
|
||||||
|
TYPE_REFERENCE
|
||||||
|
USER_TYPE
|
||||||
|
PsiElement(IDENTIFIER)('Fooo')
|
||||||
|
PsiWhiteSpace(' ')
|
||||||
|
CLASS_BODY
|
||||||
|
PsiElement(LBRACE)('{')
|
||||||
|
PsiWhiteSpace('\n\n ')
|
||||||
|
PsiElement(RBRACE)('}')
|
||||||
|
PsiWhiteSpace('\n\n ')
|
||||||
|
CLASS_OBJECT
|
||||||
|
MODIFIER_LIST
|
||||||
|
PsiElement(private)('private')
|
||||||
|
PsiWhiteSpace(' ')
|
||||||
|
PsiElement(class)('class')
|
||||||
|
PsiWhiteSpace(' ')
|
||||||
|
PsiElement(object)('object')
|
||||||
|
PsiWhiteSpace(' ')
|
||||||
|
DELEGATION_SPECIFIER_LIST
|
||||||
|
DELEGATION_SPECIFIER
|
||||||
|
DELEGATOR_SUPER_CLASS
|
||||||
|
TYPE_REFERENCE
|
||||||
|
USER_TYPE
|
||||||
|
PsiElement(IDENTIFIER)('Fooo')
|
||||||
|
PsiElement(COMMA)(',')
|
||||||
|
PsiWhiteSpace(' ')
|
||||||
|
DELEGATION_SPECIFIER
|
||||||
|
DELEGATOR_BY
|
||||||
|
TYPE_REFERENCE
|
||||||
|
USER_TYPE
|
||||||
|
PsiElement(IDENTIFIER)('Bar')
|
||||||
|
PsiWhiteSpace(' ')
|
||||||
|
PsiElement(by)('by')
|
||||||
|
PsiWhiteSpace(' ')
|
||||||
|
PsiElement(IDENTIFIER)('foo')
|
||||||
|
PsiWhiteSpace(' ')
|
||||||
|
CLASS_BODY
|
||||||
|
PsiElement(LBRACE)('{')
|
||||||
|
PsiWhiteSpace('\n\n ')
|
||||||
|
PsiElement(RBRACE)('}')
|
||||||
|
PsiWhiteSpace('\n\n ')
|
||||||
|
CLASS_OBJECT
|
||||||
|
MODIFIER_LIST
|
||||||
|
PsiElement(private)('private')
|
||||||
|
PsiWhiteSpace(' ')
|
||||||
|
PsiElement(class)('class')
|
||||||
|
PsiWhiteSpace(' ')
|
||||||
|
PsiElement(object)('object')
|
||||||
|
PsiWhiteSpace(' ')
|
||||||
|
DELEGATION_SPECIFIER_LIST
|
||||||
|
DELEGATION_SPECIFIER
|
||||||
|
DELEGATOR_SUPER_CLASS
|
||||||
|
TYPE_REFERENCE
|
||||||
|
USER_TYPE
|
||||||
|
PsiElement(IDENTIFIER)('Fooo')
|
||||||
|
PsiElement(COMMA)(',')
|
||||||
|
PsiWhiteSpace(' ')
|
||||||
|
DELEGATION_SPECIFIER
|
||||||
|
DELEGATOR_BY
|
||||||
|
TYPE_REFERENCE
|
||||||
|
USER_TYPE
|
||||||
|
PsiElement(IDENTIFIER)('Bar')
|
||||||
|
PsiWhiteSpace(' ')
|
||||||
|
PsiElement(by)('by')
|
||||||
|
PsiWhiteSpace(' ')
|
||||||
|
PsiElement(IDENTIFIER)('foo')
|
||||||
|
PsiElement(COMMA)(',')
|
||||||
|
PsiWhiteSpace(' ')
|
||||||
|
DELEGATION_SPECIFIER
|
||||||
|
DELEGATOR_SUPER_CALL
|
||||||
|
TYPE_REFERENCE
|
||||||
|
USER_TYPE
|
||||||
|
PsiElement(IDENTIFIER)('Goo')
|
||||||
|
VALUE_ARGUMENT_LIST
|
||||||
|
PsiElement(LPAR)('(')
|
||||||
|
PsiElement(RPAR)(')')
|
||||||
|
PsiWhiteSpace('\n\n\n')
|
||||||
PsiElement(RBRACE)('}')
|
PsiElement(RBRACE)('}')
|
||||||
Reference in New Issue
Block a user