From e4953f60fb242704dee5591d9afb0ea863350790 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Thu, 2 Feb 2012 14:41:00 +0400 Subject: [PATCH] Added templates for class and trait. --- .../jet/lang/parsing/JetParsing.java | 56 ++++++++++--------- .../JetKeywordCompletionContributor.java | 23 +++++--- 2 files changed, 45 insertions(+), 34 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/parsing/JetParsing.java b/compiler/frontend/src/org/jetbrains/jet/lang/parsing/JetParsing.java index d3894567682..91b0cb28c94 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/parsing/JetParsing.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/parsing/JetParsing.java @@ -388,7 +388,9 @@ public class JetParsing extends AbstractJetParsing { assert _atSet(CLASS_KEYWORD, TRAIT_KEYWORD); advance(); // CLASS_KEYWORD or TRAIT_KEYWORD - expect(IDENTIFIER, "Class name expected", CLASS_NAME_RECOVERY_SET); + if (!parseIdeTemplate()) { + expect(IDENTIFIER, "Class name expected", CLASS_NAME_RECOVERY_SET); + } boolean typeParametersDeclared = parseTypeParameterList(TYPE_PARAMETER_GT_RECOVERY_SET); PsiBuilder.Marker beforeConstructorModifiers = mark(); @@ -446,29 +448,31 @@ public class JetParsing extends AbstractJetParsing { myBuilder.enableNewlines(); advance(); // LBRACE - while (!eof() && !at(RBRACE)) { - PsiBuilder.Marker entryOrMember = mark(); + if (!parseIdeTemplate()) { + while (!eof() && !at(RBRACE)) { + PsiBuilder.Marker entryOrMember = mark(); - TokenSet constructorNameFollow = TokenSet.create(SEMICOLON, COLON, LPAR, LT, LBRACE); - int lastId = findLastBefore(ENUM_MEMBER_FIRST, constructorNameFollow, false); - TokenDetector enumDetector = new TokenDetector(ENUM_KEYWORD); - createTruncatedBuilder(lastId).parseModifierList(MODIFIER_LIST, enumDetector, false); + TokenSet constructorNameFollow = TokenSet.create(SEMICOLON, COLON, LPAR, LT, LBRACE); + int lastId = findLastBefore(ENUM_MEMBER_FIRST, constructorNameFollow, false); + TokenDetector enumDetector = new TokenDetector(ENUM_KEYWORD); + createTruncatedBuilder(lastId).parseModifierList(MODIFIER_LIST, enumDetector, false); - IElementType type; - if (at(IDENTIFIER)) { - parseEnumEntry(); - type = ENUM_ENTRY; - } - else { - type = parseMemberDeclarationRest(enumDetector.isDetected()); - } + IElementType type; + if (at(IDENTIFIER)) { + parseEnumEntry(); + type = ENUM_ENTRY; + } + else { + type = parseMemberDeclarationRest(enumDetector.isDetected()); + } - if (type == null) { - errorAndAdvance("Expecting an enum entry or member declaration"); - entryOrMember.drop(); - } - else { - entryOrMember.done(type); + if (type == null) { + errorAndAdvance("Expecting an enum entry or member declaration"); + entryOrMember.drop(); + } + else { + entryOrMember.done(type); + } } } @@ -522,11 +526,13 @@ public class JetParsing extends AbstractJetParsing { myBuilder.enableNewlines(); expect(LBRACE, "Expecting a class body", TokenSet.create(LBRACE)); - while (!eof()) { - if (at(RBRACE)) { - break; + if (!parseIdeTemplate()) { + while (!eof()) { + if (at(RBRACE)) { + break; + } + parseMemberDeclaration(); } - parseMemberDeclaration(); } expect(RBRACE, "Missing '}"); myBuilder.restoreNewlinesState(); diff --git a/idea/src/org/jetbrains/jet/plugin/completion/JetKeywordCompletionContributor.java b/idea/src/org/jetbrains/jet/plugin/completion/JetKeywordCompletionContributor.java index ce7e5f860fc..3f6761c4394 100644 --- a/idea/src/org/jetbrains/jet/plugin/completion/JetKeywordCompletionContributor.java +++ b/idea/src/org/jetbrains/jet/plugin/completion/JetKeywordCompletionContributor.java @@ -60,6 +60,8 @@ public class JetKeywordCompletionContributor extends CompletionContributor { private static final String VAR_SIMPLE_TEMPLATE = "var <##> = <##>"; private static final String VAR_WITH_TYPE_TEMPLATE = "var <##> : <##> = <##>"; private static final String VAR_WITH_GETTER_AND_SETTER_TEMPLATE = "var <##> : <##>\nget() {\n<##>\n}\nset(value) {\n<##>\n}"; + private static final String TRAIT_TEMPLATE = "trait <##> {\n<##>\n}"; + private static final String CLASS_TEMPLATE = "class <##> {\n<##>\n}"; private static class CommentFilter implements ElementFilter { @Override @@ -191,24 +193,24 @@ public class JetKeywordCompletionContributor extends CompletionContributor { public JetKeywordCompletionContributor() { registerScopeKeywordsCompletion(new InTopFilter(), - ABSTRACT_KEYWORD, CLASS_KEYWORD, ENUM_KEYWORD, + ABSTRACT_KEYWORD, ENUM_KEYWORD, FINAL_KEYWORD, GET_KEYWORD, IMPORT_KEYWORD, INLINE_KEYWORD, INTERNAL_KEYWORD, OPEN_KEYWORD, PACKAGE_KEYWORD, PRIVATE_KEYWORD, PROTECTED_KEYWORD, PUBLIC_KEYWORD, SET_KEYWORD, - TRAIT_KEYWORD, TYPE_KEYWORD); + TYPE_KEYWORD); registerScopeKeywordsCompletion(new InClassBodyFilter(), - ABSTRACT_KEYWORD, CLASS_KEYWORD, ENUM_KEYWORD, + ABSTRACT_KEYWORD, ENUM_KEYWORD, FINAL_KEYWORD, GET_KEYWORD, INLINE_KEYWORD, INTERNAL_KEYWORD, OBJECT_KEYWORD, OPEN_KEYWORD, OVERRIDE_KEYWORD, PRIVATE_KEYWORD, PROTECTED_KEYWORD, PUBLIC_KEYWORD, SET_KEYWORD, - TRAIT_KEYWORD, TYPE_KEYWORD); + TYPE_KEYWORD); registerScopeKeywordsCompletion(new InNonClassBlockFilter(), AS_KEYWORD, BREAK_KEYWORD, BY_KEYWORD, - CATCH_KEYWORD, CLASS_KEYWORD, CONTINUE_KEYWORD, + CATCH_KEYWORD, CONTINUE_KEYWORD, DO_KEYWORD, ELSE_KEYWORD, ENUM_KEYWORD, FALSE_KEYWORD, FINALLY_KEYWORD, FOR_KEYWORD, GET_KEYWORD, @@ -217,7 +219,7 @@ public class JetKeywordCompletionContributor extends CompletionContributor { PRIVATE_KEYWORD, PROTECTED_KEYWORD, PUBLIC_KEYWORD, RETURN_KEYWORD, SET_KEYWORD, SUPER_KEYWORD, CAPITALIZED_THIS_KEYWORD, THIS_KEYWORD, THROW_KEYWORD, - TRAIT_KEYWORD, TRUE_KEYWORD, TRY_KEYWORD, + TRUE_KEYWORD, TRY_KEYWORD, TYPE_KEYWORD, VARARG_KEYWORD, WHEN_KEYWORD, WHERE_KEYWORD, WHILE_KEYWORD); @@ -231,13 +233,16 @@ public class JetKeywordCompletionContributor extends CompletionContributor { // templates registerScopeKeywordsCompletion(new InTopFilter(), FUN_TEMPLATE, VAL_WITH_TYPE_TEMPLATE, VAL_WITH_GETTER_TEMPLATE, - VAR_WITH_TYPE_TEMPLATE, VAR_WITH_GETTER_AND_SETTER_TEMPLATE); + VAR_WITH_TYPE_TEMPLATE, VAR_WITH_GETTER_AND_SETTER_TEMPLATE, + TRAIT_TEMPLATE, CLASS_TEMPLATE); registerScopeKeywordsCompletion(new InClassBodyFilter(), FUN_TEMPLATE, VAL_WITH_TYPE_TEMPLATE, VAL_WITH_GETTER_TEMPLATE, - VAR_WITH_TYPE_TEMPLATE, VAR_WITH_GETTER_AND_SETTER_TEMPLATE); + VAR_WITH_TYPE_TEMPLATE, VAR_WITH_GETTER_AND_SETTER_TEMPLATE, + TRAIT_TEMPLATE, CLASS_TEMPLATE); registerScopeKeywordsCompletion(new InNonClassBlockFilter(), IF_TEMPLATE, IF_ELSE_TEMPLATE, IF_ELSE_ONELINE_TEMPLATE, - FUN_TEMPLATE, VAL_SIMPLE_TEMPLATE, VAR_SIMPLE_TEMPLATE); + FUN_TEMPLATE, VAL_SIMPLE_TEMPLATE, VAR_SIMPLE_TEMPLATE, + TRAIT_TEMPLATE, CLASS_TEMPLATE); registerScopeKeywordsCompletion(new InPropertyFilter(), IF_ELSE_ONELINE_TEMPLATE); }