understand "interface" keyword as synonym for "trait"
This commit is contained in:
@@ -73,6 +73,7 @@ public interface JetTokens {
|
|||||||
JetKeywordToken DO_KEYWORD = JetKeywordToken.keyword("do");
|
JetKeywordToken DO_KEYWORD = JetKeywordToken.keyword("do");
|
||||||
JetKeywordToken WHEN_KEYWORD = JetKeywordToken.keyword("when");
|
JetKeywordToken WHEN_KEYWORD = JetKeywordToken.keyword("when");
|
||||||
JetKeywordToken TRAIT_KEYWORD = JetKeywordToken.keyword("trait");
|
JetKeywordToken TRAIT_KEYWORD = JetKeywordToken.keyword("trait");
|
||||||
|
JetKeywordToken INTERFACE_KEYWORD = JetKeywordToken.keyword("interface");
|
||||||
// TODO: Discuss "This" keyword
|
// TODO: Discuss "This" keyword
|
||||||
JetKeywordToken CAPITALIZED_THIS_KEYWORD = JetKeywordToken.keyword("This");
|
JetKeywordToken CAPITALIZED_THIS_KEYWORD = JetKeywordToken.keyword("This");
|
||||||
|
|
||||||
@@ -160,7 +161,7 @@ public interface JetTokens {
|
|||||||
JetKeywordToken FINALLY_KEYWORD = JetKeywordToken.softKeyword("finally");
|
JetKeywordToken FINALLY_KEYWORD = JetKeywordToken.softKeyword("finally");
|
||||||
JetModifierKeywordToken FINAL_KEYWORD = JetModifierKeywordToken.softKeywordModifier("final");
|
JetModifierKeywordToken FINAL_KEYWORD = JetModifierKeywordToken.softKeywordModifier("final");
|
||||||
|
|
||||||
TokenSet KEYWORDS = TokenSet.create(PACKAGE_KEYWORD, AS_KEYWORD, TYPE_ALIAS_KEYWORD, CLASS_KEYWORD, TRAIT_KEYWORD,
|
TokenSet KEYWORDS = TokenSet.create(PACKAGE_KEYWORD, AS_KEYWORD, TYPE_ALIAS_KEYWORD, CLASS_KEYWORD, TRAIT_KEYWORD, INTERFACE_KEYWORD,
|
||||||
THIS_KEYWORD, SUPER_KEYWORD, VAL_KEYWORD, VAR_KEYWORD, FUN_KEYWORD, FOR_KEYWORD,
|
THIS_KEYWORD, SUPER_KEYWORD, VAL_KEYWORD, VAR_KEYWORD, FUN_KEYWORD, FOR_KEYWORD,
|
||||||
NULL_KEYWORD,
|
NULL_KEYWORD,
|
||||||
TRUE_KEYWORD, FALSE_KEYWORD, IS_KEYWORD,
|
TRUE_KEYWORD, FALSE_KEYWORD, IS_KEYWORD,
|
||||||
|
|||||||
@@ -241,6 +241,7 @@ LONG_TEMPLATE_ENTRY_START=\$\{
|
|||||||
{CHARACTER_LITERAL} { return JetTokens.CHARACTER_LITERAL; }
|
{CHARACTER_LITERAL} { return JetTokens.CHARACTER_LITERAL; }
|
||||||
|
|
||||||
"typealias" { return JetTokens.TYPE_ALIAS_KEYWORD ;}
|
"typealias" { return JetTokens.TYPE_ALIAS_KEYWORD ;}
|
||||||
|
"interface" { return JetTokens.INTERFACE_KEYWORD ;}
|
||||||
"continue" { return JetTokens.CONTINUE_KEYWORD ;}
|
"continue" { return JetTokens.CONTINUE_KEYWORD ;}
|
||||||
"package" { return JetTokens.PACKAGE_KEYWORD ;}
|
"package" { return JetTokens.PACKAGE_KEYWORD ;}
|
||||||
"return" { return JetTokens.RETURN_KEYWORD ;}
|
"return" { return JetTokens.RETURN_KEYWORD ;}
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -53,7 +53,7 @@ public class JetExpressionParsing extends AbstractJetParsing {
|
|||||||
|
|
||||||
private static final TokenSet TYPE_ARGUMENT_LIST_STOPPERS = TokenSet.create(
|
private static final TokenSet TYPE_ARGUMENT_LIST_STOPPERS = TokenSet.create(
|
||||||
INTEGER_LITERAL, FLOAT_LITERAL, CHARACTER_LITERAL, OPEN_QUOTE,
|
INTEGER_LITERAL, FLOAT_LITERAL, CHARACTER_LITERAL, OPEN_QUOTE,
|
||||||
PACKAGE_KEYWORD, AS_KEYWORD, TYPE_ALIAS_KEYWORD, TRAIT_KEYWORD, CLASS_KEYWORD, THIS_KEYWORD, VAL_KEYWORD, VAR_KEYWORD,
|
PACKAGE_KEYWORD, AS_KEYWORD, TYPE_ALIAS_KEYWORD, TRAIT_KEYWORD, INTERFACE_KEYWORD, CLASS_KEYWORD, THIS_KEYWORD, VAL_KEYWORD, VAR_KEYWORD,
|
||||||
FUN_KEYWORD, FOR_KEYWORD, NULL_KEYWORD,
|
FUN_KEYWORD, FOR_KEYWORD, NULL_KEYWORD,
|
||||||
TRUE_KEYWORD, FALSE_KEYWORD, IS_KEYWORD, THROW_KEYWORD, RETURN_KEYWORD, BREAK_KEYWORD,
|
TRUE_KEYWORD, FALSE_KEYWORD, IS_KEYWORD, THROW_KEYWORD, RETURN_KEYWORD, BREAK_KEYWORD,
|
||||||
CONTINUE_KEYWORD, OBJECT_KEYWORD, IF_KEYWORD, TRY_KEYWORD, ELSE_KEYWORD, WHILE_KEYWORD, DO_KEYWORD,
|
CONTINUE_KEYWORD, OBJECT_KEYWORD, IF_KEYWORD, TRY_KEYWORD, ELSE_KEYWORD, WHILE_KEYWORD, DO_KEYWORD,
|
||||||
@@ -124,6 +124,7 @@ public class JetExpressionParsing extends AbstractJetParsing {
|
|||||||
FUN_KEYWORD,
|
FUN_KEYWORD,
|
||||||
VAL_KEYWORD, VAR_KEYWORD,
|
VAL_KEYWORD, VAR_KEYWORD,
|
||||||
TRAIT_KEYWORD,
|
TRAIT_KEYWORD,
|
||||||
|
INTERFACE_KEYWORD,
|
||||||
CLASS_KEYWORD,
|
CLASS_KEYWORD,
|
||||||
TYPE_ALIAS_KEYWORD
|
TYPE_ALIAS_KEYWORD
|
||||||
),
|
),
|
||||||
@@ -1336,7 +1337,7 @@ public class JetExpressionParsing extends AbstractJetParsing {
|
|||||||
private IElementType parseLocalDeclarationRest(boolean isEnum) {
|
private IElementType parseLocalDeclarationRest(boolean isEnum) {
|
||||||
IElementType keywordToken = tt();
|
IElementType keywordToken = tt();
|
||||||
IElementType declType = null;
|
IElementType declType = null;
|
||||||
if (keywordToken == CLASS_KEYWORD || keywordToken == TRAIT_KEYWORD) {
|
if (keywordToken == CLASS_KEYWORD || keywordToken == TRAIT_KEYWORD || keywordToken == INTERFACE_KEYWORD) {
|
||||||
declType = myJetParsing.parseClass(isEnum);
|
declType = myJetParsing.parseClass(isEnum);
|
||||||
}
|
}
|
||||||
else if (keywordToken == FUN_KEYWORD) {
|
else if (keywordToken == FUN_KEYWORD) {
|
||||||
|
|||||||
@@ -44,9 +44,9 @@ public class JetParsing extends AbstractJetParsing {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static final TokenSet TOPLEVEL_OBJECT_FIRST = TokenSet.create(TYPE_ALIAS_KEYWORD, TRAIT_KEYWORD, CLASS_KEYWORD,
|
private static final TokenSet TOPLEVEL_OBJECT_FIRST = TokenSet.create(TYPE_ALIAS_KEYWORD, TRAIT_KEYWORD, INTERFACE_KEYWORD, CLASS_KEYWORD,
|
||||||
FUN_KEYWORD, VAL_KEYWORD, PACKAGE_KEYWORD);
|
FUN_KEYWORD, VAL_KEYWORD, PACKAGE_KEYWORD);
|
||||||
private static final TokenSet ENUM_MEMBER_FIRST = TokenSet.create(TYPE_ALIAS_KEYWORD, TRAIT_KEYWORD, CLASS_KEYWORD,
|
private static final TokenSet ENUM_MEMBER_FIRST = TokenSet.create(TYPE_ALIAS_KEYWORD, TRAIT_KEYWORD, INTERFACE_KEYWORD, CLASS_KEYWORD,
|
||||||
FUN_KEYWORD, VAL_KEYWORD, LBRACE, IDENTIFIER, OBJECT_KEYWORD);
|
FUN_KEYWORD, VAL_KEYWORD, LBRACE, IDENTIFIER, OBJECT_KEYWORD);
|
||||||
|
|
||||||
private static final TokenSet CLASS_NAME_RECOVERY_SET = TokenSet.orSet(TokenSet.create(LT, LPAR, COLON, LBRACE), TOPLEVEL_OBJECT_FIRST);
|
private static final TokenSet CLASS_NAME_RECOVERY_SET = TokenSet.orSet(TokenSet.create(LT, LPAR, COLON, LBRACE), TOPLEVEL_OBJECT_FIRST);
|
||||||
@@ -380,7 +380,7 @@ public class JetParsing extends AbstractJetParsing {
|
|||||||
// declType = parsePackageBlock();
|
// declType = parsePackageBlock();
|
||||||
// }
|
// }
|
||||||
// else
|
// else
|
||||||
if (keywordToken == CLASS_KEYWORD || keywordToken == TRAIT_KEYWORD) {
|
if (keywordToken == CLASS_KEYWORD || keywordToken == TRAIT_KEYWORD || keywordToken == INTERFACE_KEYWORD) {
|
||||||
declType = parseClass(detector.isEnumDetected());
|
declType = parseClass(detector.isEnumDetected());
|
||||||
}
|
}
|
||||||
else if (keywordToken == FUN_KEYWORD) {
|
else if (keywordToken == FUN_KEYWORD) {
|
||||||
@@ -577,7 +577,7 @@ public class JetParsing extends AbstractJetParsing {
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* class
|
* class
|
||||||
* : modifiers ("class" | "trait") SimpleName
|
* : modifiers ("class" | "interface") SimpleName
|
||||||
* typeParameters?
|
* typeParameters?
|
||||||
* modifiers ("(" primaryConstructorParameter{","} ")")?
|
* modifiers ("(" primaryConstructorParameter{","} ")")?
|
||||||
* (":" annotations delegationSpecifier{","})?
|
* (":" annotations delegationSpecifier{","})?
|
||||||
@@ -594,7 +594,7 @@ public class JetParsing extends AbstractJetParsing {
|
|||||||
assert _at(OBJECT_KEYWORD);
|
assert _at(OBJECT_KEYWORD);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
assert _atSet(CLASS_KEYWORD, TRAIT_KEYWORD);
|
assert _atSet(CLASS_KEYWORD, TRAIT_KEYWORD, INTERFACE_KEYWORD);
|
||||||
}
|
}
|
||||||
advance(); // CLASS_KEYWORD, TRAIT_KEYWORD or OBJECT_KEYWORD
|
advance(); // CLASS_KEYWORD, TRAIT_KEYWORD or OBJECT_KEYWORD
|
||||||
|
|
||||||
@@ -823,7 +823,7 @@ public class JetParsing extends AbstractJetParsing {
|
|||||||
if (keywordToken == CLASS_KEYWORD) {
|
if (keywordToken == CLASS_KEYWORD) {
|
||||||
declType = parseClass(isEnum);
|
declType = parseClass(isEnum);
|
||||||
}
|
}
|
||||||
else if (keywordToken == TRAIT_KEYWORD) {
|
else if (keywordToken == TRAIT_KEYWORD || keywordToken == INTERFACE_KEYWORD) {
|
||||||
declType = parseClass(isEnum);
|
declType = parseClass(isEnum);
|
||||||
}
|
}
|
||||||
else if (keywordToken == FUN_KEYWORD) {
|
else if (keywordToken == FUN_KEYWORD) {
|
||||||
|
|||||||
@@ -27,10 +27,8 @@ import com.intellij.util.IncorrectOperationException;
|
|||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.jetbrains.kotlin.JetNodeTypes;
|
import org.jetbrains.kotlin.JetNodeTypes;
|
||||||
import org.jetbrains.kotlin.lexer.JetModifierKeywordToken;
|
|
||||||
import org.jetbrains.kotlin.lexer.JetTokens;
|
import org.jetbrains.kotlin.lexer.JetTokens;
|
||||||
import org.jetbrains.kotlin.name.FqName;
|
import org.jetbrains.kotlin.name.FqName;
|
||||||
import org.jetbrains.kotlin.psi.addRemoveModifier.AddRemoveModifierPackage;
|
|
||||||
import org.jetbrains.kotlin.psi.stubs.KotlinClassStub;
|
import org.jetbrains.kotlin.psi.stubs.KotlinClassStub;
|
||||||
import org.jetbrains.kotlin.psi.stubs.elements.JetStubElementTypes;
|
import org.jetbrains.kotlin.psi.stubs.elements.JetStubElementTypes;
|
||||||
|
|
||||||
@@ -140,7 +138,8 @@ public class JetClass extends JetTypeParameterListOwnerStub<KotlinClassStub> imp
|
|||||||
return stub.isTrait();
|
return stub.isTrait();
|
||||||
}
|
}
|
||||||
|
|
||||||
return findChildByType(JetTokens.TRAIT_KEYWORD) != null;
|
return findChildByType(JetTokens.TRAIT_KEYWORD) != null ||
|
||||||
|
findChildByType(JetTokens.INTERFACE_KEYWORD) != null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isEnum() {
|
public boolean isEnum() {
|
||||||
|
|||||||
@@ -0,0 +1,4 @@
|
|||||||
|
interface Foo {
|
||||||
|
fun f()
|
||||||
|
val a
|
||||||
|
}
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
JetFile: Interface.kt
|
||||||
|
PACKAGE_DIRECTIVE
|
||||||
|
<empty list>
|
||||||
|
CLASS
|
||||||
|
PsiElement(interface)('interface')
|
||||||
|
PsiWhiteSpace(' ')
|
||||||
|
PsiElement(IDENTIFIER)('Foo')
|
||||||
|
PsiWhiteSpace(' ')
|
||||||
|
CLASS_BODY
|
||||||
|
PsiElement(LBRACE)('{')
|
||||||
|
PsiWhiteSpace('\n ')
|
||||||
|
FUN
|
||||||
|
PsiElement(fun)('fun')
|
||||||
|
PsiWhiteSpace(' ')
|
||||||
|
PsiElement(IDENTIFIER)('f')
|
||||||
|
VALUE_PARAMETER_LIST
|
||||||
|
PsiElement(LPAR)('(')
|
||||||
|
PsiElement(RPAR)(')')
|
||||||
|
PsiWhiteSpace('\n ')
|
||||||
|
PROPERTY
|
||||||
|
PsiElement(val)('val')
|
||||||
|
PsiWhiteSpace(' ')
|
||||||
|
PsiElement(IDENTIFIER)('a')
|
||||||
|
PsiWhiteSpace('\n')
|
||||||
|
PsiElement(RBRACE)('}')
|
||||||
@@ -355,6 +355,12 @@ public class JetParsingTestGenerated extends AbstractJetParsingTest {
|
|||||||
doParsingTest(fileName);
|
doParsingTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("Interface.kt")
|
||||||
|
public void testInterface() throws Exception {
|
||||||
|
String fileName = JetTestUtils.navigationMetadata("compiler/testData/psi/Interface.kt");
|
||||||
|
doParsingTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("Labels.kt")
|
@TestMetadata("Labels.kt")
|
||||||
public void testLabels() throws Exception {
|
public void testLabels() throws Exception {
|
||||||
String fileName = JetTestUtils.navigationMetadata("compiler/testData/psi/Labels.kt");
|
String fileName = JetTestUtils.navigationMetadata("compiler/testData/psi/Labels.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user