summaryrefslogtreecommitdiff
path: root/java/java-impl/src/com/intellij/spi
diff options
context:
space:
mode:
authorTor Norbye <tnorbye@google.com>2013-06-14 07:28:55 -0700
committerTor Norbye <tnorbye@google.com>2013-06-14 07:28:55 -0700
commitd9e4c285fa2c3c38c5b92cf30e77f27e243566a8 (patch)
tree354db2798801cc7730ba4a71ea9a151233309d3a /java/java-impl/src/com/intellij/spi
parent28d9ee094b1d352884aaf5b66b85b30335165c03 (diff)
downloadidea-d9e4c285fa2c3c38c5b92cf30e77f27e243566a8.tar.gz
Snapshot df6c5fa1206345df60a0c86fe8f67c5f7a6f478f from master branch of git://git.jetbrains.org/idea/community.git
Change-Id: I1d62dfd281ca361774653165ce8da9fb93d51005
Diffstat (limited to 'java/java-impl/src/com/intellij/spi')
-rw-r--r--java/java-impl/src/com/intellij/spi/SPIAnnotator.java7
-rw-r--r--java/java-impl/src/com/intellij/spi/SPIGotoSuperHandler.java5
-rw-r--r--java/java-impl/src/com/intellij/spi/parsing/SPIElementTypes.java3
-rw-r--r--java/java-impl/src/com/intellij/spi/parsing/SPIParserDefinition.java28
-rw-r--r--java/java-impl/src/com/intellij/spi/parsing/SPITokenType.java2
-rw-r--r--java/java-impl/src/com/intellij/spi/parsing/_SPILexer.flex17
-rw-r--r--java/java-impl/src/com/intellij/spi/parsing/_SPILexer.java177
-rw-r--r--java/java-impl/src/com/intellij/spi/psi/SPIClassProviderReferenceElement.java59
-rw-r--r--java/java-impl/src/com/intellij/spi/psi/SPIClassProvidersElementList.java (renamed from java/java-impl/src/com/intellij/spi/psi/SPIProvidersElementList.java)7
-rw-r--r--java/java-impl/src/com/intellij/spi/psi/SPIFile.java88
-rw-r--r--java/java-impl/src/com/intellij/spi/psi/SPIPackageOrClassReferenceElement.java (renamed from java/java-impl/src/com/intellij/spi/psi/SPIProviderElement.java)76
11 files changed, 288 insertions, 181 deletions
diff --git a/java/java-impl/src/com/intellij/spi/SPIAnnotator.java b/java/java-impl/src/com/intellij/spi/SPIAnnotator.java
index f834542854cb..a1a198408010 100644
--- a/java/java-impl/src/com/intellij/spi/SPIAnnotator.java
+++ b/java/java-impl/src/com/intellij/spi/SPIAnnotator.java
@@ -18,13 +18,12 @@ package com.intellij.spi;
import com.intellij.lang.annotation.AnnotationHolder;
import com.intellij.lang.annotation.Annotator;
import com.intellij.openapi.vfs.VirtualFile;
-import com.intellij.psi.JavaPsiFacade;
import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.util.ClassUtil;
import com.intellij.psi.util.PsiUtilCore;
-import com.intellij.spi.psi.SPIProviderElement;
+import com.intellij.spi.psi.SPIClassProviderReferenceElement;
import org.jetbrains.annotations.NotNull;
/**
@@ -42,8 +41,8 @@ public class SPIAnnotator implements Annotator{
if (psiClass == null) {
holder.createErrorAnnotation(element, "No service provider \"" + serviceProviderName + "\' found").setFileLevelAnnotation(true);
}
- } else if (element instanceof SPIProviderElement) {
- final PsiElement resolve = ((SPIProviderElement)element).resolve();
+ } else if (element instanceof SPIClassProviderReferenceElement) {
+ final PsiElement resolve = ((SPIClassProviderReferenceElement)element).resolve();
if (resolve == null) {
holder.createErrorAnnotation(element, "Cannot resolve symbol " + element.getText());
} else if (resolve instanceof PsiClass && psiClass != null) {
diff --git a/java/java-impl/src/com/intellij/spi/SPIGotoSuperHandler.java b/java/java-impl/src/com/intellij/spi/SPIGotoSuperHandler.java
index a4a01485313d..04c48bc71e40 100644
--- a/java/java-impl/src/com/intellij/spi/SPIGotoSuperHandler.java
+++ b/java/java-impl/src/com/intellij/spi/SPIGotoSuperHandler.java
@@ -20,7 +20,7 @@ import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiNameIdentifierOwner;
import com.intellij.psi.util.PsiTreeUtil;
-import com.intellij.spi.psi.SPIProviderElement;
+import com.intellij.spi.psi.SPIClassProviderReferenceElement;
/**
* User: anna
@@ -28,7 +28,8 @@ import com.intellij.spi.psi.SPIProviderElement;
public class SPIGotoSuperHandler extends JavaGotoSuperHandler {
@Override
protected PsiNameIdentifierOwner getElement(PsiFile file, int offset) {
- final SPIProviderElement providerElement = PsiTreeUtil.getParentOfType(file.findElementAt(offset), SPIProviderElement.class);
+ final SPIClassProviderReferenceElement
+ providerElement = PsiTreeUtil.getParentOfType(file.findElementAt(offset), SPIClassProviderReferenceElement.class);
if (providerElement != null) {
return (PsiClass)providerElement.resolve();
}
diff --git a/java/java-impl/src/com/intellij/spi/parsing/SPIElementTypes.java b/java/java-impl/src/com/intellij/spi/parsing/SPIElementTypes.java
index 228a8459d14f..585e11ecac88 100644
--- a/java/java-impl/src/com/intellij/spi/parsing/SPIElementTypes.java
+++ b/java/java-impl/src/com/intellij/spi/parsing/SPIElementTypes.java
@@ -24,7 +24,8 @@ public interface SPIElementTypes {
IFileElementType FILE = new IFileElementType(SPILanguage.INSTANCE);
IElementType PROVIDER = new IElementType("PROVIDER", SPILanguage.INSTANCE);
+ IElementType PACK = new IElementType("PACK", SPILanguage.INSTANCE);
- IElementType PROVIDERS_LIST = new IElementType("ROVIDER_LIST", SPILanguage.INSTANCE);
+ IElementType PROVIDERS_LIST = new IElementType("PROVIDER_LIST", SPILanguage.INSTANCE);
TokenSet PROVIDERS = TokenSet.create(PROVIDER);
}
diff --git a/java/java-impl/src/com/intellij/spi/parsing/SPIParserDefinition.java b/java/java-impl/src/com/intellij/spi/parsing/SPIParserDefinition.java
index f32bd37a11d9..57b01542ce5e 100644
--- a/java/java-impl/src/com/intellij/spi/parsing/SPIParserDefinition.java
+++ b/java/java-impl/src/com/intellij/spi/parsing/SPIParserDefinition.java
@@ -27,8 +27,9 @@ import com.intellij.psi.tree.IElementType;
import com.intellij.psi.tree.IFileElementType;
import com.intellij.psi.tree.TokenSet;
import com.intellij.psi.util.PsiUtilCore;
-import com.intellij.spi.psi.SPIProviderElement;
-import com.intellij.spi.psi.SPIProvidersElementList;
+import com.intellij.spi.psi.SPIClassProviderReferenceElement;
+import com.intellij.spi.psi.SPIClassProvidersElementList;
+import com.intellij.spi.psi.SPIPackageOrClassReferenceElement;
import com.intellij.spi.psi.SPIFile;
import com.intellij.lang.spi.SPILanguage;
import org.jetbrains.annotations.NotNull;
@@ -94,10 +95,13 @@ public class SPIParserDefinition implements ParserDefinition {
public PsiElement createElement(ASTNode node) {
final IElementType elementType = node.getElementType();
if (elementType == SPIElementTypes.PROVIDERS_LIST) {
- return new SPIProvidersElementList(node);
+ return new SPIClassProvidersElementList(node);
}
if (elementType == SPIElementTypes.PROVIDER) {
- return new SPIProviderElement(node);
+ return new SPIClassProviderReferenceElement(node);
+ }
+ if (elementType == SPIElementTypes.PACK) {
+ return new SPIPackageOrClassReferenceElement(node);
}
return PsiUtilCore.NULL_PSI_ELEMENT;
}
@@ -111,12 +115,12 @@ public class SPIParserDefinition implements ParserDefinition {
public SpaceRequirements spaceExistanceTypeBetweenTokens(ASTNode left, ASTNode right) {
return SpaceRequirements.MAY;
}
-
+
public static void parseProvider(PsiBuilder builder) {
- if (builder.getTokenType() == JavaTokenType.IDENTIFIER) {
+ if (builder.getTokenType() == SPITokenType.IDENTIFIER) {
final PsiBuilder.Marker prop = builder.mark();
- parseProviderChar(builder);
+ parseProviderChar(builder, builder.mark());
prop.done(SPIElementTypes.PROVIDER);
}
else {
@@ -125,13 +129,17 @@ public class SPIParserDefinition implements ParserDefinition {
}
}
- private static void parseProviderChar(final PsiBuilder builder) {
- LOG.assertTrue(builder.getTokenType() == JavaTokenType.IDENTIFIER);
+ private static void parseProviderChar(final PsiBuilder builder, PsiBuilder.Marker pack) {
builder.advanceLexer();
final IElementType tokenType = builder.getTokenType();
if (tokenType == JavaTokenType.DOT || tokenType == SPITokenType.DOLLAR) {
+ pack.done(SPIElementTypes.PACK);
builder.advanceLexer();
- parseProviderChar(builder);
+ final IElementType initialTokenType = builder.getTokenType();
+ if (initialTokenType == null) return;
+ parseProviderChar(builder, pack.precede());
+ } else {
+ pack.drop();
}
}
}
diff --git a/java/java-impl/src/com/intellij/spi/parsing/SPITokenType.java b/java/java-impl/src/com/intellij/spi/parsing/SPITokenType.java
index cd8b0e6d4e08..a69261439448 100644
--- a/java/java-impl/src/com/intellij/spi/parsing/SPITokenType.java
+++ b/java/java-impl/src/com/intellij/spi/parsing/SPITokenType.java
@@ -15,6 +15,7 @@
*/
package com.intellij.spi.parsing;
+import com.intellij.lang.spi.SPILanguage;
import com.intellij.psi.JavaTokenType;
import com.intellij.psi.tree.IElementType;
import com.intellij.psi.tree.java.IKeywordElementType;
@@ -25,4 +26,5 @@ import com.intellij.psi.tree.java.IKeywordElementType;
public interface SPITokenType extends JavaTokenType {
IElementType SHARP = new IKeywordElementType("SHARP");
IElementType DOLLAR = new IKeywordElementType("DOLLAR");
+ IElementType IDENTIFIER = new IElementType("IDENTIFIER", SPILanguage.INSTANCE);
}
diff --git a/java/java-impl/src/com/intellij/spi/parsing/_SPILexer.flex b/java/java-impl/src/com/intellij/spi/parsing/_SPILexer.flex
index b49ef5dac14a..9a407038660d 100644
--- a/java/java-impl/src/com/intellij/spi/parsing/_SPILexer.flex
+++ b/java/java-impl/src/com/intellij/spi/parsing/_SPILexer.flex
@@ -45,23 +45,18 @@ import com.intellij.lexer.FlexLexer;
WHITE_SPACE_CHAR=[\ \n\r\t\f]
-IDENTIFIER=[:jletter:] [:jletterdigit:]*
+IDENTIFIER=(_|[:letter:]) (_|[:letter:]|[:digit:])*
END_OF_LINE_COMMENT="#"[^\r\n]*
-DIGIT = [0-9]
-DIGIT_OR_UNDERSCORE = [_0-9]
-DIGITS = {DIGIT} | {DIGIT} {DIGIT_OR_UNDERSCORE}*
-
%%
-<YYINITIAL> {WHITE_SPACE_CHAR}+ { return JavaTokenType.WHITE_SPACE; }
+<YYINITIAL> {WHITE_SPACE_CHAR}+ { return JavaTokenType.WHITE_SPACE; }
<YYINITIAL> {END_OF_LINE_COMMENT} { return JavaTokenType.END_OF_LINE_COMMENT; }
-<YYINITIAL> {IDENTIFIER} { return JavaTokenType.IDENTIFIER; }
-
-<YYINITIAL> "." { return JavaTokenType.DOT; }
+<YYINITIAL> "$" { return SPITokenType.DOLLAR; }
+<YYINITIAL> {IDENTIFIER} { return SPITokenType.IDENTIFIER; }
-<YYINITIAL> "$" { return SPITokenType.DOLLAR; }
+<YYINITIAL> "." { return JavaTokenType.DOT; }
-<YYINITIAL> . { return JavaTokenType.BAD_CHARACTER; }
+<YYINITIAL> . { return JavaTokenType.BAD_CHARACTER; }
diff --git a/java/java-impl/src/com/intellij/spi/parsing/_SPILexer.java b/java/java-impl/src/com/intellij/spi/parsing/_SPILexer.java
index f08e8b295d1e..c3942d7eede4 100644
--- a/java/java-impl/src/com/intellij/spi/parsing/_SPILexer.java
+++ b/java/java-impl/src/com/intellij/spi/parsing/_SPILexer.java
@@ -1,4 +1,4 @@
-/* The following code was generated by JFlex 1.4.3 on 6/5/13 9:20 PM */
+/* The following code was generated by JFlex 1.4.3 on 6/10/13 12:01 PM */
/*
* Copyright 2000-2013 JetBrains s.r.o.
@@ -27,7 +27,7 @@ import com.intellij.lexer.FlexLexer;
/**
* This class is a scanner generated by
* <a href="http://www.jflex.de/">JFlex</a> 1.4.3
- * on 6/5/13 9:20 PM from the specification file
+ * on 6/10/13 12:01 PM from the specification file
* <tt>D:/Projects/IDEA.anna/tools/lexer/../../community/java/java-impl/src/com/intellij/spi/parsing/_SPILexer.flex</tt>
*/
class _SPILexer implements FlexLexer {
@@ -51,90 +51,67 @@ class _SPILexer implements FlexLexer {
* Translates characters to character classes
*/
private static final String ZZ_CMAP_PACKED =
- "\11\3\1\1\1\5\1\0\1\1\1\5\16\3\4\0\1\1\2\0"+
- "\1\4\1\2\11\0\1\6\1\0\12\3\7\0\32\2\4\0\1\2"+
- "\1\0\32\2\4\0\41\3\2\0\4\2\4\0\1\2\2\0\1\3"+
- "\7\0\1\2\4\0\1\2\5\0\27\2\1\0\37\2\1\0\u013f\2"+
- "\31\0\162\2\4\0\14\2\16\0\5\2\11\0\1\2\21\0\130\3"+
- "\5\0\23\3\12\0\1\2\13\0\1\2\1\0\3\2\1\0\1\2"+
- "\1\0\24\2\1\0\54\2\1\0\46\2\1\0\5\2\4\0\202\2"+
- "\1\0\4\3\3\0\105\2\1\0\46\2\2\0\2\2\6\0\20\2"+
- "\41\0\46\2\2\0\1\2\7\0\47\2\11\0\21\3\1\0\27\3"+
- "\1\0\3\3\1\0\1\3\1\0\2\3\1\0\1\3\13\0\33\2"+
- "\5\0\3\2\15\0\4\3\14\0\6\3\13\0\32\2\5\0\13\2"+
- "\16\3\7\0\12\3\4\0\2\2\1\3\143\2\1\0\1\2\10\3"+
- "\1\0\6\3\2\2\2\3\1\0\4\3\2\2\12\3\3\2\2\0"+
- "\1\2\17\0\1\3\1\2\1\3\36\2\33\3\2\0\3\2\60\0"+
- "\46\2\13\3\1\2\u014f\0\3\3\66\2\2\0\1\3\1\2\20\3"+
- "\2\0\1\2\4\3\3\0\12\2\2\3\2\0\12\3\21\0\3\3"+
- "\1\0\10\2\2\0\2\2\2\0\26\2\1\0\7\2\1\0\1\2"+
- "\3\0\4\2\2\0\1\3\1\2\7\3\2\0\2\3\2\0\3\3"+
- "\11\0\1\3\4\0\2\2\1\0\3\2\2\3\2\0\12\3\4\2"+
- "\15\0\3\3\1\0\6\2\4\0\2\2\2\0\26\2\1\0\7\2"+
- "\1\0\2\2\1\0\2\2\1\0\2\2\2\0\1\3\1\0\5\3"+
- "\4\0\2\3\2\0\3\3\13\0\4\2\1\0\1\2\7\0\14\3"+
- "\3\2\14\0\3\3\1\0\11\2\1\0\3\2\1\0\26\2\1\0"+
- "\7\2\1\0\2\2\1\0\5\2\2\0\1\3\1\2\10\3\1\0"+
- "\3\3\1\0\3\3\2\0\1\2\17\0\2\2\2\3\2\0\12\3"+
- "\1\0\1\2\17\0\3\3\1\0\10\2\2\0\2\2\2\0\26\2"+
- "\1\0\7\2\1\0\2\2\1\0\5\2\2\0\1\3\1\2\6\3"+
- "\3\0\2\3\2\0\3\3\10\0\2\3\4\0\2\2\1\0\3\2"+
- "\4\0\12\3\1\0\1\2\20\0\1\3\1\2\1\0\6\2\3\0"+
- "\3\2\1\0\4\2\3\0\2\2\1\0\1\2\1\0\2\2\3\0"+
- "\2\2\3\0\3\2\3\0\10\2\1\0\3\2\4\0\5\3\3\0"+
- "\3\3\1\0\4\3\11\0\1\3\17\0\11\3\11\0\1\2\7\0"+
- "\3\3\1\0\10\2\1\0\3\2\1\0\27\2\1\0\12\2\1\0"+
- "\5\2\4\0\7\3\1\0\3\3\1\0\4\3\7\0\2\3\11\0"+
- "\2\2\4\0\12\3\22\0\2\3\1\0\10\2\1\0\3\2\1\0"+
- "\27\2\1\0\12\2\1\0\5\2\2\0\1\3\1\2\7\3\1\0"+
- "\3\3\1\0\4\3\7\0\2\3\7\0\1\2\1\0\2\2\4\0"+
- "\12\3\22\0\2\3\1\0\10\2\1\0\3\2\1\0\27\2\1\0"+
- "\20\2\4\0\6\3\2\0\3\3\1\0\4\3\11\0\1\3\10\0"+
- "\2\2\4\0\12\3\22\0\2\3\1\0\22\2\3\0\30\2\1\0"+
- "\11\2\1\0\1\2\2\0\7\2\3\0\1\3\4\0\6\3\1\0"+
- "\1\3\1\0\10\3\22\0\2\3\15\0\60\2\1\3\2\2\7\3"+
- "\4\0\10\2\10\3\1\0\12\3\47\0\2\2\1\0\1\2\2\0"+
- "\2\2\1\0\1\2\2\0\1\2\6\0\4\2\1\0\7\2\1\0"+
- "\3\2\1\0\1\2\1\0\1\2\2\0\2\2\1\0\4\2\1\3"+
- "\2\2\6\3\1\0\2\3\1\2\2\0\5\2\1\0\1\2\1\0"+
- "\6\3\2\0\12\3\2\0\2\2\42\0\1\2\27\0\2\3\6\0"+
- "\12\3\13\0\1\3\1\0\1\3\1\0\1\3\4\0\2\3\10\2"+
- "\1\0\42\2\6\0\24\3\1\0\2\3\4\2\4\0\10\3\1\0"+
- "\44\3\11\0\1\3\71\0\42\2\1\0\5\2\1\0\2\2\1\0"+
- "\7\3\3\0\4\3\6\0\12\3\6\0\6\2\4\3\106\0\46\2"+
- "\12\0\51\2\7\0\132\2\5\0\104\2\5\0\122\2\6\0\7\2"+
- "\1\0\77\2\1\0\1\2\1\0\4\2\2\0\7\2\1\0\1\2"+
- "\1\0\4\2\2\0\47\2\1\0\1\2\1\0\4\2\2\0\37\2"+
- "\1\0\1\2\1\0\4\2\2\0\7\2\1\0\1\2\1\0\4\2"+
- "\2\0\7\2\1\0\7\2\1\0\27\2\1\0\37\2\1\0\1\2"+
- "\1\0\4\2\2\0\7\2\1\0\47\2\1\0\23\2\16\0\11\3"+
- "\56\0\125\2\14\0\u026c\2\2\0\10\2\12\0\32\2\5\0\113\2"+
- "\3\0\3\2\17\0\15\2\1\0\4\2\3\3\13\0\22\2\3\3"+
- "\13\0\22\2\2\3\14\0\15\2\1\0\3\2\1\0\2\3\14\0"+
- "\64\2\40\3\3\0\1\2\3\0\2\2\1\3\2\0\12\3\41\0"+
- "\3\3\2\0\12\3\6\0\130\2\10\0\51\2\1\3\126\0\35\2"+
- "\3\0\14\3\4\0\14\3\12\0\12\3\36\2\2\0\5\2\u038b\0"+
+ "\11\0\1\1\1\5\1\0\1\1\1\5\22\0\1\1\2\0\1\4"+
+ "\1\6\11\0\1\7\1\0\12\3\7\0\32\2\4\0\1\2\1\0"+
+ "\32\2\57\0\1\2\12\0\1\2\4\0\1\2\5\0\27\2\1\0"+
+ "\37\2\1\0\u013f\2\31\0\162\2\4\0\14\2\16\0\5\2\11\0"+
+ "\1\2\213\0\1\2\13\0\1\2\1\0\3\2\1\0\1\2\1\0"+
+ "\24\2\1\0\54\2\1\0\46\2\1\0\5\2\4\0\202\2\10\0"+
+ "\105\2\1\0\46\2\2\0\2\2\6\0\20\2\41\0\46\2\2\0"+
+ "\1\2\7\0\47\2\110\0\33\2\5\0\3\2\56\0\32\2\5\0"+
+ "\13\2\25\0\12\3\4\0\2\2\1\0\143\2\1\0\1\2\17\0"+
+ "\2\2\7\0\2\2\12\3\3\2\2\0\1\2\20\0\1\2\1\0"+
+ "\36\2\35\0\3\2\60\0\46\2\13\0\1\2\u0152\0\66\2\3\0"+
+ "\1\2\22\0\1\2\7\0\12\2\4\0\12\3\25\0\10\2\2\0"+
+ "\2\2\2\0\26\2\1\0\7\2\1\0\1\2\3\0\4\2\3\0"+
+ "\1\2\36\0\2\2\1\0\3\2\4\0\12\3\2\2\23\0\6\2"+
+ "\4\0\2\2\2\0\26\2\1\0\7\2\1\0\2\2\1\0\2\2"+
+ "\1\0\2\2\37\0\4\2\1\0\1\2\7\0\12\3\2\0\3\2"+
+ "\20\0\11\2\1\0\3\2\1\0\26\2\1\0\7\2\1\0\2\2"+
+ "\1\0\5\2\3\0\1\2\22\0\1\2\17\0\2\2\4\0\12\3"+
+ "\25\0\10\2\2\0\2\2\2\0\26\2\1\0\7\2\1\0\2\2"+
+ "\1\0\5\2\3\0\1\2\36\0\2\2\1\0\3\2\4\0\12\3"+
+ "\1\0\1\2\21\0\1\2\1\0\6\2\3\0\3\2\1\0\4\2"+
+ "\3\0\2\2\1\0\1\2\1\0\2\2\3\0\2\2\3\0\3\2"+
+ "\3\0\10\2\1\0\3\2\55\0\11\3\25\0\10\2\1\0\3\2"+
+ "\1\0\27\2\1\0\12\2\1\0\5\2\46\0\2\2\4\0\12\3"+
+ "\25\0\10\2\1\0\3\2\1\0\27\2\1\0\12\2\1\0\5\2"+
+ "\3\0\1\2\40\0\1\2\1\0\2\2\4\0\12\3\25\0\10\2"+
+ "\1\0\3\2\1\0\27\2\1\0\20\2\46\0\2\2\4\0\12\3"+
+ "\25\0\22\2\3\0\30\2\1\0\11\2\1\0\1\2\2\0\7\2"+
+ "\72\0\60\2\1\0\2\2\14\0\7\2\11\0\12\3\47\0\2\2"+
+ "\1\0\1\2\2\0\2\2\1\0\1\2\2\0\1\2\6\0\4\2"+
+ "\1\0\7\2\1\0\3\2\1\0\1\2\1\0\1\2\2\0\2\2"+
+ "\1\0\4\2\1\0\2\2\11\0\1\2\2\0\5\2\1\0\1\2"+
+ "\11\0\12\3\2\0\2\2\42\0\1\2\37\0\12\3\26\0\10\2"+
+ "\1\0\42\2\35\0\4\2\164\0\42\2\1\0\5\2\1\0\2\2"+
+ "\25\0\12\3\6\0\6\2\112\0\46\2\12\0\51\2\7\0\132\2"+
+ "\5\0\104\2\5\0\122\2\6\0\7\2\1\0\77\2\1\0\1\2"+
+ "\1\0\4\2\2\0\7\2\1\0\1\2\1\0\4\2\2\0\47\2"+
+ "\1\0\1\2\1\0\4\2\2\0\37\2\1\0\1\2\1\0\4\2"+
+ "\2\0\7\2\1\0\1\2\1\0\4\2\2\0\7\2\1\0\7\2"+
+ "\1\0\27\2\1\0\37\2\1\0\1\2\1\0\4\2\2\0\7\2"+
+ "\1\0\47\2\1\0\23\2\16\0\11\3\56\0\125\2\14\0\u026c\2"+
+ "\2\0\10\2\12\0\32\2\5\0\113\2\25\0\15\2\1\0\4\2"+
+ "\16\0\22\2\16\0\22\2\16\0\15\2\1\0\3\2\17\0\64\2"+
+ "\43\0\1\2\4\0\1\2\3\0\12\3\46\0\12\3\6\0\130\2"+
+ "\10\0\51\2\127\0\35\2\51\0\12\3\36\2\2\0\5\2\u038b\0"+
"\154\2\224\0\234\2\4\0\132\2\6\0\26\2\2\0\6\2\2\0"+
"\46\2\2\0\6\2\2\0\10\2\1\0\1\2\1\0\1\2\1\0"+
"\1\2\1\0\37\2\2\0\65\2\1\0\7\2\1\0\1\2\3\0"+
"\3\2\1\0\7\2\3\0\4\2\2\0\6\2\4\0\15\2\5\0"+
- "\3\2\1\0\7\2\17\0\4\3\32\0\5\3\20\0\2\2\23\0"+
- "\1\2\13\0\4\3\6\0\6\3\1\0\1\2\15\0\1\2\40\0"+
- "\22\2\36\0\15\3\4\0\1\3\3\0\6\3\27\0\1\2\4\0"+
+ "\3\2\1\0\7\2\164\0\1\2\15\0\1\2\202\0\1\2\4\0"+
"\1\2\2\0\12\2\1\0\1\2\3\0\5\2\6\0\1\2\1\0"+
"\1\2\1\0\1\2\1\0\4\2\1\0\3\2\1\0\7\2\3\0"+
- "\3\2\5\0\5\2\26\0\44\2\u0e81\0\3\2\31\0\11\2\6\3"+
- "\1\0\5\2\2\0\5\2\4\0\126\2\2\0\2\3\2\0\3\2"+
- "\1\0\137\2\5\0\50\2\4\0\136\2\21\0\30\2\70\0\20\2"+
- "\u0200\0\u19b6\2\112\0\u51a6\2\132\0\u048d\2\u0773\0\u2ba4\2\u215c\0\u012e\2"+
- "\2\0\73\2\225\0\7\2\14\0\5\2\5\0\1\2\1\3\12\2"+
- "\1\0\15\2\1\0\5\2\1\0\1\2\1\0\2\2\1\0\2\2"+
- "\1\0\154\2\41\0\u016b\2\22\0\100\2\2\0\66\2\50\0\15\2"+
- "\3\0\20\3\20\0\4\3\17\0\2\2\30\0\3\2\31\0\1\2"+
- "\6\0\5\2\1\0\207\2\2\0\1\3\4\0\1\2\13\0\12\3"+
- "\7\0\32\2\4\0\1\2\1\0\32\2\12\0\132\2\3\0\6\2"+
- "\2\0\6\2\2\0\6\2\2\0\3\2\3\0\2\2\3\0\2\2"+
- "\22\0\3\3\4\0";
+ "\3\2\5\0\5\2\u0ebb\0\2\2\52\0\5\2\5\0\2\2\4\0"+
+ "\126\2\6\0\3\2\1\0\132\2\1\0\4\2\5\0\50\2\4\0"+
+ "\136\2\21\0\30\2\70\0\20\2\u0200\0\u19b6\2\112\0\u51a6\2\132\0"+
+ "\u048d\2\u0773\0\u2ba4\2\u215c\0\u012e\2\2\0\73\2\225\0\7\2\14\0"+
+ "\5\2\5\0\1\2\1\0\12\2\1\0\15\2\1\0\5\2\1\0"+
+ "\1\2\1\0\2\2\1\0\2\2\1\0\154\2\41\0\u016b\2\22\0"+
+ "\100\2\2\0\66\2\50\0\14\2\164\0\5\2\1\0\207\2\23\0"+
+ "\12\3\7\0\32\2\6\0\32\2\13\0\131\2\3\0\6\2\2\0"+
+ "\6\2\2\0\6\2\2\0\3\2\43\0";
/**
* Translates characters to character classes
@@ -147,10 +124,10 @@ class _SPILexer implements FlexLexer {
private static final int [] ZZ_ACTION = zzUnpackAction();
private static final String ZZ_ACTION_PACKED_0 =
- "\1\0\1\1\1\2\1\3\1\4\1\5";
+ "\1\0\1\1\1\2\1\3\1\4\1\5\1\6";
private static int [] zzUnpackAction() {
- int [] result = new int[6];
+ int [] result = new int[7];
int offset = 0;
offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result);
return result;
@@ -175,10 +152,10 @@ class _SPILexer implements FlexLexer {
private static final int [] ZZ_ROWMAP = zzUnpackRowMap();
private static final String ZZ_ROWMAP_PACKED_0 =
- "\0\0\0\7\0\16\0\25\0\34\0\7";
+ "\0\0\0\10\0\20\0\30\0\40\0\10\0\10";
private static int [] zzUnpackRowMap() {
- int [] result = new int[6];
+ int [] result = new int[7];
int offset = 0;
offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result);
return result;
@@ -201,12 +178,12 @@ class _SPILexer implements FlexLexer {
private static final int [] ZZ_TRANS = zzUnpackTrans();
private static final String ZZ_TRANS_PACKED_0 =
- "\1\2\1\3\1\4\1\2\1\5\1\3\1\6\10\0"+
- "\1\3\3\0\1\3\3\0\2\4\3\0\5\5\1\0"+
- "\1\5";
+ "\1\2\1\3\1\4\1\2\1\5\1\3\1\6\1\7"+
+ "\11\0\1\3\3\0\1\3\4\0\2\4\4\0\5\5"+
+ "\1\0\2\5";
private static int [] zzUnpackTrans() {
- int [] result = new int[35];
+ int [] result = new int[40];
int offset = 0;
offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result);
return result;
@@ -247,10 +224,10 @@ class _SPILexer implements FlexLexer {
private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute();
private static final String ZZ_ATTRIBUTE_PACKED_0 =
- "\1\0\1\11\3\1\1\11";
+ "\1\0\1\11\3\1\2\11";
private static int [] zzUnpackAttribute() {
- int [] result = new int[6];
+ int [] result = new int[7];
int offset = 0;
offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result);
return result;
@@ -344,7 +321,7 @@ class _SPILexer implements FlexLexer {
char [] map = new char[0x10000];
int i = 0; /* index in packed string */
int j = 0; /* index in unpacked array */
- while (i < 1666) {
+ while (i < 1212) {
int count = packed.charAt(i++);
char value = packed.charAt(i++);
do map[j++] = value; while (--count > 0);
@@ -569,23 +546,27 @@ class _SPILexer implements FlexLexer {
case 2:
{ return JavaTokenType.WHITE_SPACE;
}
- case 6: break;
- case 5:
- { return JavaTokenType.DOT;
- }
case 7: break;
case 3:
- { return JavaTokenType.IDENTIFIER;
+ { return SPITokenType.IDENTIFIER;
}
case 8: break;
+ case 6:
+ { return JavaTokenType.DOT;
+ }
+ case 9: break;
+ case 5:
+ { return SPITokenType.DOLLAR;
+ }
+ case 10: break;
case 4:
{ return JavaTokenType.END_OF_LINE_COMMENT;
}
- case 9: break;
+ case 11: break;
case 1:
{ return JavaTokenType.BAD_CHARACTER;
}
- case 10: break;
+ case 12: break;
default:
if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
zzAtEOF = true;
diff --git a/java/java-impl/src/com/intellij/spi/psi/SPIClassProviderReferenceElement.java b/java/java-impl/src/com/intellij/spi/psi/SPIClassProviderReferenceElement.java
new file mode 100644
index 000000000000..7d9fc0218be5
--- /dev/null
+++ b/java/java-impl/src/com/intellij/spi/psi/SPIClassProviderReferenceElement.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2000-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 com.intellij.spi.psi;
+
+import com.intellij.codeInsight.lookup.LookupElementBuilder;
+import com.intellij.lang.ASTNode;
+import com.intellij.psi.*;
+import com.intellij.psi.search.searches.ClassInheritorsSearch;
+import com.intellij.psi.util.ClassUtil;
+import com.intellij.util.ArrayUtil;
+import com.intellij.util.Processor;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * User: anna
+ */
+public class SPIClassProviderReferenceElement extends SPIPackageOrClassReferenceElement {
+ public SPIClassProviderReferenceElement(ASTNode node) {
+ super(node);
+ }
+
+ @NotNull
+ @Override
+ public Object[] getVariants() {
+ final String name = getContainingFile().getName();
+ final PsiClass superProvider = JavaPsiFacade.getInstance(getProject()).findClass(name, getResolveScope());
+ if (superProvider != null) {
+ final List<Object> result = new ArrayList<Object>();
+ ClassInheritorsSearch.search(superProvider).forEach(new Processor<PsiClass>() {
+ @Override
+ public boolean process(PsiClass psiClass) {
+ final String jvmClassName = ClassUtil.getJVMClassName(psiClass);
+ if (jvmClassName != null) {
+ result.add(LookupElementBuilder.create(psiClass, jvmClassName));
+ }
+ return false;
+ }
+ });
+ return ArrayUtil.toObjectArray(result);
+ }
+ return ArrayUtil.EMPTY_OBJECT_ARRAY;
+ }
+}
diff --git a/java/java-impl/src/com/intellij/spi/psi/SPIProvidersElementList.java b/java/java-impl/src/com/intellij/spi/psi/SPIClassProvidersElementList.java
index 75cc44cb700f..90a06015dbaf 100644
--- a/java/java-impl/src/com/intellij/spi/psi/SPIProvidersElementList.java
+++ b/java/java-impl/src/com/intellij/spi/psi/SPIClassProvidersElementList.java
@@ -17,7 +17,6 @@ package com.intellij.spi.psi;
import com.intellij.extapi.psi.ASTWrapperPsiElement;
import com.intellij.lang.ASTNode;
-import com.intellij.spi.parsing.SPIElementType;
import com.intellij.spi.parsing.SPIElementTypes;
import org.jetbrains.annotations.NotNull;
@@ -26,12 +25,12 @@ import java.util.List;
/**
* User: anna
*/
-public class SPIProvidersElementList extends ASTWrapperPsiElement {
- public SPIProvidersElementList(@NotNull ASTNode node) {
+public class SPIClassProvidersElementList extends ASTWrapperPsiElement {
+ public SPIClassProvidersElementList(@NotNull ASTNode node) {
super(node);
}
- public List<SPIProviderElement> getElements() {
+ public List<SPIClassProviderReferenceElement> getElements() {
return findChildrenByType(SPIElementTypes.PROVIDER);
}
}
diff --git a/java/java-impl/src/com/intellij/spi/psi/SPIFile.java b/java/java-impl/src/com/intellij/spi/psi/SPIFile.java
index 9f1e8106878a..a3858c50ccb3 100644
--- a/java/java-impl/src/com/intellij/spi/psi/SPIFile.java
+++ b/java/java-impl/src/com/intellij/spi/psi/SPIFile.java
@@ -29,6 +29,9 @@ import com.intellij.util.IncorrectOperationException;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
+import java.util.ArrayList;
+import java.util.List;
+
/**
* User: anna
*/
@@ -49,6 +52,35 @@ public class SPIFile extends PsiFileBase {
@NotNull
@Override
+ public PsiReference[] getReferences() {
+ final List<PsiReference> refs = new ArrayList<PsiReference>();
+ int idx = 0;
+ int d;
+ final String fileName = getName();
+ while ((d = fileName.indexOf(".", idx)) > -1) {
+ final PsiPackage aPackage = JavaPsiFacade.getInstance(getProject()).findPackage(fileName.substring(0, d));
+ if (aPackage != null) {
+ refs.add(new SPIFileName2PackageReference(this, aPackage));
+ }
+ idx = d + 1;
+ }
+ final PsiReference reference = getReference();
+ PsiElement resolve = reference.resolve();
+ while (resolve instanceof PsiClass) {
+ resolve = ((PsiClass)resolve).getContainingClass();
+ if (resolve != null) {
+ final String jvmClassName = ClassUtil.getJVMClassName((PsiClass)resolve);
+ if (jvmClassName != null) {
+ refs.add(new SPIFileName2PackageReference(this, resolve));
+ }
+ }
+ }
+ refs.add(reference);
+ return refs.toArray(new PsiReference[refs.size()]);
+ }
+
+ @NotNull
+ @Override
public FileType getFileType() {
return SPIFileType.INSTANCE;
}
@@ -69,10 +101,12 @@ public class SPIFile extends PsiFileBase {
@Override
public PsiElement handleElementRename(String newElementName) throws IncorrectOperationException {
- final String className = ClassUtil.getJVMClassName(myClass);
- if (className != null) {
- final String newFileName = className.substring(0, className.lastIndexOf(myClass.getName())) + newElementName;
- return getElement().setName(newFileName);
+ if (myClass != null) {
+ final String className = ClassUtil.getJVMClassName(myClass);
+ if (className != null) {
+ final String newFileName = className.substring(0, className.lastIndexOf(myClass.getName())) + newElementName;
+ return getElement().setName(newFileName);
+ }
}
return getElement();
}
@@ -94,4 +128,50 @@ public class SPIFile extends PsiFileBase {
return ArrayUtil.EMPTY_OBJECT_ARRAY;
}
}
+
+ private static class SPIFileName2PackageReference extends PsiReferenceBase<PsiFile> {
+ private final PsiElement myPackageOrContainingClass;
+
+ public SPIFileName2PackageReference(PsiFile file, @NotNull PsiElement psiPackage) {
+ super(file, new TextRange(0, 0), false);
+ myPackageOrContainingClass = psiPackage;
+ }
+
+ @NotNull
+ @Override
+ public String getCanonicalText() {
+ return myPackageOrContainingClass instanceof PsiPackage
+ ? ((PsiPackage)myPackageOrContainingClass).getQualifiedName() : ClassUtil.getJVMClassName((PsiClass)myPackageOrContainingClass);
+ }
+
+ @Nullable
+ @Override
+ public PsiElement resolve() {
+ return myPackageOrContainingClass;
+ }
+
+ @Override
+ public PsiElement handleElementRename(String newElementName) throws IncorrectOperationException {
+ return getElement().setName(newElementName + getElement().getName().substring(getCanonicalText().length()));
+ }
+
+ @Override
+ public PsiElement bindToElement(@NotNull PsiElement element) throws IncorrectOperationException {
+ if (element instanceof PsiPackage) {
+ return handleElementRename(((PsiPackage)element).getQualifiedName());
+ } else if (element instanceof PsiClass) {
+ final String className = ClassUtil.getJVMClassName((PsiClass)element);
+ if (className != null) {
+ return handleElementRename(className);
+ }
+ }
+ return getElement();
+ }
+
+ @NotNull
+ @Override
+ public Object[] getVariants() {
+ return ArrayUtil.EMPTY_OBJECT_ARRAY;
+ }
+ }
}
diff --git a/java/java-impl/src/com/intellij/spi/psi/SPIProviderElement.java b/java/java-impl/src/com/intellij/spi/psi/SPIPackageOrClassReferenceElement.java
index 17c47b0ffbcc..fa78a2ebc69c 100644
--- a/java/java-impl/src/com/intellij/spi/psi/SPIProviderElement.java
+++ b/java/java-impl/src/com/intellij/spi/psi/SPIPackageOrClassReferenceElement.java
@@ -19,9 +19,8 @@ import com.intellij.extapi.psi.ASTWrapperPsiElement;
import com.intellij.lang.ASTNode;
import com.intellij.openapi.util.TextRange;
import com.intellij.psi.*;
-import com.intellij.psi.infos.ClassCandidateInfo;
-import com.intellij.psi.scope.PsiScopeProcessor;
import com.intellij.psi.util.ClassUtil;
+import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.spi.SPIFileType;
import com.intellij.util.ArrayUtil;
import com.intellij.util.IncorrectOperationException;
@@ -31,49 +30,20 @@ import org.jetbrains.annotations.Nullable;
/**
* User: anna
*/
-public class SPIProviderElement extends ASTWrapperPsiElement implements PsiJavaReference {
- public SPIProviderElement(ASTNode node) {
+public class SPIPackageOrClassReferenceElement extends ASTWrapperPsiElement implements PsiReference {
+ public SPIPackageOrClassReferenceElement(@NotNull ASTNode node) {
super(node);
}
@Override
- public void processVariants(PsiScopeProcessor processor) {
- }
-
- @NotNull
- @Override
- public JavaResolveResult advancedResolve(boolean incompleteCode) {
- final PsiElement resolve = resolve();
- if (resolve instanceof PsiClass) {
- return new ClassCandidateInfo(resolve, PsiSubstitutor.EMPTY);
- }
- return JavaResolveResult.EMPTY;
- }
-
- @NotNull
- @Override
- public JavaResolveResult[] multiResolve(boolean incompleteCode) {
- final PsiElement resolve = resolve();
- if (resolve instanceof PsiClass) {
- return new JavaResolveResult[]{new ClassCandidateInfo(resolve, PsiSubstitutor.EMPTY)};
- }
- return JavaResolveResult.EMPTY_ARRAY;
- }
-
- @Override
public PsiElement getElement() {
return this;
}
@Override
public TextRange getRangeInElement() {
- return new TextRange(0, getTextLength());
- }
-
- @Nullable
- @Override
- public PsiElement resolve() {
- return ClassUtil.findPsiClass(getManager(), getText(), null, true, getResolveScope());
+ final PsiElement last = PsiTreeUtil.getDeepestLast(this);
+ return new TextRange(last.getStartOffsetInParent(), getTextLength());
}
@NotNull
@@ -84,35 +54,46 @@ public class SPIProviderElement extends ASTWrapperPsiElement implements PsiJavaR
@Override
public PsiElement handleElementRename(String newElementName) throws IncorrectOperationException {
- final SPIProvidersElementList firstChild =
- (SPIProvidersElementList)PsiFileFactory.getInstance(getProject())
+ final SPIClassProvidersElementList firstChild =
+ (SPIClassProvidersElementList)PsiFileFactory.getInstance(getProject())
.createFileFromText("spi_dummy", SPIFileType.INSTANCE, newElementName).getFirstChild();
return replace(firstChild.getElements().get(0));
}
+ @Nullable
+ @Override
+ public PsiElement resolve() {
+ PsiPackage aPackage = JavaPsiFacade.getInstance(getProject()).findPackage(getText());
+ if (aPackage != null) {
+ return aPackage;
+ }
+ return ClassUtil.findPsiClass(getManager(), getText(), null, true, getResolveScope());
+ }
+
@Override
public PsiElement bindToElement(@NotNull PsiElement element) throws IncorrectOperationException {
- if (element instanceof PsiClass) {
+ if (element instanceof PsiPackage) {
+ return handleElementRename(((PsiPackage)element).getQualifiedName());
+ } else if (element instanceof PsiClass) {
final String className = ClassUtil.getJVMClassName((PsiClass)element);
- if (className != null) {
- return handleElementRename(className);
- }
+ return className != null ? handleElementRename(className) : null;
}
return null;
}
@Override
public boolean isReferenceTo(PsiElement element) {
- if (element instanceof PsiClass) {
+ if (element instanceof PsiPackage) {
+ return getText().equals(((PsiPackage)element).getQualifiedName());
+ } else if (element instanceof PsiClass) {
return getText().equals(ClassUtil.getJVMClassName((PsiClass)element));
}
return false;
}
- @NotNull
@Override
- public Object[] getVariants() {
- return ArrayUtil.EMPTY_OBJECT_ARRAY;
+ public boolean isSoft() {
+ return false;
}
@Override
@@ -120,8 +101,9 @@ public class SPIProviderElement extends ASTWrapperPsiElement implements PsiJavaR
return this;
}
+ @NotNull
@Override
- public boolean isSoft() {
- return false;
+ public Object[] getVariants() {
+ return ArrayUtil.EMPTY_OBJECT_ARRAY;
}
}