diff options
author | Tor Norbye <tnorbye@google.com> | 2013-06-14 07:28:55 -0700 |
---|---|---|
committer | Tor Norbye <tnorbye@google.com> | 2013-06-14 07:28:55 -0700 |
commit | d9e4c285fa2c3c38c5b92cf30e77f27e243566a8 (patch) | |
tree | 354db2798801cc7730ba4a71ea9a151233309d3a /java | |
parent | 28d9ee094b1d352884aaf5b66b85b30335165c03 (diff) | |
download | idea-d9e4c285fa2c3c38c5b92cf30e77f27e243566a8.tar.gz |
Snapshot df6c5fa1206345df60a0c86fe8f67c5f7a6f478f from master branch of git://git.jetbrains.org/idea/community.git
Change-Id: I1d62dfd281ca361774653165ce8da9fb93d51005
Diffstat (limited to 'java')
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/"; + } +} |