Class objects

This commit is contained in:
Andrey Breslav
2010-12-21 20:27:55 +03:00
parent 198c46528c
commit 7547b36eb0
6 changed files with 296 additions and 11 deletions
+2 -1
View File
@@ -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);
} }
+35
View File
@@ -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()
} }
+222 -2
View File
@@ -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)('}')