Minor. Extract KotlinParsing::parseCommonDeclaration
This commit is contained in:
@@ -1068,7 +1068,7 @@ public class KotlinExpressionParsing extends AbstractKotlinParsing {
|
||||
KotlinParsing.ModifierDetector detector = new KotlinParsing.ModifierDetector();
|
||||
myKotlinParsing.parseModifierList(detector, DEFAULT, TokenSet.EMPTY);
|
||||
|
||||
IElementType declType = parseLocalDeclarationRest(detector.isEnumDetected(), rollbackIfDefinitelyNotExpression, isScriptTopLevel);
|
||||
IElementType declType = parseLocalDeclarationRest(detector, rollbackIfDefinitelyNotExpression, isScriptTopLevel);
|
||||
|
||||
if (declType != null) {
|
||||
// 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
|
||||
private IElementType parseLocalDeclarationRest(boolean isEnum, boolean failIfDefinitelyNotExpression, boolean isScriptTopLevel) {
|
||||
private IElementType parseLocalDeclarationRest(
|
||||
@NotNull KotlinParsing.ModifierDetector modifierDetector,
|
||||
boolean failIfDefinitelyNotExpression,
|
||||
boolean isScriptTopLevel
|
||||
) {
|
||||
IElementType keywordToken = tt();
|
||||
IElementType declType = null;
|
||||
|
||||
if (failIfDefinitelyNotExpression) {
|
||||
if (keywordToken != FUN_KEYWORD) return null;
|
||||
|
||||
return myKotlinParsing.parseFunction(/* failIfIdentifierExists = */ true);
|
||||
}
|
||||
|
||||
if (keywordToken == CLASS_KEYWORD || keywordToken == INTERFACE_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) {
|
||||
if (keywordToken == OBJECT_KEYWORD) {
|
||||
// Object expression may appear at the statement position: should parse it
|
||||
// as expression instead of object declaration
|
||||
// sample:
|
||||
@@ -1382,11 +1372,12 @@ public class KotlinExpressionParsing extends AbstractKotlinParsing {
|
||||
if (lookahead == COLON || lookahead == LBRACE) {
|
||||
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();
|
||||
parseModifierList(detector, DEFAULT, TokenSet.EMPTY);
|
||||
|
||||
IElementType keywordToken = tt();
|
||||
IElementType declType = null;
|
||||
IElementType declType = parseCommonDeclaration(detector, NameParsingMode.REQUIRED, PropertyParsingMode.MEMBER_OR_TOPLEVEL);
|
||||
|
||||
if (keywordToken == CLASS_KEYWORD || keywordToken == INTERFACE_KEYWORD) {
|
||||
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)) {
|
||||
if (declType == null && at(LBRACE)) {
|
||||
error("Expecting a top level declaration");
|
||||
parseBlock();
|
||||
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)*
|
||||
*/
|
||||
@@ -914,7 +924,7 @@ public class KotlinParsing extends AbstractKotlinParsing {
|
||||
return object ? OBJECT_DECLARATION : CLASS;
|
||||
}
|
||||
|
||||
IElementType parseClass(boolean enumClass) {
|
||||
private IElementType parseClass(boolean enumClass) {
|
||||
return parseClassOrObject(false, NameParsingMode.REQUIRED, true, enumClass);
|
||||
}
|
||||
|
||||
@@ -1097,7 +1107,7 @@ public class KotlinParsing extends AbstractKotlinParsing {
|
||||
ModifierDetector detector = new ModifierDetector();
|
||||
parseModifierList(detector, DEFAULT, TokenSet.EMPTY);
|
||||
|
||||
IElementType declType = parseMemberDeclarationRest(detector.isEnumDetected(), detector.isDefaultDetected());
|
||||
IElementType declType = parseMemberDeclarationRest(detector);
|
||||
|
||||
if (declType == null) {
|
||||
errorWithRecovery("Expecting member declaration", TokenSet.EMPTY);
|
||||
@@ -1108,26 +1118,16 @@ public class KotlinParsing extends AbstractKotlinParsing {
|
||||
}
|
||||
}
|
||||
|
||||
private IElementType parseMemberDeclarationRest(boolean isEnum, boolean isDefault) {
|
||||
IElementType keywordToken = tt();
|
||||
IElementType declType = null;
|
||||
if (keywordToken == CLASS_KEYWORD || keywordToken == INTERFACE_KEYWORD) {
|
||||
declType = parseClass(isEnum);
|
||||
}
|
||||
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(isDefault ? NameParsingMode.ALLOWED : NameParsingMode.REQUIRED, true);
|
||||
declType = OBJECT_DECLARATION;
|
||||
}
|
||||
else if (at(INIT_KEYWORD)) {
|
||||
private IElementType parseMemberDeclarationRest(@NotNull ModifierDetector modifierDetector) {
|
||||
IElementType declType = parseCommonDeclaration(
|
||||
modifierDetector,
|
||||
modifierDetector.isDefaultDetected() ? NameParsingMode.ALLOWED : NameParsingMode.REQUIRED,
|
||||
PropertyParsingMode.MEMBER_OR_TOPLEVEL
|
||||
);
|
||||
|
||||
if (declType != null) return declType;
|
||||
|
||||
if (at(INIT_KEYWORD)) {
|
||||
advance(); // init
|
||||
if (at(LBRACE)) {
|
||||
parseBlock();
|
||||
@@ -1225,7 +1225,7 @@ public class KotlinParsing extends AbstractKotlinParsing {
|
||||
* : modifiers "typealias" SimpleName typeParameters? "=" type
|
||||
* ;
|
||||
*/
|
||||
IElementType parseTypeAlias() {
|
||||
private IElementType parseTypeAlias() {
|
||||
assert _at(TYPE_ALIAS_KEYWORD);
|
||||
|
||||
advance(); // TYPE_ALIAS_KEYWORD
|
||||
@@ -1249,6 +1249,20 @@ public class KotlinParsing extends AbstractKotlinParsing {
|
||||
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
|
||||
* : SimpleName (":" type)?
|
||||
@@ -1264,28 +1278,6 @@ public class KotlinParsing extends AbstractKotlinParsing {
|
||||
* (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) {
|
||||
assert (at(VAL_KEYWORD) || at(VAR_KEYWORD));
|
||||
advance();
|
||||
|
||||
Reference in New Issue
Block a user