diff options
author | Tor Norbye <tnorbye@google.com> | 2013-06-14 07:28:55 -0700 |
---|---|---|
committer | Tor Norbye <tnorbye@google.com> | 2013-06-14 07:28:55 -0700 |
commit | d9e4c285fa2c3c38c5b92cf30e77f27e243566a8 (patch) | |
tree | 354db2798801cc7730ba4a71ea9a151233309d3a /java/java-impl/src/com/intellij/spi | |
parent | 28d9ee094b1d352884aaf5b66b85b30335165c03 (diff) | |
download | idea-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')
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; } } |