diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java index 99e65f700ff..07321b001f8 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java @@ -470,6 +470,7 @@ public interface Errors { } }; + ParameterizedDiagnosticFactory1 UNRESOLVED_IDE_TEMPLATE = new ParameterizedDiagnosticFactory1(ERROR, "Unresolved IDE template: {0}"); // This field is needed to make the Initializer class load (interfaces cannot have static initializers) @SuppressWarnings("UnusedDeclaration") diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetIdeTemplateExpression.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetIdeTemplateExpression.java index 7b3d06e943f..8a8cbccd1fc 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetIdeTemplateExpression.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetIdeTemplateExpression.java @@ -1,7 +1,10 @@ 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; /** * @author Evgeny Gerashchenko @@ -21,4 +24,10 @@ public class JetIdeTemplateExpression extends JetExpression { public R accept(@NotNull JetVisitor visitor, D data) { return visitor.visitIdeTemplateExpression(this, data); } + + @Nullable + public String getText() { + PsiElement idElement = findChildByType(JetTokens.IDENTIFIER); + return idElement == null ? null : idElement.getText(); + } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/BasicExpressionTypingVisitor.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/BasicExpressionTypingVisitor.java index b18bc19571c..184f8577985 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/BasicExpressionTypingVisitor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/BasicExpressionTypingVisitor.java @@ -5,6 +5,7 @@ import com.google.common.collect.Multimap; import com.intellij.lang.ASTNode; import com.intellij.psi.PsiElement; import com.intellij.psi.tree.IElementType; +import com.intellij.util.ObjectUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.JetNodeTypes; @@ -734,6 +735,12 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor { } } + @Override + public JetType visitIdeTemplateExpression(JetIdeTemplateExpression expression, ExpressionTypingContext context) { + context.trace.report(UNRESOLVED_IDE_TEMPLATE.on(expression, ObjectUtils.notNull(expression.getText(), ""))); + return null; + } + @Override public JetType visitBinaryExpression(JetBinaryExpression expression, ExpressionTypingContext contextWithExpectedType) { ExpressionTypingContext context = contextWithExpectedType.replaceExpectedType(NO_EXPECTED_TYPE); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingVisitorDispatcher.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingVisitorDispatcher.java index 91ba6df5715..4b86da82046 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingVisitorDispatcher.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingVisitorDispatcher.java @@ -20,6 +20,11 @@ import static org.jetbrains.jet.lang.diagnostics.Errors.TYPECHECKER_HAS_RUN_INTO */ public class ExpressionTypingVisitorDispatcher extends JetVisitor implements ExpressionTypingInternals { + @Override + public JetType visitIdeTemplateExpression(JetIdeTemplateExpression expression, ExpressionTypingContext data) { + return basic.visitIdeTemplateExpression(expression, data); + } + @NotNull public static ExpressionTypingFacade create() { return new ExpressionTypingVisitorDispatcher(null); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingVisitorForStatements.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingVisitorForStatements.java index d67dfa79ff3..ae0f1f285f6 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingVisitorForStatements.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingVisitorForStatements.java @@ -2,6 +2,7 @@ package org.jetbrains.jet.lang.types.expressions; import com.google.common.collect.Sets; import com.intellij.psi.tree.IElementType; +import com.intellij.util.ObjectUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.*; @@ -282,4 +283,10 @@ public class ExpressionTypingVisitorForStatements extends ExpressionTypingVisito public JetType visitUnaryExpression(JetUnaryExpression expression, ExpressionTypingContext context) { return basic.visitUnaryExpression(expression, context, true); } + + @Override + public JetType visitIdeTemplateExpression(JetIdeTemplateExpression expression, ExpressionTypingContext context) { + context.trace.report(UNRESOLVED_IDE_TEMPLATE.on(expression, ObjectUtils.notNull(expression.getText(), ""))); + return null; + } } diff --git a/compiler/testData/diagnostics/tests/IdeTemplates.jet b/compiler/testData/diagnostics/tests/IdeTemplates.jet new file mode 100644 index 00000000000..b6887d409bc --- /dev/null +++ b/compiler/testData/diagnostics/tests/IdeTemplates.jet @@ -0,0 +1,42 @@ +fun main(args : Array) { + if (<##>) { + <##> + } else { + <##> + } + + fun <##>(<##>) : <##> { + <##> + } + + for (<##> in <##>) { + <##> + } + + when (<##>) { + <##> -> <##> + else -> <##> + } + + var <##> = <##> + + class <##> { + <##> + } + + class <##> { + var <##> : <##> + get() { + <##> + } + set(value) { + <##> + } + + val <##> : <##> + get() { + <##> + } + } +} + diff --git a/idea/src/org/jetbrains/jet/plugin/annotations/JetPsiChecker.java b/idea/src/org/jetbrains/jet/plugin/annotations/JetPsiChecker.java index 54eec072198..15d9212db34 100644 --- a/idea/src/org/jetbrains/jet/plugin/annotations/JetPsiChecker.java +++ b/idea/src/org/jetbrains/jet/plugin/annotations/JetPsiChecker.java @@ -144,6 +144,9 @@ public class JetPsiChecker implements Annotator { ) { List textRanges = diagnostic.getFactory().getTextRanges(diagnostic); if (diagnostic.getSeverity() == Severity.ERROR) { + if (diagnostic.getFactory() == Errors.UNRESOLVED_IDE_TEMPLATE) { + return; + } if (diagnostic instanceof UnresolvedReferenceDiagnostic) { UnresolvedReferenceDiagnostic unresolvedReferenceDiagnostic = (UnresolvedReferenceDiagnostic) diagnostic; JetReferenceExpression referenceExpression = unresolvedReferenceDiagnostic.getPsiElement();