summaryrefslogtreecommitdiff
path: root/java
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
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')
-rw-r--r--java/compiler/impl/src/com/intellij/compiler/impl/CompileDriver.java4
-rw-r--r--java/compiler/impl/src/com/intellij/compiler/server/BuildManager.java8
-rw-r--r--java/debugger/impl/src/com/intellij/debugger/DefaultDebugUIEnvironment.java2
-rw-r--r--java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/Breakpoint.java9
-rw-r--r--java/execution/impl/src/com/intellij/execution/actions/JavaRerunFailedTestsAction.java2
-rw-r--r--java/java-analysis-impl/src/com/intellij/codeInspection/RedundantLambdaCodeBlockInspection.java6
-rw-r--r--java/java-analysis-impl/src/com/intellij/codeInspection/nullable/NullableStuffInspectionBase.java2
-rw-r--r--java/java-impl/src/com/intellij/analysis/BaseClassesAnalysisAction.java2
-rw-r--r--java/java-impl/src/com/intellij/codeInsight/ExpectedTypeInfoImpl.java5
-rw-r--r--java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionSorting.java4
-rw-r--r--java/java-impl/src/com/intellij/codeInsight/completion/JavaMemberNameCompletionContributor.java5
-rw-r--r--java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/AnnotationsHighlightUtil.java24
-rw-r--r--java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java5
-rw-r--r--java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateFromUsageUtils.java7
-rw-r--r--java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/DelegateWithDefaultParamValueIntentionAction.java3
-rw-r--r--java/java-impl/src/com/intellij/codeInsight/intention/impl/TypeExpression.java6
-rw-r--r--java/java-impl/src/com/intellij/codeInsight/template/JavaCodeContextType.java9
-rw-r--r--java/java-impl/src/com/intellij/codeInsight/template/PsiTypeResult.java2
-rw-r--r--java/java-impl/src/com/intellij/codeInsight/template/macro/ClassNameMacro.java8
-rw-r--r--java/java-impl/src/com/intellij/codeInspection/deadCode/DeadHTMLComposer.java5
-rw-r--r--java/java-impl/src/com/intellij/codeInspection/deadCode/RefUnreachableFilter.java1
-rw-r--r--java/java-impl/src/com/intellij/codeInspection/deadCode/UnusedDeclarationInspection.java2
-rw-r--r--java/java-impl/src/com/intellij/codeInspection/inferNullity/InferNullityAnnotationsAction.java2
-rw-r--r--java/java-impl/src/com/intellij/codeInspection/unusedParameters/UnusedParametersInspection.java6
-rw-r--r--java/java-impl/src/com/intellij/externalSystem/JavaProjectData.java9
-rw-r--r--java/java-impl/src/com/intellij/javadoc/actions/GenerateJavadocAction.java2
-rw-r--r--java/java-impl/src/com/intellij/lang/java/JavaFindUsagesProvider.java3
-rw-r--r--java/java-impl/src/com/intellij/psi/AbstractQualifiedReference.java6
-rw-r--r--java/java-impl/src/com/intellij/psi/impl/source/codeStyle/JavaCodeStyleManagerImpl.java28
-rw-r--r--java/java-impl/src/com/intellij/psi/impl/source/codeStyle/JavaReferenceAdjuster.java (renamed from java/java-impl/src/com/intellij/psi/impl/source/codeStyle/ReferenceAdjuster.java)84
-rw-r--r--java/java-impl/src/com/intellij/psi/impl/source/resolve/reference/impl/JavaLangClassMemberReference.java2
-rw-r--r--java/java-impl/src/com/intellij/psi/impl/source/tree/injected/JavaConcatenationInjectorManager.java44
-rw-r--r--java/java-impl/src/com/intellij/refactoring/move/moveFilesOrDirectories/JavaMoveFilesOrDirectoriesHandler.java24
-rw-r--r--java/java-impl/src/com/intellij/refactoring/rename/RenameJavaMethodProcessor.java4
-rw-r--r--java/java-impl/src/com/intellij/refactoring/safeDelete/JavaSafeDeleteProcessor.java4
-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
-rw-r--r--java/java-indexing-impl/src/com/intellij/psi/impl/file/impl/JavaFileManagerBase.java2
-rw-r--r--java/java-indexing-impl/src/com/intellij/psi/impl/java/stubs/index/JavaShortClassNameIndex.java3
-rw-r--r--java/java-indexing-impl/src/com/intellij/psi/impl/search/SPIReferencesSearcher.java80
-rw-r--r--java/java-psi-api/src/com/intellij/psi/codeStyle/ReferenceAdjuster.java44
-rw-r--r--java/java-psi-api/src/com/intellij/psi/util/PsiUtil.java9
-rw-r--r--java/java-psi-impl/src/com/intellij/core/JavaCoreApplicationEnvironment.java3
-rw-r--r--java/java-psi-impl/src/com/intellij/psi/impl/PsiClassImplUtil.java18
-rw-r--r--java/java-psi-impl/src/com/intellij/psi/impl/PsiSubstitutorImpl.java14
-rw-r--r--java/java-psi-impl/src/com/intellij/psi/impl/source/PsiClassReferenceType.java3
-rw-r--r--java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiReferenceExpressionImpl.java14
-rw-r--r--java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/ReferenceMemberBeforeCtrCalled.java30
-rw-r--r--java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting6/ClassObjectAccessibility.java8
-rw-r--r--java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lambdaCodeBlock2Expr/afterComparable.java2
-rw-r--r--java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lambdaCodeBlock2Expr/afterVoid.java2
-rw-r--r--java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lambdaCodeBlock2Expr/afterVoidInCodeblock.java2
-rw-r--r--java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lambdaCodeBlock2Expr/beforeComparable.java2
-rw-r--r--java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lambdaCodeBlock2Expr/beforeReturnTypeInExpressionStatement.java2
-rw-r--r--java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lambdaCodeBlock2Expr/beforeVoid.java2
-rw-r--r--java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lambdaCodeBlock2Expr/beforeVoidInCodeblock.java2
-rw-r--r--java/java-tests/testData/spi/renameProviderImplementation/after/META-INF/services/java.lang.Runnable1
-rw-r--r--java/java-tests/testData/spi/renameProviderImplementation/after/foo/Test1.java5
-rw-r--r--java/java-tests/testData/spi/renameProviderImplementation/before/META-INF/services/java.lang.Runnable1
-rw-r--r--java/java-tests/testData/spi/renameProviderImplementation/before/foo/Test.java5
-rw-r--r--java/java-tests/testData/spi/renameProviderImplementationContainingClass/after/META-INF/services/java.lang.Runnable1
-rw-r--r--java/java-tests/testData/spi/renameProviderImplementationContainingClass/after/foo/Test1.java7
-rw-r--r--java/java-tests/testData/spi/renameProviderImplementationContainingClass/before/META-INF/services/java.lang.Runnable1
-rw-r--r--java/java-tests/testData/spi/renameProviderImplementationContainingClass/before/foo/Test.java7
-rw-r--r--java/java-tests/testSrc/com/intellij/codeInsight/daemon/AmbiguousMethodCallTest.java9
-rw-r--r--java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightAdvHighlightingJdk6Test.java1
-rw-r--r--java/java-tests/testSrc/com/intellij/codeInsight/daemon/quickFix/CreateConstantFieldFromUsageTest.groovy58
-rw-r--r--java/java-tests/testSrc/com/intellij/codeInsight/template/LiveTemplateTest.groovy54
-rw-r--r--java/java-tests/testSrc/com/intellij/ide/fileStructure/JavaFileStructureFilteringTest.java6
-rw-r--r--java/java-tests/testSrc/com/intellij/index/IndexTest.java216
-rw-r--r--java/java-tests/testSrc/com/intellij/index/StringIndex.java82
-rw-r--r--java/java-tests/testSrc/com/intellij/lang/spi/SPIRenameTest.java60
81 files changed, 1178 insertions, 386 deletions
diff --git a/java/compiler/impl/src/com/intellij/compiler/impl/CompileDriver.java b/java/compiler/impl/src/com/intellij/compiler/impl/CompileDriver.java
index 12d4f5b84b6d..be2b1d247966 100644
--- a/java/compiler/impl/src/com/intellij/compiler/impl/CompileDriver.java
+++ b/java/compiler/impl/src/com/intellij/compiler/impl/CompileDriver.java
@@ -64,6 +64,7 @@ import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.util.*;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.registry.Registry;
+import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.*;
import com.intellij.openapi.vfs.newvfs.ManagingFS;
import com.intellij.openapi.vfs.newvfs.RefreshQueue;
@@ -99,7 +100,6 @@ import org.jetbrains.annotations.TestOnly;
import org.jetbrains.jps.api.CmdlineProtoUtil;
import org.jetbrains.jps.api.CmdlineRemoteProto;
import org.jetbrains.jps.api.RequestFuture;
-import org.jetbrains.jps.incremental.Utils;
import javax.swing.*;
import java.io.*;
@@ -951,7 +951,7 @@ public class CompileDriver {
else {
message = CompilerBundle.message("status.compilation.completed.successfully.with.warnings.and.errors", errorCount, warningCount);
}
- message = message + " in " + Utils.formatDuration(duration);
+ message = message + " in " + StringUtil.formatDuration(duration);
}
return message;
}
diff --git a/java/compiler/impl/src/com/intellij/compiler/server/BuildManager.java b/java/compiler/impl/src/com/intellij/compiler/server/BuildManager.java
index 9139b750c25b..a9ad726ab623 100644
--- a/java/compiler/impl/src/com/intellij/compiler/server/BuildManager.java
+++ b/java/compiler/impl/src/com/intellij/compiler/server/BuildManager.java
@@ -92,10 +92,7 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.annotations.TestOnly;
import org.jetbrains.ide.PooledThreadExecutor;
-import org.jetbrains.jps.api.CmdlineProtoUtil;
-import org.jetbrains.jps.api.CmdlineRemoteProto;
-import org.jetbrains.jps.api.GlobalOptions;
-import org.jetbrains.jps.api.RequestFuture;
+import org.jetbrains.jps.api.*;
import org.jetbrains.jps.cmdline.BuildMain;
import org.jetbrains.jps.cmdline.ClasspathBootstrap;
import org.jetbrains.jps.incremental.Utils;
@@ -121,6 +118,7 @@ import static org.jetbrains.jps.api.CmdlineRemoteProto.Message.ControllerMessage
*/
public class BuildManager implements ApplicationComponent{
public static final Key<Boolean> ALLOW_AUTOMAKE = Key.create("_allow_automake_when_process_is_active_");
+ private static final Key<String> FORCE_MODEL_LOADING_PARAMETER = Key.create(BuildParametersKeys.FORCE_MODEL_LOADING);
private static final Logger LOG = Logger.getInstance("#com.intellij.compiler.server.BuildManager");
private static final String COMPILER_PROCESS_JDK_PROPERTY = "compiler.process.jdk";
@@ -365,7 +363,7 @@ public class BuildManager implements ApplicationComponent{
}
public static void forceModelLoading(CompileContext context) {
- context.getCompileScope().putUserData(BuildMain.FORCE_MODEL_LOADING_PARAMETER, Boolean.TRUE.toString());
+ context.getCompileScope().putUserData(FORCE_MODEL_LOADING_PARAMETER, Boolean.TRUE.toString());
}
public void clearState(Project project) {
diff --git a/java/debugger/impl/src/com/intellij/debugger/DefaultDebugUIEnvironment.java b/java/debugger/impl/src/com/intellij/debugger/DefaultDebugUIEnvironment.java
index 5c1b585391d4..bc7915f62a47 100644
--- a/java/debugger/impl/src/com/intellij/debugger/DefaultDebugUIEnvironment.java
+++ b/java/debugger/impl/src/com/intellij/debugger/DefaultDebugUIEnvironment.java
@@ -114,10 +114,8 @@ public class DefaultDebugUIEnvironment implements DebugUIEnvironment {
@Override
public void initActions(RunContentDescriptor content, DefaultActionGroup actionGroup) {
- ProcessHandler processHandler = content.getProcessHandler();
RestartAction restartAction = new RestartAction(myExecutor,
myRunner,
- processHandler,
content,
myExecutionEnvironment);
actionGroup.add(restartAction, Constraints.FIRST);
diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/Breakpoint.java b/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/Breakpoint.java
index 3d694e1dd28f..807261476fe4 100644
--- a/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/Breakpoint.java
+++ b/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/Breakpoint.java
@@ -34,8 +34,8 @@ import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.*;
import com.intellij.psi.PsiClass;
+import com.intellij.ui.AppUIUtil;
import com.intellij.util.StringBuilderSpinAllocator;
-import com.intellij.xdebugger.impl.ui.DebuggerUIUtil;
import com.sun.jdi.ObjectReference;
import com.sun.jdi.ReferenceType;
import com.sun.jdi.Value;
@@ -79,6 +79,7 @@ public abstract class Breakpoint extends FilteredRequestor implements ClassPrepa
* Request for creating all needed JPDA requests in the specified VM
* @param debuggerProcess the requesting process
*/
+ @Override
public abstract void processClassPrepare(DebugProcess debuggerProcess, final ReferenceType referenceType);
public abstract String getDisplayName ();
@@ -164,6 +165,7 @@ public abstract class Breakpoint extends FilteredRequestor implements ClassPrepa
return null;
}
+ @Override
public boolean processLocatableEvent(final SuspendContextCommandImpl action, final LocatableEvent event) throws EventProcessingException {
final SuspendContextImpl context = action.getSuspendContext();
if(!isValid()) {
@@ -222,6 +224,7 @@ public abstract class Breakpoint extends FilteredRequestor implements ClassPrepa
try {
ExpressionEvaluator evaluator = DebuggerInvocationUtil.commitAndRunReadAction(getProject(), new EvaluatingComputable<ExpressionEvaluator>() {
+ @Override
public ExpressionEvaluator compute() throws EvaluateException {
return EvaluatorBuilderImpl.build(expressionToEvaluate, ContextUtil.getContextElement(context), ContextUtil.getSourcePosition(context));
}
@@ -266,7 +269,7 @@ public abstract class Breakpoint extends FilteredRequestor implements ClassPrepa
}
private void removeBreakpoint() {
- DebuggerUIUtil.invokeOnEventDispatch(new Runnable() {
+ AppUIUtil.invokeOnEdt(new Runnable() {
@Override
public void run() {
DebuggerManagerEx.getInstanceEx(myProject).getBreakpointManager().removeBreakpoint(Breakpoint.this);
@@ -288,6 +291,7 @@ public abstract class Breakpoint extends FilteredRequestor implements ClassPrepa
RequestManagerImpl.deleteRequests(this);
}
+ @Override
public void readExternal(Element parentNode) throws InvalidDataException {
super.readExternal(parentNode);
String logMessage = JDOMExternalizerUtil.readField(parentNode, LOG_MESSAGE_OPTION_NAME);
@@ -296,6 +300,7 @@ public abstract class Breakpoint extends FilteredRequestor implements ClassPrepa
}
}
+ @Override
public void writeExternal(Element parentNode) throws WriteExternalException {
super.writeExternal(parentNode);
JDOMExternalizerUtil.writeField(parentNode, LOG_MESSAGE_OPTION_NAME, getLogMessage().toExternalForm());
diff --git a/java/execution/impl/src/com/intellij/execution/actions/JavaRerunFailedTestsAction.java b/java/execution/impl/src/com/intellij/execution/actions/JavaRerunFailedTestsAction.java
index 7bf07bf64518..76e7175b87ff 100644
--- a/java/execution/impl/src/com/intellij/execution/actions/JavaRerunFailedTestsAction.java
+++ b/java/execution/impl/src/com/intellij/execution/actions/JavaRerunFailedTestsAction.java
@@ -37,7 +37,7 @@ public class JavaRerunFailedTestsAction extends AbstractRerunFailedTestsAction {
@NotNull
@Override
protected Filter getFilter(Project project, GlobalSearchScope searchScope) {
- return Filter.FAILED_OR_INTERRUPTED.and(JavaAwareFilter.METHOD(project, searchScope));
+ return super.getFilter(project, searchScope).and(JavaAwareFilter.METHOD(project, searchScope));
}
}
diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/RedundantLambdaCodeBlockInspection.java b/java/java-analysis-impl/src/com/intellij/codeInspection/RedundantLambdaCodeBlockInspection.java
index fdb547cb62e4..4e7ccccfd590 100644
--- a/java/java-analysis-impl/src/com/intellij/codeInspection/RedundantLambdaCodeBlockInspection.java
+++ b/java/java-analysis-impl/src/com/intellij/codeInspection/RedundantLambdaCodeBlockInspection.java
@@ -42,7 +42,7 @@ public class RedundantLambdaCodeBlockInspection extends BaseJavaBatchLocalInspec
@NotNull
@Override
public String getDisplayName() {
- return "Lambda code block can be replaced with expression";
+ return "Statement lambda can be replaced with expression lambda";
}
@Override
@@ -74,7 +74,7 @@ public class RedundantLambdaCodeBlockInspection extends BaseJavaBatchLocalInspec
} else {
errorElement = body.getFirstChild();
}
- holder.registerProblem(errorElement, "Lambda code block can be replaced with one line expression",
+ holder.registerProblem(errorElement, "Statement lambda can be replaced with expression lambda",
ProblemHighlightType.LIKE_UNUSED_SYMBOL, new ReplaceWithExprFix());
}
}
@@ -111,7 +111,7 @@ public class RedundantLambdaCodeBlockInspection extends BaseJavaBatchLocalInspec
@NotNull
@Override
public String getName() {
- return "Replace with one line expression";
+ return "Replace with expression lambda";
}
@NotNull
diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/nullable/NullableStuffInspectionBase.java b/java/java-analysis-impl/src/com/intellij/codeInspection/nullable/NullableStuffInspectionBase.java
index 8014acd5b5de..c9143fbb4777 100644
--- a/java/java-analysis-impl/src/com/intellij/codeInspection/nullable/NullableStuffInspectionBase.java
+++ b/java/java-analysis-impl/src/com/intellij/codeInspection/nullable/NullableStuffInspectionBase.java
@@ -118,7 +118,7 @@ public class NullableStuffInspectionBase extends BaseJavaBatchLocalInspectionToo
final PsiClass containingClass = field.getContainingClass();
final PsiMethod setter = PropertyUtil.findPropertySetter(containingClass, propName, isStatic, false);
- if (setter != null) {
+ if (setter != null && setter.isPhysical()) {
final PsiParameter[] parameters = setter.getParameterList().getParameters();
assert parameters.length == 1 : setter.getText();
final PsiParameter parameter = parameters[0];
diff --git a/java/java-impl/src/com/intellij/analysis/BaseClassesAnalysisAction.java b/java/java-impl/src/com/intellij/analysis/BaseClassesAnalysisAction.java
index 7bd5feb01cef..9d13990e61a3 100644
--- a/java/java-impl/src/com/intellij/analysis/BaseClassesAnalysisAction.java
+++ b/java/java-impl/src/com/intellij/analysis/BaseClassesAnalysisAction.java
@@ -39,7 +39,7 @@ public abstract class BaseClassesAnalysisAction extends BaseAnalysisAction {
protected abstract void analyzeClasses(final Project project, final AnalysisScope scope, ProgressIndicator indicator);
@Override
- protected void analyze(@NotNull final Project project, final AnalysisScope scope) {
+ protected void analyze(@NotNull final Project project, @NotNull final AnalysisScope scope) {
FileDocumentManager.getInstance().saveAllDocuments();
ProgressManager.getInstance().run(new Task.Backgroundable(project, AnalysisScopeBundle.message("analyzing.project"), true) {
diff --git a/java/java-impl/src/com/intellij/codeInsight/ExpectedTypeInfoImpl.java b/java/java-impl/src/com/intellij/codeInsight/ExpectedTypeInfoImpl.java
index 63d7a8932ef1..0751887a2409 100644
--- a/java/java-impl/src/com/intellij/codeInsight/ExpectedTypeInfoImpl.java
+++ b/java/java-impl/src/com/intellij/codeInsight/ExpectedTypeInfoImpl.java
@@ -19,6 +19,7 @@ package com.intellij.codeInsight;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.util.NullableComputable;
import com.intellij.psi.*;
+import com.intellij.psi.util.PsiUtil;
import org.jetbrains.annotations.NotNull;
public class ExpectedTypeInfoImpl implements ExpectedTypeInfo {
@@ -83,8 +84,8 @@ public class ExpectedTypeInfoImpl implements ExpectedTypeInfo {
this.defaultType = defaultType;
- assert type.isValid();
- assert defaultType.isValid();
+ PsiUtil.ensureValidType(type);
+ PsiUtil.ensureValidType(defaultType);
}
@Override
diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionSorting.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionSorting.java
index 853debf37051..ee6de0545115 100644
--- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionSorting.java
+++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionSorting.java
@@ -144,8 +144,8 @@ public class JavaCompletionSorting {
PsiType itemType = JavaCompletionUtil.getLookupElementType(item);
if (itemType != null) {
- assert itemType.isValid() : item + "; " + item.getClass();
-
+ PsiUtil.ensureValidType(itemType);
+
for (final ExpectedTypeInfo expectedInfo : expectedInfos) {
final PsiType defaultType = expectedInfo.getDefaultType();
final PsiType expectedType = expectedInfo.getType();
diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaMemberNameCompletionContributor.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaMemberNameCompletionContributor.java
index 1026f48f432f..b2896f336a9a 100644
--- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaMemberNameCompletionContributor.java
+++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaMemberNameCompletionContributor.java
@@ -30,6 +30,7 @@ import com.intellij.psi.codeStyle.VariableKind;
import com.intellij.psi.util.PropertyUtil;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.PsiUtil;
+import com.intellij.psi.util.PsiUtilCore;
import com.intellij.refactoring.introduceField.InplaceIntroduceFieldPopup;
import com.intellij.refactoring.introduceVariable.IntroduceVariableBase;
import com.intellij.util.ArrayUtil;
@@ -373,9 +374,9 @@ public class JavaMemberNameCompletionContributor extends CompletionContributor {
for (final PsiField field : psiClass.getFields()) {
if (field == element) continue;
- assert field.isValid() : "invalid field: " + field;
+ PsiUtilCore.ensureValid(field);
PsiType fieldType = field.getType();
- assert fieldType.isValid() : "invalid field type: " + field + "; " + fieldType + " of " + fieldType.getClass();
+ PsiUtil.ensureValidType(fieldType);
final PsiModifierList modifierList = field.getModifierList();
if (staticContext && (modifierList != null && !modifierList.hasModifierProperty(PsiModifier.STATIC))) continue;
diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/AnnotationsHighlightUtil.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/AnnotationsHighlightUtil.java
index 6849d7469525..b1cbfe05c3b2 100644
--- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/AnnotationsHighlightUtil.java
+++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/AnnotationsHighlightUtil.java
@@ -413,18 +413,32 @@ public class AnnotationsHighlightUtil {
}
@Override
+ public void visitClassObjectAccessExpression(PsiClassObjectAccessExpression expression) {
+ super.visitClassObjectAccessExpression(expression);
+ final PsiTypeElement operand = expression.getOperand();
+ final PsiClass classType = PsiUtil.resolveClassInType(operand.getType());
+ if (classType != null) {
+ checkAccessibility(expression, classType, HighlightUtil.formatClass(classType));
+ }
+ }
+
+ @Override
public void visitReferenceExpression(PsiReferenceExpression expression) {
super.visitReferenceExpression(expression);
final PsiElement resolve = expression.resolve();
- if (resolve instanceof PsiField &&
- ((PsiMember)resolve).hasModifierProperty(PsiModifier.PRIVATE) &&
+ if (resolve instanceof PsiField) {
+ checkAccessibility(expression, (PsiMember)resolve, HighlightUtil.formatField((PsiField)resolve));
+ }
+ }
+
+ private void checkAccessibility(PsiExpression expression, PsiMember resolve, String memberString) {
+ if (resolve.hasModifierProperty(PsiModifier.PRIVATE) &&
PsiTreeUtil.isAncestor(parent, resolve, true)) {
String description = JavaErrorMessages.message("private.symbol",
- HighlightUtil.formatField((PsiField)resolve),
+ memberString,
HighlightUtil.formatClass((PsiClass)parent));
- HighlightInfo result =
+ infos[0] =
HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(expression).descriptionAndTooltip(description).create();
- infos[0] = result;
}
}
});
diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java
index 5354932c4201..55055c93b83c 100644
--- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java
+++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java
@@ -1936,6 +1936,11 @@ public class HighlightUtil extends HighlightUtilBase {
!thisOrSuperReference(((PsiReferenceExpression)expression).getQualifierExpression(), aClass)) {
return null;
}
+
+ if (expression instanceof PsiJavaCodeReferenceElement && !aClass.equals(PsiTreeUtil.getParentOfType(expression, PsiClass.class))) {
+ return null;
+ }
+
final HighlightInfo highlightInfo = createMemberReferencedError(resolvedName, expression.getTextRange());
if (expression instanceof PsiReferenceExpression && PsiUtil.isInnerClass(aClass)) {
final String referenceName = ((PsiReferenceExpression)expression).getReferenceName();
diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateFromUsageUtils.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateFromUsageUtils.java
index 128f2781c28c..ad63c638f5d0 100644
--- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateFromUsageUtils.java
+++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateFromUsageUtils.java
@@ -793,10 +793,13 @@ public class CreateFromUsageUtils {
WeighingComparable<PsiElement,ProximityLocation> proximity1 = PsiProximityComparator.getProximity(m1, expression);
WeighingComparable<PsiElement,ProximityLocation> proximity2 = PsiProximityComparator.getProximity(m2, expression);
if (proximity1 != null && proximity2 != null) {
- return proximity2.compareTo(proximity1);
+ result = proximity2.compareTo(proximity1);
+ if (result != 0) return result;
}
- return 0;
+ String name1 = StaticImportMethodFix.getMemberQualifiedName(m1);
+ String name2 = StaticImportMethodFix.getMemberQualifiedName(m2);
+ return name1 == null || name2 == null ? 0 : name1.compareTo(name2);
}
});
diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/DelegateWithDefaultParamValueIntentionAction.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/DelegateWithDefaultParamValueIntentionAction.java
index 12507bdfe4fa..856ffee4ef5d 100644
--- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/DelegateWithDefaultParamValueIntentionAction.java
+++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/DelegateWithDefaultParamValueIntentionAction.java
@@ -15,6 +15,7 @@
*/
package com.intellij.codeInsight.daemon.impl.quickfix;
+import com.intellij.codeInsight.FileModificationService;
import com.intellij.codeInsight.hint.HintManager;
import com.intellij.codeInsight.intention.LowPriorityAction;
import com.intellij.codeInsight.intention.PsiElementBaseIntentionAction;
@@ -101,6 +102,8 @@ public class DelegateWithDefaultParamValueIntentionAction extends PsiElementBase
return;
}
+ if (!FileModificationService.getInstance().preparePsiElementForWrite(element)) return;
+
Runnable runnable = new Runnable() {
@Override
public void run() {
diff --git a/java/java-impl/src/com/intellij/codeInsight/intention/impl/TypeExpression.java b/java/java-impl/src/com/intellij/codeInsight/intention/impl/TypeExpression.java
index a292fe657714..32d3e0548cba 100644
--- a/java/java-impl/src/com/intellij/codeInsight/intention/impl/TypeExpression.java
+++ b/java/java-impl/src/com/intellij/codeInsight/intention/impl/TypeExpression.java
@@ -60,7 +60,7 @@ public class TypeExpression extends Expression {
@Override
public String toString() {
- return myItems.size() == 1 ? type.getCanonicalText() : super.toString();
+ return myItems.size() == 1 ? super.toString() : type.getPresentableText();
}
};
}
@@ -85,8 +85,4 @@ public class TypeExpression extends Expression {
return result.toArray(new LookupElement[result.size()]);
}
- public boolean hasSuggestions() {
- return myItems.size() > 1;
- }
-
}
diff --git a/java/java-impl/src/com/intellij/codeInsight/template/JavaCodeContextType.java b/java/java-impl/src/com/intellij/codeInsight/template/JavaCodeContextType.java
index 42e990f3aee0..cb1c0b9a3393 100644
--- a/java/java-impl/src/com/intellij/codeInsight/template/JavaCodeContextType.java
+++ b/java/java-impl/src/com/intellij/codeInsight/template/JavaCodeContextType.java
@@ -99,7 +99,14 @@ public abstract class JavaCodeContextType extends TemplateContextType {
return false;
}
- PsiStatement statement = PsiTreeUtil.getParentOfType(element, PsiStatement.class);
+ PsiElement statement = PsiTreeUtil.getParentOfType(element, PsiStatement.class, PsiLambdaExpression.class);
+ if (statement instanceof PsiLambdaExpression) {
+ PsiElement body = ((PsiLambdaExpression)statement).getBody();
+ if (body != null && PsiTreeUtil.isAncestor(body, element, false)) {
+ statement = body;
+ }
+ }
+
return statement != null && statement.getTextRange().getStartOffset() == element.getTextRange().getStartOffset();
}
}
diff --git a/java/java-impl/src/com/intellij/codeInsight/template/PsiTypeResult.java b/java/java-impl/src/com/intellij/codeInsight/template/PsiTypeResult.java
index 6892437177af..3a3f750131b2 100644
--- a/java/java-impl/src/com/intellij/codeInsight/template/PsiTypeResult.java
+++ b/java/java-impl/src/com/intellij/codeInsight/template/PsiTypeResult.java
@@ -57,7 +57,7 @@ public class PsiTypeResult implements RecalculatableResult {
}
public String toString() {
- return getType().getPresentableText();
+ return getType().getCanonicalText();
}
@Override
diff --git a/java/java-impl/src/com/intellij/codeInsight/template/macro/ClassNameMacro.java b/java/java-impl/src/com/intellij/codeInsight/template/macro/ClassNameMacro.java
index 6d786e2932c7..2d0d69e7be6a 100644
--- a/java/java-impl/src/com/intellij/codeInsight/template/macro/ClassNameMacro.java
+++ b/java/java-impl/src/com/intellij/codeInsight/template/macro/ClassNameMacro.java
@@ -58,12 +58,8 @@ public class ClassNameMacro extends Macro {
}
if (aClass == null) return null;
- String result = aClass.getName();
- while (aClass.getContainingClass() != null && aClass.getContainingClass().getName() != null) {
- result = aClass.getContainingClass().getName() + "$" + result;
- aClass = aClass.getContainingClass();
- }
- return new TextResult(result);
+ String qname = aClass.getQualifiedName();
+ return qname == null ? null : new TextResult(qname);
}
@Override
diff --git a/java/java-impl/src/com/intellij/codeInspection/deadCode/DeadHTMLComposer.java b/java/java-impl/src/com/intellij/codeInspection/deadCode/DeadHTMLComposer.java
index e75d1b142069..ead1b1fa8860 100644
--- a/java/java-impl/src/com/intellij/codeInspection/deadCode/DeadHTMLComposer.java
+++ b/java/java-impl/src/com/intellij/codeInspection/deadCode/DeadHTMLComposer.java
@@ -43,8 +43,7 @@ public class DeadHTMLComposer extends HTMLComposerImpl {
private final InspectionTool myTool;
private final HTMLJavaHTMLComposer myComposer;
- public DeadHTMLComposer(InspectionTool tool) {
- super();
+ public DeadHTMLComposer(@NotNull InspectionTool tool) {
myTool = tool;
myComposer = getExtension(HTMLJavaHTMLComposer.COMPOSER);
}
@@ -340,7 +339,7 @@ public class DeadHTMLComposer extends HTMLComposerImpl {
private void appendCallesList(RefElement element, StringBuffer buf, Set<RefElement> mentionedElements, boolean appendCallees){
final Set<RefElement> possibleChildren = getPossibleChildren(new RefElementNode(element, myTool), element);
- if (possibleChildren.size() > 0) {
+ if (!possibleChildren.isEmpty()) {
if (appendCallees){
appendHeading(buf, InspectionsBundle.message("inspection.export.results.callees"));
}
diff --git a/java/java-impl/src/com/intellij/codeInspection/deadCode/RefUnreachableFilter.java b/java/java-impl/src/com/intellij/codeInspection/deadCode/RefUnreachableFilter.java
index 650e7c527edf..5984cf16b71a 100644
--- a/java/java-impl/src/com/intellij/codeInspection/deadCode/RefUnreachableFilter.java
+++ b/java/java-impl/src/com/intellij/codeInspection/deadCode/RefUnreachableFilter.java
@@ -30,6 +30,7 @@ import com.intellij.codeInspection.util.RefFilter;
import org.jetbrains.annotations.NotNull;
public class RefUnreachableFilter extends RefFilter {
+ @NotNull
protected InspectionTool myTool;
public RefUnreachableFilter(@NotNull InspectionTool tool) {
diff --git a/java/java-impl/src/com/intellij/codeInspection/deadCode/UnusedDeclarationInspection.java b/java/java-impl/src/com/intellij/codeInspection/deadCode/UnusedDeclarationInspection.java
index 70f22c0765fc..54a42a66f95b 100644
--- a/java/java-impl/src/com/intellij/codeInspection/deadCode/UnusedDeclarationInspection.java
+++ b/java/java-impl/src/com/intellij/codeInspection/deadCode/UnusedDeclarationInspection.java
@@ -515,7 +515,7 @@ public class UnusedDeclarationInspection extends FilteringInspectionTool {
}
private static class StrictUnreferencedFilter extends UnreferencedFilter {
- private StrictUnreferencedFilter(final InspectionTool tool) {
+ private StrictUnreferencedFilter(@NotNull InspectionTool tool) {
super(tool);
}
diff --git a/java/java-impl/src/com/intellij/codeInspection/inferNullity/InferNullityAnnotationsAction.java b/java/java-impl/src/com/intellij/codeInspection/inferNullity/InferNullityAnnotationsAction.java
index d76ae5cbef92..9d2b2c9c6452 100644
--- a/java/java-impl/src/com/intellij/codeInspection/inferNullity/InferNullityAnnotationsAction.java
+++ b/java/java-impl/src/com/intellij/codeInspection/inferNullity/InferNullityAnnotationsAction.java
@@ -65,7 +65,7 @@ public class InferNullityAnnotationsAction extends BaseAnalysisAction {
}
@Override
- protected void analyze(@NotNull final Project project, final AnalysisScope scope) {
+ protected void analyze(@NotNull final Project project, @NotNull final AnalysisScope scope) {
final ProgressManager progressManager = ProgressManager.getInstance();
final int totalFiles = scope.getFileCount();
diff --git a/java/java-impl/src/com/intellij/codeInspection/unusedParameters/UnusedParametersInspection.java b/java/java-impl/src/com/intellij/codeInspection/unusedParameters/UnusedParametersInspection.java
index ea832d151cf0..5d576bbbd27e 100644
--- a/java/java-impl/src/com/intellij/codeInspection/unusedParameters/UnusedParametersInspection.java
+++ b/java/java-impl/src/com/intellij/codeInspection/unusedParameters/UnusedParametersInspection.java
@@ -76,7 +76,7 @@ public class UnusedParametersInspection extends GlobalJavaInspectionTool {
if (refMethod.isAppMain()) return null;
- final ArrayList<RefParameter> unusedParameters = getUnusedParameters(refMethod);
+ final List<RefParameter> unusedParameters = getUnusedParameters(refMethod);
if (unusedParameters.isEmpty()) return null;
@@ -111,14 +111,14 @@ public class UnusedParametersInspection extends GlobalJavaInspectionTool {
}
final PsiSearchHelper helper = PsiSearchHelper.SERVICE.getInstance(project);
- final AnalysisScope scope = ((RefManagerImpl)manager).getScope();
+ final AnalysisScope scope = manager.getScope();
manager.iterate(new RefJavaVisitor() {
@Override
public void visitElement(@NotNull RefEntity refEntity) {
if (refEntity instanceof RefMethod) {
RefMethod refMethod = (RefMethod)refEntity;
final PsiModifierListOwner element = refMethod.getElement();
- if (element instanceof PsiMethod) { //implicit construcors are invisible
+ if (element instanceof PsiMethod) { //implicit constructors are invisible
PsiMethod psiMethod = (PsiMethod)element;
if (!refMethod.isStatic() && !refMethod.isConstructor() && !PsiModifier.PRIVATE.equals(refMethod.getAccessModifier())) {
final ArrayList<RefParameter> unusedParameters = getUnusedParameters(refMethod);
diff --git a/java/java-impl/src/com/intellij/externalSystem/JavaProjectData.java b/java/java-impl/src/com/intellij/externalSystem/JavaProjectData.java
index 29f991c88712..9deea918441a 100644
--- a/java/java-impl/src/com/intellij/externalSystem/JavaProjectData.java
+++ b/java/java-impl/src/com/intellij/externalSystem/JavaProjectData.java
@@ -17,6 +17,7 @@ package com.intellij.externalSystem;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.externalSystem.model.Key;
+import com.intellij.openapi.externalSystem.model.ProjectKeys;
import com.intellij.openapi.externalSystem.model.ProjectSystemId;
import com.intellij.openapi.externalSystem.model.project.AbstractExternalEntityData;
import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil;
@@ -33,9 +34,9 @@ import java.util.regex.Pattern;
* @since 4/12/13 12:27 PM
*/
public class JavaProjectData extends AbstractExternalEntityData {
-
- @NotNull public static final Key<JavaProjectData> KEY = Key.create(JavaProjectData.class);
-
+
+ @NotNull public static final Key<JavaProjectData> KEY = Key.create(JavaProjectData.class, ProjectKeys.PROJECT.getProcessingWeight() + 1);
+
private static final Logger LOG = Logger.getInstance("#" + JavaProjectData.class.getName());
private static final long serialVersionUID = 1L;
@@ -47,7 +48,7 @@ public class JavaProjectData extends AbstractExternalEntityData {
@NotNull private JavaSdkVersion myJdkVersion = DEFAULT_JDK_VERSION;
@NotNull private LanguageLevel myLanguageLevel = DEFAULT_LANGUAGE_LEVEL;
- @NotNull private String myCompileOutputPath;
+ @NotNull private String myCompileOutputPath;
public JavaProjectData(@NotNull ProjectSystemId owner, @NotNull String compileOutputPath) {
super(owner);
diff --git a/java/java-impl/src/com/intellij/javadoc/actions/GenerateJavadocAction.java b/java/java-impl/src/com/intellij/javadoc/actions/GenerateJavadocAction.java
index 2b88c43312e6..068f527c0170 100644
--- a/java/java-impl/src/com/intellij/javadoc/actions/GenerateJavadocAction.java
+++ b/java/java-impl/src/com/intellij/javadoc/actions/GenerateJavadocAction.java
@@ -36,7 +36,7 @@ public final class GenerateJavadocAction extends BaseAnalysisAction{
}
@Override
- protected void analyze(@NotNull Project project, AnalysisScope scope) {
+ protected void analyze(@NotNull Project project, @NotNull AnalysisScope scope) {
myConfigurable.apply();
JavadocGenerationManager.getInstance(project).generateJavadoc(scope);
dispose();
diff --git a/java/java-impl/src/com/intellij/lang/java/JavaFindUsagesProvider.java b/java/java-impl/src/com/intellij/lang/java/JavaFindUsagesProvider.java
index 3d8558e8d128..2a69d6fdc898 100644
--- a/java/java-impl/src/com/intellij/lang/java/JavaFindUsagesProvider.java
+++ b/java/java-impl/src/com/intellij/lang/java/JavaFindUsagesProvider.java
@@ -199,7 +199,8 @@ public class JavaFindUsagesProvider implements FindUsagesProvider {
return LangBundle.message("java.terms.of.anonymous.class", formatted);
}
else {
- String className = aClass.getName();
+ final String qualifiedName = aClass.getQualifiedName();
+ final String className = qualifiedName != null ? qualifiedName : aClass.getName();
if (aClass.isInterface()) {
return LangBundle.message("java.terms.of.interface", formatted, className);
}
diff --git a/java/java-impl/src/com/intellij/psi/AbstractQualifiedReference.java b/java/java-impl/src/com/intellij/psi/AbstractQualifiedReference.java
index d26892e68981..c9d53ae387e8 100644
--- a/java/java-impl/src/com/intellij/psi/AbstractQualifiedReference.java
+++ b/java/java-impl/src/com/intellij/psi/AbstractQualifiedReference.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2009 JetBrains s.r.o.
+ * 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.
@@ -19,7 +19,7 @@ import com.intellij.extapi.psi.ASTWrapperPsiElement;
import com.intellij.lang.ASTNode;
import com.intellij.openapi.util.TextRange;
import com.intellij.psi.impl.CheckUtil;
-import com.intellij.psi.impl.source.codeStyle.ReferenceAdjuster;
+import com.intellij.psi.impl.source.codeStyle.JavaReferenceAdjuster;
import com.intellij.psi.impl.source.resolve.JavaResolveUtil;
import com.intellij.psi.impl.source.resolve.ResolveCache;
import com.intellij.psi.meta.PsiMetaData;
@@ -187,7 +187,7 @@ public abstract class AbstractQualifiedReference<T extends AbstractQualifiedRefe
protected AbstractQualifiedReference shortenReferences() {
final PsiElement refElement = resolve();
if (refElement instanceof PsiClass) {
- final PsiQualifiedReference reference = ReferenceAdjuster.getClassReferenceToShorten((PsiClass)refElement, false, this);
+ final PsiQualifiedReference reference = JavaReferenceAdjuster.getClassReferenceToShorten((PsiClass)refElement, false, this);
if (reference instanceof AbstractQualifiedReference) {
((AbstractQualifiedReference)reference).dequalify();
}
diff --git a/java/java-impl/src/com/intellij/psi/impl/source/codeStyle/JavaCodeStyleManagerImpl.java b/java/java-impl/src/com/intellij/psi/impl/source/codeStyle/JavaCodeStyleManagerImpl.java
index e07d64a8d081..8beff5d7b21e 100644
--- a/java/java-impl/src/com/intellij/psi/impl/source/codeStyle/JavaCodeStyleManagerImpl.java
+++ b/java/java-impl/src/com/intellij/psi/impl/source/codeStyle/JavaCodeStyleManagerImpl.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2012 JetBrains s.r.o.
+ * 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.
@@ -19,6 +19,7 @@
*/
package com.intellij.psi.impl.source.codeStyle;
+import com.intellij.lang.ASTNode;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Comparing;
@@ -29,7 +30,6 @@ import com.intellij.psi.codeStyle.*;
import com.intellij.psi.impl.CheckUtil;
import com.intellij.psi.impl.source.SourceTreeToPsiMap;
import com.intellij.psi.impl.source.jsp.jspJava.JspxImportStatement;
-import com.intellij.psi.impl.source.tree.TreeElement;
import com.intellij.psi.statistics.JavaStatisticsManager;
import com.intellij.psi.util.PsiElementFilter;
import com.intellij.psi.util.PsiTreeUtil;
@@ -74,8 +74,15 @@ public class JavaCodeStyleManagerImpl extends JavaCodeStyleManager {
final boolean addImports = (flags & DO_NOT_ADD_IMPORTS) == 0;
final boolean incompleteCode = (flags & UNCOMPLETE_CODE) != 0;
- final TreeElement reference = new ReferenceAdjuster(myProject).process((TreeElement)element.getNode(), addImports, incompleteCode);
- return SourceTreeToPsiMap.treeToPsiNotNull(reference);
+
+ final ReferenceAdjuster adjuster = ReferenceAdjuster.Extension.getReferenceAdjuster(element.getLanguage());
+ if (adjuster != null) {
+ final ASTNode reference = adjuster.process(element.getNode(), addImports, incompleteCode, myProject);
+ return SourceTreeToPsiMap.treeToPsiNotNull(reference);
+ }
+ else {
+ return element;
+ }
}
@Override
@@ -83,14 +90,21 @@ public class JavaCodeStyleManagerImpl extends JavaCodeStyleManager {
throws IncorrectOperationException {
CheckUtil.checkWritable(element);
if (SourceTreeToPsiMap.hasTreeElement(element)) {
- new ReferenceAdjuster(myProject).processRange((TreeElement)element.getNode(), startOffset, endOffset);
+ final ReferenceAdjuster adjuster = ReferenceAdjuster.Extension.getReferenceAdjuster(element.getLanguage());
+ if (adjuster != null) {
+ adjuster.processRange(element.getNode(), startOffset, endOffset, myProject);
+ }
}
}
@Override
public PsiElement qualifyClassReferences(@NotNull PsiElement element) {
- final TreeElement reference = new ReferenceAdjuster(true, true).process((TreeElement)element.getNode(), false, false);
- return SourceTreeToPsiMap.treeToPsiNotNull(reference);
+ final ReferenceAdjuster adjuster = ReferenceAdjuster.Extension.getReferenceAdjuster(element.getLanguage());
+ if (adjuster != null) {
+ final ASTNode reference = adjuster.process(element.getNode(), false, false, true, true);
+ return SourceTreeToPsiMap.treeToPsiNotNull(reference);
+ }
+ return element;
}
@Override
diff --git a/java/java-impl/src/com/intellij/psi/impl/source/codeStyle/ReferenceAdjuster.java b/java/java-impl/src/com/intellij/psi/impl/source/codeStyle/JavaReferenceAdjuster.java
index 0f9e2865fff7..446a6a2b4aa0 100644
--- a/java/java-impl/src/com/intellij/psi/impl/source/codeStyle/ReferenceAdjuster.java
+++ b/java/java-impl/src/com/intellij/psi/impl/source/codeStyle/JavaReferenceAdjuster.java
@@ -20,6 +20,7 @@ import com.intellij.openapi.project.Project;
import com.intellij.psi.*;
import com.intellij.psi.codeStyle.CodeStyleSettings;
import com.intellij.psi.codeStyle.CodeStyleSettingsManager;
+import com.intellij.psi.codeStyle.ReferenceAdjuster;
import com.intellij.psi.impl.PsiImplUtil;
import com.intellij.psi.impl.source.PsiJavaCodeReferenceElementImpl;
import com.intellij.psi.impl.source.SourceJavaCodeReference;
@@ -34,24 +35,9 @@ import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.List;
-public class ReferenceAdjuster {
- private final boolean myUseFqClassNamesInJavadoc;
- private final boolean myUseFqClassNames;
-
- public ReferenceAdjuster(boolean useFqInJavadoc, boolean useFqInCode) {
- myUseFqClassNamesInJavadoc = useFqInJavadoc;
- myUseFqClassNames = useFqInCode;
- }
-
- public ReferenceAdjuster(Project project) {
- this(CodeStyleSettingsManager.getSettings(project));
- }
-
- public ReferenceAdjuster(CodeStyleSettings settings) {
- this(settings.USE_FQ_CLASS_NAMES_IN_JAVADOC, settings.USE_FQ_CLASS_NAMES);
- }
-
- public TreeElement process(TreeElement element, boolean addImports, boolean incompleteCode) {
+public class JavaReferenceAdjuster implements ReferenceAdjuster {
+ @Override
+ public ASTNode process(ASTNode element, boolean addImports, boolean incompleteCode, boolean useFqInJavadoc, boolean useFqInCode) {
IElementType elementType = element.getElementType();
if ((elementType == JavaElementType.JAVA_CODE_REFERENCE || elementType == JavaElementType.REFERENCE_EXPRESSION) && !isAnnotated(element)) {
IElementType parentType = element.getTreeParent().getElementType();
@@ -63,7 +49,7 @@ public class ReferenceAdjuster {
if (parameterList != null) {
PsiTypeElement[] typeParameters = parameterList.getTypeParameterElements();
for (PsiTypeElement typeParameter : typeParameters) {
- process((TreeElement)typeParameter.getNode(), addImports, incompleteCode);
+ process(typeParameter.getNode(), addImports, incompleteCode, useFqInJavadoc, useFqInCode);
}
}
@@ -76,7 +62,7 @@ public class ReferenceAdjuster {
if (rightKind) {
boolean isInsideDocComment = TreeUtil.findParent(element, JavaDocElementType.DOC_COMMENT) != null;
boolean isShort = !ref.isQualified();
- if (!makeFQ(isInsideDocComment)) {
+ if (isInsideDocComment ? !useFqInJavadoc : !useFqInCode) {
if (isShort) return element; // short name already, no need to change
}
@@ -85,13 +71,14 @@ public class ReferenceAdjuster {
refElement = ref.resolve();
}
else {
- PsiResolveHelper helper = JavaPsiFacade.getInstance(element.getManager().getProject()).getResolveHelper();
- refElement = helper.resolveReferencedClass(((SourceJavaCodeReference)element).getClassNameText(), ref);
+ PsiResolveHelper helper = JavaPsiFacade.getInstance(ref.getManager().getProject()).getResolveHelper();
+ final SourceJavaCodeReference reference = (SourceJavaCodeReference)element;
+ refElement = helper.resolveReferencedClass(reference.getClassNameText(), ref);
}
if (refElement instanceof PsiClass) {
PsiClass psiClass = (PsiClass)refElement;
- if (makeFQ(isInsideDocComment)) {
+ if (isInsideDocComment ? useFqInJavadoc : useFqInCode) {
String qName = psiClass.getQualifiedName();
if (qName == null) return element;
@@ -99,26 +86,26 @@ public class ReferenceAdjuster {
if (file instanceof PsiJavaFile) {
if (ImportHelper.isImplicitlyImported(qName, (PsiJavaFile)file)) {
if (isShort) return element;
- return (TreeElement)makeShortReference((CompositeElement)element, psiClass, addImports);
+ return makeShortReference((CompositeElement)element, psiClass, addImports);
}
String thisPackageName = ((PsiJavaFile)file).getPackageName();
if (ImportHelper.hasPackage(qName, thisPackageName)) {
if (!isShort) {
- return (TreeElement)makeShortReference((CompositeElement)element, psiClass, addImports);
+ return makeShortReference((CompositeElement)element, psiClass, addImports);
}
}
}
- return (TreeElement)replaceReferenceWithFQ(element, psiClass);
+ return replaceReferenceWithFQ(element, psiClass);
}
else {
int oldLength = element.getTextLength();
- TreeElement treeElement = (TreeElement)makeShortReference((CompositeElement)element, psiClass, addImports);
+ ASTNode treeElement = makeShortReference((CompositeElement)element, psiClass, addImports);
if (treeElement.getTextLength() == oldLength && psiClass.getContainingClass() != null) {
PsiElement qualifier = ref.getQualifier();
if (qualifier instanceof PsiJavaCodeReferenceElement && ((PsiJavaCodeReferenceElement)qualifier).resolve() instanceof PsiClass) {
- process((TreeElement)qualifier.getNode(), addImports, incompleteCode);
+ process(qualifier.getNode(), addImports, incompleteCode, useFqInJavadoc, useFqInCode);
}
}
return treeElement;
@@ -128,15 +115,21 @@ public class ReferenceAdjuster {
}
}
- for (TreeElement child = element.getFirstChildNode(); child != null; child = child.getTreeNext()) {
+ for (ASTNode child = element.getFirstChildNode(); child != null; child = child.getTreeNext()) {
//noinspection AssignmentToForLoopParameter
- child = process(child, addImports, incompleteCode);
+ child = process(child, addImports, incompleteCode, useFqInJavadoc, useFqInCode);
}
return element;
}
- private static boolean isAnnotated(TreeElement element) {
+ @Override
+ public ASTNode process(ASTNode element, boolean addImports, boolean incompleteCode, Project project) {
+ final CodeStyleSettings settings = CodeStyleSettingsManager.getSettings(project);
+ return process(element, addImports, incompleteCode, settings.USE_FQ_CLASS_NAMES_IN_JAVADOC, settings.USE_FQ_CLASS_NAMES);
+ }
+
+ private static boolean isAnnotated(ASTNode element) {
PsiJavaCodeReferenceElement ref = (PsiJavaCodeReferenceElement)element.getPsi();
PsiElement qualifier = ref.getQualifier();
@@ -156,21 +149,24 @@ public class ReferenceAdjuster {
return false;
}
- private boolean makeFQ(boolean isInsideDocComment) {
- return isInsideDocComment ? myUseFqClassNamesInJavadoc : myUseFqClassNames;
- }
-
- public void processRange(TreeElement element, int startOffset, int endOffset) {
+ @Override
+ public void processRange(ASTNode element, int startOffset, int endOffset, boolean useFqInJavadoc, boolean useFqInCode) {
List<ASTNode> array = new ArrayList<ASTNode>();
addReferencesInRange(array, element, startOffset, endOffset);
for (ASTNode ref : array) {
if (ref.getPsi().isValid()) {
- process((TreeElement)ref, true, true);
+ process(ref, true, true, useFqInJavadoc, useFqInCode);
}
}
}
- private static void addReferencesInRange(List<ASTNode> array, TreeElement parent, int startOffset, int endOffset) {
+ @Override
+ public void processRange(ASTNode element, int startOffset, int endOffset, Project project) {
+ final CodeStyleSettings settings = CodeStyleSettingsManager.getSettings(project);
+ processRange(element, startOffset, endOffset, settings.USE_FQ_CLASS_NAMES_IN_JAVADOC, settings.USE_FQ_CLASS_NAMES);
+ }
+
+ private static void addReferencesInRange(List<ASTNode> array, ASTNode parent, int startOffset, int endOffset) {
if (parent.getElementType() == JavaElementType.JAVA_CODE_REFERENCE || parent.getElementType() == JavaElementType.REFERENCE_EXPRESSION) {
array.add(parent);
return;
@@ -180,7 +176,7 @@ public class ReferenceAdjuster {
JspFile jspFile = JspPsiUtil.getJspFile(parent.getPsi());
if (jspFile != null) {
JspClass jspClass = (JspClass)jspFile.getJavaClass();
- addReferencesInRange(array, (TreeElement)jspClass.getNode(), startOffset, endOffset);
+ addReferencesInRange(array, jspClass.getNode(), startOffset, endOffset);
return;
}
}
@@ -188,9 +184,9 @@ public class ReferenceAdjuster {
addReferencesInRangeForComposite(array, parent, startOffset, endOffset);
}
- private static void addReferencesInRangeForComposite(List<ASTNode> array, TreeElement parent, int startOffset, int endOffset) {
+ private static void addReferencesInRangeForComposite(List<ASTNode> array, ASTNode parent, int startOffset, int endOffset) {
int offset = 0;
- for (TreeElement child = parent.getFirstChildNode(); child != null; child = child.getTreeNext()) {
+ for (ASTNode child = parent.getFirstChildNode(); child != null; child = child.getTreeNext()) {
int length = child.getTextLength();
if (startOffset <= offset + length && offset <= endOffset) {
IElementType type = child.getElementType();
@@ -214,8 +210,8 @@ public class ReferenceAdjuster {
@Nullable
public static PsiQualifiedReferenceElement getClassReferenceToShorten(@NotNull final PsiClass refClass,
- final boolean addImports,
- @NotNull final PsiQualifiedReferenceElement reference) {
+ final boolean addImports,
+ @NotNull final PsiQualifiedReferenceElement reference) {
PsiClass parentClass = refClass.getContainingClass();
if (parentClass != null) {
JavaPsiFacade facade = JavaPsiFacade.getInstance(parentClass.getProject());
@@ -226,7 +222,7 @@ public class ReferenceAdjuster {
if (!CodeStyleSettingsManager.getSettings(reference.getProject()).INSERT_INNER_CLASS_IMPORTS) {
final PsiElement qualifier = reference.getQualifier();
- if (qualifier instanceof PsiQualifiedReference) {
+ if (qualifier instanceof PsiQualifiedReferenceElement) {
return getClassReferenceToShorten(parentClass, addImports, (PsiQualifiedReferenceElement)qualifier);
}
return null;
diff --git a/java/java-impl/src/com/intellij/psi/impl/source/resolve/reference/impl/JavaLangClassMemberReference.java b/java/java-impl/src/com/intellij/psi/impl/source/resolve/reference/impl/JavaLangClassMemberReference.java
index 553233451a8b..13644930d88e 100644
--- a/java/java-impl/src/com/intellij/psi/impl/source/resolve/reference/impl/JavaLangClassMemberReference.java
+++ b/java/java-impl/src/com/intellij/psi/impl/source/resolve/reference/impl/JavaLangClassMemberReference.java
@@ -163,7 +163,7 @@ public class JavaLangClassMemberReference extends PsiReferenceBase<PsiLiteralExp
private static String getMethodTypes(PsiMethod method) {
final StringBuilder buf = new StringBuilder();
for (PsiParameter parameter : method.getParameterList().getParameters()) {
- buf.append(", ").append(((PsiClassReferenceType)parameter.getType()).getReference().getReferenceName()).append(".class");
+ buf.append(", ").append(TypeConversionUtil.erasure(parameter.getType()).getPresentableText()).append(".class");
}
return buf.toString();
}
diff --git a/java/java-impl/src/com/intellij/psi/impl/source/tree/injected/JavaConcatenationInjectorManager.java b/java/java-impl/src/com/intellij/psi/impl/source/tree/injected/JavaConcatenationInjectorManager.java
index ef072b733f02..5b4dd7af48b7 100644
--- a/java/java-impl/src/com/intellij/psi/impl/source/tree/injected/JavaConcatenationInjectorManager.java
+++ b/java/java-impl/src/com/intellij/psi/impl/source/tree/injected/JavaConcatenationInjectorManager.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2009 JetBrains s.r.o.
+ * 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.
@@ -41,7 +41,6 @@ import java.util.List;
public class JavaConcatenationInjectorManager implements ModificationTracker {
public static final ExtensionPointName<ConcatenationAwareInjector> CONCATENATION_INJECTOR_EP_NAME = ExtensionPointName.create("com.intellij.concatenationAwareInjector");
private volatile long myModificationCounter;
- private static final ConcatenationPsiCachedValueProvider CONCATENATION_PSI_CACHED_VALUE_PROVIDER = new ConcatenationPsiCachedValueProvider();
public JavaConcatenationInjectorManager(Project project, PsiManagerEx psiManagerEx) {
final ExtensionPoint<ConcatenationAwareInjector> concatPoint = Extensions.getArea(project).getExtensionPoint(CONCATENATION_INJECTOR_EP_NAME);
@@ -73,17 +72,7 @@ public class JavaConcatenationInjectorManager implements ModificationTracker {
return myModificationCounter;
}
- private static class ConcatenationPsiCachedValueProvider implements ParameterizedCachedValueProvider<MultiHostRegistrarImpl, PsiElement> {
- @Override
- public CachedValueProvider.Result<MultiHostRegistrarImpl> compute(PsiElement context) {
- Project project = context.getProject();
- Pair<PsiElement, PsiElement[]> pair = computeAnchorAndOperands(context);
- MultiHostRegistrarImpl registrar = doCompute(context, project, pair.first, pair.second);
- return registrar == null ? null : CachedValueProvider.Result.create(registrar, PsiModificationTracker.MODIFICATION_COUNT, getInstance(project));
- }
- }
-
- private static Pair<PsiElement,PsiElement[]> computeAnchorAndOperands(PsiElement context) {
+ private static Pair<PsiElement,PsiElement[]> computeAnchorAndOperandsImpl(PsiElement context) {
PsiElement element = context;
PsiElement parent = context.getParent();
while (parent instanceof PsiPolyadicExpression && ((PsiPolyadicExpression)parent).getOperationTokenType() == JavaTokenType.PLUS
@@ -130,10 +119,10 @@ public class JavaConcatenationInjectorManager implements ModificationTracker {
private static final Key<ParameterizedCachedValue<MultiHostRegistrarImpl, PsiElement>> INJECTED_PSI_IN_CONCATENATION = Key.create("INJECTED_PSI_IN_CONCATENATION");
private static final Key<Integer> NO_CONCAT_INJECTION_TIMESTAMP = Key.create("NO_CONCAT_INJECTION_TIMESTAMP");
- public static class Concatenation2InjectorAdapter implements MultiHostInjector {
+ public static abstract class BaseConcatenation2InjectorAdapter implements MultiHostInjector {
private final JavaConcatenationInjectorManager myManager;
- public Concatenation2InjectorAdapter(Project project) {
+ public BaseConcatenation2InjectorAdapter(Project project) {
myManager = getInstance(project);
}
@@ -171,7 +160,16 @@ public class JavaConcatenationInjectorManager implements ModificationTracker {
if (data == null) {
CachedValueProvider.Result<MultiHostRegistrarImpl> cachedResult =
CachedValueProvider.Result.create(result, PsiModificationTracker.MODIFICATION_COUNT, getInstance(project));
- data = CachedValuesManager.getManager(project).createParameterizedCachedValue(CONCATENATION_PSI_CACHED_VALUE_PROVIDER, false);
+ data = CachedValuesManager.getManager(project).createParameterizedCachedValue(
+ new ParameterizedCachedValueProvider<MultiHostRegistrarImpl, PsiElement>() {
+ @Override
+ public CachedValueProvider.Result<MultiHostRegistrarImpl> compute(PsiElement context) {
+ Project project = context.getProject();
+ Pair<PsiElement, PsiElement[]> pair = computeAnchorAndOperands(context);
+ MultiHostRegistrarImpl registrar = doCompute(context, project, pair.first, pair.second);
+ return registrar == null ? null : CachedValueProvider.Result.create(registrar, PsiModificationTracker.MODIFICATION_COUNT, getInstance(project));
+ }
+ }, false);
((PsiParameterizedCachedValue<MultiHostRegistrarImpl, PsiElement>)data).setValue(cachedResult);
anchor.putUserData(INJECTED_PSI_IN_CONCATENATION, data);
@@ -189,6 +187,20 @@ public class JavaConcatenationInjectorManager implements ModificationTracker {
}
}
+ protected abstract Pair<PsiElement, PsiElement[]> computeAnchorAndOperands(PsiElement context);
+ }
+
+ public static class Concatenation2InjectorAdapter extends BaseConcatenation2InjectorAdapter implements MultiHostInjector {
+
+ public Concatenation2InjectorAdapter(Project project) {
+ super(project);
+ }
+
+ @Override
+ public Pair<PsiElement, PsiElement[]> computeAnchorAndOperands(PsiElement context) {
+ return computeAnchorAndOperandsImpl(context);
+ }
+
@Override
@NotNull
public List<? extends Class<? extends PsiElement>> elementsToInjectIn() {
diff --git a/java/java-impl/src/com/intellij/refactoring/move/moveFilesOrDirectories/JavaMoveFilesOrDirectoriesHandler.java b/java/java-impl/src/com/intellij/refactoring/move/moveFilesOrDirectories/JavaMoveFilesOrDirectoriesHandler.java
index 0f646757406e..ccdc7c33cabb 100644
--- a/java/java-impl/src/com/intellij/refactoring/move/moveFilesOrDirectories/JavaMoveFilesOrDirectoriesHandler.java
+++ b/java/java-impl/src/com/intellij/refactoring/move/moveFilesOrDirectories/JavaMoveFilesOrDirectoriesHandler.java
@@ -27,9 +27,10 @@ import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.util.PsiUtil;
import com.intellij.psi.util.PsiUtilCore;
import com.intellij.refactoring.move.MoveCallback;
-import com.intellij.util.ArrayUtil;
+import com.intellij.util.ArrayUtilRt;
import com.intellij.util.Function;
import com.intellij.util.IncorrectOperationException;
+import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.*;
@@ -81,15 +82,16 @@ public class JavaMoveFilesOrDirectoriesHandler extends MoveFilesOrDirectoriesHan
PsiElement element = elements[i];
if (element instanceof PsiClass) {
final PsiClass topLevelClass = PsiUtil.getTopLevelClass(element);
- elements[i] = topLevelClass;
- final PsiFile containingFile = obtainContainingFile(topLevelClass, elements);
- if (containingFile != null && !adjustedElements.contains(containingFile)) {
- adjustedElements.add(containingFile);
- }
- }
- else {
- adjustedElements.add(element);
+ if (topLevelClass != null) {
+ elements[i] = topLevelClass;
+ final PsiFile containingFile = obtainContainingFile(topLevelClass, elements);
+ if (containingFile != null && !adjustedElements.contains(containingFile)) {
+ adjustedElements.add(containingFile);
+ continue;
+ }
+ }
}
+ adjustedElements.add(element);
}
result.setResult(PsiUtilCore.toPsiElementArray(adjustedElements));
}
@@ -99,11 +101,11 @@ public class JavaMoveFilesOrDirectoriesHandler extends MoveFilesOrDirectoriesHan
}
@Nullable
- private static PsiFile obtainContainingFile(PsiElement element, PsiElement[] elements) {
+ private static PsiFile obtainContainingFile(@NotNull PsiElement element, PsiElement[] elements) {
final PsiClass[] classes = ((PsiClassOwner)element.getParent()).getClasses();
final Set<PsiClass> nonMovedClasses = new HashSet<PsiClass>();
for (PsiClass aClass : classes) {
- if (ArrayUtil.find(elements, aClass) < 0) {
+ if (ArrayUtilRt.find(elements, aClass) < 0) {
nonMovedClasses.add(aClass);
}
}
diff --git a/java/java-impl/src/com/intellij/refactoring/rename/RenameJavaMethodProcessor.java b/java/java-impl/src/com/intellij/refactoring/rename/RenameJavaMethodProcessor.java
index e4ac3ce780ac..c410d763dac1 100644
--- a/java/java-impl/src/com/intellij/refactoring/rename/RenameJavaMethodProcessor.java
+++ b/java/java-impl/src/com/intellij/refactoring/rename/RenameJavaMethodProcessor.java
@@ -209,8 +209,10 @@ public class RenameJavaMethodProcessor extends RenameJavaMemberProcessor {
final PsiElement element = info.getElement();
if (element instanceof PsiReferenceExpression) {
if (((PsiReferenceExpression)element).resolve() == methodToRename) {
+ final PsiElement parent = element.getParent();
+ LOG.assertTrue(parent instanceof PsiMethodCallExpression, parent.getText());
final PsiMethodCallExpression copy = (PsiMethodCallExpression)JavaPsiFacade.getElementFactory(element.getProject())
- .createExpressionFromText(element.getParent().getText(), element);
+ .createExpressionFromText(parent.getText(), element);
final PsiReferenceExpression expression = (PsiReferenceExpression)processRef(copy.getMethodExpression(), newName);
if (expression == null) continue;
final JavaResolveResult resolveResult = expression.advancedResolve(true);
diff --git a/java/java-impl/src/com/intellij/refactoring/safeDelete/JavaSafeDeleteProcessor.java b/java/java-impl/src/com/intellij/refactoring/safeDelete/JavaSafeDeleteProcessor.java
index ccdeb37fd71f..7f8ae6d46b99 100644
--- a/java/java-impl/src/com/intellij/refactoring/safeDelete/JavaSafeDeleteProcessor.java
+++ b/java/java-impl/src/com/intellij/refactoring/safeDelete/JavaSafeDeleteProcessor.java
@@ -113,7 +113,9 @@ public class JavaSafeDeleteProcessor extends SafeDeleteProcessorDelegateBase {
SuperMethodWarningUtil.checkSuperMethods((PsiMethod)element, RefactoringBundle.message("to.delete.with.usage.search"),
allElementsToDelete);
if (methods.length == 0) return null;
- return Arrays.asList(methods);
+ final ArrayList<PsiMethod> psiMethods = new ArrayList<PsiMethod>(Arrays.asList(methods));
+ psiMethods.add((PsiMethod)element);
+ return psiMethods;
}
else if (element instanceof PsiParameter && ((PsiParameter) element).getDeclarationScope() instanceof PsiMethod) {
PsiMethod method = (PsiMethod) ((PsiParameter) element).getDeclarationScope();
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;
}
}
diff --git a/java/java-indexing-impl/src/com/intellij/psi/impl/file/impl/JavaFileManagerBase.java b/java/java-indexing-impl/src/com/intellij/psi/impl/file/impl/JavaFileManagerBase.java
index 60afa034b88c..af186c8bca67 100644
--- a/java/java-indexing-impl/src/com/intellij/psi/impl/file/impl/JavaFileManagerBase.java
+++ b/java/java-indexing-impl/src/com/intellij/psi/impl/file/impl/JavaFileManagerBase.java
@@ -278,7 +278,7 @@ public abstract class JavaFileManagerBase implements JavaFileManager, Disposable
for (PsiClass aClass : classes) {
PsiFile file = aClass.getContainingFile();
if (file == null) {
- LOG.error("aClass=" + aClass);
+ LOG.error("aClass=" + aClass + " of class " + aClass.getClass() + "; valid=" + aClass.isValid());
continue;
}
final boolean valid = aClass.isValid();
diff --git a/java/java-indexing-impl/src/com/intellij/psi/impl/java/stubs/index/JavaShortClassNameIndex.java b/java/java-indexing-impl/src/com/intellij/psi/impl/java/stubs/index/JavaShortClassNameIndex.java
index 5cd6454bf26e..7faeaf9ff01d 100644
--- a/java/java-indexing-impl/src/com/intellij/psi/impl/java/stubs/index/JavaShortClassNameIndex.java
+++ b/java/java-indexing-impl/src/com/intellij/psi/impl/java/stubs/index/JavaShortClassNameIndex.java
@@ -24,6 +24,7 @@ import com.intellij.psi.PsiClass;
import com.intellij.psi.impl.search.JavaSourceFilterScope;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.stubs.StringStubIndexExtension;
+import com.intellij.psi.stubs.StubIndex;
import com.intellij.psi.stubs.StubIndexKey;
import org.jetbrains.annotations.NotNull;
@@ -44,6 +45,6 @@ public class JavaShortClassNameIndex extends StringStubIndexExtension<PsiClass>
@Override
public Collection<PsiClass> get(final String s, final Project project, @NotNull final GlobalSearchScope scope) {
- return super.get(s, project, new JavaSourceFilterScope(scope));
+ return StubIndex.getInstance().safeGet(getKey(), s, project, new JavaSourceFilterScope(scope), PsiClass.class);
}
} \ No newline at end of file
diff --git a/java/java-indexing-impl/src/com/intellij/psi/impl/search/SPIReferencesSearcher.java b/java/java-indexing-impl/src/com/intellij/psi/impl/search/SPIReferencesSearcher.java
index 6ffe6247d4e7..080c800c89f4 100644
--- a/java/java-indexing-impl/src/com/intellij/psi/impl/search/SPIReferencesSearcher.java
+++ b/java/java-indexing-impl/src/com/intellij/psi/impl/search/SPIReferencesSearcher.java
@@ -18,11 +18,9 @@ package com.intellij.psi.impl.search;
import com.intellij.lang.spi.SPILanguage;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.application.QueryExecutorBase;
+import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Computable;
-import com.intellij.psi.PsiClass;
-import com.intellij.psi.PsiElement;
-import com.intellij.psi.PsiFile;
-import com.intellij.psi.PsiReference;
+import com.intellij.psi.*;
import com.intellij.psi.search.FilenameIndex;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.search.SearchScope;
@@ -33,32 +31,62 @@ import org.jetbrains.annotations.NotNull;
public class SPIReferencesSearcher extends QueryExecutorBase<PsiReference, ReferencesSearch.SearchParameters> {
@Override
- public void processQuery(@NotNull ReferencesSearch.SearchParameters p, @NotNull Processor<PsiReference> consumer) {
- final PsiElement element = p.getElementToSearch();
- if (!(element instanceof PsiClass)) {
- return;
- }
- final SearchScope scope = p.getEffectiveSearchScope();
- if (!(scope instanceof GlobalSearchScope)) return;
- final PsiClass aClass = (PsiClass)element;
- final String jvmClassName = ApplicationManager.getApplication().runReadAction(new Computable<String>() {
+ public void processQuery(@NotNull final ReferencesSearch.SearchParameters p, @NotNull Processor<PsiReference> consumer) {
+ final SearchScope scope = ApplicationManager.getApplication().runReadAction(new Computable<SearchScope>() {
@Override
- public String compute() {
- return ClassUtil.getJVMClassName(aClass);
+ public SearchScope compute() {
+ return p.getEffectiveSearchScope();
}
});
- if (jvmClassName == null) return;
- final PsiFile[] files = ApplicationManager.getApplication().runReadAction(new Computable<PsiFile[]>() {
- @Override
- public PsiFile[] compute() {
- return FilenameIndex.getFilesByName(aClass.getProject(), jvmClassName, (GlobalSearchScope)scope);
+ if (!(scope instanceof GlobalSearchScope)) return;
+
+ final PsiElement element = p.getElementToSearch();
+ if (element instanceof PsiClass) {
+ final PsiClass aClass = (PsiClass)element;
+ final String jvmClassName = ApplicationManager.getApplication().runReadAction(new Computable<String>() {
+ @Override
+ public String compute() {
+ return ClassUtil.getJVMClassName(aClass);
+ }
+ });
+
+ if (jvmClassName == null) return;
+ final PsiFile[] files = ApplicationManager.getApplication().runReadAction(new Computable<PsiFile[]>() {
+ @Override
+ public PsiFile[] compute() {
+ return FilenameIndex.getFilesByName(aClass.getProject(), jvmClassName, (GlobalSearchScope)scope);
+ }
+ });
+ for (PsiFile file : files) {
+ if (file.getLanguage() == SPILanguage.INSTANCE) {
+ final PsiReference reference = file.getReference();
+ if (reference != null) {
+ consumer.process(reference);
+ }
+ }
}
- });
- for (PsiFile file : files) {
- if (file.getLanguage() == SPILanguage.INSTANCE) {
- final PsiReference reference = file.getReference();
- if (reference != null) {
- consumer.process(reference);
+ } else if (element instanceof PsiPackage) {
+ final String qualifiedName = ((PsiPackage)element).getQualifiedName();
+ final Project project = element.getProject();
+ final String[] filenames = FilenameIndex.getAllFilenames(project);
+ for (final String filename : filenames) {
+ if (filename.startsWith(qualifiedName + ".")) {
+ final PsiFile[] files = ApplicationManager.getApplication().runReadAction(new Computable<PsiFile[]>() {
+ @Override
+ public PsiFile[] compute() {
+ return FilenameIndex.getFilesByName(project, filename, (GlobalSearchScope)scope);
+ }
+ });
+ for (PsiFile file : files) {
+ if (file.getLanguage() == SPILanguage.INSTANCE) {
+ final PsiReference[] references = file.getReferences();
+ for (PsiReference reference : references) {
+ if (reference.getCanonicalText().equals(qualifiedName)) {
+ consumer.process(reference);
+ }
+ }
+ }
+ }
}
}
}
diff --git a/java/java-psi-api/src/com/intellij/psi/codeStyle/ReferenceAdjuster.java b/java/java-psi-api/src/com/intellij/psi/codeStyle/ReferenceAdjuster.java
new file mode 100644
index 000000000000..8be4e1d8a2d0
--- /dev/null
+++ b/java/java-psi-api/src/com/intellij/psi/codeStyle/ReferenceAdjuster.java
@@ -0,0 +1,44 @@
+/*
+ * 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.psi.codeStyle;
+
+import com.intellij.lang.ASTNode;
+import com.intellij.lang.Language;
+import com.intellij.lang.LanguageExtension;
+import com.intellij.openapi.project.Project;
+
+/**
+ * @author Max Medvedev
+ */
+public interface ReferenceAdjuster {
+ ASTNode process(ASTNode element, boolean addImports, boolean incompleteCode, boolean useFqInJavadoc, boolean useFqInCode);
+ ASTNode process(ASTNode element, boolean addImports, boolean incompleteCode, Project project);
+
+ void processRange(ASTNode element, int startOffset, int endOffset, boolean useFqInJavadoc, boolean useFqInCode);
+ void processRange(ASTNode element, int startOffset, int endOffset, Project project);
+
+ class Extension extends LanguageExtension<ReferenceAdjuster> {
+ private static final Extension INSTANCE = new Extension();
+
+ public Extension() {
+ super("com.intellij.codeStyle.ReferenceAdjuster");
+ }
+
+ public static ReferenceAdjuster getReferenceAdjuster(Language language) {
+ return INSTANCE.forLanguage(language);
+ }
+ }
+}
diff --git a/java/java-psi-api/src/com/intellij/psi/util/PsiUtil.java b/java/java-psi-api/src/com/intellij/psi/util/PsiUtil.java
index 386490d24ab1..ebaf563d392e 100644
--- a/java/java-psi-api/src/com/intellij/psi/util/PsiUtil.java
+++ b/java/java-psi-api/src/com/intellij/psi/util/PsiUtil.java
@@ -1012,4 +1012,13 @@ public final class PsiUtil extends PsiUtilCore {
}
return parent;
}
+
+ public static void ensureValidType(@NotNull PsiType type) {
+ if (!type.isValid()) {
+ if (type instanceof PsiClassType) {
+ ((PsiClassType)type).resolve(); // should throw exception
+ }
+ throw new AssertionError("Invalid type: " + type + " of class " + type.getClass());
+ }
+ }
}
diff --git a/java/java-psi-impl/src/com/intellij/core/JavaCoreApplicationEnvironment.java b/java/java-psi-impl/src/com/intellij/core/JavaCoreApplicationEnvironment.java
index ba6b5f1dcf77..51ae457b4fc0 100644
--- a/java/java-psi-impl/src/com/intellij/core/JavaCoreApplicationEnvironment.java
+++ b/java/java-psi-impl/src/com/intellij/core/JavaCoreApplicationEnvironment.java
@@ -51,8 +51,7 @@ public class JavaCoreApplicationEnvironment extends CoreApplicationEnvironment {
registerFileType(JavaClassFileType.INSTANCE, "class");
registerFileType(JavaFileType.INSTANCE, "java");
- registerFileType(ArchiveFileType.INSTANCE, "jar");
- registerFileType(ArchiveFileType.INSTANCE, "zip");
+ registerFileType(ArchiveFileType.INSTANCE, "jar;zip");
addExplicitExtension(FileTypeFileViewProviders.INSTANCE, JavaClassFileType.INSTANCE, new ClassFileViewProviderFactory());
addExplicitExtension(BinaryFileStubBuilders.INSTANCE, JavaClassFileType.INSTANCE, new ClassFileStubBuilder());
diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/PsiClassImplUtil.java b/java/java-psi-impl/src/com/intellij/psi/impl/PsiClassImplUtil.java
index 7cc2bd234c35..71dff8a0704e 100644
--- a/java/java-psi-impl/src/com/intellij/psi/impl/PsiClassImplUtil.java
+++ b/java/java-psi-impl/src/com/intellij/psi/impl/PsiClassImplUtil.java
@@ -478,6 +478,7 @@ public class PsiClassImplUtil {
final List<Pair<PsiMember, PsiSubstitutor>> list = allFieldsMap.get(name);
if (list != null) {
+ boolean resolved = false;
for (final Pair<PsiMember, PsiSubstitutor> candidate : list) {
PsiMember candidateField = candidate.getFirst();
PsiClass containingClass = candidateField.getContainingClass();
@@ -489,8 +490,11 @@ public class PsiClassImplUtil {
substitutor, factory, languageLevel);
processor.handleEvent(PsiScopeProcessor.Event.SET_DECLARATION_HOLDER, containingClass);
- if (!processor.execute(candidateField, state.put(PsiSubstitutor.KEY, finalSubstitutor))) return false;
+ if (!processor.execute(candidateField, state.put(PsiSubstitutor.KEY, finalSubstitutor))) {
+ resolved = true;
+ }
}
+ if (resolved) return false;
}
}
}
@@ -514,6 +518,7 @@ public class PsiClassImplUtil {
List<Pair<PsiMember, PsiSubstitutor>> list = allClassesMap.get(name);
if (list != null) {
+ boolean resolved = false;
for (final Pair<PsiMember, PsiSubstitutor> candidate : list) {
PsiMember inner = candidate.getFirst();
PsiClass containingClass = inner.getContainingClass();
@@ -521,9 +526,12 @@ public class PsiClassImplUtil {
PsiSubstitutor finalSubstitutor = obtainFinalSubstitutor(containingClass, candidate.getSecond(), aClass,
substitutor, factory, languageLevel);
processor.handleEvent(PsiScopeProcessor.Event.SET_DECLARATION_HOLDER, containingClass);
- if (!processor.execute(inner, state.put(PsiSubstitutor.KEY, finalSubstitutor))) return false;
+ if (!processor.execute(inner, state.put(PsiSubstitutor.KEY, finalSubstitutor))) {
+ resolved = true;
+ }
}
}
+ if (resolved) return false;
}
}
}
@@ -543,6 +551,7 @@ public class PsiClassImplUtil {
Map<String, List<Pair<PsiMember, PsiSubstitutor>>> allMethodsMap = value.get(MemberType.METHOD);
List<Pair<PsiMember, PsiSubstitutor>> list = allMethodsMap.get(name);
if (list != null) {
+ boolean resolved = false;
for (final Pair<PsiMember, PsiSubstitutor> candidate : list) {
ProgressIndicatorProvider.checkCanceled();
PsiMethod candidateMethod = (PsiMethod)candidate.getFirst();
@@ -558,7 +567,10 @@ public class PsiClassImplUtil {
substitutor, factory, languageLevel);
finalSubstitutor = checkRaw(isRaw, factory, candidateMethod, finalSubstitutor);
processor.handleEvent(PsiScopeProcessor.Event.SET_DECLARATION_HOLDER, containingClass);
- if (!processor.execute(candidateMethod, state.put(PsiSubstitutor.KEY, finalSubstitutor))) return false;
+ if (!processor.execute(candidateMethod, state.put(PsiSubstitutor.KEY, finalSubstitutor))) {
+ resolved = true;
+ }
+ if (resolved) return false;
}
if (visited != null) {
diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/PsiSubstitutorImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/PsiSubstitutorImpl.java
index 90f63f67b972..c7cd48afa8b7 100644
--- a/java/java-psi-impl/src/com/intellij/psi/impl/PsiSubstitutorImpl.java
+++ b/java/java-psi-impl/src/com/intellij/psi/impl/PsiSubstitutorImpl.java
@@ -18,6 +18,8 @@ package com.intellij.psi.impl;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.psi.*;
import com.intellij.psi.impl.light.LightTypeParameter;
+import com.intellij.psi.util.PsiUtil;
+import com.intellij.psi.util.PsiUtilCore;
import com.intellij.psi.util.TypeConversionUtil;
import com.intellij.util.Function;
import com.intellij.util.containers.ContainerUtil;
@@ -97,7 +99,7 @@ public class PsiSubstitutorImpl implements PsiSubstitutor {
//noinspection ConstantConditions
return null;
}
- assert type.isValid();
+ PsiUtil.ensureValidType(type);
PsiType substituted = type.accept(myAddingBoundsSubstitutionVisitor);
return correctExternalSubstitution(substituted, type);
}
@@ -271,20 +273,18 @@ public class PsiSubstitutorImpl implements PsiSubstitutor {
final PsiClassType.ClassResolveResult resolveResult = classType.resolveGenerics();
final PsiClass aClass = resolveResult.getElement();
if (aClass == null) return classType;
- assert classType.isValid();
- assert aClass.isValid();
+
+ PsiUtilCore.ensureValid(aClass);
if (aClass instanceof PsiTypeParameter) {
final PsiTypeParameter typeParameter = (PsiTypeParameter)aClass;
if (containsInMap(typeParameter)) {
PsiType result = substituteTypeParameter(typeParameter);
if (result != null) {
- assert result.isValid();
+ PsiUtil.ensureValidType(result);
}
return result;
}
- else {
- return classType;
- }
+ return classType;
}
final Map<PsiTypeParameter, PsiType> hashMap = new HashMap<PsiTypeParameter, PsiType>(2);
if (!processClass(aClass, resolveResult.getSubstitutor(), hashMap)) {
diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiClassReferenceType.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiClassReferenceType.java
index 6eafa4f31a77..348f6ba44a28 100644
--- a/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiClassReferenceType.java
+++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiClassReferenceType.java
@@ -22,6 +22,7 @@ import com.intellij.psi.*;
import com.intellij.psi.impl.light.LightClassReference;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.util.PsiUtil;
+import com.intellij.psi.util.PsiUtilCore;
import com.intellij.util.SmartList;
import org.jetbrains.annotations.NotNull;
@@ -137,7 +138,7 @@ public class PsiClassReferenceType extends PsiClassType {
@Override
@NotNull
public ClassResolveResult resolveGenerics() {
- LOG.assertTrue(isValid());
+ PsiUtilCore.ensureValid(myReference);
final JavaResolveResult result = myReference.advancedResolve(false);
return new DelegatingClassResolveResult(result);
}
diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiReferenceExpressionImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiReferenceExpressionImpl.java
index b93bf2a60638..550da84ec9e9 100644
--- a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiReferenceExpressionImpl.java
+++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiReferenceExpressionImpl.java
@@ -26,7 +26,6 @@ import com.intellij.psi.*;
import com.intellij.psi.codeStyle.JavaCodeStyleManager;
import com.intellij.psi.codeStyle.JavaCodeStyleSettingsFacade;
import com.intellij.psi.filters.*;
-import com.intellij.psi.filters.element.ModifierFilter;
import com.intellij.psi.impl.CheckUtil;
import com.intellij.psi.impl.PsiImplUtil;
import com.intellij.psi.impl.PsiManagerEx;
@@ -47,7 +46,10 @@ import com.intellij.psi.tree.IElementType;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.PsiUtil;
import com.intellij.psi.util.TypeConversionUtil;
-import com.intellij.util.*;
+import com.intellij.util.CharTable;
+import com.intellij.util.Function;
+import com.intellij.util.IncorrectOperationException;
+import com.intellij.util.NullableFunction;
import gnu.trove.THashSet;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -386,7 +388,9 @@ public class PsiReferenceExpressionImpl extends PsiReferenceExpressionBase imple
else if (resolve instanceof PsiMethod) {
PsiMethod method = (PsiMethod)resolve;
ret = method.getReturnType();
- LOG.assertTrue(ret == null || ret.isValid());
+ if (ret != null) {
+ PsiUtil.ensureValidType(ret);
+ }
owner = method;
}
if (ret == null) return null;
@@ -400,9 +404,9 @@ public class PsiReferenceExpressionImpl extends PsiReferenceExpressionBase imple
final PsiSubstitutor substitutor = result.getSubstitutor();
if (owner == null || !PsiUtil.isRawSubstitutor(owner, substitutor)) {
PsiType substitutedType = substitutor.substitute(ret);
- LOG.assertTrue(substitutedType.isValid());
+ PsiUtil.ensureValidType(substitutedType);
PsiType normalized = PsiImplUtil.normalizeWildcardTypeByPosition(substitutedType, expr);
- LOG.assertTrue(normalized.isValid());
+ PsiUtil.ensureValidType(normalized);
return normalized;
}
}
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/ReferenceMemberBeforeCtrCalled.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/ReferenceMemberBeforeCtrCalled.java
index fec91bc2dbb6..bafdc02117c7 100644
--- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/ReferenceMemberBeforeCtrCalled.java
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/ReferenceMemberBeforeCtrCalled.java
@@ -1,5 +1,7 @@
// reference before ctr called
import java.io.*;
+import java.lang.Override;
+import java.lang.String;
import java.net.*;
class A {
@@ -171,4 +173,32 @@ class WithAnonymous {
}
}
+}
+
+class InnerClassRefInsideAnonymous {
+ static class Foo {}
+ static class SuperClass {
+ SuperClass(Foo foo) {
+ }
+
+ SuperClass(String s, Foo foo) {
+ }
+ }
+
+ static class Child extends SuperClass {
+ Child(Foo foo) {
+ super(new Foo() {
+ public String toString() {
+ AFoo afoo = null;
+ return super.toString();
+ }
+ });
+ }
+
+ Child(String s, Foo foo) {
+ super(s, new <error descr="Cannot reference 'AFoo' before supertype constructor has been called">AFoo</error>());
+ }
+
+ class AFoo extends Foo {}
+ }
} \ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting6/ClassObjectAccessibility.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting6/ClassObjectAccessibility.java
new file mode 100644
index 000000000000..de912bc9cd05
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting6/ClassObjectAccessibility.java
@@ -0,0 +1,8 @@
+@SomeAnnotation(<error descr="'Foo.Bar' has private access in 'Foo'">Foo.Bar.class</error>)
+public class Foo{
+ private static class Bar {
+ }
+}
+@interface SomeAnnotation {
+ Class value();
+}
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lambdaCodeBlock2Expr/afterComparable.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lambdaCodeBlock2Expr/afterComparable.java
index ea146267d52f..435a05db80e0 100644
--- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lambdaCodeBlock2Expr/afterComparable.java
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lambdaCodeBlock2Expr/afterComparable.java
@@ -1,4 +1,4 @@
-// "Replace with one line expression" "true"
+// "Replace with expression lambda" "true"
class Test {
{
Comparable<String> c = (o) -> 0;
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lambdaCodeBlock2Expr/afterVoid.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lambdaCodeBlock2Expr/afterVoid.java
index a1c4e157b489..7007e1b2029d 100644
--- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lambdaCodeBlock2Expr/afterVoid.java
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lambdaCodeBlock2Expr/afterVoid.java
@@ -1,4 +1,4 @@
-// "Replace with one line expression" "true"
+// "Replace with expression lambda" "true"
class Test {
{
Runnable c = () -> System.out.println();
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lambdaCodeBlock2Expr/afterVoidInCodeblock.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lambdaCodeBlock2Expr/afterVoidInCodeblock.java
index a1c4e157b489..7007e1b2029d 100644
--- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lambdaCodeBlock2Expr/afterVoidInCodeblock.java
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lambdaCodeBlock2Expr/afterVoidInCodeblock.java
@@ -1,4 +1,4 @@
-// "Replace with one line expression" "true"
+// "Replace with expression lambda" "true"
class Test {
{
Runnable c = () -> System.out.println();
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lambdaCodeBlock2Expr/beforeComparable.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lambdaCodeBlock2Expr/beforeComparable.java
index e586ccea8ff8..03b022a93ab7 100644
--- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lambdaCodeBlock2Expr/beforeComparable.java
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lambdaCodeBlock2Expr/beforeComparable.java
@@ -1,4 +1,4 @@
-// "Replace with one line expression" "true"
+// "Replace with expression lambda" "true"
class Test {
{
Comparable<String> c = (o) -> {r<caret>eturn 0;};
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lambdaCodeBlock2Expr/beforeReturnTypeInExpressionStatement.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lambdaCodeBlock2Expr/beforeReturnTypeInExpressionStatement.java
index cd86ba278aff..e5be2cdba078 100644
--- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lambdaCodeBlock2Expr/beforeReturnTypeInExpressionStatement.java
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lambdaCodeBlock2Expr/beforeReturnTypeInExpressionStatement.java
@@ -1,4 +1,4 @@
-// "Replace with one line expression" "false"
+// "Replace with expression lambda" "false"
class Test {
{
Runnable c = () -> <caret>{foo();};
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lambdaCodeBlock2Expr/beforeVoid.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lambdaCodeBlock2Expr/beforeVoid.java
index 4adb4dc1a9ba..aeb9cccb479d 100644
--- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lambdaCodeBlock2Expr/beforeVoid.java
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lambdaCodeBlock2Expr/beforeVoid.java
@@ -1,4 +1,4 @@
-// "Replace with one line expression" "true"
+// "Replace with expression lambda" "true"
class Test {
{
Runnable c = () -> <caret>{System.out.println();};
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lambdaCodeBlock2Expr/beforeVoidInCodeblock.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lambdaCodeBlock2Expr/beforeVoidInCodeblock.java
index 40da17238178..e7fc6585207a 100644
--- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lambdaCodeBlock2Expr/beforeVoidInCodeblock.java
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lambdaCodeBlock2Expr/beforeVoidInCodeblock.java
@@ -1,4 +1,4 @@
-// "Replace with one line expression" "true"
+// "Replace with expression lambda" "true"
class Test {
{
Runnable c = () -> <caret>{{System.out.println();}};
diff --git a/java/java-tests/testData/spi/renameProviderImplementation/after/META-INF/services/java.lang.Runnable b/java/java-tests/testData/spi/renameProviderImplementation/after/META-INF/services/java.lang.Runnable
new file mode 100644
index 000000000000..d5e048db40e7
--- /dev/null
+++ b/java/java-tests/testData/spi/renameProviderImplementation/after/META-INF/services/java.lang.Runnable
@@ -0,0 +1 @@
+foo.Test1
diff --git a/java/java-tests/testData/spi/renameProviderImplementation/after/foo/Test1.java b/java/java-tests/testData/spi/renameProviderImplementation/after/foo/Test1.java
new file mode 100644
index 000000000000..2eccef137257
--- /dev/null
+++ b/java/java-tests/testData/spi/renameProviderImplementation/after/foo/Test1.java
@@ -0,0 +1,5 @@
+package foo;
+public class Test1 implements Runnable {
+ public void run() {
+ }
+}
diff --git a/java/java-tests/testData/spi/renameProviderImplementation/before/META-INF/services/java.lang.Runnable b/java/java-tests/testData/spi/renameProviderImplementation/before/META-INF/services/java.lang.Runnable
new file mode 100644
index 000000000000..58e81823c8d7
--- /dev/null
+++ b/java/java-tests/testData/spi/renameProviderImplementation/before/META-INF/services/java.lang.Runnable
@@ -0,0 +1 @@
+foo.Test
diff --git a/java/java-tests/testData/spi/renameProviderImplementation/before/foo/Test.java b/java/java-tests/testData/spi/renameProviderImplementation/before/foo/Test.java
new file mode 100644
index 000000000000..c8593311f724
--- /dev/null
+++ b/java/java-tests/testData/spi/renameProviderImplementation/before/foo/Test.java
@@ -0,0 +1,5 @@
+package foo;
+public class T<caret>est implements Runnable {
+ public void run() {
+ }
+}
diff --git a/java/java-tests/testData/spi/renameProviderImplementationContainingClass/after/META-INF/services/java.lang.Runnable b/java/java-tests/testData/spi/renameProviderImplementationContainingClass/after/META-INF/services/java.lang.Runnable
new file mode 100644
index 000000000000..8fc3592a69db
--- /dev/null
+++ b/java/java-tests/testData/spi/renameProviderImplementationContainingClass/after/META-INF/services/java.lang.Runnable
@@ -0,0 +1 @@
+foo.Test1$FooRunnable
diff --git a/java/java-tests/testData/spi/renameProviderImplementationContainingClass/after/foo/Test1.java b/java/java-tests/testData/spi/renameProviderImplementationContainingClass/after/foo/Test1.java
new file mode 100644
index 000000000000..a47210234436
--- /dev/null
+++ b/java/java-tests/testData/spi/renameProviderImplementationContainingClass/after/foo/Test1.java
@@ -0,0 +1,7 @@
+package foo;
+public class Test1 {
+ public static class FooRunnable implements Runnable {
+ public void run() {
+ }
+ }
+}
diff --git a/java/java-tests/testData/spi/renameProviderImplementationContainingClass/before/META-INF/services/java.lang.Runnable b/java/java-tests/testData/spi/renameProviderImplementationContainingClass/before/META-INF/services/java.lang.Runnable
new file mode 100644
index 000000000000..7cbcb9169c60
--- /dev/null
+++ b/java/java-tests/testData/spi/renameProviderImplementationContainingClass/before/META-INF/services/java.lang.Runnable
@@ -0,0 +1 @@
+foo.Test$FooRunnable
diff --git a/java/java-tests/testData/spi/renameProviderImplementationContainingClass/before/foo/Test.java b/java/java-tests/testData/spi/renameProviderImplementationContainingClass/before/foo/Test.java
new file mode 100644
index 000000000000..562f1319c30c
--- /dev/null
+++ b/java/java-tests/testData/spi/renameProviderImplementationContainingClass/before/foo/Test.java
@@ -0,0 +1,7 @@
+package foo;
+public class T<caret>est{
+ public static class FooRunnable implements Runnable {
+ public void run() {
+ }
+ }
+}
diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/AmbiguousMethodCallTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/AmbiguousMethodCallTest.java
index dfb7db246247..2042e298849e 100644
--- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/AmbiguousMethodCallTest.java
+++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/AmbiguousMethodCallTest.java
@@ -15,7 +15,6 @@
*/
package com.intellij.codeInsight.daemon;
-import com.intellij.codeInspection.InspectionProfileEntry;
import com.intellij.codeInspection.LocalInspectionTool;
import com.intellij.codeInspection.compiler.JavacQuirksInspection;
import com.intellij.codeInspection.redundantCast.RedundantCastInspection;
@@ -31,16 +30,10 @@ import org.jetbrains.annotations.NotNull;
public class AmbiguousMethodCallTest extends LightDaemonAnalyzerTestCase {
@NonNls static final String BASE_PATH = "/codeInsight/daemonCodeAnalyzer/ambiguousCalls";
- private void doTest(boolean checkWarnings, boolean checkInfos, InspectionProfileEntry... tools) throws Exception {
- for (InspectionProfileEntry tool : tools) { enableInspectionTool(tool); }
+ private void doTest(boolean checkWarnings, boolean checkInfos) throws Exception {
doTest(BASE_PATH + "/" + getTestName(false) + ".java", checkWarnings, checkInfos);
}
- private void doTest(boolean checkWarnings, boolean checkWeakWarnings, boolean checkInfos, InspectionProfileEntry... tools) throws Exception {
- for (InspectionProfileEntry tool : tools) { enableInspectionTool(tool); }
- doTest(BASE_PATH + "/" + getTestName(false) + ".java", checkWarnings, checkWeakWarnings, checkInfos);
- }
-
@NotNull
@Override
protected LocalInspectionTool[] configureLocalInspectionTools() {
diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightAdvHighlightingJdk6Test.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightAdvHighlightingJdk6Test.java
index 7e68365f8b89..4b9afce4dcd6 100644
--- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightAdvHighlightingJdk6Test.java
+++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightAdvHighlightingJdk6Test.java
@@ -56,4 +56,5 @@ public class LightAdvHighlightingJdk6Test extends LightDaemonAnalyzerTestCase {
public void testMethodReturnTypeSubstitutability() { setLanguageLevel(LanguageLevel.JDK_1_6); doTest(true, false); }
public void testIDEADEV11877() throws Exception { setLanguageLevel(LanguageLevel.JDK_1_6); doTest(false, false); }
public void testIDEA108285() throws Exception { setLanguageLevel(LanguageLevel.JDK_1_6); doTest(false, false); }
+ public void testClassObjectAccessibility() throws Exception { setLanguageLevel(LanguageLevel.JDK_1_6); doTest(false, false); }
}
diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/quickFix/CreateConstantFieldFromUsageTest.groovy b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/quickFix/CreateConstantFieldFromUsageTest.groovy
new file mode 100644
index 000000000000..8157fcab66ef
--- /dev/null
+++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/quickFix/CreateConstantFieldFromUsageTest.groovy
@@ -0,0 +1,58 @@
+package com.intellij.codeInsight.daemon.quickFix
+import com.intellij.codeInsight.template.impl.TemplateManagerImpl
+import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase
+/**
+ * @author peter
+ */
+class CreateConstantFieldFromUsageTest extends LightCodeInsightFixtureTestCase {
+
+ public void "test add import when there is a single type variant"() {
+ TemplateManagerImpl.setTemplateTesting(project, testRootDisposable)
+ myFixture.addClass "package foo; public class Foo { public void someMethod() {} }"
+ myFixture.configureByText "a.java", '''
+class Test {
+ void foo() { <caret>CONST.someMethod(); }
+}
+'''
+ myFixture.launchAction(myFixture.findSingleIntention("Create Constant Field"))
+ myFixture.checkResult '''import foo.Foo;
+
+class Test {
+ private static final <selection>Foo</selection> CONST = ;
+
+ void foo() { CONST.someMethod(); }
+}
+'''
+ assert !myFixture.lookup
+ }
+
+ public void "test insert presentable name when showing type lookup"() {
+ TemplateManagerImpl.setTemplateTesting(project, testRootDisposable)
+ myFixture.addClass "package foo; public class Foo { public void someMethod() {} }"
+ myFixture.addClass "package bar; public class Bar { public void someMethod() {} }"
+ myFixture.configureByText "a.java", '''
+class Test {
+ void foo() { <caret>CONST.someMethod(); }
+}
+'''
+ myFixture.launchAction(myFixture.findSingleIntention("Create Constant Field"))
+ myFixture.checkResult '''
+class Test {
+ private static final <selection>Bar</selection> CONST = ;
+
+ void foo() { CONST.someMethod(); }
+}
+'''
+ assert myFixture.lookup
+ myFixture.type('\n')
+ myFixture.checkResult '''import bar.Bar;
+
+class Test {
+ private static final Bar CONST = <caret>;
+
+ void foo() { CONST.someMethod(); }
+}
+'''
+ }
+
+}
diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/template/LiveTemplateTest.groovy b/java/java-tests/testSrc/com/intellij/codeInsight/template/LiveTemplateTest.groovy
index af208b0867f4..d3a746668fcf 100644
--- a/java/java-tests/testSrc/com/intellij/codeInsight/template/LiveTemplateTest.groovy
+++ b/java/java-tests/testSrc/com/intellij/codeInsight/template/LiveTemplateTest.groovy
@@ -11,6 +11,7 @@ import com.intellij.codeInsight.lookup.impl.LookupImpl
import com.intellij.codeInsight.lookup.impl.LookupManagerImpl
import com.intellij.codeInsight.template.macro.ClassNameCompleteMacro
import com.intellij.codeInsight.template.macro.CompleteMacro
+import com.intellij.codeInsight.template.macro.MethodReturnTypeMacro
import com.intellij.openapi.application.AccessToken
import com.intellij.openapi.application.WriteAction
import com.intellij.openapi.command.CommandProcessor
@@ -337,6 +338,8 @@ class Foo {
assertFalse(isApplicable("class Foo {{ \"<caret>\" }}", template));
assertTrue(isApplicable("class Foo {{ <caret>a.b(); ) }}", template));
assertTrue(isApplicable("class Foo {{ <caret>a(); ) }}", template));
+ assertTrue(isApplicable("class Foo {{ Runnable r = () -> { <caret>System.out.println(\"foo\"); }; ) }}", template));
+ assertTrue(isApplicable("class Foo {{ Runnable r = () -> <caret>System.out.println(\"foo\"); ) }}", template));
}
public void testJavaExpressionContext() throws Exception {
@@ -345,6 +348,8 @@ class Foo {
assertTrue(isApplicable("class Foo {{ <caret>toar }}", template));
assertTrue(isApplicable("class Foo {{ return (<caret>toar) }}", template));
assertFalse(isApplicable("class Foo {{ return (aaa <caret>toar) }}", template));
+ assertTrue(isApplicable("class Foo {{ Runnable r = () -> { <caret>System.out.println(\"foo\"); }; ) }}", template));
+ assertTrue(isApplicable("class Foo {{ Runnable r = () -> <caret>System.out.println(\"foo\"); ) }}", template));
}
public void testJavaDeclarationContext() throws Exception {
@@ -365,6 +370,8 @@ class Foo {
assertTrue(isApplicable("class Foo { <caret>xxx void foo(String bar, xxx goo ) {} }", template));
assertTrue(isApplicable("class Foo { void foo(<caret>String[] bar) {} }", template));
assertTrue(isApplicable("class Foo { <caret>xxx String[] foo(String[] bar) {} }", template));
+
+ assertTrue(isApplicable("<caret>xxx package foo; class Foo {}", template));
}
public void testOtherContext() throws IOException {
@@ -551,4 +558,51 @@ class Foo {
myFixture.checkResult "class Foo {{\n System.out.println(<caret>); }}"
}
+ public void "_test multi-dimensional toar"() {
+ myFixture.configureByText "a.java", '''
+class Foo {{
+ java.util.List<String[]> list;
+ String[][] s = toar<caret>
+}}'''
+ myFixture.type('\t')
+ //state.gotoEnd()
+ myFixture.checkResult '''
+class Foo {{
+ java.util.List<String[]> list;
+ String[][] s = list.toArray(new String[list.size()][])<caret>
+}}'''
+ }
+
+ public void "test inner class name"() {
+ myFixture.configureByText "a.java", '''
+class Outer {
+ class Inner {
+ void foo() {
+ soutm<caret>
+ }
+ }
+}'''
+ myFixture.type('\t')
+ assert myFixture.editor.document.text.contains("Outer.Inner.foo")
+ }
+
+ public void "test do not strip type argument containing class"() {
+ myFixture.configureByText 'a.java', '''
+import java.util.*;
+class Foo {
+ List<Map.Entry<String, Integer>> foo() {
+ <caret>
+ }
+}
+'''
+
+ final TemplateManager manager = TemplateManager.getInstance(getProject());
+ final Template template = manager.createTemplate("result", "user", '$T$ result;');
+ template.addVariable('T', new MacroCallNode(new MethodReturnTypeMacro()), new EmptyNode(), false)
+ template.toReformat = true
+
+ manager.startTemplate(getEditor(), template);
+ assert myFixture.editor.document.text.contains('List<Map.Entry<String, Integer>> result;')
+ }
+
}
diff --git a/java/java-tests/testSrc/com/intellij/ide/fileStructure/JavaFileStructureFilteringTest.java b/java/java-tests/testSrc/com/intellij/ide/fileStructure/JavaFileStructureFilteringTest.java
index 75c7bf17279c..6f567f8567e7 100644
--- a/java/java-tests/testSrc/com/intellij/ide/fileStructure/JavaFileStructureFilteringTest.java
+++ b/java/java-tests/testSrc/com/intellij/ide/fileStructure/JavaFileStructureFilteringTest.java
@@ -38,10 +38,10 @@ public class JavaFileStructureFilteringTest extends JavaFileStructureTestCase {
public void testSelectLeafFirst3() throws Exception {checkTree("clear");}
public void testSelectLeafFirst4() throws Exception {checkTree("clear");}
- @Bombed(user = "peter", month = Calendar.JUNE, day = 10)
+ @Bombed(user = "peter", month = Calendar.JULY, day = 10)
public void testMatcher1() throws Exception {checkTree("ico");}
- @Bombed(user = "peter", month = Calendar.JUNE, day = 10)
+ @Bombed(user = "peter", month = Calendar.JULY, day = 10)
public void testMatcher2() throws Exception {checkTree("ico");}
- @Bombed(user = "peter", month = Calendar.JUNE, day = 10)
+ @Bombed(user = "peter", month = Calendar.JULY, day = 10)
public void testAnonymousMatcher2() throws Exception {checkTree("ico");}
}
diff --git a/java/java-tests/testSrc/com/intellij/index/IndexTest.java b/java/java-tests/testSrc/com/intellij/index/IndexTest.java
new file mode 100644
index 000000000000..6b84a760f4e1
--- /dev/null
+++ b/java/java-tests/testSrc/com/intellij/index/IndexTest.java
@@ -0,0 +1,216 @@
+package com.intellij.index;
+
+import com.intellij.openapi.application.ApplicationManager;
+import com.intellij.openapi.editor.Document;
+import com.intellij.openapi.fileEditor.FileDocumentManager;
+import com.intellij.openapi.util.Factory;
+import com.intellij.openapi.util.io.FileUtil;
+import com.intellij.openapi.vfs.VfsUtil;
+import com.intellij.openapi.vfs.VirtualFile;
+import com.intellij.psi.JavaPsiFacade;
+import com.intellij.psi.PsiFile;
+import com.intellij.psi.PsiManager;
+import com.intellij.psi.impl.PsiManagerEx;
+import com.intellij.psi.search.GlobalSearchScope;
+import com.intellij.testFramework.IdeaTestCase;
+import com.intellij.testFramework.PlatformTestUtil;
+import com.intellij.testFramework.PsiTestUtil;
+import com.intellij.util.indexing.MapIndexStorage;
+import com.intellij.util.indexing.StorageException;
+import com.intellij.util.io.*;
+
+import java.io.DataInput;
+import java.io.DataOutput;
+import java.io.File;
+import java.io.IOException;
+import java.util.*;
+
+/**
+ * @author Eugene Zhuravlev
+ * Date: Dec 12, 2007
+ */
+public class IndexTest extends IdeaTestCase {
+
+ public void testUpdate() throws StorageException, IOException {
+ final File storageFile = FileUtil.createTempFile("indextest", "storage");
+ final File metaIndexFile = FileUtil.createTempFile("indextest_inputs", "storage");
+ final MapIndexStorage indexStorage = new MapIndexStorage(storageFile, new EnumeratorStringDescriptor(), new EnumeratorStringDescriptor(), 16 * 1024);
+ final StringIndex index = new StringIndex(indexStorage, new Factory<PersistentHashMap<Integer, Collection<String>>>() {
+ @Override
+ public PersistentHashMap<Integer, Collection<String>> create() {
+ try {
+ return createMetaIndex(metaIndexFile);
+ }
+ catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ });
+
+ try {
+// build index
+ index.update("com/ppp/a.java", "a b c d", null);
+ index.update("com/ppp/b.java", "a b g h", null);
+ index.update("com/ppp/c.java", "a z f", null);
+ index.update("com/ppp/d.java", "a a u y z", null);
+ index.update("com/ppp/e.java", "a n chj e c d", null);
+
+ assertDataEquals(index.getFilesByWord("a"), "com/ppp/a.java", "com/ppp/b.java", "com/ppp/c.java", "com/ppp/d.java", "com/ppp/e.java");
+ assertDataEquals(index.getFilesByWord("b"), "com/ppp/a.java", "com/ppp/b.java");
+ assertDataEquals(index.getFilesByWord("c"), "com/ppp/a.java", "com/ppp/e.java");
+ assertDataEquals(index.getFilesByWord("d"), "com/ppp/a.java", "com/ppp/e.java");
+ assertDataEquals(index.getFilesByWord("g"), "com/ppp/b.java");
+ assertDataEquals(index.getFilesByWord("h"), "com/ppp/b.java");
+ assertDataEquals(index.getFilesByWord("z"), "com/ppp/c.java", "com/ppp/d.java");
+ assertDataEquals(index.getFilesByWord("f"), "com/ppp/c.java");
+ assertDataEquals(index.getFilesByWord("u"), "com/ppp/d.java");
+ assertDataEquals(index.getFilesByWord("y"), "com/ppp/d.java");
+ assertDataEquals(index.getFilesByWord("n"), "com/ppp/e.java");
+ assertDataEquals(index.getFilesByWord("chj"), "com/ppp/e.java");
+ assertDataEquals(index.getFilesByWord("e"), "com/ppp/e.java");
+
+ // update index
+
+ index.update("com/ppp/d.java", "a u y z", "a a u y z");
+ assertDataEquals(index.getFilesByWord("a"), "com/ppp/a.java", "com/ppp/b.java", "com/ppp/c.java", "com/ppp/d.java", "com/ppp/e.java");
+ index.update("com/ppp/d.java", "u y z", "a u y z");
+ assertDataEquals(index.getFilesByWord("a"), "com/ppp/a.java", "com/ppp/b.java", "com/ppp/c.java", "com/ppp/e.java");
+ index.update("com/ppp/d.java", "a a a u y z", "u y z");
+ assertDataEquals(index.getFilesByWord("a"), "com/ppp/a.java", "com/ppp/b.java", "com/ppp/c.java", "com/ppp/d.java", "com/ppp/e.java");
+
+ index.update("com/ppp/e.java", "a n chj e c d z", "a n chj e c d");
+ assertDataEquals(index.getFilesByWord("z"), "com/ppp/c.java", "com/ppp/d.java", "com/ppp/e.java");
+
+ index.update("com/ppp/b.java", null, "a b g h");
+ assertDataEquals(index.getFilesByWord("a"), "com/ppp/a.java", "com/ppp/c.java", "com/ppp/d.java", "com/ppp/e.java");
+ assertDataEquals(index.getFilesByWord("b"), "com/ppp/a.java");
+ assertDataEquals(index.getFilesByWord("g"));
+ assertDataEquals(index.getFilesByWord("h"));
+ }
+ finally {
+ indexStorage.close();
+ FileUtil.delete(storageFile);
+ }
+ }
+
+ private PersistentHashMap<Integer, Collection<String>> createMetaIndex(File metaIndexFile) throws IOException {
+ return new PersistentHashMap<Integer, Collection<String>>(metaIndexFile, new EnumeratorIntegerDescriptor(), new DataExternalizer<Collection<String>>() {
+ @Override
+ public void save(DataOutput out, Collection<String> value) throws IOException {
+ DataInputOutputUtil.writeINT(out, value.size());
+ for (String key : value) {
+ out.writeUTF(key);
+ }
+ }
+
+ @Override
+ public Collection<String> read(DataInput in) throws IOException {
+ final int size = DataInputOutputUtil.readINT(in);
+ final List<String> list = new ArrayList<String>();
+ for (int idx = 0; idx < size; idx++) {
+ list.add(in.readUTF());
+ }
+ return list;
+ }
+ });
+ }
+
+ /*
+ public void testStubIndexUnsavedDocumentsIndexing() throws IncorrectOperationException, IOException, StorageException {
+ IdeaTestUtil.registerExtension(StubIndexExtension.EP_NAME, new TextStubIndexExtension(), getTestRootDisposable());
+ IdeaTestUtil.registerExtension(StubIndexExtension.EP_NAME, new ClassNameStubIndexExtension(), getTestRootDisposable());
+ FileTypeManager.getInstance().registerFileType(TestFileType.INSTANCE, "fff");
+ final FFFLangParserDefinition parserDefinition = new FFFLangParserDefinition();
+ LanguageParserDefinitions.INSTANCE.addExplicitExtension(FFFLanguage.INSTANCE, parserDefinition);
+
+ final TestStubElementType stubType = new TestStubElementType();
+ SerializationManager.getInstance().registerSerializer(TestStubElement.class, stubType);
+
+ final File fffFile = new File(FileUtil.createTempDirectory("testing", "stubindex"), "MyClass.fff");
+ fffFile.createNewFile();
+
+ final VirtualFile vFile = LocalFileSystem.getInstance().refreshAndFindFileByIoFile(fffFile);
+
+ assertNotNull(vFile);
+ assertEquals(TestFileType.INSTANCE, vFile.getFileType());
+
+ try {
+ final MockPsiFile psiFile = new MockPsiFile(vFile, MockPsiManager.getInstance(myProject));
+
+ final MockPsiClass cls = new MockPsiClass("com.company.MyClass");
+ psiFile.add(cls);
+
+ final MockPsiMethod aaaMethod = new MockPsiMethod("aaa");
+ cls.addMethod(aaaMethod);
+ final MockPsiMethod bbbMethod = new MockPsiMethod("bbb");
+ cls.addMethod(bbbMethod);
+
+ final PsiFileStubImpl fileStub = new PsiFileStubImpl(psiFile);
+ final TestStubElement clsStub = stubType.createStub(cls, fileStub);
+ stubType.createStub(aaaMethod, clsStub);
+ stubType.createStub(bbbMethod, clsStub);
+
+ final ByteArrayOutputStream arrayStream = new ByteArrayOutputStream();
+ SerializationManager.getInstance().serialize(fileStub, new DataOutputStream(arrayStream));
+
+ final FileBasedIndex fbi = FileBasedIndex.getInstance();
+ final UpdatableIndex<Integer, SerializedStubTree, FileContent> stubUpdatingIndex = fbi.getIndex(StubUpdatingIndex.INDEX_ID);
+ final MemoryIndexStorage storage = (MemoryIndexStorage)((MapReduceIndex)stubUpdatingIndex).getStorage();
+
+ // initial
+ final int fileId = FileBasedIndex.getFileId(vFile);
+ final byte[] bytes = arrayStream.toByteArray();
+ stubUpdatingIndex.update(fileId, new FileContent(vFile, bytes), null);
+
+ final ValueContainer<SerializedStubTree> data = stubUpdatingIndex.getData(fileId);
+ final List<SerializedStubTree> trees = data.toValueList();
+
+ final SerializedStubTree tree = assertOneElement(trees);
+
+ assertTrue(Comparing.equal(bytes, tree.getBytes()));
+
+ final StubElement deserialized = tree.getStub();
+ }
+ finally {
+ LanguageParserDefinitions.INSTANCE.removeExplicitExtension(FFFLanguage.INSTANCE, parserDefinition);
+ }
+
+ }
+ */
+
+ private static <T> void assertDataEquals(List<T> actual, T... expected) {
+ assertTrue(new HashSet<T>(Arrays.asList(expected)).equals(new HashSet<T>(actual)));
+ }
+
+ public void _testCollectedPsiWithChangedDocument() throws IOException {
+ VirtualFile dir = getVirtualFile(createTempDirectory());
+ PsiTestUtil.addSourceContentToRoots(myModule, dir);
+
+ final VirtualFile vFile = createChildData(dir, "Foo.java");
+ VfsUtil.saveText(vFile, "class Foo {}");
+
+ final GlobalSearchScope scope = GlobalSearchScope.allScope(getProject());
+ final JavaPsiFacade facade = JavaPsiFacade.getInstance(getProject());
+ assertNotNull(facade.findClass("Foo", scope));
+ ApplicationManager.getApplication().runWriteAction(new Runnable() {
+ @Override
+ public void run() {
+ PsiFile psiFile = PsiManager.getInstance(getProject()).findFile(vFile);
+ assertNotNull(psiFile);
+
+ Document document = FileDocumentManager.getInstance().getDocument(vFile);
+ document.deleteString(0, document.getTextLength());
+ assertNotNull(facade.findClass("Foo", scope));
+
+ psiFile = null;
+ PlatformTestUtil.tryGcSoftlyReachableObjects();
+ assertNull(((PsiManagerEx)PsiManager.getInstance(getProject())).getFileManager().getCachedPsiFile(vFile));
+
+ // should be assertNull(facade.findClass("Foo", scope));
+ // or the file should not be allowed to be gc'ed
+ facade.findClass("Foo", scope).getText();
+ }
+ });
+ }
+
+}
diff --git a/java/java-tests/testSrc/com/intellij/index/StringIndex.java b/java/java-tests/testSrc/com/intellij/index/StringIndex.java
new file mode 100644
index 000000000000..e48d5be0e0ca
--- /dev/null
+++ b/java/java-tests/testSrc/com/intellij/index/StringIndex.java
@@ -0,0 +1,82 @@
+package com.intellij.index;
+
+import com.intellij.openapi.util.Factory;
+import com.intellij.util.indexing.DataIndexer;
+import com.intellij.util.indexing.IndexStorage;
+import com.intellij.util.indexing.MapReduceIndex;
+import com.intellij.util.indexing.StorageException;
+import com.intellij.util.io.PersistentHashMap;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.io.IOException;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author Eugene Zhuravlev
+ * Date: Dec 12, 2007
+ */
+public class StringIndex {
+ private final MapReduceIndex<String, String, PathContentPair> myIndex;
+
+ public StringIndex(final IndexStorage<String, String> storage, final Factory<PersistentHashMap<Integer, Collection<String>>> factory)
+ throws IOException {
+ myIndex = new MapReduceIndex<String, String, PathContentPair>(null, new Indexer(), storage);
+ myIndex.setInputIdToDataKeysIndex(factory);
+ }
+
+ public List<String> getFilesByWord(String word) throws StorageException {
+ return myIndex.getData(word).toValueList();
+ }
+
+ public void update(final String path, @Nullable String content, @Nullable String oldContent) throws StorageException {
+ myIndex.update(path.hashCode(), toInput(path, content));
+ }
+
+ @Nullable
+ private PathContentPair toInput(@NotNull String path, @Nullable String content) {
+ return content != null ? new PathContentPair(path, content) : null;
+ }
+
+ private static class Indexer implements DataIndexer<String, String, PathContentPair> {
+ @Override
+ @NotNull
+ public Map<String,String> map(final PathContentPair inputData) {
+ final Map<String,String> _map = new HashMap<String, String>();
+ final StringBuilder builder = new StringBuilder();
+ final String content = inputData.content;
+ for (int idx = 0; idx < content.length(); idx++) {
+ final char ch = content.charAt(idx);
+ if (Character.isWhitespace(ch)) {
+ if (builder.length() > 0) {
+ _map.put(builder.toString(), inputData.path);
+ builder.setLength(0);
+ }
+ }
+ else {
+ builder.append(ch);
+ }
+ }
+ // emit the last word
+ if (builder.length() > 0) {
+ _map.put(builder.toString(), inputData.path);
+ builder.setLength(0);
+ }
+ return _map;
+ }
+ }
+
+ private static final class PathContentPair {
+ final String path;
+ final String content;
+
+ public PathContentPair(final String path, final String content) {
+ this.path = path;
+ this.content = content;
+ }
+ }
+
+}
diff --git a/java/java-tests/testSrc/com/intellij/lang/spi/SPIRenameTest.java b/java/java-tests/testSrc/com/intellij/lang/spi/SPIRenameTest.java
new file mode 100644
index 000000000000..bb4bd50d6330
--- /dev/null
+++ b/java/java-tests/testSrc/com/intellij/lang/spi/SPIRenameTest.java
@@ -0,0 +1,60 @@
+/*
+ * 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.lang.spi;
+
+import com.intellij.JavaTestUtil;
+import com.intellij.codeInsight.TargetElementUtilBase;
+import com.intellij.openapi.vfs.VirtualFile;
+import com.intellij.psi.PsiElement;
+import com.intellij.refactoring.MultiFileTestCase;
+import com.intellij.refactoring.rename.RenameProcessor;
+import com.intellij.refactoring.rename.RenamePsiElementProcessor;
+
+/**
+ * User: anna
+ */
+public class SPIRenameTest extends MultiFileTestCase {
+ public void testRenameProviderImplementation() throws Exception {
+ doRenameTest("Test.java", "Test1");
+ }
+
+ public void testRenameProviderImplementationContainingClass() throws Exception {
+ doRenameTest("Test.java", "Test1");
+ }
+
+ private void doRenameTest(final String editorFile, final String newName) throws Exception {
+ doTest(new PerformAction() {
+ @Override
+ public void performAction(VirtualFile rootDir, VirtualFile rootAfter) throws Exception {
+ final VirtualFile file = rootDir.findFileByRelativePath("foo/" + editorFile);
+ assert file != null;
+ configureByExistingFile(file);
+ final PsiElement element = TargetElementUtilBase.findTargetElement(myEditor,
+ TargetElementUtilBase.REFERENCED_ELEMENT_ACCEPTED |
+ TargetElementUtilBase.ELEMENT_NAME_ACCEPTED);
+ assert element != null;
+ final PsiElement substitution = RenamePsiElementProcessor.forElement(element).substituteElementToRename(element, myEditor);
+ assert substitution != null;
+ new RenameProcessor(getProject(), substitution, newName, true, true).run();
+ }
+ });
+ }
+
+ @Override
+ protected String getTestRoot() {
+ return "/spi/";
+ }
+}