Value arguments fixed
This commit is contained in:
@@ -71,11 +71,11 @@ block
|
|||||||
;
|
;
|
||||||
|
|
||||||
decomposer // TODO: consider other names
|
decomposer // TODO: consider other names
|
||||||
: attributes "decomposer" SimpleName "(" (attributes SimpleName){","} ")" // Public properties only
|
: attributes "decomposer" (type ".")? SimpleName "(" (attributes SimpleName){","} ")" // Public properties only
|
||||||
;
|
;
|
||||||
|
|
||||||
function
|
function
|
||||||
: modifiers "fun" functionRest
|
: modifiers "fun" (type ".")? functionRest
|
||||||
;
|
;
|
||||||
|
|
||||||
functionRest
|
functionRest
|
||||||
@@ -88,7 +88,7 @@ functionBody
|
|||||||
;
|
;
|
||||||
|
|
||||||
property
|
property
|
||||||
: modifiers ("val" | "var") propertyRest
|
: modifiers ("val" | "var") (type ".")? propertyRest
|
||||||
;
|
;
|
||||||
|
|
||||||
propertyRest
|
propertyRest
|
||||||
|
|||||||
@@ -1,22 +0,0 @@
|
|||||||
extension
|
|
||||||
: completeExtension
|
|
||||||
: extensionMethod
|
|
||||||
: extensionProperty
|
|
||||||
: extensionDecomposer
|
|
||||||
;
|
|
||||||
|
|
||||||
completeExtension
|
|
||||||
: modifiers "extension" SimpleName? typeParameters? "for" type classBody? // properties cannot be lazy, cannot have backing fields
|
|
||||||
;
|
|
||||||
|
|
||||||
extensionMethod
|
|
||||||
: modifiers "fun" type "." functionRest
|
|
||||||
;
|
|
||||||
|
|
||||||
extensionProperty
|
|
||||||
: modifiers ("val" | "var") type "." propertyRest // Extension property cannot be lazy
|
|
||||||
;
|
|
||||||
|
|
||||||
extensionDecomposer
|
|
||||||
: attributes "decomposer" (type ".")? SimpleName "(" attributes SimpleName{","} ")" // Public properties only
|
|
||||||
;
|
|
||||||
@@ -25,6 +25,7 @@ toplevelObject
|
|||||||
: function
|
: function
|
||||||
: property
|
: property
|
||||||
: typedef
|
: typedef
|
||||||
|
: decomposer
|
||||||
;
|
;
|
||||||
|
|
||||||
namespace
|
namespace
|
||||||
@@ -36,4 +37,8 @@ namespace
|
|||||||
|
|
||||||
typedef
|
typedef
|
||||||
: modifiers "type" SimpleName typeParameters? "=" type
|
: modifiers "type" SimpleName typeParameters? "=" type
|
||||||
;
|
;
|
||||||
|
|
||||||
|
extension
|
||||||
|
: modifiers "extension" SimpleName? typeParameters? "for" type classBody? // properties cannot be lazy, cannot have backing fields
|
||||||
|
;
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ public interface JetNodeTypes {
|
|||||||
JetNodeType FUN = new JetNodeType("FUN");
|
JetNodeType FUN = new JetNodeType("FUN");
|
||||||
JetNodeType EXTENSION = new JetNodeType("EXTENSION");
|
JetNodeType EXTENSION = new JetNodeType("EXTENSION");
|
||||||
JetNodeType TYPEDEF = new JetNodeType("TYPEDEF");
|
JetNodeType TYPEDEF = new JetNodeType("TYPEDEF");
|
||||||
|
JetNodeType DECOMPOSER = new JetNodeType("DECOMPOSER");
|
||||||
JetNodeType TYPE_PARAMETER_LIST = new JetNodeType("TYPE_PARAMETER_LIST");
|
JetNodeType TYPE_PARAMETER_LIST = new JetNodeType("TYPE_PARAMETER_LIST");
|
||||||
JetNodeType TYPE_PARAMETER = new JetNodeType("TYPE_PARAMETER");
|
JetNodeType TYPE_PARAMETER = new JetNodeType("TYPE_PARAMETER");
|
||||||
JetNodeType PRIMARY_CONSTRUCTOR_PARAMETERS_LIST = new JetNodeType("PRIMARY_CONSTRUCTOR_PARAMETERS_LIST");
|
JetNodeType PRIMARY_CONSTRUCTOR_PARAMETERS_LIST = new JetNodeType("PRIMARY_CONSTRUCTOR_PARAMETERS_LIST");
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ public class JetParsing {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static final TokenSet TOPLEVEL_OBJECT_FIRST = TokenSet.create(TYPE_KEYWORD, CLASS_KEYWORD,
|
private static final TokenSet TOPLEVEL_OBJECT_FIRST = TokenSet.create(TYPE_KEYWORD, CLASS_KEYWORD,
|
||||||
EXTENSION_KEYWORD, FUN_KEYWORD, VAL_KEYWORD, REF_KEYWORD, NAMESPACE_KEYWORD);
|
EXTENSION_KEYWORD, FUN_KEYWORD, VAL_KEYWORD, REF_KEYWORD, NAMESPACE_KEYWORD, DECOMPOSER_KEYWORD);
|
||||||
|
|
||||||
private static final TokenSet CLASS_NAME_RECOVERY_SET = TokenSet.orSet(TokenSet.create(LT, WRAPS_KEYWORD, LPAR, COLON, LBRACE), TOPLEVEL_OBJECT_FIRST);
|
private static final TokenSet CLASS_NAME_RECOVERY_SET = TokenSet.orSet(TokenSet.create(LT, WRAPS_KEYWORD, LPAR, COLON, LBRACE), TOPLEVEL_OBJECT_FIRST);
|
||||||
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);
|
||||||
@@ -199,6 +199,9 @@ public class JetParsing {
|
|||||||
else if (keywordToken == TYPE_KEYWORD) {
|
else if (keywordToken == TYPE_KEYWORD) {
|
||||||
declType = parseTypedef();
|
declType = parseTypedef();
|
||||||
}
|
}
|
||||||
|
else if (keywordToken == DECOMPOSER_KEYWORD) {
|
||||||
|
declType = parseDecomposer();
|
||||||
|
}
|
||||||
|
|
||||||
if (declType == null) {
|
if (declType == null) {
|
||||||
errorAndAdvance("Expecting namespace or top level declaration");
|
errorAndAdvance("Expecting namespace or top level declaration");
|
||||||
@@ -209,6 +212,16 @@ public class JetParsing {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* decomposer
|
||||||
|
* : attributes "decomposer" (type ".")? SimpleName "(" (attributes SimpleName){","} ")" // Public properties only
|
||||||
|
* ;
|
||||||
|
*/
|
||||||
|
private JetNodeType parseDecomposer() {
|
||||||
|
// TODO
|
||||||
|
return DECOMPOSER;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* modifier
|
* modifier
|
||||||
* : "virtual"
|
* : "virtual"
|
||||||
@@ -330,13 +343,15 @@ public class JetParsing {
|
|||||||
*/
|
*/
|
||||||
private void parseValueArgument() {
|
private void parseValueArgument() {
|
||||||
PsiBuilder.Marker argument = mark();
|
PsiBuilder.Marker argument = mark();
|
||||||
|
JetNodeType type = VALUE_ARGUMENT;
|
||||||
if (at(IDENTIFIER) && lookahead(1) == EQ) {
|
if (at(IDENTIFIER) && lookahead(1) == EQ) {
|
||||||
advance(); // IDENTIFIER
|
advance(); // IDENTIFIER
|
||||||
advance(); // EQ
|
advance(); // EQ
|
||||||
|
type = NAMED_ARGUMENT;
|
||||||
}
|
}
|
||||||
if (at(OUT_KEYWORD) || at(REF_KEYWORD)) advance(); // REF or OUT
|
if (at(OUT_KEYWORD) || at(REF_KEYWORD)) advance(); // REF or OUT
|
||||||
parseExpression();
|
parseExpression();
|
||||||
argument.done(VALUE_ARGUMENT);
|
argument.done(type);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -374,6 +389,16 @@ public class JetParsing {
|
|||||||
return NAMESPACE;
|
return NAMESPACE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* class
|
||||||
|
* : modifiers "class" SimpleName
|
||||||
|
* typeParameters?
|
||||||
|
* "wraps"?
|
||||||
|
* ("(" primaryConstructorParameter{","} ")")?
|
||||||
|
* (":" attributes delegationSpecifier{","})?
|
||||||
|
* classBody?
|
||||||
|
* ;
|
||||||
|
*/
|
||||||
private JetNodeType parseClass() {
|
private JetNodeType parseClass() {
|
||||||
assert at(CLASS_KEYWORD);
|
assert at(CLASS_KEYWORD);
|
||||||
advance(); // CLASS_KEYWORD
|
advance(); // CLASS_KEYWORD
|
||||||
@@ -398,6 +423,11 @@ public class JetParsing {
|
|||||||
return CLASS;
|
return CLASS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* classBody
|
||||||
|
* : ("{" memberDeclaration{","} "}")?
|
||||||
|
* ;
|
||||||
|
*/
|
||||||
private void parseClassBody() {
|
private void parseClassBody() {
|
||||||
assert at(LBRACE);
|
assert at(LBRACE);
|
||||||
PsiBuilder.Marker body = mark();
|
PsiBuilder.Marker body = mark();
|
||||||
@@ -436,25 +466,51 @@ public class JetParsing {
|
|||||||
return TYPEDEF;
|
return TYPEDEF;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* property
|
||||||
|
* : modifiers ("val" | "var") (type ".")? propertyRest
|
||||||
|
* ;
|
||||||
|
*/
|
||||||
private JetNodeType parseProperty() {
|
private JetNodeType parseProperty() {
|
||||||
advance(); // TODO
|
advance(); // TODO
|
||||||
return PROPERTY;
|
return PROPERTY;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* function
|
||||||
|
* : modifiers "fun" (type ".")? functionRest
|
||||||
|
* ;
|
||||||
|
*
|
||||||
|
* functionRest
|
||||||
|
* : attributes SimpleName typeParameters? functionParameters (":" type)? functionBody?
|
||||||
|
* ;
|
||||||
|
*/
|
||||||
private JetNodeType parseFunction() {
|
private JetNodeType parseFunction() {
|
||||||
advance(); // TODO
|
advance(); // TODO
|
||||||
return FUN;
|
return FUN;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* extension
|
||||||
|
* : modifiers "extension" SimpleName? typeParameters? "for" type classBody? // properties cannot be lazy, cannot have backing fields
|
||||||
|
* ;
|
||||||
|
*/
|
||||||
private JetNodeType parseExtension() {
|
private JetNodeType parseExtension() {
|
||||||
advance(); // TODO
|
advance(); // TODO
|
||||||
return EXTENSION;
|
return EXTENSION;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* delegationSpecifier{","}
|
||||||
|
*/
|
||||||
private void parseDelegationSpecifierList() {
|
private void parseDelegationSpecifierList() {
|
||||||
PsiBuilder.Marker list = mark();
|
PsiBuilder.Marker list = mark();
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
|
if (at(COMMA)) {
|
||||||
|
errorAndAdvance("Expecting a delegation specifier");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
parseDelegationSpecifier();
|
parseDelegationSpecifier();
|
||||||
if (!at(COMMA)) break;
|
if (!at(COMMA)) break;
|
||||||
advance(); // COMMA
|
advance(); // COMMA
|
||||||
@@ -463,19 +519,37 @@ public class JetParsing {
|
|||||||
list.done(DELEGATION_SPECIFIER_LIST);
|
list.done(DELEGATION_SPECIFIER_LIST);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* attributes delegationSpecifier
|
||||||
|
*
|
||||||
|
* delegationSpecifier
|
||||||
|
* : constructorInvocation // type and constructor arguments
|
||||||
|
* : explicitDelegation
|
||||||
|
* ;
|
||||||
|
*
|
||||||
|
* explicitDelegation
|
||||||
|
* : userType "by" expression // TODO: Syntax is questionable
|
||||||
|
* ;
|
||||||
|
*/
|
||||||
private void parseDelegationSpecifier() {
|
private void parseDelegationSpecifier() {
|
||||||
PsiBuilder.Marker specifier = mark();
|
PsiBuilder.Marker specifier = mark();
|
||||||
parseAttributeList();
|
parseAttributeList();
|
||||||
|
|
||||||
PsiBuilder.Marker delegator = mark();
|
PsiBuilder.Marker delegator = mark();
|
||||||
parseTypeRef(); // TODO: Error recovery!!!
|
if (at(LPAR)) {
|
||||||
|
error("Expecting type name");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
parseTypeRef();
|
||||||
|
}
|
||||||
|
|
||||||
if (at(BY_KEYWORD)) {
|
if (at(BY_KEYWORD)) {
|
||||||
advance(); // BY_KEYWORD
|
advance(); // BY_KEYWORD
|
||||||
parseExpression();
|
parseExpression();
|
||||||
delegator.done(DELEGATOR_BY);
|
delegator.done(DELEGATOR_BY);
|
||||||
}
|
}
|
||||||
else if (at(LPAR)) {
|
else if (at(LPAR)) {
|
||||||
parseValueParameterList();
|
parseValueArgumentList();
|
||||||
delegator.done(DELEGATOR_SUPER_CALL);
|
delegator.done(DELEGATOR_SUPER_CALL);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@@ -485,32 +559,6 @@ public class JetParsing {
|
|||||||
specifier.done(DELEGATION_SPECIFIER);
|
specifier.done(DELEGATION_SPECIFIER);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void parseValueParameterList() {
|
|
||||||
assert at(LPAR);
|
|
||||||
PsiBuilder.Marker list = mark();
|
|
||||||
advance(); // LPAR
|
|
||||||
while (true) {
|
|
||||||
if (at(IDENTIFIER) && lookahead(1) == EQ) {
|
|
||||||
PsiBuilder.Marker named = mark();
|
|
||||||
advance(); // IDENTIFIER
|
|
||||||
advance(); // EQ
|
|
||||||
parseExpression();
|
|
||||||
named.done(NAMED_ARGUMENT);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
parseExpression();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!at(COMMA)) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
expect(RPAR, "Missing ')'");
|
|
||||||
|
|
||||||
list.done(VALUE_PARAMETER_LIST);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* attributes
|
* attributes
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ JetFile: BabySteps.jet
|
|||||||
TYPE_REFERENCE
|
TYPE_REFERENCE
|
||||||
USER_TYPE
|
USER_TYPE
|
||||||
PsiElement(IDENTIFIER)('foo')
|
PsiElement(IDENTIFIER)('foo')
|
||||||
VALUE_PARAMETER_LIST
|
VALUE_ARGUMENT_LIST
|
||||||
PsiElement(LPAR)('(')
|
PsiElement(LPAR)('(')
|
||||||
NAMED_ARGUMENT
|
NAMED_ARGUMENT
|
||||||
PsiElement(IDENTIFIER)('d')
|
PsiElement(IDENTIFIER)('d')
|
||||||
|
|||||||
Reference in New Issue
Block a user