diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/annotator/GrKeywordAndDeclarationHighlighter.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/annotator/GrKeywordAndDeclarationHighlighter.java index 68217b75294e..e27a9077b0d0 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/annotator/GrKeywordAndDeclarationHighlighter.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/annotator/GrKeywordAndDeclarationHighlighter.java @@ -36,6 +36,7 @@ import org.jetbrains.plugins.groovy.lang.psi.GroovyFile; import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElement; import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.GrLabel; import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.modifiers.annotation.GrAnnotation; +import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.modifiers.annotation.GrAnnotationNameValuePair; import org.jetbrains.plugins.groovy.lang.psi.api.statements.arguments.GrArgumentLabel; import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrReferenceExpression; import org.jetbrains.plugins.groovy.lang.psi.api.types.GrCodeReferenceElement; @@ -101,6 +102,7 @@ public class GrKeywordAndDeclarationHighlighter extends TextEditorHighlightingPa return false; //It is allowed to name packages 'as', 'in' or 'def' } } + else if (token == GroovyTokenTypes.kDEF && element.getParent() instanceof GrAnnotationNameValuePair) return false; else if (parent instanceof GrReferenceExpression && element == ((GrReferenceExpression)parent).getReferenceNameElement()) { return false; //don't highlight foo.def } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/parser/parsing/auxiliary/annotations/AnnotationArguments.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/parser/parsing/auxiliary/annotations/AnnotationArguments.java index 4bb0a5a55b2f..c9c3773233e4 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/parser/parsing/auxiliary/annotations/AnnotationArguments.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/parser/parsing/auxiliary/annotations/AnnotationArguments.java @@ -42,7 +42,7 @@ public class AnnotationArguments implements GroovyElementTypes { return; } - if (ParserUtils.lookAhead(builder, mIDENT, mASSIGN)) { + if (checkIdentAndAssign(builder)) { parsePairs(builder, parser); } else { @@ -60,6 +60,11 @@ public class AnnotationArguments implements GroovyElementTypes { annArgs.done(ANNOTATION_ARGUMENTS); } + private static boolean checkIdentAndAssign(PsiBuilder builder) { + //def is valid name identifier + return ParserUtils.lookAhead(builder, mIDENT, mASSIGN) || ParserUtils.lookAhead(builder, kDEF, mASSIGN); + } + /* * annotationMemberValueInitializer ::= conditionalExpression | annotation */ @@ -114,8 +119,10 @@ public class AnnotationArguments implements GroovyElementTypes { private static boolean parsePair(PsiBuilder builder, GroovyParser parser) { PsiBuilder.Marker marker = builder.mark(); - if (ParserUtils.lookAhead(builder, mIDENT, mASSIGN)) { - ParserUtils.getToken(builder, mIDENT); + if (checkIdentAndAssign(builder)) { + if (!ParserUtils.getToken(builder, mIDENT)) { + ParserUtils.getToken(builder, kDEF); + } ParserUtils.getToken(builder, mASSIGN); ParserUtils.getToken(builder, mNLS); } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/auxiliary/annotation/GrAnnotationNameValuePairImpl.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/auxiliary/annotation/GrAnnotationNameValuePairImpl.java index bf084a6baf78..aa402bacbb95 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/auxiliary/annotation/GrAnnotationNameValuePairImpl.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/auxiliary/annotation/GrAnnotationNameValuePairImpl.java @@ -20,6 +20,7 @@ import com.intellij.codeInsight.completion.PrefixMatcher; import com.intellij.lang.ASTNode; import com.intellij.openapi.util.TextRange; import com.intellij.psi.*; +import com.intellij.psi.tree.IElementType; import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -63,7 +64,13 @@ public class GrAnnotationNameValuePairImpl extends GroovyPsiElementImpl implemen @Nullable public PsiElement getNameIdentifierGroovy() { - return findChildByType(GroovyTokenTypes.mIDENT); + PsiElement child = getFirstChild(); + if (child == null) return null; + + IElementType type = child.getNode().getElementType(); + if (type == GroovyTokenTypes.mIDENT || type == GroovyTokenTypes.kDEF) return child; + + return null; } public PsiIdentifier getNameIdentifier() { diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/parser/AnnotationsParsingTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/parser/AnnotationsParsingTest.groovy new file mode 100644 index 000000000000..28cf3d6e47db --- /dev/null +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/parser/AnnotationsParsingTest.groovy @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2000-2005 by JetBrains s.r.o. All Rights Reserved. + * Use is subject to license terms. + */ +package org.jetbrains.plugins.groovy.lang.parser + +/** + * @author peter + */ +public class AnnotationsParsingTest extends GroovyParsingTestCase { + final String basePath = super.basePath + "annotations" + + public void testAnn1() { doTest() } + public void testAnn2() { doTest() } + public void testAnn3() { doTest() } + public void testAnn4() { doTest() } + public void testAnn5() { doTest() } + public void testAnn6() { doTest() } + public void testAnn7() { doTest() } + public void testClassLiteral() { doTest() } + public void testImportAnn() { doTest() } + public void testPackageAnn() { doTest() } + public void testDefAttribute() {doTest()} +} \ No newline at end of file diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/parser/AnnotationsParsingTest.java b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/parser/AnnotationsParsingTest.java deleted file mode 100644 index 25ab092d485a..000000000000 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/parser/AnnotationsParsingTest.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright (c) 2000-2005 by JetBrains s.r.o. All Rights Reserved. - * Use is subject to license terms. - */ -package org.jetbrains.plugins.groovy.lang.parser; - -/** - * @author peter - */ -public class AnnotationsParsingTest extends GroovyParsingTestCase { - @Override - protected String getBasePath() { - return super.getBasePath() + "annotations"; - } - - public void testAnn1() throws Throwable { doTest(); } - public void testAnn2() throws Throwable { doTest(); } - public void testAnn3() throws Throwable { doTest(); } - public void testAnn4() throws Throwable { doTest(); } - public void testAnn5() throws Throwable { doTest(); } - public void testAnn6() throws Throwable { doTest(); } - public void testAnn7() throws Throwable { doTest(); } - public void testClassLiteral() throws Throwable { doTest(); } - public void testImportAnn() throws Throwable { doTest(); } - public void testPackageAnn() throws Throwable { doTest(); } -} \ No newline at end of file diff --git a/plugins/groovy/testdata/parsing/groovy/annotations/defAttribute.test b/plugins/groovy/testdata/parsing/groovy/annotations/defAttribute.test new file mode 100644 index 000000000000..4f193cc3b76a --- /dev/null +++ b/plugins/groovy/testdata/parsing/groovy/annotations/defAttribute.test @@ -0,0 +1,25 @@ +@Foo(def = 4) +def a +----- +Groovy script + Variable definitions + Modifiers + Annotation + PsiElement(@)('@') + Reference element + PsiElement(identifier)('Foo') + Annotation arguments + PsiElement(()('(') + Annotation member value pair + PsiElement(def)('def') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + Literal + PsiElement(Integer)('4') + PsiElement())(')') + PsiElement(new line)('\n') + PsiElement(def)('def') + PsiWhiteSpace(' ') + Variable + PsiElement(identifier)('a') \ No newline at end of file