Minor. Extract KotlinParsing::parseCommonDeclaration
This commit is contained in:
@@ -1068,7 +1068,7 @@ public class KotlinExpressionParsing extends AbstractKotlinParsing {
|
|||||||
KotlinParsing.ModifierDetector detector = new KotlinParsing.ModifierDetector();
|
KotlinParsing.ModifierDetector detector = new KotlinParsing.ModifierDetector();
|
||||||
myKotlinParsing.parseModifierList(detector, DEFAULT, TokenSet.EMPTY);
|
myKotlinParsing.parseModifierList(detector, DEFAULT, TokenSet.EMPTY);
|
||||||
|
|
||||||
IElementType declType = parseLocalDeclarationRest(detector.isEnumDetected(), rollbackIfDefinitelyNotExpression, isScriptTopLevel);
|
IElementType declType = parseLocalDeclarationRest(detector, rollbackIfDefinitelyNotExpression, isScriptTopLevel);
|
||||||
|
|
||||||
if (declType != null) {
|
if (declType != null) {
|
||||||
// we do not attach preceding comments (non-doc) to local variables because they are likely commenting a few statements below
|
// we do not attach preceding comments (non-doc) to local variables because they are likely commenting a few statements below
|
||||||
@@ -1348,29 +1348,19 @@ public class KotlinExpressionParsing extends AbstractKotlinParsing {
|
|||||||
* ;
|
* ;
|
||||||
*/
|
*/
|
||||||
@Nullable
|
@Nullable
|
||||||
private IElementType parseLocalDeclarationRest(boolean isEnum, boolean failIfDefinitelyNotExpression, boolean isScriptTopLevel) {
|
private IElementType parseLocalDeclarationRest(
|
||||||
|
@NotNull KotlinParsing.ModifierDetector modifierDetector,
|
||||||
|
boolean failIfDefinitelyNotExpression,
|
||||||
|
boolean isScriptTopLevel
|
||||||
|
) {
|
||||||
IElementType keywordToken = tt();
|
IElementType keywordToken = tt();
|
||||||
IElementType declType = null;
|
|
||||||
|
|
||||||
if (failIfDefinitelyNotExpression) {
|
if (failIfDefinitelyNotExpression) {
|
||||||
if (keywordToken != FUN_KEYWORD) return null;
|
if (keywordToken != FUN_KEYWORD) return null;
|
||||||
|
|
||||||
return myKotlinParsing.parseFunction(/* failIfIdentifierExists = */ true);
|
return myKotlinParsing.parseFunction(/* failIfIdentifierExists = */ true);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (keywordToken == CLASS_KEYWORD || keywordToken == INTERFACE_KEYWORD) {
|
if (keywordToken == OBJECT_KEYWORD) {
|
||||||
declType = myKotlinParsing.parseClass(isEnum);
|
|
||||||
}
|
|
||||||
else if (keywordToken == FUN_KEYWORD) {
|
|
||||||
declType = myKotlinParsing.parseFunction();
|
|
||||||
}
|
|
||||||
else if (keywordToken == VAL_KEYWORD || keywordToken == VAR_KEYWORD) {
|
|
||||||
declType = myKotlinParsing.parseLocalProperty(isScriptTopLevel);
|
|
||||||
}
|
|
||||||
else if (keywordToken == TYPE_ALIAS_KEYWORD) {
|
|
||||||
declType = myKotlinParsing.parseTypeAlias();
|
|
||||||
}
|
|
||||||
else if (keywordToken == OBJECT_KEYWORD) {
|
|
||||||
// Object expression may appear at the statement position: should parse it
|
// Object expression may appear at the statement position: should parse it
|
||||||
// as expression instead of object declaration
|
// as expression instead of object declaration
|
||||||
// sample:
|
// sample:
|
||||||
@@ -1382,11 +1372,12 @@ public class KotlinExpressionParsing extends AbstractKotlinParsing {
|
|||||||
if (lookahead == COLON || lookahead == LBRACE) {
|
if (lookahead == COLON || lookahead == LBRACE) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
myKotlinParsing.parseObject(NameParsingMode.REQUIRED, true);
|
|
||||||
declType = OBJECT_DECLARATION;
|
|
||||||
}
|
}
|
||||||
return declType;
|
|
||||||
|
return myKotlinParsing.parseCommonDeclaration(
|
||||||
|
modifierDetector, NameParsingMode.REQUIRED,
|
||||||
|
isScriptTopLevel ? KotlinParsing.PropertyParsingMode.SCRIPT_TOPLEVEL : KotlinParsing.PropertyParsingMode.LOCAL
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -416,26 +416,9 @@ public class KotlinParsing extends AbstractKotlinParsing {
|
|||||||
ModifierDetector detector = new ModifierDetector();
|
ModifierDetector detector = new ModifierDetector();
|
||||||
parseModifierList(detector, DEFAULT, TokenSet.EMPTY);
|
parseModifierList(detector, DEFAULT, TokenSet.EMPTY);
|
||||||
|
|
||||||
IElementType keywordToken = tt();
|
IElementType declType = parseCommonDeclaration(detector, NameParsingMode.REQUIRED, PropertyParsingMode.MEMBER_OR_TOPLEVEL);
|
||||||
IElementType declType = null;
|
|
||||||
|
|
||||||
if (keywordToken == CLASS_KEYWORD || keywordToken == INTERFACE_KEYWORD) {
|
if (declType == null && at(LBRACE)) {
|
||||||
declType = parseClass(detector.isEnumDetected());
|
|
||||||
}
|
|
||||||
else if (keywordToken == FUN_KEYWORD) {
|
|
||||||
declType = parseFunction();
|
|
||||||
}
|
|
||||||
else if (keywordToken == VAL_KEYWORD || keywordToken == VAR_KEYWORD) {
|
|
||||||
declType = parseProperty();
|
|
||||||
}
|
|
||||||
else if (keywordToken == TYPE_ALIAS_KEYWORD) {
|
|
||||||
declType = parseTypeAlias();
|
|
||||||
}
|
|
||||||
else if (keywordToken == OBJECT_KEYWORD) {
|
|
||||||
parseObject(NameParsingMode.REQUIRED, true);
|
|
||||||
declType = OBJECT_DECLARATION;
|
|
||||||
}
|
|
||||||
else if (at(LBRACE)) {
|
|
||||||
error("Expecting a top level declaration");
|
error("Expecting a top level declaration");
|
||||||
parseBlock();
|
parseBlock();
|
||||||
declType = FUN;
|
declType = FUN;
|
||||||
@@ -450,6 +433,33 @@ public class KotlinParsing extends AbstractKotlinParsing {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public IElementType parseCommonDeclaration(
|
||||||
|
@NotNull ModifierDetector detector,
|
||||||
|
@NotNull NameParsingMode nameParsingModeForObject,
|
||||||
|
@NotNull PropertyParsingMode propertyParsingMode
|
||||||
|
) {
|
||||||
|
IElementType keywordToken = tt();
|
||||||
|
|
||||||
|
if (keywordToken == CLASS_KEYWORD || keywordToken == INTERFACE_KEYWORD) {
|
||||||
|
return parseClass(detector.isEnumDetected());
|
||||||
|
}
|
||||||
|
else if (keywordToken == FUN_KEYWORD) {
|
||||||
|
return parseFunction();
|
||||||
|
}
|
||||||
|
else if (keywordToken == VAL_KEYWORD || keywordToken == VAR_KEYWORD) {
|
||||||
|
return parseProperty(propertyParsingMode);
|
||||||
|
}
|
||||||
|
else if (keywordToken == TYPE_ALIAS_KEYWORD) {
|
||||||
|
return parseTypeAlias();
|
||||||
|
}
|
||||||
|
else if (keywordToken == OBJECT_KEYWORD) {
|
||||||
|
parseObject(nameParsingModeForObject, true);
|
||||||
|
return OBJECT_DECLARATION;
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* (modifier | annotation)*
|
* (modifier | annotation)*
|
||||||
*/
|
*/
|
||||||
@@ -914,7 +924,7 @@ public class KotlinParsing extends AbstractKotlinParsing {
|
|||||||
return object ? OBJECT_DECLARATION : CLASS;
|
return object ? OBJECT_DECLARATION : CLASS;
|
||||||
}
|
}
|
||||||
|
|
||||||
IElementType parseClass(boolean enumClass) {
|
private IElementType parseClass(boolean enumClass) {
|
||||||
return parseClassOrObject(false, NameParsingMode.REQUIRED, true, enumClass);
|
return parseClassOrObject(false, NameParsingMode.REQUIRED, true, enumClass);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1097,7 +1107,7 @@ public class KotlinParsing extends AbstractKotlinParsing {
|
|||||||
ModifierDetector detector = new ModifierDetector();
|
ModifierDetector detector = new ModifierDetector();
|
||||||
parseModifierList(detector, DEFAULT, TokenSet.EMPTY);
|
parseModifierList(detector, DEFAULT, TokenSet.EMPTY);
|
||||||
|
|
||||||
IElementType declType = parseMemberDeclarationRest(detector.isEnumDetected(), detector.isDefaultDetected());
|
IElementType declType = parseMemberDeclarationRest(detector);
|
||||||
|
|
||||||
if (declType == null) {
|
if (declType == null) {
|
||||||
errorWithRecovery("Expecting member declaration", TokenSet.EMPTY);
|
errorWithRecovery("Expecting member declaration", TokenSet.EMPTY);
|
||||||
@@ -1108,26 +1118,16 @@ public class KotlinParsing extends AbstractKotlinParsing {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private IElementType parseMemberDeclarationRest(boolean isEnum, boolean isDefault) {
|
private IElementType parseMemberDeclarationRest(@NotNull ModifierDetector modifierDetector) {
|
||||||
IElementType keywordToken = tt();
|
IElementType declType = parseCommonDeclaration(
|
||||||
IElementType declType = null;
|
modifierDetector,
|
||||||
if (keywordToken == CLASS_KEYWORD || keywordToken == INTERFACE_KEYWORD) {
|
modifierDetector.isDefaultDetected() ? NameParsingMode.ALLOWED : NameParsingMode.REQUIRED,
|
||||||
declType = parseClass(isEnum);
|
PropertyParsingMode.MEMBER_OR_TOPLEVEL
|
||||||
}
|
);
|
||||||
else if (keywordToken == FUN_KEYWORD) {
|
|
||||||
declType = parseFunction();
|
if (declType != null) return declType;
|
||||||
}
|
|
||||||
else if (keywordToken == VAL_KEYWORD || keywordToken == VAR_KEYWORD) {
|
if (at(INIT_KEYWORD)) {
|
||||||
declType = parseProperty();
|
|
||||||
}
|
|
||||||
else if (keywordToken == TYPE_ALIAS_KEYWORD) {
|
|
||||||
declType = parseTypeAlias();
|
|
||||||
}
|
|
||||||
else if (keywordToken == OBJECT_KEYWORD) {
|
|
||||||
parseObject(isDefault ? NameParsingMode.ALLOWED : NameParsingMode.REQUIRED, true);
|
|
||||||
declType = OBJECT_DECLARATION;
|
|
||||||
}
|
|
||||||
else if (at(INIT_KEYWORD)) {
|
|
||||||
advance(); // init
|
advance(); // init
|
||||||
if (at(LBRACE)) {
|
if (at(LBRACE)) {
|
||||||
parseBlock();
|
parseBlock();
|
||||||
@@ -1225,7 +1225,7 @@ public class KotlinParsing extends AbstractKotlinParsing {
|
|||||||
* : modifiers "typealias" SimpleName typeParameters? "=" type
|
* : modifiers "typealias" SimpleName typeParameters? "=" type
|
||||||
* ;
|
* ;
|
||||||
*/
|
*/
|
||||||
IElementType parseTypeAlias() {
|
private IElementType parseTypeAlias() {
|
||||||
assert _at(TYPE_ALIAS_KEYWORD);
|
assert _at(TYPE_ALIAS_KEYWORD);
|
||||||
|
|
||||||
advance(); // TYPE_ALIAS_KEYWORD
|
advance(); // TYPE_ALIAS_KEYWORD
|
||||||
@@ -1249,6 +1249,20 @@ public class KotlinParsing extends AbstractKotlinParsing {
|
|||||||
return TYPEALIAS;
|
return TYPEALIAS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum PropertyParsingMode {
|
||||||
|
MEMBER_OR_TOPLEVEL(false, true),
|
||||||
|
LOCAL(true, false),
|
||||||
|
SCRIPT_TOPLEVEL(true, true);
|
||||||
|
|
||||||
|
public final boolean destructuringAllowed;
|
||||||
|
public final boolean accessorsAllowed;
|
||||||
|
|
||||||
|
PropertyParsingMode(boolean destructuringAllowed, boolean accessorsAllowed) {
|
||||||
|
this.destructuringAllowed = destructuringAllowed;
|
||||||
|
this.accessorsAllowed = accessorsAllowed;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* variableDeclarationEntry
|
* variableDeclarationEntry
|
||||||
* : SimpleName (":" type)?
|
* : SimpleName (":" type)?
|
||||||
@@ -1264,28 +1278,6 @@ public class KotlinParsing extends AbstractKotlinParsing {
|
|||||||
* (getter? setter? | setter? getter?) SEMI?
|
* (getter? setter? | setter? getter?) SEMI?
|
||||||
* ;
|
* ;
|
||||||
*/
|
*/
|
||||||
private IElementType parseProperty() {
|
|
||||||
return parseProperty(PropertyParsingMode.MEMBER_OR_TOPLEVEL);
|
|
||||||
}
|
|
||||||
|
|
||||||
public IElementType parseLocalProperty(boolean isScriptTopLevel) {
|
|
||||||
return parseProperty(isScriptTopLevel ? PropertyParsingMode.SCRIPT_TOPLEVEL : PropertyParsingMode.LOCAL);
|
|
||||||
}
|
|
||||||
|
|
||||||
enum PropertyParsingMode {
|
|
||||||
MEMBER_OR_TOPLEVEL(false, true),
|
|
||||||
LOCAL(true, false),
|
|
||||||
SCRIPT_TOPLEVEL(true, true);
|
|
||||||
|
|
||||||
public final boolean destructuringAllowed;
|
|
||||||
public final boolean accessorsAllowed;
|
|
||||||
|
|
||||||
PropertyParsingMode(boolean destructuringAllowed, boolean accessorsAllowed) {
|
|
||||||
this.destructuringAllowed = destructuringAllowed;
|
|
||||||
this.accessorsAllowed = accessorsAllowed;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public IElementType parseProperty(PropertyParsingMode mode) {
|
public IElementType parseProperty(PropertyParsingMode mode) {
|
||||||
assert (at(VAL_KEYWORD) || at(VAR_KEYWORD));
|
assert (at(VAL_KEYWORD) || at(VAR_KEYWORD));
|
||||||
advance();
|
advance();
|
||||||
|
|||||||
Reference in New Issue
Block a user