Removed IDE templates support from compiler.

This commit is contained in:
Evgeny Gerashchenko
2013-09-17 17:56:49 +04:00
parent 31a712b424
commit dcfeea4029
19 changed files with 442 additions and 993 deletions
@@ -148,8 +148,6 @@ public interface JetNodeTypes {
JetNodeType NAMESPACE_HEADER = new JetNodeType("NAMESPACE_HEADER", JetNamespaceHeader.class);
JetNodeType SCRIPT = new JetNodeType("SCRIPT", JetScript.class);
JetNodeType IDE_TEMPLATE_EXPRESSION = new JetNodeType("IDE_TEMPLATE_EXPRESSION", JetIdeTemplate.class);
IFileElementType TYPE_CODE_FRAGMENT = new JetTypeCodeFragmentType();
IFileElementType EXPRESSION_CODE_FRAGMENT = new JetExpressionCodeFragmentType();
}
@@ -71,7 +71,6 @@ public abstract class AbstractDiagnostic<E extends PsiElement> implements Parame
@Override
public boolean isValid() {
if (!getFactory().isValid(this)) return false;
if (psiElement.getNode().findChildByType(JetNodeTypes.IDE_TEMPLATE_EXPRESSION) != null) return false;
return true;
}
}
@@ -106,8 +106,7 @@ public class JetExpressionParsing extends AbstractJetParsing {
IDENTIFIER, // SimpleName
FIELD_IDENTIFIER, // Field reference
PACKAGE_KEYWORD, // for absolute qualified names
IDE_TEMPLATE_START
PACKAGE_KEYWORD // for absolute qualified names
);
private static final TokenSet STATEMENT_FIRST = TokenSet.orSet(
@@ -125,7 +124,7 @@ public class JetExpressionParsing extends AbstractJetParsing {
);
/*package*/ static final TokenSet EXPRESSION_FOLLOW = TokenSet.create(
SEMICOLON, ARROW, COMMA, RBRACE, RPAR, RBRACKET, IDE_TEMPLATE_END
SEMICOLON, ARROW, COMMA, RBRACE, RPAR, RBRACKET
);
@SuppressWarnings({"UnusedDeclaration"})
@@ -532,9 +531,6 @@ public class JetExpressionParsing extends AbstractJetParsing {
if (at(LPAR)) {
parseParenthesizedExpression();
}
else if (at(IDE_TEMPLATE_START)) {
myJetParsing.parseIdeTemplate();
}
else if (at(HASH)) {
parseTupleExpression();
}
@@ -820,14 +816,13 @@ public class JetExpressionParsing extends AbstractJetParsing {
* : whenCondition{","} "->" element SEMI
*/
private void parseWhenEntryNotElse() {
if (!myJetParsing.parseIdeTemplate()) {
while (true) {
while (at(COMMA)) errorAndAdvance("Expecting a when-condition");
parseWhenCondition();
if (!at(COMMA)) break;
advance(); // COMMA
}
while (true) {
while (at(COMMA)) errorAndAdvance("Expecting a when-condition");
parseWhenCondition();
if (!at(COMMA)) break;
advance(); // COMMA
}
expect(ARROW, "Expecting '->' or 'when'", WHEN_CONDITION_RECOVERY_SET);
if (atSet(WHEN_CONDITION_RECOVERY_SET)) {
error("Expecting an element");
@@ -1359,9 +1354,8 @@ public class JetExpressionParsing extends AbstractJetParsing {
parameter.done(MULTI_VARIABLE_DECLARATION);
}
else {
if (!myJetParsing.parseIdeTemplate()) {
expect(IDENTIFIER, "Expecting a variable name", TokenSet.create(COLON));
}
expect(IDENTIFIER, "Expecting a variable name", TokenSet.create(COLON));
if (at(COLON)) {
advance(); // COLON
myJetParsing.parseTypeRef(TokenSet.create(IN_KEYWORD));
@@ -465,9 +465,7 @@ public class JetParsing extends AbstractJetParsing {
assert _atSet(CLASS_KEYWORD, TRAIT_KEYWORD);
advance(); // CLASS_KEYWORD or TRAIT_KEYWORD
if (!parseIdeTemplate()) {
expect(IDENTIFIER, "Class name expected", CLASS_NAME_RECOVERY_SET);
}
expect(IDENTIFIER, "Class name expected", CLASS_NAME_RECOVERY_SET);
boolean typeParametersDeclared = parseTypeParameterList(TYPE_PARAMETER_GT_RECOVERY_SET);
PsiBuilder.Marker beforeConstructorModifiers = mark();
@@ -525,31 +523,29 @@ public class JetParsing extends AbstractJetParsing {
myBuilder.enableNewlines();
advance(); // LBRACE
if (!parseIdeTemplate()) {
while (!eof() && !at(RBRACE)) {
PsiBuilder.Marker entryOrMember = mark();
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);
}
}
@@ -595,13 +591,11 @@ public class JetParsing extends AbstractJetParsing {
myBuilder.enableNewlines();
expect(LBRACE, "Expecting a class body", TokenSet.create(LBRACE));
if (!parseIdeTemplate()) {
while (!eof()) {
if (at(RBRACE)) {
break;
}
parseMemberDeclaration();
while (!eof()) {
if (at(RBRACE)) {
break;
}
parseMemberDeclaration();
}
expect(RBRACE, "Missing '}");
myBuilder.restoreNewlinesState();
@@ -689,9 +683,7 @@ public class JetParsing extends AbstractJetParsing {
if (named) {
PsiBuilder.Marker propertyDeclaration = mark();
if (!parseIdeTemplate()) {
expect(IDENTIFIER, "Expecting object name", TokenSet.create(LBRACE));
}
expect(IDENTIFIER, "Expecting object name", TokenSet.create(LBRACE));
propertyDeclaration.done(OBJECT_DECLARATION_NAME);
}
else {
@@ -879,9 +871,7 @@ public class JetParsing extends AbstractJetParsing {
if (at(COLON)) {
PsiBuilder.Marker type = mark();
advance(); // COLON
if (!parseIdeTemplate()) {
parseTypeRef();
}
parseTypeRef();
errorIf(type, multiDeclaration, "Type annotations are not allowed on multi-declarations");
}
@@ -1097,9 +1087,7 @@ public class JetParsing extends AbstractJetParsing {
if (at(COLON)) {
advance(); // COLON
if (!parseIdeTemplate()) {
parseTypeRef();
}
parseTypeRef();
}
parseTypeConstraintsGuarded(typeParameterListOccurred);
@@ -1122,20 +1110,14 @@ public class JetParsing extends AbstractJetParsing {
parseAnnotations(false);
}
else {
if (parseIdeTemplate()) {
expect(DOT, "Expecting '.' after receiver template");
createTruncatedBuilder(lastDot).parseTypeRef();
if (atSet(RECEIVER_TYPE_TERMINATORS)) {
advance(); // expectation
}
else {
createTruncatedBuilder(lastDot).parseTypeRef();
if (atSet(RECEIVER_TYPE_TERMINATORS)) {
advance(); // expectation
}
else {
errorWithRecovery("Expecting '.' before a " + title + " name", nameFollow);
}
errorWithRecovery("Expecting '.' before a " + title + " name", nameFollow);
}
}
}
@@ -1144,14 +1126,10 @@ public class JetParsing extends AbstractJetParsing {
*/
private void parseFunctionOrPropertyName(boolean receiverFound, String title, TokenSet nameFollow) {
if (!receiverFound) {
if (!parseIdeTemplate()) {
expect(IDENTIFIER, "Expecting " + title + " name or receiver type", nameFollow);
}
expect(IDENTIFIER, "Expecting " + title + " name or receiver type", nameFollow);
}
else {
if (!parseIdeTemplate()) {
expect(IDENTIFIER, "Expecting " + title + " name", nameFollow);
}
expect(IDENTIFIER, "Expecting " + title + " name", nameFollow);
}
}
@@ -1702,32 +1680,30 @@ public class JetParsing extends AbstractJetParsing {
myBuilder.disableNewlines();
advance(); // LPAR
if (!parseIdeTemplate()) {
if (!at(RPAR) && !atSet(recoverySet)) {
while (true) {
if (at(COMMA)) {
errorAndAdvance("Expecting a parameter declaration");
}
else if (at(RPAR)) {
error("Expecting a parameter declaration");
break;
}
if (isFunctionTypeContents) {
if (!tryParseValueParameter()) {
PsiBuilder.Marker valueParameter = mark();
parseModifierList(MODIFIER_LIST, false); // lazy, out, ref
parseTypeRef();
valueParameter.done(VALUE_PARAMETER);
}
}
else {
parseValueParameter();
}
if (at(COMMA)) {
advance(); // COMMA
}
else if (!atSet(VALUE_PARAMETER_FIRST)) break;
if (!at(RPAR) && !atSet(recoverySet)) {
while (true) {
if (at(COMMA)) {
errorAndAdvance("Expecting a parameter declaration");
}
else if (at(RPAR)) {
error("Expecting a parameter declaration");
break;
}
if (isFunctionTypeContents) {
if (!tryParseValueParameter()) {
PsiBuilder.Marker valueParameter = mark();
parseModifierList(MODIFIER_LIST, false); // lazy, out, ref
parseTypeRef();
valueParameter.done(VALUE_PARAMETER);
}
}
else {
parseValueParameter();
}
if (at(COMMA)) {
advance(); // COMMA
}
else if (!atSet(VALUE_PARAMETER_FIRST)) break;
}
}
@@ -1803,29 +1779,6 @@ public class JetParsing extends AbstractJetParsing {
return noErrors;
}
/*
* "<#<" expression ">#>"
*/
boolean parseIdeTemplate() {
@Nullable JetNodeType nodeType = IDE_TEMPLATE_EXPRESSION;
if (at(IDE_TEMPLATE_START)) {
PsiBuilder.Marker mark = null;
if (nodeType != null) {
mark = mark();
}
advance();
expect(IDENTIFIER, "Expecting identifier inside template");
expect(IDE_TEMPLATE_END, "Expecting IDE template end after identifier");
if (nodeType != null) {
mark.done(nodeType);
}
return true;
}
else {
return false;
}
}
@Override
protected JetParsing create(SemanticWhitespaceAwarePsiBuilder builder) {
return createForTopLevel(builder);
@@ -1,45 +0,0 @@
/*
* Copyright 2010-2013 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.jet.lang.psi;
import com.intellij.lang.ASTNode;
import com.intellij.psi.PsiElement;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lexer.JetTokens;
public class JetIdeTemplate extends JetElementImpl {
public JetIdeTemplate(@NotNull ASTNode node) {
super(node);
}
@Override
public void accept(@NotNull JetVisitorVoid visitor) {
visitor.visitIdeTemplate(this);
}
@Override
public <R, D> R accept(@NotNull JetVisitor<R, D> visitor, D data) {
return visitor.visitIdeTemplate(this, data);
}
@Nullable
public String getPlaceholderText() {
PsiElement idElement = findChildByType(JetTokens.IDENTIFIER);
return idElement == null ? null : idElement.getText();
}
}
@@ -273,10 +273,6 @@ public class JetVisitor<R, D> extends PsiElementVisitor {
return visitExpression(expression, data);
}
public R visitIdeTemplate(JetIdeTemplate expression, D data) {
return null;
}
public R visitCatchSection(JetCatchClause catchClause, D data) {
return visitJetElement(catchClause, data);
}
@@ -263,9 +263,6 @@ public class JetVisitorVoid extends PsiElementVisitor {
visitExpression(expression);
}
public void visitIdeTemplate(JetIdeTemplate expression) {
}
public void visitCatchSection(JetCatchClause catchClause) {
visitJetElement(catchClause);
}
@@ -17,16 +17,13 @@
package org.jetbrains.jet.lang.resolve;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiElementVisitor;
import com.intellij.psi.PsiErrorElement;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.diagnostics.Diagnostic;
import org.jetbrains.jet.lang.diagnostics.DiagnosticHolder;
import org.jetbrains.jet.lang.diagnostics.DiagnosticUtils;
import org.jetbrains.jet.lang.psi.JetIdeTemplate;
import org.jetbrains.jet.lang.psi.JetTreeVisitorVoid;
import org.jetbrains.jet.lang.psi.JetVisitorVoid;
import java.util.ArrayList;
import java.util.List;
@@ -33,11 +33,6 @@ import static org.jetbrains.jet.lang.diagnostics.Errors.TYPECHECKER_HAS_RUN_INTO
public class ExpressionTypingVisitorDispatcher extends JetVisitor<JetTypeInfo, ExpressionTypingContext> implements ExpressionTypingInternals {
@Override
public JetTypeInfo visitIdeTemplate(JetIdeTemplate expression, ExpressionTypingContext data) {
return basic.visitIdeTemplate(expression, data);
}
@NotNull
public static ExpressionTypingFacade create(@NotNull PlatformToKotlinClassMap platformToKotlinClassMap) {
return new ExpressionTypingVisitorDispatcher(platformToKotlinClassMap, null);
@@ -268,8 +268,6 @@ LONG_TEMPLATE_ENTRY_END=\}
\!in{IDENTIFIER_PART} { yypushback(3); return JetTokens.EXCL; }
\!is{IDENTIFIER_PART} { yypushback(3); return JetTokens.EXCL; }
"<#<" { return JetTokens.IDE_TEMPLATE_START ; }
">#>" { return JetTokens.IDE_TEMPLATE_END ; }
"===" { return JetTokens.EQEQEQ ; }
"!==" { return JetTokens.EXCLEQEQEQ; }
"!in" { return JetTokens.NOT_IN; }
@@ -132,9 +132,6 @@ public interface JetTokens {
JetToken AT = new JetToken("AT");
JetToken ATAT = new JetToken("ATAT");
JetToken IDE_TEMPLATE_START = new JetToken("IDE_TEMPLATE_START");
JetToken IDE_TEMPLATE_END = new JetToken("IDE_TEMPLATE_END");
TokenSet LABELS = TokenSet.create(AT, ATAT, LABEL_IDENTIFIER);
JetToken COMMA = new JetToken("COMMA");
File diff suppressed because it is too large Load Diff