java: experimental <any T> support
authorRoman Shevchenko <roman.shevchenko@jetbrains.com>
Mon, 13 Oct 2014 18:01:12 +0000 (20:01 +0200)
committerRoman Shevchenko <roman.shevchenko@jetbrains.com>
Mon, 13 Oct 2014 18:01:12 +0000 (20:01 +0200)
java/java-psi-impl/src/com/intellij/lang/java/parser/JavaParserUtil.java
java/java-psi-impl/src/com/intellij/lang/java/parser/ReferenceParser.java
java/java-tests/testData/psi/parser-partial/references/AnyType.txt [new file with mode: 0644]
java/java-tests/testSrc/com/intellij/lang/java/parser/JavaParsingTestCase.java
java/java-tests/testSrc/com/intellij/lang/java/parser/partial/ReferenceParserTest.java

index ec6b39106d0b91696dcb98f8c5d88e4c0620124c..1eb16b3f03d174dad9a9bd1b3e21dc740720b8cb 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2000-2013 JetBrains s.r.o.
+ * Copyright 2000-2014 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.
@@ -21,6 +21,8 @@ import com.intellij.lang.impl.PsiBuilderAdapter;
 import com.intellij.lang.java.JavaLanguage;
 import com.intellij.lang.java.JavaParserDefinition;
 import com.intellij.lexer.Lexer;
+import com.intellij.openapi.application.Application;
+import com.intellij.openapi.application.ApplicationManager;
 import com.intellij.openapi.project.Project;
 import com.intellij.openapi.util.Condition;
 import com.intellij.openapi.util.Key;
@@ -36,6 +38,7 @@ import com.intellij.psi.impl.source.tree.TreeUtil;
 import com.intellij.psi.tree.IElementType;
 import com.intellij.psi.tree.TokenSet;
 import com.intellij.psi.util.PsiUtil;
+import com.intellij.util.SystemProperties;
 import com.intellij.util.indexing.IndexingDataKeys;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
@@ -119,6 +122,12 @@ public class JavaParserUtil {
   public static final WhitespacesAndCommentsBinder SPECIAL_PRECEDING_COMMENT_BINDER = new PrecedingWhitespacesAndCommentsBinder(true);
   public static final WhitespacesAndCommentsBinder TRAILING_COMMENT_BINDER = new TrailingWhitespacesAndCommentsBinder();
 
+  public static final boolean EXPERIMENTAL_FEATURES;
+  static {
+    Application app = ApplicationManager.getApplication();
+    EXPERIMENTAL_FEATURES = SystemProperties.getBooleanProperty("idea.experimental.java.features", app != null && app.isUnitTestMode());
+  }
+
   private JavaParserUtil() { }
 
   public static void setLanguageLevel(final PsiBuilder builder, final LanguageLevel level) {
index c6c8e71fbca1c6a907baa1e44fb46c7a268b7217..a2eb9047c2a84e89c6b87e4ecff519d0e3b7f73a 100644 (file)
@@ -17,6 +17,7 @@ package com.intellij.lang.java.parser;
 
 import com.intellij.codeInsight.daemon.JavaErrorMessages;
 import com.intellij.lang.PsiBuilder;
+import com.intellij.pom.java.LanguageLevel;
 import com.intellij.psi.JavaTokenType;
 import com.intellij.psi.impl.source.tree.ElementType;
 import com.intellij.psi.impl.source.tree.JavaElementType;
@@ -343,6 +344,12 @@ public class ReferenceParser {
 
     myParser.getDeclarationParser().parseAnnotations(builder);
 
+    if (EXPERIMENTAL_FEATURES && "any".equals(builder.getTokenText()) && getLanguageLevel(builder).isAtLeast(LanguageLevel.JDK_1_9)) {
+      PsiBuilder.Marker mark = builder.mark();
+      builder.advanceLexer();
+      mark.done(JavaElementType.DUMMY_ELEMENT);
+    }
+
     final boolean wild = expect(builder, JavaTokenType.QUEST);
     if (!wild && !expect(builder, JavaTokenType.IDENTIFIER)) {
       param.rollbackTo();
diff --git a/java/java-tests/testData/psi/parser-partial/references/AnyType.txt b/java/java-tests/testData/psi/parser-partial/references/AnyType.txt
new file mode 100644 (file)
index 0000000..f08d620
--- /dev/null
@@ -0,0 +1,11 @@
+PsiJavaFile:AnyType.java
+  PsiTypeParameterList
+    PsiJavaToken:LT('<')
+    PsiTypeParameter:T
+      PsiElement(DUMMY_ELEMENT)
+        PsiIdentifier:any('any')
+      PsiWhiteSpace(' ')
+      PsiIdentifier:T('T')
+      PsiElement(EXTENDS_BOUND_LIST)
+        <empty list>
+    PsiJavaToken:GT('>')
\ No newline at end of file
index 1d77c1ea0cb054505f1ad02ad8f2ca80d9d4ffc1..861745fba66d74fd89bec89e8aa0629cc31c42f7 100644 (file)
@@ -74,6 +74,10 @@ public abstract class JavaParsingTestCase extends ParsingTestCase {
     void parse(PsiBuilder builder);
   }
 
+  protected void setLanguageLevel(@NotNull LanguageLevel languageLevel) {
+    myLanguageLevel = languageLevel;
+  }
+
   protected void doParserTest(final String text, final TestParser parser) {
     final String name = getTestName(false);
     myFile = createPsiFile(name, text, parser);
index 5c130ba091bc84932745974ef853c9e294330eab..555d166e13bf267b0c7c6a55793d598298d67c72 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2000-2012 JetBrains s.r.o.
+ * Copyright 2000-2014 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.
@@ -19,7 +19,7 @@ import com.intellij.lang.PsiBuilder;
 import com.intellij.lang.java.parser.JavaParser;
 import com.intellij.lang.java.parser.JavaParsingTestCase;
 import com.intellij.lang.java.parser.ReferenceParser;
-
+import com.intellij.pom.java.LanguageLevel;
 
 public class ReferenceParserTest extends JavaParsingTestCase {
   public ReferenceParserTest() {
@@ -51,6 +51,11 @@ public class ReferenceParserTest extends JavaParsingTestCase {
   public void testTypeParams7() { doTypeParamsParserTest("<T extends X, Y>"); }
   public void testTypeParams8() { doTypeParamsParserTest("<?>"); }
 
+  public void testAnyType() {
+    setLanguageLevel(LanguageLevel.JDK_1_9);
+    doTypeParamsParserTest("<any T>");
+  }
+
   private void doRefParserTest(final String text, final boolean incomplete) {
     doParserTest(text, new MyTestParser(incomplete));
   }
@@ -73,8 +78,7 @@ public class ReferenceParserTest extends JavaParsingTestCase {
   private static class MyTestParser2 implements TestParser {
     @Override
     public void parse(final PsiBuilder builder) {
-      JavaParser.INSTANCE.getReferenceParser()
-        .parseType(builder, ReferenceParser.ELLIPSIS | ReferenceParser.DIAMONDS | ReferenceParser.DISJUNCTIONS);
+      JavaParser.INSTANCE.getReferenceParser().parseType(builder, ReferenceParser.ELLIPSIS | ReferenceParser.DIAMONDS | ReferenceParser.DISJUNCTIONS);
     }
   }