mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
Merge remote branch 'origin/master'
This commit is contained in:
Generated
+1
@@ -10,6 +10,7 @@
|
||||
<module fileurl="file://$PROJECT_DIR$/plugins/IntentionPowerPak/IntentionPowerPackPlugin.iml" filepath="$PROJECT_DIR$/plugins/IntentionPowerPak/IntentionPowerPackPlugin.iml" group="plugins" />
|
||||
<module fileurl="file://$PROJECT_DIR$/RegExpSupport/RegExpSupport.iml" filepath="$PROJECT_DIR$/RegExpSupport/RegExpSupport.iml" />
|
||||
<module fileurl="file://$PROJECT_DIR$/plugins/android/android.iml" filepath="$PROJECT_DIR$/plugins/android/android.iml" group="plugins/Android" />
|
||||
<module fileurl="file://$PROJECT_DIR$/plugins/android/common/android-common.iml" filepath="$PROJECT_DIR$/plugins/android/common/android-common.iml" group="plugins/Android" />
|
||||
<module fileurl="file://$PROJECT_DIR$/plugins/android/jps-plugin/android-jps-plugin.iml" filepath="$PROJECT_DIR$/plugins/android/jps-plugin/android-jps-plugin.iml" group="plugins/Android" />
|
||||
<module fileurl="file://$PROJECT_DIR$/plugins/android/rt/android-rt.iml" filepath="$PROJECT_DIR$/plugins/android/rt/android-rt.iml" group="plugins/Android" />
|
||||
<module fileurl="file://$PROJECT_DIR$/platform/annotations/annotations.iml" filepath="$PROJECT_DIR$/platform/annotations/annotations.iml" group="platform" />
|
||||
|
||||
@@ -383,7 +383,10 @@ public def layoutCommunityPlugins(String home) {
|
||||
exclude(name: "**/ddmlib_1.jar")
|
||||
}
|
||||
|
||||
jar("android_rt.jar") {module("android-rt")}
|
||||
jar("android-common.jar") {
|
||||
module("android-rt")
|
||||
module("android-common")
|
||||
}
|
||||
|
||||
dir("jps") {
|
||||
jar("android-jps-plugin.jar") { module("android-jps-plugin") }
|
||||
|
||||
@@ -69,13 +69,13 @@ public abstract class DebuggerEditorImpl extends CompletionEditor{
|
||||
private WeakReference<ListPopup> myPopup;
|
||||
|
||||
private final PsiTreeChangeListener myPsiListener = new PsiTreeChangeAdapter() {
|
||||
public void childRemoved(PsiTreeChangeEvent event) {
|
||||
public void childRemoved(@NotNull PsiTreeChangeEvent event) {
|
||||
checkContext();
|
||||
}
|
||||
public void childReplaced(PsiTreeChangeEvent event) {
|
||||
public void childReplaced(@NotNull PsiTreeChangeEvent event) {
|
||||
checkContext();
|
||||
}
|
||||
public void childMoved(PsiTreeChangeEvent event) {
|
||||
public void childMoved(@NotNull PsiTreeChangeEvent event) {
|
||||
checkContext();
|
||||
}
|
||||
private void checkContext() {
|
||||
|
||||
@@ -30,6 +30,7 @@ import org.jetbrains.annotations.NotNull;
|
||||
import java.io.InputStream;
|
||||
import java.io.Reader;
|
||||
import java.nio.charset.Charset;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
|
||||
/**
|
||||
* @author dyoma
|
||||
@@ -40,7 +41,7 @@ public class Extractor implements Disposable {
|
||||
private OutputPacketProcessor myEventsDispatcher;
|
||||
private static final Logger LOG = Logger.getInstance("#" + Extractor.class.getName());
|
||||
private final MergingUpdateQueue myQueue = new MergingUpdateQueue("Test Extractor", 20, true, MergingUpdateQueue.ANY_COMPONENT);
|
||||
private int myOrder = -1;
|
||||
private AtomicInteger myOrder = new AtomicInteger(-1);
|
||||
|
||||
public Extractor(@NotNull InputStream stream, @NotNull Charset charset) {
|
||||
myStream = new SegmentedInputStream(stream, charset);
|
||||
@@ -66,7 +67,7 @@ public class Extractor implements Disposable {
|
||||
myFulfilledWorkGate = new DeferredActionsQueue() { //todo make it all later
|
||||
@Override
|
||||
public void addLast(final Runnable runnable) {
|
||||
myQueue.queue(new MyUpdate(runnable, queue, myOrder++));
|
||||
myQueue.queue(new MyUpdate(runnable, queue, myOrder.incrementAndGet()));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -33,11 +33,11 @@ public class ConfigFileImpl implements ConfigFile {
|
||||
final VirtualFilePointerManager pointerManager = VirtualFilePointerManager.getInstance();
|
||||
myFilePointer = pointerManager.create(configuration.getUrl(), this, new VirtualFilePointerListener() {
|
||||
@Override
|
||||
public void beforeValidityChanged(final VirtualFilePointer[] pointers) {
|
||||
public void beforeValidityChanged(@NotNull final VirtualFilePointer[] pointers) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void validityChanged(final VirtualFilePointer[] pointers) {
|
||||
public void validityChanged(@NotNull final VirtualFilePointer[] pointers) {
|
||||
myPsiFile = null;
|
||||
onChange();
|
||||
}
|
||||
|
||||
@@ -576,7 +576,7 @@ public class ExpectedTypesProvider {
|
||||
@Override
|
||||
public void visitPolyadicExpression(PsiPolyadicExpression expr) {
|
||||
PsiExpression[] operands = expr.getOperands();
|
||||
int index = Arrays.asList(operands).indexOf(myExpr);
|
||||
final int index = Arrays.asList(operands).indexOf(myExpr);
|
||||
assert index >= 0;
|
||||
|
||||
if (myForCompletion && index == 0) {
|
||||
@@ -591,7 +591,7 @@ public class ExpectedTypesProvider {
|
||||
}
|
||||
return;
|
||||
}
|
||||
PsiExpression anotherExpr = index > 0 ? operands[0] : index < operands.length ? operands[1] : null;
|
||||
PsiExpression anotherExpr = index > 0 ? operands[0] : 1 < operands.length ? operands[1] : null;
|
||||
PsiType anotherType = anotherExpr != null ? anotherExpr.getType() : null;
|
||||
IElementType i = expr.getOperationTokenType();
|
||||
if (i == JavaTokenType.MINUS ||
|
||||
|
||||
@@ -65,6 +65,7 @@ import com.intellij.psi.xml.XmlDocument;
|
||||
import com.intellij.psi.xml.XmlFile;
|
||||
import com.intellij.psi.xml.XmlTag;
|
||||
import com.intellij.util.*;
|
||||
import com.intellij.util.containers.ConcurrentWeakHashMap;
|
||||
import com.intellij.util.containers.ConcurrentWeakValueHashMap;
|
||||
import com.intellij.util.messages.MessageBusConnection;
|
||||
import com.intellij.util.ui.OptionsMessageDialog;
|
||||
@@ -135,9 +136,20 @@ public class ExternalAnnotationsManagerImpl extends ExternalAnnotationsManager {
|
||||
return result.isEmpty() ? null : result.values().toArray(new PsiAnnotation[result.size()]);
|
||||
}
|
||||
|
||||
private final Map<PsiModifierListOwner, Map<String, PsiAnnotation>> cache = new ConcurrentWeakHashMap<PsiModifierListOwner, Map<String, PsiAnnotation>>();
|
||||
@NotNull
|
||||
private Map<String, PsiAnnotation> collectExternalAnnotations(@NotNull final PsiModifierListOwner listOwner) {
|
||||
if (hasAnyAnnotationsRoots() == ThreeState.NO) return Collections.emptyMap();
|
||||
|
||||
Map<String, PsiAnnotation> map = cache.get(listOwner);
|
||||
if (map == null) {
|
||||
map = doCollect(listOwner);
|
||||
cache.put(listOwner, map);
|
||||
}
|
||||
return map;
|
||||
}
|
||||
|
||||
private Map<String, PsiAnnotation> doCollect(@NotNull PsiModifierListOwner listOwner) {
|
||||
final List<XmlFile> files = findExternalAnnotationsFiles(listOwner);
|
||||
if (files == null) {
|
||||
return Collections.emptyMap();
|
||||
@@ -313,10 +325,12 @@ public class ExternalAnnotationsManagerImpl extends ExternalAnnotationsManager {
|
||||
return VfsUtil.toVirtualFileArray(result);
|
||||
}
|
||||
|
||||
private void annotateExternally(@NotNull final VirtualFile file, @NotNull final PsiModifierListOwner listOwner, final Project project,
|
||||
private void annotateExternally(@NotNull final VirtualFile file,
|
||||
@NotNull final PsiModifierListOwner listOwner,
|
||||
@NotNull Project project,
|
||||
@NotNull final String packageName,
|
||||
final VirtualFile virtualFile,
|
||||
final String annotationFQName,
|
||||
@NotNull final String annotationFQName,
|
||||
@NotNull final PsiFile fromFile,
|
||||
final PsiNameValuePair[] value) {
|
||||
final XmlFile[] annotationsXml = new XmlFile[1];
|
||||
@@ -352,46 +366,61 @@ public class ExternalAnnotationsManagerImpl extends ExternalAnnotationsManager {
|
||||
|
||||
@Override
|
||||
public boolean deannotate(@NotNull final PsiModifierListOwner listOwner, @NotNull final String annotationFQN) {
|
||||
final List<XmlFile> files = findExternalAnnotationsFiles(listOwner);
|
||||
if (files != null) {
|
||||
try {
|
||||
final List<XmlFile> files = findExternalAnnotationsFiles(listOwner);
|
||||
if (files == null) {
|
||||
return false;
|
||||
}
|
||||
for (XmlFile file : files) {
|
||||
if (file.isValid()) {
|
||||
final XmlDocument document = file.getDocument();
|
||||
if (document != null) {
|
||||
final XmlTag rootTag = document.getRootTag();
|
||||
if (rootTag != null) {
|
||||
final String externalName = getExternalName(listOwner, false);
|
||||
final String oldExternalName = getNormalizedExternalName(listOwner);
|
||||
for (final XmlTag tag : rootTag.getSubTags()) {
|
||||
final String className = tag.getAttributeValue("name");
|
||||
if (Comparing.strEqual(className, externalName) || Comparing.strEqual(className, oldExternalName)) {
|
||||
for (XmlTag annotationTag : tag.getSubTags()) {
|
||||
if (Comparing.strEqual(annotationTag.getAttributeValue("name"), annotationFQN)) {
|
||||
if (ReadonlyStatusHandler.getInstance(myPsiManager.getProject())
|
||||
.ensureFilesWritable(file.getVirtualFile()).hasReadonlyFiles()) {
|
||||
return false;
|
||||
}
|
||||
try {
|
||||
annotationTag.delete();
|
||||
if (tag.getSubTags().length == 0) {
|
||||
tag.delete();
|
||||
}
|
||||
}
|
||||
catch (IncorrectOperationException e) {
|
||||
LOG.error(e);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
if (!file.isValid()) {
|
||||
continue;
|
||||
}
|
||||
final XmlDocument document = file.getDocument();
|
||||
if (document == null) {
|
||||
continue;
|
||||
}
|
||||
final XmlTag rootTag = document.getRootTag();
|
||||
if (rootTag == null) {
|
||||
continue;
|
||||
}
|
||||
final String externalName = getExternalName(listOwner, false);
|
||||
final String oldExternalName = getNormalizedExternalName(listOwner);
|
||||
for (final XmlTag tag : rootTag.getSubTags()) {
|
||||
final String className = tag.getAttributeValue("name");
|
||||
if (!Comparing.strEqual(className, externalName) && !Comparing.strEqual(className, oldExternalName)) {
|
||||
continue;
|
||||
}
|
||||
for (XmlTag annotationTag : tag.getSubTags()) {
|
||||
if (!Comparing.strEqual(annotationTag.getAttributeValue("name"), annotationFQN)) {
|
||||
continue;
|
||||
}
|
||||
if (ReadonlyStatusHandler.getInstance(myPsiManager.getProject())
|
||||
.ensureFilesWritable(file.getVirtualFile()).hasReadonlyFiles()) {
|
||||
return false;
|
||||
}
|
||||
try {
|
||||
annotationTag.delete();
|
||||
if (tag.getSubTags().length == 0) {
|
||||
tag.delete();
|
||||
}
|
||||
}
|
||||
catch (IncorrectOperationException e) {
|
||||
LOG.error(e);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
finally {
|
||||
dropCache();
|
||||
}
|
||||
}
|
||||
|
||||
private void dropCache() {
|
||||
cache.clear();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -481,11 +510,11 @@ public class ExternalAnnotationsManagerImpl extends ExternalAnnotationsManager {
|
||||
myExternalAnnotations.clear();
|
||||
}
|
||||
|
||||
private void annotateExternally(final PsiModifierListOwner listOwner,
|
||||
final String annotationFQName,
|
||||
@Nullable final XmlFile xmlFile,
|
||||
@NotNull PsiFile codeUsageFile,
|
||||
PsiNameValuePair[] values) {
|
||||
private void annotateExternally(@NotNull PsiModifierListOwner listOwner,
|
||||
@NotNull String annotationFQName,
|
||||
@Nullable final XmlFile xmlFile,
|
||||
@NotNull PsiFile codeUsageFile,
|
||||
PsiNameValuePair[] values) {
|
||||
if (xmlFile == null) return;
|
||||
try {
|
||||
final XmlDocument document = xmlFile.getDocument();
|
||||
@@ -518,6 +547,7 @@ public class ExternalAnnotationsManagerImpl extends ExternalAnnotationsManager {
|
||||
LOG.error(e);
|
||||
}
|
||||
finally {
|
||||
dropCache();
|
||||
if (codeUsageFile.getVirtualFile().isInLocalFileSystem()) {
|
||||
UndoUtil.markPsiFileForUndo(codeUsageFile);
|
||||
}
|
||||
@@ -525,7 +555,8 @@ public class ExternalAnnotationsManagerImpl extends ExternalAnnotationsManager {
|
||||
}
|
||||
|
||||
@NonNls
|
||||
private static String createAnnotationTag(String annotationFQName, @Nullable PsiNameValuePair[] values) {
|
||||
@NotNull
|
||||
private static String createAnnotationTag(@NotNull String annotationFQName, @Nullable PsiNameValuePair[] values) {
|
||||
@NonNls String text;
|
||||
if (values != null) {
|
||||
text = " <annotation name=\'" + annotationFQName + "\'>\n";
|
||||
|
||||
+2
-1
@@ -150,7 +150,8 @@ public class CreateConstructorParameterFromFieldFix implements IntentionAction {
|
||||
final Collection<SmartPsiElementPointer<PsiField>> fieldsToFix = getFieldsToFix();
|
||||
try {
|
||||
final PsiMethod constructor = constrs.get(0);
|
||||
final List<PsiField> fields = new ArrayList<PsiField>();
|
||||
final LinkedHashSet<PsiField> fields = new LinkedHashSet<PsiField>();
|
||||
getFieldsToFix().add(myField);
|
||||
for (SmartPsiElementPointer<PsiField> elementPointer : fieldsToFix) {
|
||||
final PsiField field = elementPointer.getElement();
|
||||
if (field != null && isAvailable(field) && filterConstructorsIfFieldAlreadyAssigned(new PsiMethod[]{constructor}, field).contains(constructor)) {
|
||||
|
||||
+4
-4
@@ -16,9 +16,6 @@
|
||||
package com.intellij.codeInsight.daemon.impl.quickfix;
|
||||
|
||||
import com.intellij.codeInsight.daemon.QuickFixBundle;
|
||||
import static com.intellij.codeInsight.daemon.impl.quickfix.CreateClassKind.CLASS;
|
||||
import static com.intellij.codeInsight.daemon.impl.quickfix.CreateClassKind.INTERFACE;
|
||||
|
||||
import com.intellij.ide.util.PsiClassListCellRenderer;
|
||||
import com.intellij.ide.util.PsiElementListCellRenderer;
|
||||
import com.intellij.openapi.application.ApplicationManager;
|
||||
@@ -37,6 +34,9 @@ import javax.swing.*;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import static com.intellij.codeInsight.daemon.impl.quickfix.CreateClassKind.CLASS;
|
||||
import static com.intellij.codeInsight.daemon.impl.quickfix.CreateClassKind.INTERFACE;
|
||||
|
||||
/**
|
||||
* @author ven
|
||||
*/
|
||||
@@ -78,7 +78,7 @@ public class CreateInnerClassFromUsageFix extends CreateClassFromUsageBaseFix {
|
||||
PsiMember contextMember = PsiTreeUtil.getParentOfType(run, PsiMember.class);
|
||||
|
||||
while (contextMember != null) {
|
||||
if (contextMember instanceof PsiClass) {
|
||||
if (contextMember instanceof PsiClass && !(contextMember instanceof PsiTypeParameter)) {
|
||||
result.add((PsiClass)contextMember);
|
||||
}
|
||||
run = contextMember;
|
||||
|
||||
+1
@@ -247,6 +247,7 @@ public class CreatePropertyFromUsageFix extends CreateFromUsageBaseFix {
|
||||
builder.setEndVariableAfter(body.getLBrace());
|
||||
|
||||
accessor = CodeInsightUtilBase.forcePsiPostprocessAndRestoreElement(accessor);
|
||||
LOG.assertTrue(accessor != null);
|
||||
targetClass = accessor.getContainingClass();
|
||||
LOG.assertTrue(targetClass != null);
|
||||
Template template = builder.buildTemplate();
|
||||
|
||||
+4
-1
@@ -30,11 +30,14 @@ import com.intellij.openapi.util.text.StringUtil;
|
||||
import com.intellij.psi.*;
|
||||
import com.intellij.psi.codeStyle.CodeStyleManager;
|
||||
import com.intellij.psi.util.PsiTreeUtil;
|
||||
import com.intellij.refactoring.util.RefactoringUtil;
|
||||
import com.intellij.util.Function;
|
||||
import com.intellij.util.IncorrectOperationException;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import javax.swing.*;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashSet;
|
||||
|
||||
/**
|
||||
* User: anna
|
||||
@@ -84,7 +87,7 @@ public class DelegateWithDefaultParamValueIntentionAction extends PsiElementBase
|
||||
final PsiParameter parameter = PsiTreeUtil.getParentOfType(element, PsiParameter.class);
|
||||
final PsiMethod method = (PsiMethod)parameter.getDeclarationScope();
|
||||
final PsiMethod prototype = (PsiMethod)method.getContainingClass().addBefore(generateMethodPrototype(method, parameter), method);
|
||||
|
||||
RefactoringUtil.fixJavadocsForParams(prototype, new HashSet<PsiParameter>(Arrays.asList(prototype.getParameterList().getParameters())));
|
||||
TemplateBuilderImpl builder = new TemplateBuilderImpl(prototype);
|
||||
|
||||
PsiCodeBlock body = prototype.getBody();
|
||||
|
||||
+9
@@ -19,6 +19,7 @@ import com.intellij.codeInsight.daemon.JavaErrorMessages;
|
||||
import com.intellij.codeInsight.daemon.impl.analysis.HighlightMessageUtil;
|
||||
import com.intellij.codeInsight.daemon.impl.analysis.HighlightUtil;
|
||||
import com.intellij.codeInsight.daemon.impl.quickfix.AccessStaticViaInstanceFix;
|
||||
import com.intellij.codeInsight.daemon.impl.quickfix.RemoveUnusedVariableFix;
|
||||
import com.intellij.codeInspection.BaseJavaLocalInspectionTool;
|
||||
import com.intellij.codeInspection.InspectionsBundle;
|
||||
import com.intellij.codeInspection.ProblemsHolder;
|
||||
@@ -26,6 +27,8 @@ import com.intellij.psi.*;
|
||||
import org.jetbrains.annotations.NonNls;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
/**
|
||||
* User: anna
|
||||
* Date: 15-Nov-2005
|
||||
@@ -87,6 +90,12 @@ public class AccessStaticViaInstance extends BaseJavaLocalInspectionTool {
|
||||
String description = JavaErrorMessages.message("static.member.accessed.via.instance.reference",
|
||||
HighlightUtil.formatType(qualifierExpression.getType()),
|
||||
HighlightMessageUtil.getSymbolName(resolved, result.getSubstitutor()));
|
||||
if (!onTheFly) {
|
||||
if (RemoveUnusedVariableFix.checkSideEffects(qualifierExpression, null, new ArrayList<PsiElement>())) {
|
||||
holder.registerProblem(expr, description);
|
||||
return;
|
||||
}
|
||||
}
|
||||
holder.registerProblem(expr, description, new AccessStaticViaInstanceFix(expr, result, onTheFly));
|
||||
}
|
||||
}
|
||||
|
||||
+6
-4
@@ -27,12 +27,13 @@ import com.intellij.openapi.diagnostic.Logger;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.util.Key;
|
||||
import com.intellij.openapi.util.Pair;
|
||||
import com.intellij.openapi.util.UserDataHolderEx;
|
||||
import com.intellij.psi.*;
|
||||
import com.intellij.psi.codeStyle.CodeStyleManager;
|
||||
import com.intellij.psi.search.GlobalSearchScope;
|
||||
import com.intellij.psi.util.PsiTreeUtil;
|
||||
import com.intellij.reference.SoftReference;
|
||||
import com.intellij.util.IncorrectOperationException;
|
||||
import com.intellij.util.PatchedSoftReference;
|
||||
import com.intellij.util.containers.ConcurrentHashMap;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
@@ -75,12 +76,13 @@ public class MethodBodyChecker {
|
||||
}
|
||||
}
|
||||
|
||||
private static final Key<Map<String, PsiMethod>> CACHE_KEY = new Key<Map<String, PsiMethod>>("MethodBodyChecker templates cache");
|
||||
private static final Key<SoftReference<Map<String, PsiMethod>>> CACHE_KEY = Key.create("MethodBodyChecker templates cache");
|
||||
|
||||
private static Map<String, PsiMethod> getTemplatesCache(PsiClass aClass) {
|
||||
Map<String, PsiMethod> cache = aClass.getUserData(CACHE_KEY);
|
||||
SoftReference<Map<String, PsiMethod>> ref = aClass.getUserData(CACHE_KEY);
|
||||
Map<String, PsiMethod> cache = ref == null ? null : ref.get();
|
||||
if (cache == null) {
|
||||
cache = ((UserDataHolderEx)aClass).putUserDataIfAbsent(CACHE_KEY, new ConcurrentHashMap<String, PsiMethod>());
|
||||
aClass.putUserData(CACHE_KEY, new PatchedSoftReference<Map<String, PsiMethod>>(cache = new ConcurrentHashMap<String, PsiMethod>()));
|
||||
}
|
||||
return cache;
|
||||
}
|
||||
|
||||
+2
-1
@@ -174,7 +174,8 @@ public class MagicCompletionContributor extends CompletionContributor {
|
||||
@Override
|
||||
public void consume(CompletionResult completionResult) {
|
||||
LookupElement element = completionResult.getLookupElement();
|
||||
if (allowed.contains(element.getObject())) {
|
||||
Object object = element.getObject();
|
||||
if (object instanceof PsiElement && allowed.contains(object)) {
|
||||
return;
|
||||
}
|
||||
result.passResult(completionResult);
|
||||
|
||||
@@ -104,10 +104,17 @@ public class OptimizeImportsRefactoringHelper implements RefactoringHelper<Set<P
|
||||
if (importStatement != null && importStatement.isValid()) {
|
||||
final PsiJavaCodeReferenceElement ref = importStatement.getImportReference();
|
||||
//Do not remove non-resolving refs
|
||||
if (ref == null || ref.resolve() == null) {
|
||||
if (ref == null) {
|
||||
continue;
|
||||
}
|
||||
final PsiElement resolve = ref.resolve();
|
||||
if (resolve == null) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (resolve instanceof PsiPackage && ((PsiPackage)resolve).getDirectories(ref.getResolveScope()).length == 0) {
|
||||
continue;
|
||||
}
|
||||
importStatement.delete();
|
||||
}
|
||||
}
|
||||
|
||||
+7
-2
@@ -24,6 +24,7 @@ import com.intellij.openapi.util.text.StringUtil;
|
||||
import com.intellij.psi.*;
|
||||
import com.intellij.psi.codeStyle.JavaCodeStyleManager;
|
||||
import com.intellij.psi.codeStyle.VariableKind;
|
||||
import com.intellij.psi.util.TypeConversionUtil;
|
||||
import com.intellij.refactoring.HelpID;
|
||||
import com.intellij.refactoring.RefactoringBundle;
|
||||
import com.intellij.refactoring.ui.NameSuggestionsField;
|
||||
@@ -86,10 +87,14 @@ class AnonymousToInnerDialog extends DialogWrapper{
|
||||
if (typeParameters.length > 0) {
|
||||
names = new String[]{StringUtil.join(typeParameters, new Function<PsiType, String>() {
|
||||
public String fun(PsiType psiType) {
|
||||
PsiType type = psiType;
|
||||
if (psiType instanceof PsiClassType) {
|
||||
return ((PsiClassType)psiType).rawType().getPresentableText();
|
||||
type = TypeConversionUtil.erasure(psiType);
|
||||
}
|
||||
return psiType.getPresentableText();
|
||||
if (type instanceof PsiArrayType) {
|
||||
type = type.getDeepComponentType();
|
||||
}
|
||||
return type.getPresentableText();
|
||||
}
|
||||
}, "") + name, "My" + name};
|
||||
} else {
|
||||
|
||||
+1
@@ -72,6 +72,7 @@ public class ChangeClassSignatureProcessor extends BaseRefactoringProcessor {
|
||||
if (reference.getElement() instanceof PsiJavaCodeReferenceElement) {
|
||||
PsiJavaCodeReferenceElement referenceElement = (PsiJavaCodeReferenceElement)reference.getElement();
|
||||
PsiElement parent = referenceElement.getParent();
|
||||
if (parent instanceof PsiTypeElement && parent.getParent() instanceof PsiInstanceOfExpression) continue;
|
||||
if (parent instanceof PsiTypeElement || parent instanceof PsiNewExpression || parent instanceof PsiAnonymousClass ||
|
||||
parent instanceof PsiReferenceList) {
|
||||
if (!hadTypeParameters || referenceElement.getTypeParameters().length > 0) {
|
||||
|
||||
@@ -298,7 +298,7 @@ public class CopyClassesHandler extends CopyHandlerDelegateBase {
|
||||
|
||||
@Nullable
|
||||
public static PsiElement doCopyClasses(final Map<PsiFile, PsiClass[]> fileToClasses,
|
||||
HashMap<PsiFile, String> map, final String copyClassName,
|
||||
@Nullable HashMap<PsiFile, String> map, final String copyClassName,
|
||||
final PsiDirectory targetDirectory,
|
||||
final Project project) throws IncorrectOperationException {
|
||||
PsiElement newElement = null;
|
||||
@@ -345,8 +345,12 @@ public class CopyClassesHandler extends CopyHandlerDelegateBase {
|
||||
|
||||
for (PsiFile file : files) {
|
||||
try {
|
||||
final PsiFile fileCopy =
|
||||
CopyFilesOrDirectoriesHandler.copyToDirectory(file, getNewFileName(file, copyClassName), targetDirectory, choice);
|
||||
PsiDirectory finalTarget = targetDirectory;
|
||||
final String relativePath = map != null ? map.get(file) : null;
|
||||
if (relativePath != null && !relativePath.isEmpty()) {
|
||||
finalTarget = buildRelativeDir(targetDirectory, relativePath).findOrCreateTargetDirectory();
|
||||
}
|
||||
final PsiFile fileCopy = CopyFilesOrDirectoriesHandler.copyToDirectory(file, getNewFileName(file, copyClassName), finalTarget, choice);
|
||||
if (fileCopy != null) {
|
||||
createdFiles.add(fileCopy);
|
||||
}
|
||||
|
||||
+3
-3
@@ -218,9 +218,9 @@ public abstract class BaseExpressionToFieldHandler extends IntroduceHandlerBase
|
||||
return false;
|
||||
}
|
||||
|
||||
public static void setModifiers(PsiField field, Settings settings, final boolean declareStatic) {
|
||||
public static void setModifiers(PsiField field, Settings settings) {
|
||||
if (!settings.isIntroduceEnumConstant()) {
|
||||
if (declareStatic) {
|
||||
if (settings.isDeclareStatic()) {
|
||||
PsiUtil.setModifierProperty(field, PsiModifier.STATIC, true);
|
||||
}
|
||||
if (settings.isDeclareFinal()) {
|
||||
@@ -711,7 +711,7 @@ public abstract class BaseExpressionToFieldHandler extends IntroduceHandlerBase
|
||||
createField(myFieldName, myType, initializer, initializerPlace == InitializationPlace.IN_FIELD_DECLARATION && initializer != null,
|
||||
myParentClass);
|
||||
|
||||
setModifiers(myField, mySettings, mySettings.isDeclareStatic());
|
||||
setModifiers(myField, mySettings);
|
||||
myField = appendField(initializer, initializerPlace, destClass, myParentClass, myAnchorElement, myField);
|
||||
if (!mySettings.isIntroduceEnumConstant()) {
|
||||
VisibilityUtil.fixVisibility(myOccurrences, myField, mySettings.getFieldVisibility());
|
||||
|
||||
@@ -31,6 +31,8 @@ import com.intellij.refactoring.util.CommonRefactoringUtil;
|
||||
import com.intellij.refactoring.util.occurrences.*;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class IntroduceFieldHandler extends BaseExpressionToFieldHandler {
|
||||
|
||||
public static final String REFACTORING_NAME = RefactoringBundle.message("introduce.field.title");
|
||||
@@ -199,10 +201,19 @@ public class IntroduceFieldHandler extends BaseExpressionToFieldHandler {
|
||||
final PsiStatement statement = PsiTreeUtil.getParentOfType(local, PsiStatement.class);
|
||||
return IntroduceFieldHandler.this.showRefactoringDialog(project, editor, aClass, local.getInitializer(), local.getType(), occurences, local, statement);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected int getChosenClassIndex(List<PsiClass> classes) {
|
||||
return IntroduceFieldHandler.this.getChosenClassIndex(classes);
|
||||
}
|
||||
};
|
||||
return localToFieldHandler.convertLocalToField(localVariable, editor);
|
||||
}
|
||||
|
||||
protected int getChosenClassIndex(List<PsiClass> classes) {
|
||||
return classes.size() - 1;
|
||||
}
|
||||
|
||||
private static class MyOccurrenceFilter implements OccurrenceFilter {
|
||||
public boolean isOK(PsiExpression occurrence) {
|
||||
return !isInSuperOrThis(occurrence);
|
||||
|
||||
@@ -81,7 +81,7 @@ public abstract class LocalToFieldHandler {
|
||||
|
||||
if (classes.isEmpty()) return false;
|
||||
if (classes.size() == 1 || ApplicationManager.getApplication().isUnitTestMode()) {
|
||||
if (convertLocalToField(local, classes.get(classes.size() - 1), editor, tempIsStatic)) return false;
|
||||
if (convertLocalToField(local, classes.get(getChosenClassIndex(classes)), editor, tempIsStatic)) return false;
|
||||
} else {
|
||||
final boolean isStatic = tempIsStatic;
|
||||
NavigationUtil.getPsiElementPopup(classes.toArray(new PsiClass[classes.size()]), new PsiClassListCellRenderer(), "Choose class to introduce " + (myIsConstant ? "constant" : "field"), new PsiElementProcessor<PsiClass>() {
|
||||
@@ -96,6 +96,10 @@ public abstract class LocalToFieldHandler {
|
||||
return true;
|
||||
}
|
||||
|
||||
protected int getChosenClassIndex(List<PsiClass> classes) {
|
||||
return classes.size() - 1;
|
||||
}
|
||||
|
||||
private boolean convertLocalToField(PsiLocalVariable local, PsiClass aClass, Editor editor, boolean isStatic) {
|
||||
final PsiExpression[] occurences = CodeInsightUtil.findReferenceExpressions(RefactoringUtil.getVariableScope(local), local);
|
||||
if (editor != null) {
|
||||
@@ -250,7 +254,6 @@ public abstract class LocalToFieldHandler {
|
||||
private final PsiClass myDestinationClass;
|
||||
private final BaseExpressionToFieldHandler.Settings mySettings;
|
||||
private final BaseExpressionToFieldHandler.InitializationPlace myInitializerPlace;
|
||||
private final boolean myStatic;
|
||||
private final PsiExpression[] myOccurences;
|
||||
private PsiField myField;
|
||||
private PsiStatement myAssignmentStatement;
|
||||
@@ -269,7 +272,6 @@ public abstract class LocalToFieldHandler {
|
||||
myDestinationClass = aClass;
|
||||
mySettings = settings;
|
||||
myInitializerPlace = settings.getInitializerPlace();
|
||||
myStatic = isStatic;
|
||||
myOccurences = occurrences;
|
||||
}
|
||||
|
||||
@@ -288,7 +290,7 @@ public abstract class LocalToFieldHandler {
|
||||
myField = mySettings.isIntroduceEnumConstant() ? EnumConstantsUtil.createEnumConstant(myDestinationClass, myLocal, myFieldName)
|
||||
: createField(myLocal, mySettings.getForcedType(), myFieldName, myInitializerPlace == IN_FIELD_DECLARATION);
|
||||
myField = (PsiField)myDestinationClass.add(myField);
|
||||
BaseExpressionToFieldHandler.setModifiers(myField, mySettings, myStatic);
|
||||
BaseExpressionToFieldHandler.setModifiers(myField, mySettings);
|
||||
if (!mySettings.isIntroduceEnumConstant()) {
|
||||
VisibilityUtil.fixVisibility(myOccurences, myField, mySettings.getFieldVisibility());
|
||||
}
|
||||
|
||||
+1
@@ -99,6 +99,7 @@ public abstract class AbstractJavaInplaceIntroducer extends AbstractInplaceIntro
|
||||
@Override
|
||||
protected void saveSettings(@NotNull PsiVariable psiVariable) {
|
||||
TypeSelectorManagerImpl.typeSelected(psiVariable.getType(), getType());//myDefaultType.getType());
|
||||
myTypeSelectorManager = null;
|
||||
}
|
||||
|
||||
public PsiType getType() {
|
||||
|
||||
+14
-17
@@ -27,10 +27,7 @@ import com.intellij.psi.*;
|
||||
import com.intellij.psi.search.GlobalSearchScope;
|
||||
import com.intellij.psi.search.PackageScope;
|
||||
import com.intellij.psi.search.searches.ReferencesSearch;
|
||||
import com.intellij.psi.util.MethodSignatureUtil;
|
||||
import com.intellij.psi.util.PsiTreeUtil;
|
||||
import com.intellij.psi.util.PsiUtil;
|
||||
import com.intellij.psi.util.PsiUtilBase;
|
||||
import com.intellij.psi.util.*;
|
||||
import com.intellij.refactoring.BaseRefactoringProcessor;
|
||||
import com.intellij.refactoring.MoveDestination;
|
||||
import com.intellij.refactoring.PackageWrapper;
|
||||
@@ -68,16 +65,15 @@ public class MoveClassesOrPackagesProcessor extends BaseRefactoringProcessor {
|
||||
private boolean mySearchInNonJavaFiles;
|
||||
private final PackageWrapper myTargetPackage;
|
||||
private final MoveCallback myMoveCallback;
|
||||
protected final MoveDestination myMoveDestination;
|
||||
protected @NotNull final MoveDestination myMoveDestination;
|
||||
protected NonCodeUsageInfo[] myNonCodeUsages;
|
||||
|
||||
public MoveClassesOrPackagesProcessor(
|
||||
Project project,
|
||||
PsiElement[] elements,
|
||||
final MoveDestination moveDestination,
|
||||
boolean searchInComments,
|
||||
boolean searchInNonJavaFiles,
|
||||
MoveCallback moveCallback) {
|
||||
public MoveClassesOrPackagesProcessor(Project project,
|
||||
PsiElement[] elements,
|
||||
@NotNull final MoveDestination moveDestination,
|
||||
boolean searchInComments,
|
||||
boolean searchInNonJavaFiles,
|
||||
MoveCallback moveCallback) {
|
||||
super(project);
|
||||
final Set<PsiElement> toMove = new LinkedHashSet<PsiElement>();
|
||||
for (PsiElement element : elements) {
|
||||
@@ -87,7 +83,7 @@ public class MoveClassesOrPackagesProcessor extends BaseRefactoringProcessor {
|
||||
toMove.add(element);
|
||||
}
|
||||
}
|
||||
myElementsToMove = PsiUtilBase.toPsiElementArray(toMove);
|
||||
myElementsToMove = PsiUtilCore.toPsiElementArray(toMove);
|
||||
Arrays.sort(myElementsToMove, new Comparator<PsiElement>() {
|
||||
@Override
|
||||
public int compare(PsiElement o1, PsiElement o2) {
|
||||
@@ -451,7 +447,8 @@ public class MoveClassesOrPackagesProcessor extends BaseRefactoringProcessor {
|
||||
if (allClasses.containsKey(psiClass)) {
|
||||
continue;
|
||||
}
|
||||
final PsiClass[] classes = ((PsiClassOwner)element.getContainingFile()).getClasses();
|
||||
final PsiClassOwner containingFile = (PsiClassOwner)element.getContainingFile();
|
||||
final PsiClass[] classes = containingFile.getClasses();
|
||||
boolean all = true;
|
||||
for (PsiClass aClass : classes) {
|
||||
if (ArrayUtil.find(myElementsToMove, aClass) == -1) {
|
||||
@@ -464,14 +461,14 @@ public class MoveClassesOrPackagesProcessor extends BaseRefactoringProcessor {
|
||||
}
|
||||
}
|
||||
}
|
||||
Map<PsiElement, PsiElement> oldToNewElementsMapping = new HashMap<PsiElement, PsiElement>();
|
||||
final Map<PsiElement, PsiElement> oldToNewElementsMapping = new HashMap<PsiElement, PsiElement>();
|
||||
for (int idx = 0; idx < myElementsToMove.length; idx++) {
|
||||
PsiElement element = myElementsToMove[idx];
|
||||
final RefactoringElementListener elementListener = getTransaction().getElementListener(element);
|
||||
if (element instanceof PsiPackage) {
|
||||
final PsiDirectory[] directories = ((PsiPackage)element).getDirectories();
|
||||
final PsiPackage newElement =
|
||||
MoveClassesOrPackagesUtil.doMovePackage((PsiPackage)element, myMoveDestination);
|
||||
final PsiPackage newElement = MoveClassesOrPackagesUtil.doMovePackage((PsiPackage)element, myMoveDestination);
|
||||
LOG.assertTrue(newElement != null);
|
||||
oldToNewElementsMapping.put(element, newElement);
|
||||
int i = 0;
|
||||
final PsiDirectory[] newDirectories = newElement.getDirectories();
|
||||
|
||||
+1
-2
@@ -15,7 +15,6 @@
|
||||
*/
|
||||
package com.intellij.refactoring.move.moveClassesOrPackages;
|
||||
|
||||
import com.intellij.ide.util.DirectoryChooser;
|
||||
import com.intellij.ide.util.DirectoryChooserUtil;
|
||||
import com.intellij.lang.java.JavaFindUsagesProvider;
|
||||
import com.intellij.openapi.application.ApplicationManager;
|
||||
@@ -23,7 +22,6 @@ import com.intellij.openapi.diagnostic.Logger;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.roots.ProjectFileIndex;
|
||||
import com.intellij.openapi.roots.ProjectRootManager;
|
||||
import com.intellij.openapi.util.Comparing;
|
||||
import com.intellij.openapi.util.Computable;
|
||||
import com.intellij.openapi.util.TextRange;
|
||||
import com.intellij.openapi.vfs.VfsUtil;
|
||||
@@ -231,6 +229,7 @@ public class MoveClassesOrPackagesUtil {
|
||||
|
||||
newClass = aClass;
|
||||
if (!moveDestination.equals(file.getContainingDirectory())) {
|
||||
LOG.assertTrue(file.getVirtualFile() != null, aClass);
|
||||
MoveFilesOrDirectoriesUtil.doMoveFile(file, moveDestination);
|
||||
if (file instanceof PsiClassOwner && newPackage != null) {
|
||||
((PsiClassOwner)file).setPackageName(newPackage.getQualifiedName());
|
||||
|
||||
@@ -65,32 +65,32 @@ public class SliceManager implements PersistentStateComponent<SliceManager.Store
|
||||
|
||||
psiManager.addPsiTreeChangeListener(new PsiTreeChangeAdapter() {
|
||||
@Override
|
||||
public void beforeChildAddition(PsiTreeChangeEvent event) {
|
||||
public void beforeChildAddition(@NotNull PsiTreeChangeEvent event) {
|
||||
cancel();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void beforeChildRemoval(PsiTreeChangeEvent event) {
|
||||
public void beforeChildRemoval(@NotNull PsiTreeChangeEvent event) {
|
||||
cancel();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void beforeChildReplacement(PsiTreeChangeEvent event) {
|
||||
public void beforeChildReplacement(@NotNull PsiTreeChangeEvent event) {
|
||||
cancel();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void beforeChildMovement(PsiTreeChangeEvent event) {
|
||||
public void beforeChildMovement(@NotNull PsiTreeChangeEvent event) {
|
||||
cancel();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void beforeChildrenChange(PsiTreeChangeEvent event) {
|
||||
public void beforeChildrenChange(@NotNull PsiTreeChangeEvent event) {
|
||||
cancel();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void beforePropertyChange(PsiTreeChangeEvent event) {
|
||||
public void beforePropertyChange(@NotNull PsiTreeChangeEvent event) {
|
||||
cancel();
|
||||
}
|
||||
}, project);
|
||||
|
||||
+13
-102
@@ -26,22 +26,19 @@ import com.intellij.openapi.util.Key;
|
||||
import com.intellij.openapi.util.NotNullLazyKey;
|
||||
import com.intellij.psi.*;
|
||||
import com.intellij.psi.impl.AnyPsiChangeListener;
|
||||
import com.intellij.psi.impl.DebugUtil;
|
||||
import com.intellij.psi.impl.PsiManagerEx;
|
||||
import com.intellij.psi.impl.PsiManagerImpl;
|
||||
import com.intellij.psi.impl.source.PsiClassReferenceType;
|
||||
import com.intellij.psi.impl.source.tree.TreeElement;
|
||||
import com.intellij.psi.util.TypeConversionUtil;
|
||||
import com.intellij.reference.SoftReference;
|
||||
import com.intellij.util.ConcurrencyUtil;
|
||||
import com.intellij.util.Function;
|
||||
import com.intellij.util.Processor;
|
||||
import com.intellij.util.containers.ConcurrentWeakHashMap;
|
||||
import com.intellij.util.containers.WeakHashMap;
|
||||
import com.intellij.util.containers.WeakList;
|
||||
import com.intellij.util.messages.MessageBus;
|
||||
import org.jetbrains.annotations.NonNls;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.lang.ref.Reference;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.ConcurrentMap;
|
||||
@@ -55,11 +52,7 @@ public class JavaResolveCache {
|
||||
return INSTANCE_KEY.getValue(project);
|
||||
}
|
||||
|
||||
private final ConcurrentMap<PsiExpression, PsiType> myCalculatedTypes = new ConcurrentWeakHashMap<PsiExpression, PsiType>();
|
||||
private final ConcurrentMap<PsiElement, PsiType> myCachedReferencesInPsiTypes = new ConcurrentWeakHashMap<PsiElement, PsiType>();
|
||||
// e.g. given FileOutputStream os, os2;
|
||||
// PsiJavaCodeReferenceElement("FileOutputStream") -> [ PsiReferenceExpression("os"), PsiReferenceExpression("os2") ]
|
||||
private final Map<PsiElement, WeakList<PsiElement>> myCachedReferenceIn_PsiClassReferenceType_To_ListOfReferencesOfThisType_CachedHere = new WeakHashMap<PsiElement, WeakList<PsiElement>>();
|
||||
private final ConcurrentMap<PsiExpression, Reference<PsiType>> myCalculatedTypes = new ConcurrentWeakHashMap<PsiExpression, Reference<PsiType>>();
|
||||
|
||||
private final Map<PsiVariable,Object> myVarToConstValueMapPhysical;
|
||||
private final Map<PsiVariable,Object> myVarToConstValueMapNonPhysical;
|
||||
@@ -86,39 +79,31 @@ public class JavaResolveCache {
|
||||
|
||||
private void clearCaches(boolean isPhysical) {
|
||||
myCalculatedTypes.clear();
|
||||
myCachedReferencesInPsiTypes.clear();
|
||||
myCachedReferenceIn_PsiClassReferenceType_To_ListOfReferencesOfThisType_CachedHere.clear();
|
||||
if (isPhysical) {
|
||||
myVarToConstValueMapPhysical.clear();
|
||||
}
|
||||
myVarToConstValueMapNonPhysical.clear();
|
||||
}
|
||||
|
||||
public boolean isTypeCached(@NotNull PsiExpression expr) {
|
||||
return myCalculatedTypes.get(expr) != null;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public <T extends PsiExpression> PsiType getType(@NotNull T expr, @NotNull Function<T, PsiType> f) {
|
||||
PsiType type = myCalculatedTypes.get(expr);
|
||||
PsiType type = getCachedType(expr);
|
||||
if (type == null) {
|
||||
type = f.fun(expr);
|
||||
if (type == null) {
|
||||
type = TypeConversionUtil.NULL_TYPE;
|
||||
}
|
||||
PsiType stored = ConcurrencyUtil.cacheOrGet(myCalculatedTypes, expr, type);
|
||||
SoftReference<PsiType> ref = new SoftReference<PsiType>(type);
|
||||
Reference<PsiType> storedRef = ConcurrencyUtil.cacheOrGet(myCalculatedTypes, expr, ref);
|
||||
|
||||
if (stored == type && DebugUtil.DO_EXPENSIVE_CHECKS) {
|
||||
registerDiagnosticsHooks(expr, type);
|
||||
}
|
||||
|
||||
type = stored;
|
||||
PsiType stored = storedRef.get();
|
||||
type = stored == null ? type : stored;
|
||||
}
|
||||
|
||||
if (!type.isValid()) {
|
||||
if (expr.isValid()) {
|
||||
PsiJavaCodeReferenceElement refInside = type instanceof PsiClassReferenceType ? ((PsiClassReferenceType)type).getReference() : null;
|
||||
String typeinfo = type + " (" + type.getClass() + ")" + (refInside == null ? "" : "; ref inside: "+refInside + " ("+refInside.getClass()+") valid:"+refInside.isValid());
|
||||
@NonNls String typeinfo = type + " (" + type.getClass() + ")" + (refInside == null ? "" : "; ref inside: "+refInside + " ("+refInside.getClass()+") valid:"+refInside.isValid());
|
||||
LOG.error("Type is invalid: " + typeinfo + "; expr: '" + expr + "' (" + expr.getClass() + ") is valid");
|
||||
}
|
||||
else {
|
||||
@@ -129,83 +114,9 @@ public class JavaResolveCache {
|
||||
return type == TypeConversionUtil.NULL_TYPE ? null : type;
|
||||
}
|
||||
|
||||
private <T extends PsiExpression> void registerDiagnosticsHooks(T expr, PsiType type) {
|
||||
if (type instanceof PsiClassReferenceType) {
|
||||
PsiJavaCodeReferenceElement reference = ((PsiClassReferenceType)type).getReference();
|
||||
ConcurrencyUtil.cacheOrGet(myCachedReferencesInPsiTypes, reference, type);
|
||||
synchronized (myCachedReferenceIn_PsiClassReferenceType_To_ListOfReferencesOfThisType_CachedHere) {
|
||||
WeakList<PsiElement> refsTo = myCachedReferenceIn_PsiClassReferenceType_To_ListOfReferencesOfThisType_CachedHere.get(reference);
|
||||
if (refsTo==null) {
|
||||
refsTo = new WeakList<PsiElement>();
|
||||
myCachedReferenceIn_PsiClassReferenceType_To_ListOfReferencesOfThisType_CachedHere.put(reference, refsTo);
|
||||
}
|
||||
refsTo.add(expr);
|
||||
}
|
||||
final PsiFile dummyHolder = reference.getContainingFile();
|
||||
if (dummyHolder != null && !dummyHolder.isPhysical()) {
|
||||
PsiElement physicalContext = dummyHolder.getContext();
|
||||
PsiFile physicalFile;
|
||||
if (physicalContext != null &&
|
||||
(physicalFile = physicalContext.getContainingFile()) != null &&
|
||||
physicalFile.getVirtualFile() != null &&
|
||||
!((PsiManagerEx)dummyHolder.getManager()).isAssertOnFileLoading(physicalFile.getVirtualFile())) {
|
||||
DebugUtil.trackInvalidation(physicalContext, "dummy holder was invalidated", new Processor<PsiElement>() {
|
||||
@Override
|
||||
public boolean process(PsiElement element) {
|
||||
DebugUtil.onInvalidated((TreeElement)dummyHolder.getNode());
|
||||
return true;
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
DebugUtil.trackInvalidation(reference, "Reference inside PsiClassReferenceType was invalidated", new Processor<PsiElement>() {
|
||||
@Override
|
||||
public boolean process(PsiElement element) {
|
||||
PsiType cached = myCalculatedTypes.get(element);
|
||||
if (cached != null) {
|
||||
LOG.error(element + " (inside ref) is invalid and yet it is still cached: " + cached);
|
||||
}
|
||||
PsiType cachedRef = myCachedReferencesInPsiTypes.get(element);
|
||||
if (cachedRef != null) {
|
||||
LOG.error(element + " (inside ref) is invalid and yet it is still cached in ref cache: " + cachedRef);
|
||||
}
|
||||
|
||||
|
||||
synchronized (myCachedReferenceIn_PsiClassReferenceType_To_ListOfReferencesOfThisType_CachedHere) {
|
||||
WeakList<PsiElement> refsTo = myCachedReferenceIn_PsiClassReferenceType_To_ListOfReferencesOfThisType_CachedHere.get(element);
|
||||
if (refsTo != null) {
|
||||
for (PsiElement ref : refsTo) {
|
||||
PsiType cachedT = myCalculatedTypes.get(ref);
|
||||
if (cachedT != null && !cachedT.isValid()) {
|
||||
LOG.error("During invalidation of " + element + " ("+element.getClass()+")"+
|
||||
" cached type " + cachedT + " of the ref "+ref+" ("+ref.getClass()+")"+
|
||||
" became invalid and yet it is still cached"
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
});
|
||||
}
|
||||
DebugUtil.trackInvalidation(expr, "Expression invalidated", new Processor<PsiElement>() {
|
||||
@Override
|
||||
public boolean process(PsiElement element) {
|
||||
PsiType cached = myCalculatedTypes.get(element);
|
||||
if (cached != null) {
|
||||
LOG.error(element + " is invalid and yet it is still cached: " + cached);
|
||||
}
|
||||
|
||||
PsiType cachedRef = myCachedReferencesInPsiTypes.get(element);
|
||||
if (cachedRef != null) {
|
||||
LOG.error(element + " is invalid and yet it is still cached (inside PsiType): " + cachedRef);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
});
|
||||
private <T extends PsiExpression> PsiType getCachedType(T expr) {
|
||||
Reference<PsiType> reference = myCalculatedTypes.get(expr);
|
||||
return reference == null ? null : reference.get();
|
||||
}
|
||||
|
||||
@Nullable
|
||||
|
||||
@@ -41,8 +41,7 @@ public interface JavaElementType {
|
||||
private final Constructor<? extends ASTNode> myConstructor;
|
||||
|
||||
private JavaCompositeElementType(@NonNls final String debugName, final Class<? extends ASTNode> nodeClass) {
|
||||
super(debugName);
|
||||
myConstructor = ReflectionUtil.getDefaultConstructor(nodeClass);
|
||||
this(debugName, nodeClass, false);
|
||||
}
|
||||
|
||||
private JavaCompositeElementType(@NonNls final String debugName, final Class<? extends ASTNode> nodeClass, final boolean leftBound) {
|
||||
|
||||
+2
-19
@@ -17,7 +17,6 @@ package com.intellij.psi.impl.source.tree.java;
|
||||
|
||||
import com.intellij.lang.ASTNode;
|
||||
import com.intellij.openapi.diagnostic.Logger;
|
||||
import com.intellij.openapi.progress.ProgressIndicatorProvider;
|
||||
import com.intellij.psi.*;
|
||||
import com.intellij.psi.impl.source.resolve.JavaResolveCache;
|
||||
import com.intellij.psi.impl.source.tree.ChildRole;
|
||||
@@ -33,6 +32,8 @@ import org.jetbrains.annotations.NotNull;
|
||||
public class PsiBinaryExpressionImpl extends ExpressionPsiElement implements PsiBinaryExpression {
|
||||
private static final Logger LOG = Logger.getInstance("#com.intellij.psi.impl.source.tree.java.PsiBinaryExpressionImpl");
|
||||
|
||||
/** used via reflection in {@link com.intellij.psi.impl.source.tree.JavaElementType.JavaCompositeElementType#JavaCompositeElementType(java.lang.String, java.lang.Class)} */
|
||||
@SuppressWarnings("UnusedDeclaration")
|
||||
public PsiBinaryExpressionImpl() {
|
||||
this(JavaElementType.BINARY_EXPRESSION);
|
||||
}
|
||||
@@ -79,24 +80,6 @@ public class PsiBinaryExpressionImpl extends ExpressionPsiElement implements Psi
|
||||
PsiType type = TypeConversionUtil.calcTypeForBinaryExpression(null, rType, sign, false);
|
||||
if (type != TypeConversionUtil.NULL_TYPE) return type;
|
||||
|
||||
if (lOperand instanceof PsiBinaryExpressionImpl && !JavaResolveCache.getInstance(param.getProject()).isTypeCached(lOperand)) {
|
||||
// cache all intermediate expression types from bottom up
|
||||
PsiBinaryExpressionImpl topLevel = param;
|
||||
PsiElement element = param;
|
||||
while (element instanceof PsiBinaryExpressionImpl) {
|
||||
topLevel = (PsiBinaryExpressionImpl)element;
|
||||
element = element.getParent();
|
||||
}
|
||||
topLevel.accept(new JavaRecursiveElementWalkingVisitor() {
|
||||
@Override
|
||||
protected void elementFinished(PsiElement element) {
|
||||
if (element instanceof PsiExpression) {
|
||||
ProgressIndicatorProvider.checkCanceled();
|
||||
((PsiExpression)element).getType();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
PsiType lType = lOperand.getType();
|
||||
return TypeConversionUtil.calcTypeForBinaryExpression(lType, rType, sign, true);
|
||||
}
|
||||
|
||||
+14
@@ -0,0 +1,14 @@
|
||||
// "Generate delegated method with default parameter value" "true"
|
||||
class Test {
|
||||
/**
|
||||
*/
|
||||
void foo() {
|
||||
foo();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param i
|
||||
*/
|
||||
void foo(int ii){
|
||||
}
|
||||
}
|
||||
+8
@@ -0,0 +1,8 @@
|
||||
// "Generate delegated method with default parameter value" "true"
|
||||
class Test {
|
||||
/**
|
||||
* @param i
|
||||
*/
|
||||
void foo(int i<caret>i){
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
public class ChangeClassSignatureAddParameter {
|
||||
|
||||
public void test(Object object) {
|
||||
if (object instanceof MyClass) {
|
||||
MyClass myClass = (MyClass)object;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class My<caret>Class {
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
public class ChangeClassSignatureAddParameter {
|
||||
|
||||
public void test(Object object) {
|
||||
if (object instanceof MyClass) {
|
||||
MyClass<String> myClass = (MyClass<String>)object;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class MyClass<T> {
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
public class A {
|
||||
private static final class Inner {
|
||||
public final String string;
|
||||
|
||||
public Inner(Integer param) {
|
||||
string = param.toString();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
public class A {
|
||||
private static final class Inner {
|
||||
public Inner(Integer param) {
|
||||
String s<caret>tr = param.toString();
|
||||
}
|
||||
}
|
||||
}
|
||||
+2
@@ -1,5 +1,7 @@
|
||||
package p1;
|
||||
|
||||
import zzz.bbb.*;
|
||||
|
||||
class C {
|
||||
zzz.bbb.AAA a = new zzz.bbb.AAA();
|
||||
}
|
||||
@@ -45,7 +45,7 @@ public class AddAnnotationFixTest extends UsefulTestCase {
|
||||
@Override
|
||||
public void setUp() throws Exception {
|
||||
super.setUp();
|
||||
final TestFixtureBuilder<IdeaProjectTestFixture> projectBuilder = IdeaTestFixtureFactory.getFixtureFactory().createFixtureBuilder();
|
||||
final TestFixtureBuilder<IdeaProjectTestFixture> projectBuilder = IdeaTestFixtureFactory.getFixtureFactory().createFixtureBuilder(getName());
|
||||
|
||||
myFixture = JavaTestFixtureFactory.getFixtureFactory().createCodeInsightFixture(projectBuilder.getFixture());
|
||||
final String dataPath = PathManagerEx.getTestDataPath() + "/codeInsight/externalAnnotations";
|
||||
|
||||
@@ -22,6 +22,7 @@ import com.intellij.psi.impl.source.tree.java.MethodElement
|
||||
import com.intellij.testFramework.LeakHunter
|
||||
import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase
|
||||
import com.intellij.util.Processor
|
||||
import com.intellij.codeInspection.defaultFileTemplateUsage.DefaultFileTemplateUsageInspection
|
||||
|
||||
/**
|
||||
* @author peter
|
||||
@@ -74,4 +75,14 @@ class AstLeaksTest extends LightCodeInsightFixtureTestCase {
|
||||
LeakHunter.checkLeak(sup, MethodElement)
|
||||
}
|
||||
|
||||
public void "test no hard refs to Default File Template inspection internal AST"() {
|
||||
myFixture.addFileToProject('sup.java', 'class Super { void bar() {} }')
|
||||
PsiJavaFile foo = myFixture.addFileToProject('a.java', 'class Foo { void bar() { bar(); } }')
|
||||
myFixture.configureFromExistingVirtualFile(foo.virtualFile)
|
||||
myFixture.enableInspections(new DefaultFileTemplateUsageInspection())
|
||||
myFixture.doHighlighting()
|
||||
|
||||
LeakHunter.checkLeak(foo.classes[0], MethodElement, { MethodElement node -> !node.psi.physical } as Processor<MethodElement>)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -35,11 +35,11 @@ class StubAstSwitchTest extends LightCodeInsightFixtureTestCase {
|
||||
def oldCount = psiManager.modificationTracker.javaStructureModificationCount
|
||||
|
||||
ApplicationManager.application.runWriteAction { file.virtualFile.setBinaryContent(file.virtualFile.contentsToByteArray()) }
|
||||
assert file.stub
|
||||
|
||||
assert psiManager.modificationTracker.javaStructureModificationCount != oldCount
|
||||
|
||||
assert !cls.valid
|
||||
assert file.stub
|
||||
assert cls != PsiTreeUtil.findElementOfClassAtOffset(file, 1, PsiClass, false)
|
||||
assert !file.stub
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@ package com.intellij.psi.impl.file.impl;
|
||||
|
||||
import com.intellij.psi.PsiTreeChangeEvent;
|
||||
import com.intellij.psi.PsiTreeChangeListener;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* @author dsl
|
||||
@@ -14,62 +15,62 @@ class EventsTestListener implements PsiTreeChangeListener {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void beforeChildAddition(PsiTreeChangeEvent event) {
|
||||
public void beforeChildAddition(@NotNull PsiTreeChangeEvent event) {
|
||||
myBuffer.append("beforeChildAddition\n");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void beforeChildRemoval(PsiTreeChangeEvent event) {
|
||||
public void beforeChildRemoval(@NotNull PsiTreeChangeEvent event) {
|
||||
myBuffer.append("beforeChildRemoval\n");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void beforeChildReplacement(PsiTreeChangeEvent event) {
|
||||
public void beforeChildReplacement(@NotNull PsiTreeChangeEvent event) {
|
||||
myBuffer.append("beforeChildReplacement\n");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void beforeChildMovement(PsiTreeChangeEvent event) {
|
||||
public void beforeChildMovement(@NotNull PsiTreeChangeEvent event) {
|
||||
myBuffer.append("beforeChildMovement\n");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void beforeChildrenChange(PsiTreeChangeEvent event) {
|
||||
public void beforeChildrenChange(@NotNull PsiTreeChangeEvent event) {
|
||||
myBuffer.append("beforeChildrenChange\n");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void beforePropertyChange(PsiTreeChangeEvent event) {
|
||||
public void beforePropertyChange(@NotNull PsiTreeChangeEvent event) {
|
||||
myBuffer.append("beforePropertyChange\n");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void childAdded(PsiTreeChangeEvent event) {
|
||||
public void childAdded(@NotNull PsiTreeChangeEvent event) {
|
||||
myBuffer.append("childAdded\n");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void childRemoved(PsiTreeChangeEvent event) {
|
||||
public void childRemoved(@NotNull PsiTreeChangeEvent event) {
|
||||
myBuffer.append("childRemoved\n");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void childReplaced(PsiTreeChangeEvent event) {
|
||||
public void childReplaced(@NotNull PsiTreeChangeEvent event) {
|
||||
myBuffer.append("childReplaced\n");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void childrenChanged(PsiTreeChangeEvent event) {
|
||||
public void childrenChanged(@NotNull PsiTreeChangeEvent event) {
|
||||
myBuffer.append("childrenChanged\n");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void childMoved(PsiTreeChangeEvent event) {
|
||||
public void childMoved(@NotNull PsiTreeChangeEvent event) {
|
||||
myBuffer.append("childMoved\n");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void propertyChanged(PsiTreeChangeEvent event) {
|
||||
public void propertyChanged(@NotNull PsiTreeChangeEvent event) {
|
||||
myBuffer.append("propertyChanged\n");
|
||||
}
|
||||
}
|
||||
|
||||
+3
-2
@@ -31,6 +31,7 @@ import com.intellij.psi.PsiTreeChangeAdapter;
|
||||
import com.intellij.psi.PsiTreeChangeEvent;
|
||||
import com.intellij.psi.search.GlobalSearchScope;
|
||||
import com.intellij.testFramework.PsiTestCase;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
@@ -78,12 +79,12 @@ public class InvalidateClassFileTest extends PsiTestCase {
|
||||
final boolean[] notified = new boolean[] {false};
|
||||
final PsiTreeChangeAdapter listener = new PsiTreeChangeAdapter() {
|
||||
@Override
|
||||
public void childRemoved(PsiTreeChangeEvent event) {
|
||||
public void childRemoved(@NotNull PsiTreeChangeEvent event) {
|
||||
notified[0] = true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void childrenChanged(PsiTreeChangeEvent event) {
|
||||
public void childrenChanged(@NotNull PsiTreeChangeEvent event) {
|
||||
notified[0] = true;
|
||||
}
|
||||
};
|
||||
|
||||
@@ -21,6 +21,7 @@ import com.intellij.psi.search.GlobalSearchScope;
|
||||
import com.intellij.testFramework.PsiTestCase;
|
||||
import com.intellij.util.io.ReadOnlyAttributeUtil;
|
||||
import com.intellij.util.WaitFor;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
@@ -529,7 +530,7 @@ public class PsiEventsTest extends PsiTestCase {
|
||||
final VirtualFile virtualFile = createFile("a.xml", "<tag/>").getVirtualFile();
|
||||
final PsiTreeChangeAdapter listener = new PsiTreeChangeAdapter() {
|
||||
@Override
|
||||
public void propertyChanged(PsiTreeChangeEvent event) {
|
||||
public void propertyChanged(@NotNull PsiTreeChangeEvent event) {
|
||||
getJavaFacade().findClass("XXX", GlobalSearchScope.allScope(myProject));
|
||||
}
|
||||
};
|
||||
@@ -544,67 +545,67 @@ public class PsiEventsTest extends PsiTestCase {
|
||||
public void testBeforeAfterChildrenChange() throws Throwable {
|
||||
listener = new PsiTreeChangeListener() {
|
||||
@Override
|
||||
public void beforeChildAddition(PsiTreeChangeEvent event) {
|
||||
public void beforeChildAddition(@NotNull PsiTreeChangeEvent event) {
|
||||
logEvent(event);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void beforeChildRemoval(PsiTreeChangeEvent event) {
|
||||
public void beforeChildRemoval(@NotNull PsiTreeChangeEvent event) {
|
||||
logEvent(event);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void beforeChildReplacement(PsiTreeChangeEvent event) {
|
||||
public void beforeChildReplacement(@NotNull PsiTreeChangeEvent event) {
|
||||
logEvent(event);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void beforeChildMovement(PsiTreeChangeEvent event) {
|
||||
public void beforeChildMovement(@NotNull PsiTreeChangeEvent event) {
|
||||
logEvent(event);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void beforeChildrenChange(PsiTreeChangeEvent event) {
|
||||
public void beforeChildrenChange(@NotNull PsiTreeChangeEvent event) {
|
||||
logEvent(event);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void beforePropertyChange(PsiTreeChangeEvent event) {
|
||||
public void beforePropertyChange(@NotNull PsiTreeChangeEvent event) {
|
||||
logEvent(event);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void childAdded(PsiTreeChangeEvent event) {
|
||||
public void childAdded(@NotNull PsiTreeChangeEvent event) {
|
||||
logEvent(event);
|
||||
assertBeforeEventFired(event);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void childRemoved(PsiTreeChangeEvent event) {
|
||||
public void childRemoved(@NotNull PsiTreeChangeEvent event) {
|
||||
logEvent(event);
|
||||
assertBeforeEventFired(event);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void childReplaced(PsiTreeChangeEvent event) {
|
||||
public void childReplaced(@NotNull PsiTreeChangeEvent event) {
|
||||
logEvent(event);
|
||||
assertBeforeEventFired(event);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void childrenChanged(PsiTreeChangeEvent event) {
|
||||
public void childrenChanged(@NotNull PsiTreeChangeEvent event) {
|
||||
logEvent(event);
|
||||
assertBeforeEventFired(event);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void childMoved(PsiTreeChangeEvent event) {
|
||||
public void childMoved(@NotNull PsiTreeChangeEvent event) {
|
||||
logEvent(event);
|
||||
assertBeforeEventFired(event);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void propertyChanged(PsiTreeChangeEvent event) {
|
||||
public void propertyChanged(@NotNull PsiTreeChangeEvent event) {
|
||||
logEvent(event);
|
||||
assertBeforeEventFired(event);
|
||||
}
|
||||
|
||||
@@ -1,12 +1,15 @@
|
||||
package com.intellij.refactoring;
|
||||
|
||||
import com.intellij.JavaTestUtil;
|
||||
import com.intellij.psi.PsiClass;
|
||||
import com.intellij.psi.PsiPrimitiveType;
|
||||
import com.intellij.psi.PsiType;
|
||||
import com.intellij.refactoring.introduceField.BaseExpressionToFieldHandler;
|
||||
import com.intellij.refactoring.util.CommonRefactoringUtil;
|
||||
import com.intellij.testFramework.LightCodeInsightTestCase;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author ven
|
||||
*/
|
||||
@@ -115,4 +118,16 @@ public class IntroduceFieldInSameClassTest extends LightCodeInsightTestCase {
|
||||
performRefactoring(BaseExpressionToFieldHandler.InitializationPlace.IN_FIELD_DECLARATION, false);
|
||||
checkResultByFile("/refactoring/introduceField/afterLocalVarAnnotations.java");
|
||||
}
|
||||
|
||||
public void testStaticFieldInInnerClass() throws Exception {
|
||||
configureByFile("/refactoring/introduceField/beforeStaticFieldInInnerClass.java");
|
||||
new MockIntroduceFieldHandler(BaseExpressionToFieldHandler.InitializationPlace.IN_CURRENT_METHOD, false){
|
||||
@Override
|
||||
protected int getChosenClassIndex(List<PsiClass> classes) {
|
||||
return 0;
|
||||
}
|
||||
}.invoke(getProject(), myEditor, myFile, null);
|
||||
checkResultByFile("/refactoring/introduceField/afterStaticFieldInInnerClass.java");
|
||||
}
|
||||
|
||||
}
|
||||
+11
@@ -30,6 +30,17 @@ public class ChangeClassSignatureTest extends LightRefactoringTestCase {
|
||||
});
|
||||
}
|
||||
|
||||
public void testInstanceOf() throws Exception {
|
||||
doTest(new GenParams() {
|
||||
@Override
|
||||
public TypeParameterInfo[] gen(PsiClass aClass) throws IncorrectOperationException {
|
||||
return new TypeParameterInfo[]{
|
||||
new TypeParameterInfo(aClass, "T", "java.lang.String")
|
||||
};
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public void testSubstituteParamInsideClass() throws Exception {
|
||||
doTest(new GenParams() {
|
||||
@Override
|
||||
|
||||
@@ -30,6 +30,7 @@ import com.intellij.psi.PsiManager;
|
||||
import com.intellij.psi.search.GlobalSearchScope;
|
||||
import com.intellij.psi.search.PsiShortNamesCache;
|
||||
import com.intellij.util.ui.UIUtil;
|
||||
import org.jetbrains.annotations.NonNls;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.awt.*;
|
||||
@@ -40,6 +41,9 @@ import java.awt.*;
|
||||
* Time: 8:36 PM
|
||||
*/
|
||||
public class ExceptionWorker {
|
||||
@NonNls private static final String AT = "at";
|
||||
private static final String AT_PREFIX = AT + " ";
|
||||
private static final String STANDALONE_AT = " " + AT + " ";
|
||||
|
||||
private static final TextAttributes HYPERLINK_ATTRIBUTES = EditorColorsManager
|
||||
.getInstance().getGlobalScheme().getAttributes(CodeInsightColors.HYPERLINK_ATTRIBUTES);
|
||||
@@ -73,12 +77,12 @@ public class ExceptionWorker {
|
||||
|
||||
final int lparenthIndex = myInfo.third.getStartOffset();
|
||||
final int rparenthIndex = myInfo.third.getEndOffset();
|
||||
final String fileAndLine = line.substring(lparenthIndex + 1, rparenthIndex);
|
||||
final String fileAndLine = line.substring(lparenthIndex + 1, rparenthIndex).trim();
|
||||
|
||||
final int colonIndex = fileAndLine.lastIndexOf(':');
|
||||
if (colonIndex <= 0) return;
|
||||
if (colonIndex < 0) return;
|
||||
|
||||
final String lineString = fileAndLine.substring(colonIndex + 1).trim();
|
||||
final String lineString = fileAndLine.substring(colonIndex + 1);
|
||||
try {
|
||||
final int lineNumber = Integer.parseInt(lineString);
|
||||
final PsiManager manager = PsiManager.getInstance(myProject);
|
||||
@@ -142,18 +146,34 @@ public class ExceptionWorker {
|
||||
return myInfo;
|
||||
}
|
||||
|
||||
//todo [roma] regexp
|
||||
@Nullable
|
||||
static Trinity<TextRange, TextRange, TextRange> parseExceptionLine(final String line) {
|
||||
int lparenIdx = line.indexOf('(');
|
||||
int rparenIdx = line.indexOf(')', lparenIdx + 1);
|
||||
if (lparenIdx < 0 || rparenIdx <= lparenIdx) return null;
|
||||
int startIdx;
|
||||
if (line.startsWith(AT_PREFIX)){
|
||||
startIdx = 0;
|
||||
}
|
||||
else{
|
||||
startIdx = line.indexOf(STANDALONE_AT);
|
||||
if (startIdx < 0) {
|
||||
startIdx = line.indexOf(AT_PREFIX);
|
||||
}
|
||||
|
||||
int dotIdx = line.lastIndexOf('.', lparenIdx);
|
||||
int startIdx = handleSpaces(line, dotIdx, -1, false);
|
||||
if (startIdx == dotIdx) return null;
|
||||
if (startIdx < 0) {
|
||||
startIdx = -1;
|
||||
}
|
||||
}
|
||||
|
||||
final int lparenIdx = line.indexOf('(', startIdx);
|
||||
if (lparenIdx < 0) return null;
|
||||
final int dotIdx = line.lastIndexOf('.', lparenIdx);
|
||||
if (dotIdx < 0 || dotIdx < startIdx) return null;
|
||||
|
||||
final int rparenIdx = line.indexOf(')', lparenIdx);
|
||||
if (rparenIdx < 0) return null;
|
||||
|
||||
// class, method, link
|
||||
return Trinity.create(new TextRange(startIdx + 1, handleSpaces(line, dotIdx, -1, true)),
|
||||
return Trinity.create(new TextRange(startIdx + 1 + (startIdx >= 0 ? AT.length() : 0), handleSpaces(line, dotIdx, -1, true)),
|
||||
new TextRange(handleSpaces(line, dotIdx + 1, 1, true), handleSpaces(line, lparenIdx + 1, -1, true)),
|
||||
new TextRange(lparenIdx, rparenIdx));
|
||||
}
|
||||
|
||||
@@ -87,7 +87,15 @@ public class IncProjectBuilder {
|
||||
CompileContext context = null;
|
||||
try {
|
||||
try {
|
||||
context = createContext(scope, isMake, isProjectRebuild);
|
||||
if (myProjectDescriptor.dataManager.versionDiffers()) {
|
||||
myMessageDispatcher.processMessage(new CompilerMessage(
|
||||
COMPILE_SERVER_NAME, BuildMessage.Kind.INFO, "Dependency data format has changed, project rebuild required"
|
||||
));
|
||||
context = createContextForForcedRebuild(scope, isMake, isProjectRebuild);
|
||||
}
|
||||
else {
|
||||
context = createContext(scope, isMake, isProjectRebuild);
|
||||
}
|
||||
runBuild(context);
|
||||
}
|
||||
catch (ProjectBuildException e) {
|
||||
@@ -100,20 +108,14 @@ public class IncProjectBuilder {
|
||||
e.getMessage())
|
||||
);
|
||||
flushContext(context);
|
||||
if (isMake || isProjectRebuild) {
|
||||
context = createContext(new AllProjectScope(scope.getProject(), scope.getArtifacts(), true), false, true);
|
||||
}
|
||||
else {
|
||||
//in case of forced compilation keep the scope, but remove all caches
|
||||
context = createContext(scope, false, false);
|
||||
cleanOutputRoots(context);
|
||||
}
|
||||
context = createContextForForcedRebuild(scope, isMake, isProjectRebuild);
|
||||
runBuild(context);
|
||||
}
|
||||
else {
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
myProjectDescriptor.dataManager.saveVersion();
|
||||
}
|
||||
catch (ProjectBuildException e) {
|
||||
final Throwable cause = e.getCause();
|
||||
@@ -133,6 +135,19 @@ public class IncProjectBuilder {
|
||||
}
|
||||
}
|
||||
|
||||
private CompileContext createContextForForcedRebuild(CompileScope scope, boolean isMake, boolean isProjectRebuild) throws ProjectBuildException {
|
||||
final CompileContext context;
|
||||
if (isMake || isProjectRebuild) {
|
||||
context = createContext(new AllProjectScope(scope.getProject(), scope.getArtifacts(), true), false, true);
|
||||
}
|
||||
else {
|
||||
//in case of forced compilation keep the scope, but remove all caches
|
||||
context = createContext(scope, false, false);
|
||||
cleanOutputRoots(context);
|
||||
}
|
||||
return context;
|
||||
}
|
||||
|
||||
private static void flushContext(CompileContext context) {
|
||||
if (context != null) {
|
||||
context.getTimestampStorage().force();
|
||||
|
||||
@@ -8,8 +8,7 @@ import org.jetbrains.jps.Module;
|
||||
import org.jetbrains.jps.ModuleChunk;
|
||||
import org.jetbrains.jps.incremental.artifacts.ArtifactsBuildData;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.io.*;
|
||||
import java.util.HashMap;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
@@ -19,6 +18,7 @@ import java.util.Map;
|
||||
* Date: 10/7/11
|
||||
*/
|
||||
public class BuildDataManager {
|
||||
private static final int VERSION = 1;
|
||||
private static final Logger LOG = Logger.getInstance("#org.jetbrains.jps.incremental.storage.BuildDataManager");
|
||||
private static final String SRC_TO_OUTPUTS_STORAGE = "src-out";
|
||||
private static final String SRC_TO_FORM_STORAGE = "src-form";
|
||||
@@ -32,12 +32,14 @@ public class BuildDataManager {
|
||||
private final ArtifactsBuildData myArtifactsBuildData;
|
||||
private final Mappings myMappings;
|
||||
private final File myDataStorageRoot;
|
||||
private final File myVersionFile;
|
||||
|
||||
public BuildDataManager(final File dataStorageRoot, final boolean useMemoryTempCaches) throws IOException {
|
||||
myDataStorageRoot = dataStorageRoot;
|
||||
mySrcToFormMap = new SourceToFormMapping(new File(getSourceToFormsRoot(), "data"));
|
||||
myMappings = new Mappings(getMappingsRoot(), useMemoryTempCaches);
|
||||
myArtifactsBuildData = new ArtifactsBuildData(new File(dataStorageRoot, "artifacts"));
|
||||
myVersionFile = new File(myDataStorageRoot, "version.dat");
|
||||
}
|
||||
|
||||
public SourceToOutputMapping getSourceToOutputMap(String moduleName, boolean testSources) throws IOException {
|
||||
@@ -237,4 +239,50 @@ public class BuildDataManager {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private Boolean myVersionDiffers = null;
|
||||
|
||||
public boolean versionDiffers() {
|
||||
final Boolean cached = myVersionDiffers;
|
||||
if (cached != null) {
|
||||
return cached;
|
||||
}
|
||||
try {
|
||||
final DataInputStream is = new DataInputStream(new FileInputStream(myVersionFile));
|
||||
try {
|
||||
final boolean diff = is.readInt() != VERSION;
|
||||
myVersionDiffers = diff;
|
||||
return diff;
|
||||
}
|
||||
finally {
|
||||
is.close();
|
||||
}
|
||||
}
|
||||
catch (FileNotFoundException ignored) {
|
||||
return false; // treat it as a new dir
|
||||
}
|
||||
catch (IOException ex) {
|
||||
LOG.info(ex);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public void saveVersion() {
|
||||
final Boolean differs = myVersionDiffers;
|
||||
if (differs == null || differs) {
|
||||
try {
|
||||
FileUtil.createIfDoesntExist(myVersionFile);
|
||||
final DataOutputStream os = new DataOutputStream(new FileOutputStream(myVersionFile));
|
||||
try {
|
||||
os.writeInt(VERSION);
|
||||
myVersionDiffers = Boolean.FALSE;
|
||||
}
|
||||
finally {
|
||||
os.close();
|
||||
}
|
||||
}
|
||||
catch (IOException ignored) {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,29 +15,24 @@
|
||||
*/
|
||||
package org.jetbrains.jps.server;
|
||||
|
||||
import com.google.common.cache.CacheBuilder;
|
||||
import com.google.protobuf.Message;
|
||||
import com.intellij.compiler.notNullVerification.NotNullVerifyingInstrumenter;
|
||||
import com.intellij.openapi.application.PathManager;
|
||||
import com.intellij.openapi.util.io.FileUtil;
|
||||
import com.intellij.uiDesigner.compiler.AlienFormFileException;
|
||||
import com.intellij.uiDesigner.core.GridConstraints;
|
||||
import com.jgoodies.forms.layout.CellConstraints;
|
||||
import com.sun.jna.Pointer;
|
||||
import gnu.trove.TIntHash;
|
||||
import net.n3.nanoxml.IXMLBuilder;
|
||||
import org.codehaus.groovy.GroovyException;
|
||||
import org.jboss.netty.util.Version;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import org.jetbrains.jps.MacroExpander;
|
||||
import org.jetbrains.jps.javac.JavacServer;
|
||||
import com.intellij.openapi.util.io.FileUtilRt;
|
||||
import org.objectweb.asm.ClassWriter;
|
||||
import org.objectweb.asm.commons.EmptyVisitor;
|
||||
|
||||
import javax.tools.*;
|
||||
import java.io.File;
|
||||
import java.util.ArrayList;
|
||||
import java.util.LinkedHashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
* @author Eugene Zhuravlev
|
||||
@@ -88,24 +83,18 @@ public class ClasspathBootstrap {
|
||||
public static List<File> getCompileServerApplicationClasspath() {
|
||||
final Set<File> cp = new LinkedHashSet<File>();
|
||||
cp.add(getResourcePath(Server.class));
|
||||
cp.add(getResourcePath(com.google.protobuf.Message.class)); // protobuf
|
||||
cp.add(getResourcePath(org.jboss.netty.bootstrap.Bootstrap.class)); // netty
|
||||
cp.add(getResourcePath(TIntHash.class)); // trove
|
||||
cp.add(getResourcePath(FileUtilRt.class)); // util-rt module
|
||||
cp.add(getResourcePath(FileUtil.class)); // util module
|
||||
cp.add(getResourcePath(Pointer.class)); // jna.jar
|
||||
cp.add(getResourcePath(CacheBuilder.class)); // guava
|
||||
for (String path : PathManager.getUtilClassPath()) { cp.add(new File(path)); } // util
|
||||
cp.add(getResourcePath(Message.class)); // protobuf
|
||||
cp.add(getResourcePath(Version.class)); // netty
|
||||
cp.add(getResourcePath(ClassWriter.class)); // asm
|
||||
cp.add(getResourcePath(org.objectweb.asm.commons.EmptyVisitor.class)); // asm-commons
|
||||
cp.add(getResourcePath(EmptyVisitor.class)); // asm-commons
|
||||
cp.add(getResourcePath(MacroExpander.class)); // jps-model
|
||||
cp.add(getResourcePath(AlienFormFileException.class)); // forms-compiler
|
||||
cp.add(getResourcePath(GroovyException.class)); // groovy
|
||||
cp.add(getResourcePath(org.jdom.input.SAXBuilder.class)); // jdom
|
||||
cp.add(getResourcePath(GridConstraints.class)); // forms-rt
|
||||
cp.add(getResourcePath(CellConstraints.class)); // jgoodies-forms
|
||||
cp.add(getResourcePath(NotNullVerifyingInstrumenter.class)); // not-null
|
||||
cp.add(getResourcePath(IXMLBuilder.class)); // nano-xml
|
||||
cp.add(getResourcePath(org.apache.log4j.Logger.class)); // log4j
|
||||
|
||||
final Class<StandardJavaFileManager> optimizedFileManagerClass = getOptimizedFileManagerClass();
|
||||
if (optimizedFileManagerClass != null) {
|
||||
@@ -133,14 +122,9 @@ public class ClasspathBootstrap {
|
||||
public static List<File> getJavacServerClasspath() {
|
||||
final Set<File> cp = new LinkedHashSet<File>();
|
||||
cp.add(getResourcePath(JavacServer.class));
|
||||
cp.add(getResourcePath(com.google.protobuf.Message.class)); // protobuf
|
||||
cp.add(getResourcePath(org.jboss.netty.bootstrap.Bootstrap.class)); // netty
|
||||
cp.add(getResourcePath(TIntHash.class)); // trove
|
||||
cp.add(getResourcePath(FileUtilRt.class)); // util-rt module
|
||||
cp.add(getResourcePath(FileUtil.class)); // util module
|
||||
cp.add(getResourcePath(Pointer.class)); // jna.jar
|
||||
cp.add(getResourcePath(CacheBuilder.class)); // guava
|
||||
cp.add(getResourcePath(org.jdom.input.SAXBuilder.class)); // jdom
|
||||
for (String path : PathManager.getUtilClassPath()) { cp.add(new File(path)); } // util
|
||||
cp.add(getResourcePath(Message.class)); // protobuf
|
||||
cp.add(getResourcePath(Version.class)); // netty
|
||||
|
||||
final Class<StandardJavaFileManager> optimizedFileManagerClass = getOptimizedFileManagerClass();
|
||||
if (optimizedFileManagerClass != null) {
|
||||
@@ -178,5 +162,4 @@ public class ClasspathBootstrap {
|
||||
public static File getResourcePath(Class aClass) {
|
||||
return new File(PathManager.getResourceRoot(aClass, "/" + aClass.getName().replace('.', '/') + ".class"));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -130,12 +130,15 @@ public class Server {
|
||||
}
|
||||
|
||||
private void doStop(long elapsedTime) {
|
||||
try {
|
||||
System.out.println("Stopping compile server; reason: no pings from client received in " + elapsedTime + " ms");
|
||||
myMessageHandler.cancelAllBuildsAndClearState();
|
||||
}
|
||||
finally {
|
||||
stop();
|
||||
if (!myMessageHandler.hasRunningBuilds()) {
|
||||
try {
|
||||
System.out.println("Stopping compile server; reason: no pings from client received in " + elapsedTime + " ms");
|
||||
myMessageHandler.cancelAllBuildsAndClearState();
|
||||
stop();
|
||||
}
|
||||
finally {
|
||||
System.exit(0);
|
||||
}
|
||||
}
|
||||
}
|
||||
}, allowedIdlePeriod, allowedIdlePeriod, TimeUnit.MILLISECONDS);
|
||||
|
||||
@@ -1070,10 +1070,12 @@ public class Mappings {
|
||||
|
||||
}
|
||||
else {
|
||||
final Option<Boolean> inheritorOf = self.isInheritorOf(cc.name, it.name);
|
||||
|
||||
debug("Method: ", mm.name);
|
||||
debug("Class : ", cc.name);
|
||||
|
||||
if (overrides.satisfy(mm)) {
|
||||
if (overrides.satisfy(mm) && inheritorOf.isValue() && inheritorOf.value()) {
|
||||
debug("Current method overrides that found");
|
||||
|
||||
final Option<Boolean> subtypeOf = u.isSubtypeOf(mm.type, m.type);
|
||||
@@ -1099,8 +1101,6 @@ public class Mappings {
|
||||
|
||||
final Collection<DependencyContext.S> yetPropagated = self.propagateMethodAccess(mm.name, it.name);
|
||||
|
||||
final Option<Boolean> inheritorOf = self.isInheritorOf(cc.name, it.name);
|
||||
|
||||
if (inheritorOf.isValue() && inheritorOf.value()) {
|
||||
final Collection<DependencyContext.S> deps = myClassToClassDependency.get(cc.name);
|
||||
|
||||
|
||||
@@ -15,6 +15,8 @@
|
||||
*/
|
||||
package com.intellij.psi;
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.EventListener;
|
||||
|
||||
/**
|
||||
@@ -31,7 +33,7 @@ public interface PsiTreeChangeListener extends EventListener {
|
||||
*
|
||||
* @param event the event object describing the change.
|
||||
*/
|
||||
void beforeChildAddition(PsiTreeChangeEvent event);
|
||||
void beforeChildAddition(@NotNull PsiTreeChangeEvent event);
|
||||
|
||||
/**
|
||||
* Invoked just before removal of a child from the tree.<br>
|
||||
@@ -40,7 +42,7 @@ public interface PsiTreeChangeListener extends EventListener {
|
||||
*
|
||||
* @param event the event object describing the change.
|
||||
*/
|
||||
void beforeChildRemoval(PsiTreeChangeEvent event);
|
||||
void beforeChildRemoval(@NotNull PsiTreeChangeEvent event);
|
||||
|
||||
/**
|
||||
* Invoked just before replacement of a child in the tree by another element.<br>
|
||||
@@ -49,7 +51,7 @@ public interface PsiTreeChangeListener extends EventListener {
|
||||
*
|
||||
* @param event the event object describing the change.
|
||||
*/
|
||||
void beforeChildReplacement(PsiTreeChangeEvent event);
|
||||
void beforeChildReplacement(@NotNull PsiTreeChangeEvent event);
|
||||
|
||||
/**
|
||||
* Invoked just before movement of a child in the tree by changing its parent or by changing its position in the same parent.<br>
|
||||
@@ -59,7 +61,7 @@ public interface PsiTreeChangeListener extends EventListener {
|
||||
*
|
||||
* @param event the event object describing the change.
|
||||
*/
|
||||
void beforeChildMovement(PsiTreeChangeEvent event);
|
||||
void beforeChildMovement(@NotNull PsiTreeChangeEvent event);
|
||||
|
||||
/**
|
||||
* Invoked before a mass change of children of the specified node.<br>
|
||||
@@ -67,7 +69,7 @@ public interface PsiTreeChangeListener extends EventListener {
|
||||
*
|
||||
* @param event the event object describing the change.
|
||||
*/
|
||||
void beforeChildrenChange(PsiTreeChangeEvent event);
|
||||
void beforeChildrenChange(@NotNull PsiTreeChangeEvent event);
|
||||
|
||||
/**
|
||||
* Invoked just before changing of some property of an element.<br>
|
||||
@@ -77,7 +79,7 @@ public interface PsiTreeChangeListener extends EventListener {
|
||||
*
|
||||
* @param event the event object describing the change.
|
||||
*/
|
||||
void beforePropertyChange(PsiTreeChangeEvent event);
|
||||
void beforePropertyChange(@NotNull PsiTreeChangeEvent event);
|
||||
|
||||
/**
|
||||
* Invoked just after adding of a new child to the tree.<br>
|
||||
@@ -86,7 +88,7 @@ public interface PsiTreeChangeListener extends EventListener {
|
||||
*
|
||||
* @param event the event object describing the change.
|
||||
*/
|
||||
void childAdded(PsiTreeChangeEvent event);
|
||||
void childAdded(@NotNull PsiTreeChangeEvent event);
|
||||
|
||||
/**
|
||||
* Invoked just after removal of a child from the tree.<br>
|
||||
@@ -97,7 +99,7 @@ public interface PsiTreeChangeListener extends EventListener {
|
||||
*
|
||||
* @param event the event object describing the change.
|
||||
*/
|
||||
void childRemoved(PsiTreeChangeEvent event);
|
||||
void childRemoved(@NotNull PsiTreeChangeEvent event);
|
||||
|
||||
/**
|
||||
* Invoked just after replacement of a child in the tree by another element.<br>
|
||||
@@ -109,7 +111,7 @@ public interface PsiTreeChangeListener extends EventListener {
|
||||
*
|
||||
* @param event the event object describing the change.
|
||||
*/
|
||||
void childReplaced(PsiTreeChangeEvent event);
|
||||
void childReplaced(@NotNull PsiTreeChangeEvent event);
|
||||
|
||||
/**
|
||||
* Invoked after a mass change of children of the specified node.<br>
|
||||
@@ -117,7 +119,7 @@ public interface PsiTreeChangeListener extends EventListener {
|
||||
*
|
||||
* @param event the event object describing the change.
|
||||
*/
|
||||
void childrenChanged(PsiTreeChangeEvent event);
|
||||
void childrenChanged(@NotNull PsiTreeChangeEvent event);
|
||||
|
||||
/**
|
||||
* Invoked just after movement of a child in the tree by changing its parent or by changing its position in the same parent.<br>
|
||||
@@ -127,7 +129,7 @@ public interface PsiTreeChangeListener extends EventListener {
|
||||
*
|
||||
* @param event the event object describing the change.
|
||||
*/
|
||||
void childMoved(PsiTreeChangeEvent event);
|
||||
void childMoved(@NotNull PsiTreeChangeEvent event);
|
||||
|
||||
/**
|
||||
* Invoked just after changing of some property of an element.<br>
|
||||
@@ -138,5 +140,5 @@ public interface PsiTreeChangeListener extends EventListener {
|
||||
*
|
||||
* @param event the event object describing the change.
|
||||
*/
|
||||
void propertyChanged(PsiTreeChangeEvent event);
|
||||
void propertyChanged(@NotNull PsiTreeChangeEvent event);
|
||||
}
|
||||
|
||||
@@ -58,6 +58,11 @@ public abstract class IntervalTreeImpl<T extends MutableInterval> extends RedBla
|
||||
protected int delta; // delta of startOffset. getStartOffset() = myStartOffset + Sum of deltas up to root
|
||||
|
||||
private volatile long cachedDeltaUpToRoot; // field (packed to long for atomicity) containing deltaUpToRoot, node modCount and allDeltasUpAreNull flag
|
||||
// fields are packed as following
|
||||
// private int modCount; // if it equals to the com.intellij.openapi.editor.impl.RedBlackTree.modCount then deltaUpToRoot can be used, otherwise it is expired
|
||||
// private int deltaUpToRoot; // sum of all deltas up to the root (including this node' delta). Has valid value only if modCount == IntervalTreeImpl.this.modCount
|
||||
// private boolean allDeltasUpAreNull; // true if all deltas up the tree (including this node) are 0. Has valid value only if modCount == IntervalTreeImpl.this.modCount
|
||||
|
||||
private final IntervalTreeImpl<E> myIntervalTree;
|
||||
|
||||
public IntervalNode(IntervalTreeImpl<E> intervalTree, @NotNull E key, int start, int end) {
|
||||
@@ -167,16 +172,13 @@ public abstract class IntervalTreeImpl<T extends MutableInterval> extends RedBla
|
||||
}
|
||||
|
||||
protected int computeDeltaUpToRoot() {
|
||||
return computeDeltaUpToRoot(new NodeCachedOffsets());
|
||||
}
|
||||
protected int computeDeltaUpToRoot(NodeCachedOffsets cached) {
|
||||
restart:
|
||||
while (true) { // have to restart on failure to update cached offsets in case of concurrent modification
|
||||
if (!isValid()) return 0;
|
||||
int treeModCount = myIntervalTree.modCount;
|
||||
unpackCachedValuesTo(cached);
|
||||
if (cached.modCount == treeModCount) {
|
||||
return cached.deltaUpToRoot;
|
||||
long packedOffsets = cachedDeltaUpToRoot;
|
||||
if (modCount(packedOffsets) == treeModCount) {
|
||||
return deltaUpToRoot(packedOffsets);
|
||||
}
|
||||
try {
|
||||
myIntervalTree.l.readLock().lock();
|
||||
@@ -189,10 +191,10 @@ public abstract class IntervalTreeImpl<T extends MutableInterval> extends RedBla
|
||||
int height = 0;
|
||||
long path = 0; // path to this node from the root; 0 bit means we choose left subtree, 1 bit means we choose right subtree
|
||||
while (node != treeRoot) {
|
||||
node.unpackCachedValuesTo(cached);
|
||||
if (node.isValid() && cached.modCount == treeModCount) {
|
||||
deltaUp = cached.deltaUpToRoot - node.delta;
|
||||
allDeltasAreNull = cached.allDeltasUpAreNull;
|
||||
long nodePackedOffsets = node.cachedDeltaUpToRoot;
|
||||
if (node.isValid() && modCount(nodePackedOffsets) == treeModCount) {
|
||||
deltaUp = deltaUpToRoot(nodePackedOffsets) - node.delta;
|
||||
allDeltasAreNull = allDeltasUpAreNull(nodePackedOffsets);
|
||||
break;
|
||||
}
|
||||
IntervalNode<E> parent = node.getParent();
|
||||
@@ -305,11 +307,14 @@ public abstract class IntervalTreeImpl<T extends MutableInterval> extends RedBla
|
||||
return cachedDeltaUpdater.compareAndSetLong(this, oldValue, newValue);
|
||||
}
|
||||
|
||||
public void unpackCachedValuesTo(NodeCachedOffsets t) {
|
||||
long value = cachedDeltaUpToRoot;
|
||||
t.deltaUpToRoot = (int)(value >> 33);
|
||||
t.modCount = (int)value;
|
||||
t.allDeltasUpAreNull = ((value >> 32) & 1) != 0;
|
||||
private static boolean allDeltasUpAreNull(long packedOffsets) {
|
||||
return ((packedOffsets >> 32) & 1) != 0;
|
||||
}
|
||||
private static int modCount(long packedOffsets) {
|
||||
return (int)packedOffsets;
|
||||
}
|
||||
private static int deltaUpToRoot(long packedOffsets) {
|
||||
return (int)(packedOffsets >> 33);
|
||||
}
|
||||
|
||||
@NonNls
|
||||
@@ -319,12 +324,6 @@ public abstract class IntervalTreeImpl<T extends MutableInterval> extends RedBla
|
||||
}
|
||||
}
|
||||
|
||||
static class NodeCachedOffsets {
|
||||
private int modCount; // if it equals to the com.intellij.openapi.editor.impl.RedBlackTree.modCount then deltaUpToRoot can be used, otherwise it is expired
|
||||
private int deltaUpToRoot; // sum of all deltas up to the root (including this node' delta). Has valid value only if modCount == IntervalTreeImpl.this.modCount
|
||||
private boolean allDeltasUpAreNull; // true if all deltas up the tree (including this node) are 0. Has valid value only if modCount == IntervalTreeImpl.this.modCount
|
||||
}
|
||||
|
||||
private void assertUnderWriteLock() {
|
||||
assert isAcquired(l.writeLock()) : l.writeLock();
|
||||
}
|
||||
@@ -333,12 +332,12 @@ public abstract class IntervalTreeImpl<T extends MutableInterval> extends RedBla
|
||||
return s.contains("Locked by thread");
|
||||
}
|
||||
|
||||
private void pushDeltaFromRoot(IntervalNode<T> node, NodeCachedOffsets cached) {
|
||||
private void pushDeltaFromRoot(IntervalNode<T> node) {
|
||||
if (node != null) {
|
||||
node.unpackCachedValuesTo(cached);
|
||||
if (cached.allDeltasUpAreNull && node.isValid() && cached.modCount == modCount) return;
|
||||
pushDeltaFromRoot(node.getParent(), cached);
|
||||
pushDelta(node, cached);
|
||||
long packedOffsets = node.cachedDeltaUpToRoot;
|
||||
if (IntervalNode.allDeltasUpAreNull(packedOffsets) && node.isValid() && IntervalNode.modCount(packedOffsets) == modCount) return;
|
||||
pushDeltaFromRoot(node.getParent());
|
||||
pushDelta(node);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -672,14 +671,13 @@ public abstract class IntervalTreeImpl<T extends MutableInterval> extends RedBla
|
||||
node.setRight(null);
|
||||
|
||||
List<IntervalNode<T>> gced = new SmartList<IntervalNode<T>>();
|
||||
NodeCachedOffsets cached = new NodeCachedOffsets();
|
||||
if (root == null) {
|
||||
root = node;
|
||||
}
|
||||
else {
|
||||
IntervalNode<T> current = getRoot();
|
||||
while (true) {
|
||||
pushDelta(current, cached);
|
||||
pushDelta(current);
|
||||
int compResult = compareNodes(node, 0, current, 0, gced);
|
||||
if (compResult == 0) {
|
||||
return current;
|
||||
@@ -702,7 +700,7 @@ public abstract class IntervalTreeImpl<T extends MutableInterval> extends RedBla
|
||||
node.setParent(current);
|
||||
}
|
||||
node.setCachedValues(0, true, modCount);
|
||||
correctMaxUp(node, cached);
|
||||
correctMaxUp(node);
|
||||
onInsertNode();
|
||||
keySize += node.intervals.size();
|
||||
insertCase1(node);
|
||||
@@ -782,11 +780,10 @@ public abstract class IntervalTreeImpl<T extends MutableInterval> extends RedBla
|
||||
int[] nodeCounter,
|
||||
TLongHashSet ids, boolean allDeltasUpAreNull) {
|
||||
if (root == null) return Trinity.create(Integer.MAX_VALUE,Integer.MIN_VALUE,Integer.MIN_VALUE);
|
||||
NodeCachedOffsets cached = new NodeCachedOffsets();
|
||||
root.unpackCachedValuesTo(cached);
|
||||
if (cached.modCount == modCount) {
|
||||
assert cached.allDeltasUpAreNull == (root.delta == 0 && allDeltasUpAreNull);
|
||||
assert cached.deltaUpToRoot == root.delta + deltaUpToRootExclusive;
|
||||
long packedOffsets = root.cachedDeltaUpToRoot;
|
||||
if (IntervalNode.modCount(packedOffsets) == modCount) {
|
||||
assert IntervalNode.allDeltasUpAreNull(packedOffsets) == (root.delta == 0 && allDeltasUpAreNull);
|
||||
assert IntervalNode.deltaUpToRoot(packedOffsets) == root.delta + deltaUpToRootExclusive;
|
||||
}
|
||||
T liveInterval = null;
|
||||
for (int i = root.intervals.size() - 1; i >= 0; i--) {
|
||||
@@ -839,12 +836,11 @@ public abstract class IntervalTreeImpl<T extends MutableInterval> extends RedBla
|
||||
@Override
|
||||
protected Node<T> maximumNode(Node<T> n) {
|
||||
IntervalNode<T> root = (IntervalNode<T>)n;
|
||||
NodeCachedOffsets cached = new NodeCachedOffsets();
|
||||
pushDelta(root.getParent(), cached);
|
||||
pushDelta(root, cached);
|
||||
pushDelta(root.getParent());
|
||||
pushDelta(root);
|
||||
while (root.getRight() != null) {
|
||||
root = root.getRight();
|
||||
pushDelta(root, cached);
|
||||
pushDelta(root);
|
||||
}
|
||||
return root;
|
||||
}
|
||||
@@ -906,16 +902,15 @@ public abstract class IntervalTreeImpl<T extends MutableInterval> extends RedBla
|
||||
void removeNode(@NotNull IntervalNode<T> node) {
|
||||
deleteNode(node);
|
||||
IntervalNode<T> parent = node.getParent();
|
||||
correctMaxUp(parent, new NodeCachedOffsets());
|
||||
correctMaxUp(parent);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void deleteNode(@NotNull Node<T> n) {
|
||||
assertUnderWriteLock();
|
||||
IntervalNode<T> node = (IntervalNode<T>)n;
|
||||
NodeCachedOffsets cached = new NodeCachedOffsets();
|
||||
pushDeltaFromRoot(node, cached);
|
||||
assertAllDeltasAreNull(node, cached);
|
||||
pushDeltaFromRoot(node);
|
||||
assertAllDeltasAreNull(node);
|
||||
super.deleteNode(n);
|
||||
|
||||
keySize -= node.intervals.size();
|
||||
@@ -928,10 +923,10 @@ public abstract class IntervalTreeImpl<T extends MutableInterval> extends RedBla
|
||||
}
|
||||
|
||||
// returns true if all deltas involved are still 0
|
||||
protected boolean pushDelta(IntervalNode<T> root, NodeCachedOffsets cached) {
|
||||
protected boolean pushDelta(IntervalNode<T> root) {
|
||||
if (root == null || !root.isValid()) return true;
|
||||
IntervalNode<T> parent = root.getParent();
|
||||
assertAllDeltasAreNull(parent, cached);
|
||||
assertAllDeltasAreNull(parent);
|
||||
int delta = root.delta;
|
||||
root.setCachedValues(0, true, 0);
|
||||
if (delta != 0) {
|
||||
@@ -984,7 +979,7 @@ public abstract class IntervalTreeImpl<T extends MutableInterval> extends RedBla
|
||||
//correctMaxUp(a);
|
||||
a.color = dcolor;
|
||||
d.color = acolor;
|
||||
correctMaxUp(a, new NodeCachedOffsets());
|
||||
correctMaxUp(a);
|
||||
|
||||
checkMax(false);
|
||||
assert a.delta == 0 : a.delta;
|
||||
@@ -1044,8 +1039,8 @@ public abstract class IntervalTreeImpl<T extends MutableInterval> extends RedBla
|
||||
node.maxEnd = realMax - deltaUpToRoot;
|
||||
}
|
||||
|
||||
private void correctMaxUp(IntervalNode<T> node, NodeCachedOffsets cached) {
|
||||
int delta = node == null ? 0 : node.computeDeltaUpToRoot(cached);
|
||||
private void correctMaxUp(IntervalNode<T> node) {
|
||||
int delta = node == null ? 0 : node.computeDeltaUpToRoot();
|
||||
assert delta == 0 : delta;
|
||||
while (node != null) {
|
||||
if (node.isValid()) {
|
||||
@@ -1065,12 +1060,11 @@ public abstract class IntervalTreeImpl<T extends MutableInterval> extends RedBla
|
||||
IntervalNode<T> node2 = node1.getLeft();
|
||||
IntervalNode<T> node3 = node1.getRight();
|
||||
|
||||
NodeCachedOffsets cached = new NodeCachedOffsets();
|
||||
IntervalNode<T> parent = node1.getParent();
|
||||
int deltaUp = parent == null ? 0 : parent.computeDeltaUpToRoot(cached);
|
||||
pushDelta(node1, cached);
|
||||
pushDelta(node2, cached);
|
||||
pushDelta(node3, cached);
|
||||
int deltaUp = parent == null ? 0 : parent.computeDeltaUpToRoot();
|
||||
pushDelta(node1);
|
||||
pushDelta(node2);
|
||||
pushDelta(node3);
|
||||
|
||||
super.rotateRight(node1);
|
||||
|
||||
@@ -1079,9 +1073,9 @@ public abstract class IntervalTreeImpl<T extends MutableInterval> extends RedBla
|
||||
}
|
||||
correctMax(node1, deltaUp);
|
||||
correctMax(node2, deltaUp);
|
||||
assertAllDeltasAreNull(node1, cached);
|
||||
assertAllDeltasAreNull(node2, cached);
|
||||
assertAllDeltasAreNull(node3, cached);
|
||||
assertAllDeltasAreNull(node1);
|
||||
assertAllDeltasAreNull(node2);
|
||||
assertAllDeltasAreNull(node3);
|
||||
checkMax(false);
|
||||
}
|
||||
|
||||
@@ -1092,12 +1086,11 @@ public abstract class IntervalTreeImpl<T extends MutableInterval> extends RedBla
|
||||
IntervalNode<T> node2 = node1.getLeft();
|
||||
IntervalNode<T> node3 = node1.getRight();
|
||||
|
||||
NodeCachedOffsets cached = new NodeCachedOffsets();
|
||||
IntervalNode<T> parent = node1.getParent();
|
||||
int deltaUp = parent == null ? 0 : parent.computeDeltaUpToRoot(cached);
|
||||
pushDelta(node1, cached);
|
||||
pushDelta(node2, cached);
|
||||
pushDelta(node3, cached);
|
||||
int deltaUp = parent == null ? 0 : parent.computeDeltaUpToRoot();
|
||||
pushDelta(node1);
|
||||
pushDelta(node2);
|
||||
pushDelta(node3);
|
||||
checkMax(false);
|
||||
super.rotateLeft(node1);
|
||||
|
||||
@@ -1106,9 +1099,9 @@ public abstract class IntervalTreeImpl<T extends MutableInterval> extends RedBla
|
||||
}
|
||||
correctMax(node1, deltaUp);
|
||||
correctMax(node3, deltaUp);
|
||||
assertAllDeltasAreNull(node1, cached);
|
||||
assertAllDeltasAreNull(node2, cached);
|
||||
assertAllDeltasAreNull(node3, cached);
|
||||
assertAllDeltasAreNull(node1);
|
||||
assertAllDeltasAreNull(node2);
|
||||
assertAllDeltasAreNull(node3);
|
||||
|
||||
checkMax(false);
|
||||
}
|
||||
@@ -1116,9 +1109,8 @@ public abstract class IntervalTreeImpl<T extends MutableInterval> extends RedBla
|
||||
@Override
|
||||
protected void replaceNode(@NotNull Node<T> node, Node<T> child) {
|
||||
IntervalNode<T> myNode = (IntervalNode<T>)node;
|
||||
NodeCachedOffsets cached = new NodeCachedOffsets();
|
||||
pushDelta(myNode, cached);
|
||||
pushDelta((IntervalNode<T>)child, cached);
|
||||
pushDelta(myNode);
|
||||
pushDelta((IntervalNode<T>)child);
|
||||
|
||||
super.replaceNode(node, child);
|
||||
if (child != null && myNode.isValid()) {
|
||||
@@ -1127,12 +1119,12 @@ public abstract class IntervalTreeImpl<T extends MutableInterval> extends RedBla
|
||||
}
|
||||
}
|
||||
|
||||
private void assertAllDeltasAreNull(IntervalNode<T> node, NodeCachedOffsets cached) {
|
||||
private void assertAllDeltasAreNull(IntervalNode<T> node) {
|
||||
if (node == null) return;
|
||||
if (!node.isValid()) return;
|
||||
assert node.delta == 0;
|
||||
node.unpackCachedValuesTo(cached);
|
||||
assert cached.modCount != modCount || cached.allDeltasUpAreNull;
|
||||
long packedOffsets = node.cachedDeltaUpToRoot;
|
||||
assert IntervalNode.modCount(packedOffsets) != modCount || IntervalNode.allDeltasUpAreNull(packedOffsets);
|
||||
}
|
||||
|
||||
private IntervalNode<T> findMinOverlappingWith(IntervalNode<T> root, Interval interval, int modCountBefore, int deltaUpToRootExclusive) {
|
||||
|
||||
@@ -187,7 +187,7 @@ public class RangeMarkerTree<T extends RangeMarkerEx> extends IntervalTreeImpl<T
|
||||
|
||||
modCount++;
|
||||
List<IntervalNode<T>> affected = new SmartList<IntervalNode<T>>();
|
||||
collectAffectedMarkersAndShiftSubtrees(getRoot(), e, affected, new NodeCachedOffsets());
|
||||
collectAffectedMarkersAndShiftSubtrees(getRoot(), e, affected);
|
||||
checkMax(false);
|
||||
|
||||
if (!affected.isEmpty()) {
|
||||
@@ -257,9 +257,9 @@ public class RangeMarkerTree<T extends RangeMarkerEx> extends IntervalTreeImpl<T
|
||||
// returns true if all deltas involved are still 0
|
||||
private boolean collectAffectedMarkersAndShiftSubtrees(IntervalNode<T> root,
|
||||
@NotNull DocumentEvent e,
|
||||
@NotNull List<IntervalNode<T>> affected, NodeCachedOffsets cached) {
|
||||
@NotNull List<IntervalNode<T>> affected) {
|
||||
if (root == null) return true;
|
||||
boolean norm = pushDelta(root, cached);
|
||||
boolean norm = pushDelta(root);
|
||||
|
||||
int maxEnd = root.maxEnd;
|
||||
assert root.isValid();
|
||||
@@ -284,8 +284,8 @@ public class RangeMarkerTree<T extends RangeMarkerEx> extends IntervalTreeImpl<T
|
||||
int newL = left.changeDelta(-lengthDelta);
|
||||
norm &= newL == 0;
|
||||
}
|
||||
norm &= pushDelta(root, cached);
|
||||
norm &= collectAffectedMarkersAndShiftSubtrees(left, e, affected, cached);
|
||||
norm &= pushDelta(root);
|
||||
norm &= collectAffectedMarkersAndShiftSubtrees(left, e, affected);
|
||||
correctMax(root, 0);
|
||||
}
|
||||
else {
|
||||
@@ -295,8 +295,8 @@ public class RangeMarkerTree<T extends RangeMarkerEx> extends IntervalTreeImpl<T
|
||||
root.setValid(false); //make invisible
|
||||
}
|
||||
|
||||
norm &= collectAffectedMarkersAndShiftSubtrees(root.getLeft(), e, affected, cached);
|
||||
norm &= collectAffectedMarkersAndShiftSubtrees(root.getRight(), e, affected, cached);
|
||||
norm &= collectAffectedMarkersAndShiftSubtrees(root.getLeft(), e, affected);
|
||||
norm &= collectAffectedMarkersAndShiftSubtrees(root.getRight(), e, affected);
|
||||
correctMax(root,0);
|
||||
}
|
||||
return norm;
|
||||
|
||||
@@ -249,15 +249,12 @@ public abstract class PsiFileImpl extends ElementBase implements PsiFileEx, PsiF
|
||||
return findTreeForStub(ast, stubs, stub);
|
||||
}
|
||||
|
||||
public boolean isStubBasedChildValid(@NotNull StubBasedPsiElementBase psi) {
|
||||
StubElement fileStub = getStub();
|
||||
if (fileStub != null) {
|
||||
synchronized (myStubLock) {
|
||||
fileStub = getStub();
|
||||
StubElement childStub = psi.getStub();
|
||||
if (fileStub != null && childStub != null && fileStub != childStub.getParentStub()) {
|
||||
return false;
|
||||
}
|
||||
public boolean isStubBasedChildValid(@NotNull StubBasedPsiElementBase child) {
|
||||
synchronized (myStubLock) {
|
||||
StubTree fileStub = derefStub();
|
||||
StubElement childStub = child.getStub();
|
||||
if (childStub != null && (fileStub == null || fileStub.getRoot() != childStub.getParentStub())) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return isValid();
|
||||
|
||||
@@ -52,8 +52,6 @@ public abstract class InspectionProfileEntry {
|
||||
private Boolean myUseNewSerializer = null;
|
||||
|
||||
/**
|
||||
* DO NOT OVERRIDE this method.
|
||||
*
|
||||
* @see InspectionEP#groupDisplayName
|
||||
* @see InspectionEP#groupKey
|
||||
* @see InspectionEP#groupBundle
|
||||
@@ -64,8 +62,6 @@ public abstract class InspectionProfileEntry {
|
||||
}
|
||||
|
||||
/**
|
||||
* DO NOT OVERRIDE this method.
|
||||
*
|
||||
* @see InspectionEP#groupPath
|
||||
*/
|
||||
@NotNull
|
||||
@@ -78,8 +74,6 @@ public abstract class InspectionProfileEntry {
|
||||
}
|
||||
|
||||
/**
|
||||
* DO NOT OVERRIDE this method.
|
||||
*
|
||||
* @see InspectionEP#displayName
|
||||
* @see InspectionEP#key
|
||||
* @see InspectionEP#bundle
|
||||
|
||||
@@ -15,43 +15,45 @@
|
||||
*/
|
||||
package com.intellij.psi;
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* Default empty implementation of {@link PsiTreeChangeListener}.
|
||||
*/
|
||||
public abstract class PsiTreeChangeAdapter implements PsiTreeChangeListener {
|
||||
public void beforeChildAddition(PsiTreeChangeEvent event) {
|
||||
public void beforeChildAddition(@NotNull PsiTreeChangeEvent event) {
|
||||
}
|
||||
|
||||
public void beforeChildRemoval(PsiTreeChangeEvent event) {
|
||||
public void beforeChildRemoval(@NotNull PsiTreeChangeEvent event) {
|
||||
}
|
||||
|
||||
public void beforeChildReplacement(PsiTreeChangeEvent event) {
|
||||
public void beforeChildReplacement(@NotNull PsiTreeChangeEvent event) {
|
||||
}
|
||||
|
||||
public void beforeChildMovement(PsiTreeChangeEvent event) {
|
||||
public void beforeChildMovement(@NotNull PsiTreeChangeEvent event) {
|
||||
}
|
||||
|
||||
public void beforeChildrenChange(PsiTreeChangeEvent event) {
|
||||
public void beforeChildrenChange(@NotNull PsiTreeChangeEvent event) {
|
||||
}
|
||||
|
||||
public void beforePropertyChange(PsiTreeChangeEvent event) {
|
||||
public void beforePropertyChange(@NotNull PsiTreeChangeEvent event) {
|
||||
}
|
||||
|
||||
public void childAdded(PsiTreeChangeEvent event) {
|
||||
public void childAdded(@NotNull PsiTreeChangeEvent event) {
|
||||
}
|
||||
|
||||
public void childRemoved(PsiTreeChangeEvent event) {
|
||||
public void childRemoved(@NotNull PsiTreeChangeEvent event) {
|
||||
}
|
||||
|
||||
public void childReplaced(PsiTreeChangeEvent event) {
|
||||
public void childReplaced(@NotNull PsiTreeChangeEvent event) {
|
||||
}
|
||||
|
||||
public void childMoved(PsiTreeChangeEvent event) {
|
||||
public void childMoved(@NotNull PsiTreeChangeEvent event) {
|
||||
}
|
||||
|
||||
public void childrenChanged(PsiTreeChangeEvent event) {
|
||||
public void childrenChanged(@NotNull PsiTreeChangeEvent event) {
|
||||
}
|
||||
|
||||
public void propertyChanged(PsiTreeChangeEvent event) {
|
||||
public void propertyChanged(@NotNull PsiTreeChangeEvent event) {
|
||||
}
|
||||
}
|
||||
|
||||
+6
-3
@@ -28,10 +28,10 @@ import com.intellij.openapi.roots.ProjectFileIndex;
|
||||
import com.intellij.openapi.roots.ProjectRootManager;
|
||||
import com.intellij.openapi.util.Comparing;
|
||||
import com.intellij.openapi.util.text.StringUtil;
|
||||
import com.intellij.openapi.vfs.VfsUtil;
|
||||
import com.intellij.openapi.vfs.VfsUtilCore;
|
||||
import com.intellij.openapi.vfs.VirtualFile;
|
||||
import org.jetbrains.annotations.NonNls;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
@@ -74,7 +74,9 @@ public class FilePatternPackageSet extends PatternBasedPackageSet {
|
||||
}
|
||||
|
||||
private boolean fileMatcher(VirtualFile virtualFile, ProjectFileIndex fileIndex, VirtualFile projectBaseDir){
|
||||
return myFilePattern.matcher(getRelativePath(virtualFile, fileIndex, true, projectBaseDir)).matches();
|
||||
final String relativePath = getRelativePath(virtualFile, fileIndex, true, projectBaseDir);
|
||||
LOG.assertTrue(relativePath != null, "vFile: " + virtualFile + "; projectBaseDir: " + projectBaseDir);
|
||||
return myFilePattern.matcher(relativePath).matches();
|
||||
}
|
||||
|
||||
public static boolean matchesModule(final Pattern moduleGroupPattern,
|
||||
@@ -183,6 +185,7 @@ public class FilePatternPackageSet extends PatternBasedPackageSet {
|
||||
return Comparing.strEqual(myPathPattern, oldQName);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public static String getRelativePath(final VirtualFile virtualFile,
|
||||
final ProjectFileIndex index,
|
||||
final boolean useFQName,
|
||||
@@ -194,7 +197,7 @@ public class FilePatternPackageSet extends PatternBasedPackageSet {
|
||||
final Module module = index.getModuleForFile(virtualFile);
|
||||
if (module != null) {
|
||||
if (projectBaseDir != null) {
|
||||
if (VfsUtil.isAncestor(projectBaseDir, virtualFile, false)){
|
||||
if (VfsUtilCore.isAncestor(projectBaseDir, virtualFile, false)){
|
||||
final String projectRelativePath = VfsUtilCore.getRelativePath(virtualFile, projectBaseDir, '/');
|
||||
return useFQName ? projectRelativePath : projectRelativePath.substring(projectRelativePath.indexOf('/') + 1);
|
||||
}
|
||||
|
||||
@@ -124,17 +124,17 @@ public class PsiChangeHandler extends PsiTreeChangeAdapter implements Disposable
|
||||
}
|
||||
|
||||
@Override
|
||||
public void childAdded(PsiTreeChangeEvent event) {
|
||||
public void childAdded(@NotNull PsiTreeChangeEvent event) {
|
||||
queueElement(event.getParent(), true, event);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void childRemoved(PsiTreeChangeEvent event) {
|
||||
public void childRemoved(@NotNull PsiTreeChangeEvent event) {
|
||||
queueElement(event.getParent(), true, event);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void childReplaced(PsiTreeChangeEvent event) {
|
||||
public void childReplaced(@NotNull PsiTreeChangeEvent event) {
|
||||
queueElement(event.getNewChild(), typesEqual(event.getNewChild(), event.getOldChild()), event);
|
||||
}
|
||||
|
||||
@@ -143,7 +143,7 @@ public class PsiChangeHandler extends PsiTreeChangeAdapter implements Disposable
|
||||
}
|
||||
|
||||
@Override
|
||||
public void childrenChanged(PsiTreeChangeEvent event) {
|
||||
public void childrenChanged(@NotNull PsiTreeChangeEvent event) {
|
||||
if (((PsiTreeChangeEventImpl)event).isGenericChildrenChange()) {
|
||||
return;
|
||||
}
|
||||
@@ -151,13 +151,13 @@ public class PsiChangeHandler extends PsiTreeChangeAdapter implements Disposable
|
||||
}
|
||||
|
||||
@Override
|
||||
public void beforeChildMovement(PsiTreeChangeEvent event) {
|
||||
public void beforeChildMovement(@NotNull PsiTreeChangeEvent event) {
|
||||
queueElement(event.getOldParent(), true, event);
|
||||
queueElement(event.getNewParent(), true, event);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void beforeChildrenChange(PsiTreeChangeEvent event) {
|
||||
public void beforeChildrenChange(@NotNull PsiTreeChangeEvent event) {
|
||||
// this event sent always before every PSI change, even not significant one (like after quick typing/backspacing char)
|
||||
// mark file dirty just in case
|
||||
PsiFile psiFile = event.getFile();
|
||||
@@ -167,7 +167,7 @@ public class PsiChangeHandler extends PsiTreeChangeAdapter implements Disposable
|
||||
}
|
||||
|
||||
@Override
|
||||
public void propertyChanged(PsiTreeChangeEvent event) {
|
||||
public void propertyChanged(@NotNull PsiTreeChangeEvent event) {
|
||||
String propertyName = event.getPropertyName();
|
||||
if (!propertyName.equals(PsiTreeChangeEvent.PROP_WRITABLE)) {
|
||||
myFileStatusMap.markAllFilesDirty();
|
||||
|
||||
+1
-4
@@ -1,6 +1,5 @@
|
||||
|
||||
/*
|
||||
* Copyright 2000-2009 JetBrains s.r.o.
|
||||
* Copyright 2000-2012 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.
|
||||
@@ -14,7 +13,6 @@
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.intellij.codeInsight.daemon.impl.actions;
|
||||
|
||||
import com.intellij.codeInsight.CodeInsightActionHandler;
|
||||
@@ -27,7 +25,6 @@ import com.intellij.openapi.project.DumbAware;
|
||||
import com.intellij.psi.PsiFile;
|
||||
|
||||
public class GotoNextErrorAction extends BaseCodeInsightAction implements DumbAware {
|
||||
|
||||
public GotoNextErrorAction() {
|
||||
super(false);
|
||||
}
|
||||
|
||||
@@ -398,7 +398,7 @@ public class CtrlMouseHandler extends AbstractProjectComponent {
|
||||
}
|
||||
else if (targetElements.length == 1) {
|
||||
if (targetElements[0] != resolvedElement && elementAtPointer != null && targetElements[0].isPhysical()) {
|
||||
return new InfoSingle(elementAtPointer, targetElements[0]);
|
||||
return ref != null ? new InfoSingle(ref, targetElements[0]) : new InfoSingle(elementAtPointer, targetElements[0]);
|
||||
}
|
||||
}
|
||||
else {
|
||||
|
||||
+6
-6
@@ -122,27 +122,27 @@ public class WolfTheProblemSolverImpl extends WolfTheProblemSolver {
|
||||
public WolfTheProblemSolverImpl(Project project, PsiManager psiManager, VirtualFileManager virtualFileManager) {
|
||||
myProject = project;
|
||||
PsiTreeChangeListener changeListener = new PsiTreeChangeAdapter() {
|
||||
public void childAdded(PsiTreeChangeEvent event) {
|
||||
public void childAdded(@NotNull PsiTreeChangeEvent event) {
|
||||
childrenChanged(event);
|
||||
}
|
||||
|
||||
public void childRemoved(PsiTreeChangeEvent event) {
|
||||
public void childRemoved(@NotNull PsiTreeChangeEvent event) {
|
||||
childrenChanged(event);
|
||||
}
|
||||
|
||||
public void childReplaced(PsiTreeChangeEvent event) {
|
||||
public void childReplaced(@NotNull PsiTreeChangeEvent event) {
|
||||
childrenChanged(event);
|
||||
}
|
||||
|
||||
public void childMoved(PsiTreeChangeEvent event) {
|
||||
public void childMoved(@NotNull PsiTreeChangeEvent event) {
|
||||
childrenChanged(event);
|
||||
}
|
||||
|
||||
public void propertyChanged(PsiTreeChangeEvent event) {
|
||||
public void propertyChanged(@NotNull PsiTreeChangeEvent event) {
|
||||
childrenChanged(event);
|
||||
}
|
||||
|
||||
public void childrenChanged(PsiTreeChangeEvent event) {
|
||||
public void childrenChanged(@NotNull PsiTreeChangeEvent event) {
|
||||
clearSyntaxErrorFlag(event);
|
||||
}
|
||||
};
|
||||
|
||||
+6
-1
@@ -31,6 +31,7 @@ import com.intellij.openapi.application.AccessToken;
|
||||
import com.intellij.openapi.application.ApplicationManager;
|
||||
import com.intellij.openapi.application.WriteAction;
|
||||
import com.intellij.openapi.command.CommandProcessor;
|
||||
import com.intellij.openapi.diagnostic.Logger;
|
||||
import com.intellij.openapi.editor.Document;
|
||||
import com.intellij.openapi.editor.Editor;
|
||||
import com.intellij.openapi.editor.EditorFactory;
|
||||
@@ -48,6 +49,8 @@ import java.util.Set;
|
||||
|
||||
public class SaveAsTemplateAction extends AnAction {
|
||||
|
||||
private static final Logger LOG = Logger.getInstance("#" + SaveAsTemplateAction.class.getName());
|
||||
|
||||
public void actionPerformed(AnActionEvent e) {
|
||||
DataContext dataContext = e.getDataContext();
|
||||
final Editor editor = PlatformDataKeys.EDITOR.getData(dataContext);
|
||||
@@ -89,7 +92,9 @@ public class SaveAsTemplateAction extends AnAction {
|
||||
if (!(reference instanceof PsiQualifiedReference) || ((PsiQualifiedReference) reference).getQualifier() == null) {
|
||||
String canonicalText = reference.getCanonicalText();
|
||||
TextRange referenceRange = reference.getRangeInElement();
|
||||
TextRange range = element.getTextRange().cutOut(referenceRange).shiftRight(-offsetDelta);
|
||||
final TextRange elementTextRange = element.getTextRange();
|
||||
LOG.assertTrue(elementTextRange != null, elementTextRange);
|
||||
final TextRange range = elementTextRange.cutOut(referenceRange).shiftRight(-offsetDelta);
|
||||
final String oldText = document.getText(range);
|
||||
// workaround for Java references: canonicalText contains generics, and we need to cut them off because otherwise
|
||||
// they will be duplicated
|
||||
|
||||
@@ -831,8 +831,8 @@ public class TemplateState implements Disposable {
|
||||
if (selStart >= 0 && selEnd >= 0) {
|
||||
myEditor.getSelectionModel().setSelection(mySegments.getSegmentStart(selStart), mySegments.getSegmentStart(selEnd));
|
||||
}
|
||||
fireBeforeTemplateFinished();
|
||||
final Editor editor = myEditor;
|
||||
fireBeforeTemplateFinished();
|
||||
int oldVar = myCurrentVariableNumber;
|
||||
setCurrentVariableNumber(-1);
|
||||
currentVariableChanged(oldVar);
|
||||
|
||||
@@ -403,7 +403,7 @@ public class FindUsagesManager implements JDOMExternalizable {
|
||||
.processRequests(options.fastTrack, new ReadActionProcessor<PsiReference>() {
|
||||
@Override
|
||||
public boolean processInReadAction(final PsiReference ref) {
|
||||
return usageInfoProcessor.process(new UsageInfo(ref));
|
||||
return !ref.getElement().isValid() || usageInfoProcessor.process(new UsageInfo(ref));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -174,6 +174,16 @@ public class GotoRelatedFileAction extends AnAction {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getIndexedString(Object value) {
|
||||
if (value instanceof GotoRelatedItem) {
|
||||
//noinspection ConstantConditions
|
||||
return ((GotoRelatedItem)value).getCustomName();
|
||||
}
|
||||
final PsiElement element = (PsiElement)value;
|
||||
return renderer.getElementText(element) + " " + renderer.getContainerText(element, null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public PopupStep onChosen(Object selectedValue, boolean finalChoice) {
|
||||
processor.process(selectedValue);
|
||||
|
||||
@@ -195,7 +195,7 @@ public class BookmarksAction extends AnAction implements DumbAware {
|
||||
|
||||
ActionToolbar actionToolbar = ActionManager.getInstance().createActionToolbar("", actions, true);
|
||||
actionToolbar.setReservePlaceAutoPopupIcon(false);
|
||||
actionToolbar.setMinimumButtonSize(new Dimension(16, 16));
|
||||
actionToolbar.setMinimumButtonSize(new Dimension(20, 20));
|
||||
final JComponent toolBar = actionToolbar.getComponent();
|
||||
toolBar.setOpaque(false);
|
||||
|
||||
|
||||
@@ -31,6 +31,7 @@ import com.intellij.openapi.vfs.VirtualFile;
|
||||
import com.intellij.psi.*;
|
||||
import com.intellij.psi.util.PsiModificationTracker;
|
||||
import com.intellij.util.Alarm;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.awt.datatransfer.Transferable;
|
||||
import java.util.ArrayList;
|
||||
@@ -146,30 +147,30 @@ public class ProjectListBuilder extends AbstractListBuilder {
|
||||
myOutOfCodeBlockModificationCount = myModificationTracker.getOutOfCodeBlockModificationCount();
|
||||
}
|
||||
|
||||
public void childRemoved(final PsiTreeChangeEvent event) {
|
||||
public void childRemoved(@NotNull final PsiTreeChangeEvent event) {
|
||||
final PsiElement child = event.getOldChild();
|
||||
if (child instanceof PsiWhiteSpace) return; //optimization
|
||||
childrenChanged();
|
||||
}
|
||||
|
||||
public void childAdded(final PsiTreeChangeEvent event) {
|
||||
public void childAdded(@NotNull final PsiTreeChangeEvent event) {
|
||||
final PsiElement child = event.getNewChild();
|
||||
if (child instanceof PsiWhiteSpace) return; //optimization
|
||||
childrenChanged();
|
||||
}
|
||||
|
||||
public void childReplaced(final PsiTreeChangeEvent event) {
|
||||
public void childReplaced(@NotNull final PsiTreeChangeEvent event) {
|
||||
final PsiElement oldChild = event.getOldChild();
|
||||
final PsiElement newChild = event.getNewChild();
|
||||
if (oldChild instanceof PsiWhiteSpace && newChild instanceof PsiWhiteSpace) return; //optimization
|
||||
childrenChanged();
|
||||
}
|
||||
|
||||
public void childMoved(final PsiTreeChangeEvent event) {
|
||||
public void childMoved(@NotNull final PsiTreeChangeEvent event) {
|
||||
childrenChanged();
|
||||
}
|
||||
|
||||
public void childrenChanged(final PsiTreeChangeEvent event) {
|
||||
public void childrenChanged(@NotNull final PsiTreeChangeEvent event) {
|
||||
childrenChanged();
|
||||
}
|
||||
|
||||
@@ -180,7 +181,7 @@ public class ProjectListBuilder extends AbstractListBuilder {
|
||||
addUpdateRequest();
|
||||
}
|
||||
|
||||
public void propertyChanged(final PsiTreeChangeEvent event) {
|
||||
public void propertyChanged(@NotNull final PsiTreeChangeEvent event) {
|
||||
final String propertyName = event.getPropertyName();
|
||||
if (propertyName.equals(PsiTreeChangeEvent.PROP_ROOTS)) {
|
||||
addUpdateRequest();
|
||||
|
||||
@@ -378,7 +378,7 @@ public class FavoritesManager implements ProjectComponent, JDOMExternalizable {
|
||||
}
|
||||
|
||||
private class MyRootsChangeAdapter extends PsiTreeChangeAdapter {
|
||||
public void beforeChildMovement(final PsiTreeChangeEvent event) {
|
||||
public void beforeChildMovement(@NotNull final PsiTreeChangeEvent event) {
|
||||
final PsiElement oldParent = event.getOldParent();
|
||||
final PsiElement newParent = event.getNewParent();
|
||||
final PsiElement child = event.getChild();
|
||||
@@ -417,7 +417,7 @@ public class FavoritesManager implements ProjectComponent, JDOMExternalizable {
|
||||
}
|
||||
}
|
||||
|
||||
public void beforePropertyChange(final PsiTreeChangeEvent event) {
|
||||
public void beforePropertyChange(@NotNull final PsiTreeChangeEvent event) {
|
||||
if (event.getPropertyName().equals(PsiTreeChangeEvent.PROP_FILE_NAME) || event.getPropertyName().equals(PsiTreeChangeEvent.PROP_DIRECTORY_NAME)) {
|
||||
final PsiElement psiElement = event.getChild();
|
||||
if (psiElement instanceof PsiFile || psiElement instanceof PsiDirectory) {
|
||||
|
||||
@@ -110,27 +110,27 @@ public class HierarchyTreeBuilder extends AbstractTreeBuilder {
|
||||
}
|
||||
|
||||
private final class MyPsiTreeChangeListener extends PsiTreeChangeAdapter {
|
||||
public final void childAdded(final PsiTreeChangeEvent event) {
|
||||
public final void childAdded(@NotNull final PsiTreeChangeEvent event) {
|
||||
getUpdater().addSubtreeToUpdate(getRootNode());
|
||||
}
|
||||
|
||||
public final void childRemoved(final PsiTreeChangeEvent event) {
|
||||
public final void childRemoved(@NotNull final PsiTreeChangeEvent event) {
|
||||
getUpdater().addSubtreeToUpdate(getRootNode());
|
||||
}
|
||||
|
||||
public final void childReplaced(final PsiTreeChangeEvent event) {
|
||||
public final void childReplaced(@NotNull final PsiTreeChangeEvent event) {
|
||||
getUpdater().addSubtreeToUpdate(getRootNode());
|
||||
}
|
||||
|
||||
public final void childMoved(final PsiTreeChangeEvent event) {
|
||||
public final void childMoved(@NotNull final PsiTreeChangeEvent event) {
|
||||
getUpdater().addSubtreeToUpdate(getRootNode());
|
||||
}
|
||||
|
||||
public final void childrenChanged(final PsiTreeChangeEvent event) {
|
||||
public final void childrenChanged(@NotNull final PsiTreeChangeEvent event) {
|
||||
getUpdater().addSubtreeToUpdate(getRootNode());
|
||||
}
|
||||
|
||||
public final void propertyChanged(final PsiTreeChangeEvent event) {
|
||||
public final void propertyChanged(@NotNull final PsiTreeChangeEvent event) {
|
||||
getUpdater().addSubtreeToUpdate(getRootNode());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -184,23 +184,23 @@ public class NavBarListener extends WolfTheProblemSolver.ProblemListener
|
||||
rebuildUI();
|
||||
}
|
||||
|
||||
public void childAdded(PsiTreeChangeEvent event) {
|
||||
public void childAdded(@NotNull PsiTreeChangeEvent event) {
|
||||
updateModel();
|
||||
}
|
||||
|
||||
public void childReplaced(PsiTreeChangeEvent event) {
|
||||
public void childReplaced(@NotNull PsiTreeChangeEvent event) {
|
||||
updateModel();
|
||||
}
|
||||
|
||||
public void childMoved(PsiTreeChangeEvent event) {
|
||||
public void childMoved(@NotNull PsiTreeChangeEvent event) {
|
||||
updateModel();
|
||||
}
|
||||
|
||||
public void childrenChanged(PsiTreeChangeEvent event) {
|
||||
public void childrenChanged(@NotNull PsiTreeChangeEvent event) {
|
||||
updateModel();
|
||||
}
|
||||
|
||||
public void propertyChanged(final PsiTreeChangeEvent event) {
|
||||
public void propertyChanged(@NotNull final PsiTreeChangeEvent event) {
|
||||
updateModel();
|
||||
}
|
||||
|
||||
@@ -267,23 +267,23 @@ public class NavBarListener extends WolfTheProblemSolver.ProblemListener
|
||||
public void beforeRootsChange(ModuleRootEvent event) {}
|
||||
|
||||
@Override
|
||||
public void beforeChildAddition(PsiTreeChangeEvent event) {}
|
||||
public void beforeChildAddition(@NotNull PsiTreeChangeEvent event) {}
|
||||
|
||||
@Override
|
||||
public void beforeChildRemoval(PsiTreeChangeEvent event) {}
|
||||
public void beforeChildRemoval(@NotNull PsiTreeChangeEvent event) {}
|
||||
|
||||
@Override
|
||||
public void beforeChildReplacement(PsiTreeChangeEvent event) {}
|
||||
public void beforeChildReplacement(@NotNull PsiTreeChangeEvent event) {}
|
||||
|
||||
@Override
|
||||
public void beforeChildMovement(PsiTreeChangeEvent event) {}
|
||||
public void beforeChildMovement(@NotNull PsiTreeChangeEvent event) {}
|
||||
|
||||
@Override
|
||||
public void beforeChildrenChange(PsiTreeChangeEvent event) {}
|
||||
public void beforeChildrenChange(@NotNull PsiTreeChangeEvent event) {}
|
||||
|
||||
@Override
|
||||
public void beforePropertyChange(PsiTreeChangeEvent event) {}
|
||||
public void beforePropertyChange(@NotNull PsiTreeChangeEvent event) {}
|
||||
|
||||
@Override
|
||||
public void childRemoved(PsiTreeChangeEvent event) {}
|
||||
public void childRemoved(@NotNull PsiTreeChangeEvent event) {}
|
||||
}
|
||||
|
||||
+7
-6
@@ -23,6 +23,7 @@ import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.vfs.VirtualFile;
|
||||
import com.intellij.psi.*;
|
||||
import com.intellij.psi.util.PsiModificationTracker;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import javax.swing.tree.DefaultMutableTreeNode;
|
||||
|
||||
@@ -43,31 +44,31 @@ public abstract class ProjectViewPsiTreeChangeListener extends PsiTreeChangeAdap
|
||||
|
||||
protected abstract DefaultMutableTreeNode getRootNode();
|
||||
|
||||
public final void childRemoved(PsiTreeChangeEvent event) {
|
||||
public final void childRemoved(@NotNull PsiTreeChangeEvent event) {
|
||||
PsiElement child = event.getOldChild();
|
||||
if (child instanceof PsiWhiteSpace) return; //optimization
|
||||
childrenChanged(event.getParent(), true);
|
||||
}
|
||||
|
||||
public final void childAdded(PsiTreeChangeEvent event) {
|
||||
public final void childAdded(@NotNull PsiTreeChangeEvent event) {
|
||||
PsiElement child = event.getNewChild();
|
||||
if (child instanceof PsiWhiteSpace) return; //optimization
|
||||
childrenChanged(event.getParent(), true);
|
||||
}
|
||||
|
||||
public final void childReplaced(PsiTreeChangeEvent event) {
|
||||
public final void childReplaced(@NotNull PsiTreeChangeEvent event) {
|
||||
PsiElement oldChild = event.getOldChild();
|
||||
PsiElement newChild = event.getNewChild();
|
||||
if (oldChild instanceof PsiWhiteSpace && newChild instanceof PsiWhiteSpace) return; //optimization
|
||||
childrenChanged(event.getParent(), true);
|
||||
}
|
||||
|
||||
public final void childMoved(PsiTreeChangeEvent event) {
|
||||
public final void childMoved(@NotNull PsiTreeChangeEvent event) {
|
||||
childrenChanged(event.getOldParent(), false);
|
||||
childrenChanged(event.getNewParent(), true);
|
||||
}
|
||||
|
||||
public final void childrenChanged(PsiTreeChangeEvent event) {
|
||||
public final void childrenChanged(@NotNull PsiTreeChangeEvent event) {
|
||||
childrenChanged(event.getParent(), true);
|
||||
}
|
||||
|
||||
@@ -104,7 +105,7 @@ public abstract class ProjectViewPsiTreeChangeListener extends PsiTreeChangeAdap
|
||||
}
|
||||
}
|
||||
|
||||
public void propertyChanged(PsiTreeChangeEvent event) {
|
||||
public void propertyChanged(@NotNull PsiTreeChangeEvent event) {
|
||||
String propertyName = event.getPropertyName();
|
||||
PsiElement element = event.getElement();
|
||||
DefaultMutableTreeNode rootNode = getRootNode();
|
||||
|
||||
@@ -513,7 +513,7 @@ public class ScopeTreeViewPanel extends JPanel implements Disposable {
|
||||
}
|
||||
|
||||
private class MyPsiTreeChangeAdapter extends PsiTreeChangeAdapter {
|
||||
public void childAdded(final PsiTreeChangeEvent event) {
|
||||
public void childAdded(@NotNull final PsiTreeChangeEvent event) {
|
||||
final PsiElement element = event.getParent();
|
||||
final PsiElement child = event.getChild();
|
||||
if (child == null) return;
|
||||
@@ -549,7 +549,7 @@ public class ScopeTreeViewPanel extends JPanel implements Disposable {
|
||||
}
|
||||
}
|
||||
|
||||
public void beforeChildRemoval(final PsiTreeChangeEvent event) {
|
||||
public void beforeChildRemoval(@NotNull final PsiTreeChangeEvent event) {
|
||||
final PsiElement child = event.getChild();
|
||||
final PsiElement parent = event.getParent();
|
||||
if (parent instanceof PsiDirectory && (child instanceof PsiFile && !isInjected((PsiFile)child) || child instanceof PsiDirectory)) {
|
||||
@@ -565,7 +565,7 @@ public class ScopeTreeViewPanel extends JPanel implements Disposable {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void beforeChildMovement(PsiTreeChangeEvent event) {
|
||||
public void beforeChildMovement(@NotNull PsiTreeChangeEvent event) {
|
||||
final PsiElement oldParent = event.getOldParent();
|
||||
final PsiElement child = event.getChild();
|
||||
if (oldParent instanceof PsiDirectory) {
|
||||
@@ -583,7 +583,7 @@ public class ScopeTreeViewPanel extends JPanel implements Disposable {
|
||||
}
|
||||
}
|
||||
|
||||
public void childMoved(PsiTreeChangeEvent event) {
|
||||
public void childMoved(@NotNull PsiTreeChangeEvent event) {
|
||||
final PsiElement newParent = event.getNewParent();
|
||||
final PsiElement child = event.getChild();
|
||||
if (newParent instanceof PsiDirectory) {
|
||||
@@ -611,7 +611,7 @@ public class ScopeTreeViewPanel extends JPanel implements Disposable {
|
||||
}
|
||||
|
||||
|
||||
public void childrenChanged(PsiTreeChangeEvent event) {
|
||||
public void childrenChanged(@NotNull PsiTreeChangeEvent event) {
|
||||
final PsiElement parent = event.getParent();
|
||||
final PsiFile file = parent.getContainingFile();
|
||||
if (file != null && file.getFileType() == StdFileTypes.JAVA) {
|
||||
@@ -631,7 +631,7 @@ public class ScopeTreeViewPanel extends JPanel implements Disposable {
|
||||
}
|
||||
}
|
||||
|
||||
public final void propertyChanged(PsiTreeChangeEvent event) {
|
||||
public final void propertyChanged(@NotNull PsiTreeChangeEvent event) {
|
||||
String propertyName = event.getPropertyName();
|
||||
final PsiElement element = event.getElement();
|
||||
if (element != null) {
|
||||
@@ -651,7 +651,7 @@ public class ScopeTreeViewPanel extends JPanel implements Disposable {
|
||||
}
|
||||
}
|
||||
|
||||
public void childReplaced(final PsiTreeChangeEvent event) {
|
||||
public void childReplaced(@NotNull final PsiTreeChangeEvent event) {
|
||||
final NamedScope scope = getCurrentScope();
|
||||
final PsiElement element = event.getNewChild();
|
||||
final PsiFile psiFile = event.getFile();
|
||||
|
||||
+5
-5
@@ -62,24 +62,24 @@ public abstract class TemplateLanguageStructureViewBuilder implements StructureV
|
||||
myProject = psiElement.getProject();
|
||||
|
||||
myPsiTreeChangeAdapter = new PsiTreeChangeAdapter() {
|
||||
public void childAdded(PsiTreeChangeEvent event) {
|
||||
public void childAdded(@NotNull PsiTreeChangeEvent event) {
|
||||
childrenChanged(event);
|
||||
}
|
||||
|
||||
public void childRemoved(PsiTreeChangeEvent event) {
|
||||
public void childRemoved(@NotNull PsiTreeChangeEvent event) {
|
||||
childrenChanged(event);
|
||||
}
|
||||
|
||||
public void childReplaced(PsiTreeChangeEvent event) {
|
||||
public void childReplaced(@NotNull PsiTreeChangeEvent event) {
|
||||
childrenChanged(event);
|
||||
}
|
||||
|
||||
public void childMoved(PsiTreeChangeEvent event) {
|
||||
public void childMoved(@NotNull PsiTreeChangeEvent event) {
|
||||
childrenChanged(event);
|
||||
}
|
||||
|
||||
final Alarm myAlarm = new Alarm();
|
||||
public void childrenChanged(PsiTreeChangeEvent event) {
|
||||
public void childrenChanged(@NotNull PsiTreeChangeEvent event) {
|
||||
myAlarm.cancelAllRequests();
|
||||
myAlarm.addRequest(new Runnable(){
|
||||
public void run() {
|
||||
|
||||
+6
-6
@@ -136,20 +136,20 @@ public class StructureTreeBuilder extends AbstractTreeBuilder {
|
||||
myOutOfCodeBlockModificationCount = myModificationTracker.getOutOfCodeBlockModificationCount();
|
||||
}
|
||||
|
||||
public void childRemoved(PsiTreeChangeEvent event) {
|
||||
public void childRemoved(@NotNull PsiTreeChangeEvent event) {
|
||||
PsiElement child = event.getOldChild();
|
||||
if (child instanceof PsiWhiteSpace) return; //optimization
|
||||
|
||||
childrenChanged();
|
||||
}
|
||||
|
||||
public void childAdded(PsiTreeChangeEvent event) {
|
||||
public void childAdded(@NotNull PsiTreeChangeEvent event) {
|
||||
PsiElement child = event.getNewChild();
|
||||
if (child instanceof PsiWhiteSpace) return; //optimization
|
||||
childrenChanged();
|
||||
}
|
||||
|
||||
public void childReplaced(PsiTreeChangeEvent event) {
|
||||
public void childReplaced(@NotNull PsiTreeChangeEvent event) {
|
||||
/** Test comment */
|
||||
PsiElement oldChild = event.getOldChild();
|
||||
PsiElement newChild = event.getNewChild();
|
||||
@@ -157,11 +157,11 @@ public class StructureTreeBuilder extends AbstractTreeBuilder {
|
||||
childrenChanged();
|
||||
}
|
||||
|
||||
public void childMoved(PsiTreeChangeEvent event) {
|
||||
public void childMoved(@NotNull PsiTreeChangeEvent event) {
|
||||
childrenChanged();
|
||||
}
|
||||
|
||||
public void childrenChanged(PsiTreeChangeEvent event) {
|
||||
public void childrenChanged(@NotNull PsiTreeChangeEvent event) {
|
||||
childrenChanged();
|
||||
}
|
||||
|
||||
@@ -172,7 +172,7 @@ public class StructureTreeBuilder extends AbstractTreeBuilder {
|
||||
setupUpdateAlarm();
|
||||
}
|
||||
|
||||
public void propertyChanged(PsiTreeChangeEvent event) {
|
||||
public void propertyChanged(@NotNull PsiTreeChangeEvent event) {
|
||||
childrenChanged();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -658,7 +658,7 @@ public abstract class TodoTreeBuilder extends AbstractTreeBuilder {
|
||||
}
|
||||
|
||||
private final class MyPsiTreeChangeListener extends PsiTreeChangeAdapter {
|
||||
public void childAdded(PsiTreeChangeEvent e) {
|
||||
public void childAdded(@NotNull PsiTreeChangeEvent e) {
|
||||
// If local modification
|
||||
if (e.getFile() != null) {
|
||||
markFileAsDirty(e.getFile());
|
||||
@@ -675,7 +675,7 @@ public abstract class TodoTreeBuilder extends AbstractTreeBuilder {
|
||||
updateTree(true);
|
||||
}
|
||||
|
||||
public void beforeChildRemoval(PsiTreeChangeEvent e) {
|
||||
public void beforeChildRemoval(@NotNull PsiTreeChangeEvent e) {
|
||||
// If local midification
|
||||
final PsiFile file = e.getFile();
|
||||
if (file != null) {
|
||||
@@ -711,7 +711,7 @@ public abstract class TodoTreeBuilder extends AbstractTreeBuilder {
|
||||
}
|
||||
}
|
||||
|
||||
public void childMoved(PsiTreeChangeEvent e) {
|
||||
public void childMoved(@NotNull PsiTreeChangeEvent e) {
|
||||
if (e.getFile() != null) { // local change
|
||||
markFileAsDirty(e.getFile());
|
||||
updateTree(true);
|
||||
@@ -744,21 +744,21 @@ public abstract class TodoTreeBuilder extends AbstractTreeBuilder {
|
||||
}
|
||||
}
|
||||
|
||||
public void childReplaced(PsiTreeChangeEvent e) {
|
||||
public void childReplaced(@NotNull PsiTreeChangeEvent e) {
|
||||
if (e.getFile() != null) {
|
||||
markFileAsDirty(e.getFile());
|
||||
updateTree(true);
|
||||
}
|
||||
}
|
||||
|
||||
public void childrenChanged(PsiTreeChangeEvent e) {
|
||||
public void childrenChanged(@NotNull PsiTreeChangeEvent e) {
|
||||
if (e.getFile() != null) {
|
||||
markFileAsDirty(e.getFile());
|
||||
updateTree(true);
|
||||
}
|
||||
}
|
||||
|
||||
public void propertyChanged(PsiTreeChangeEvent e) {
|
||||
public void propertyChanged(@NotNull PsiTreeChangeEvent e) {
|
||||
String propertyName = e.getPropertyName();
|
||||
if (propertyName.equals(PsiTreeChangeEvent.PROP_ROOTS)) { // rebuild all tree when source roots were changed
|
||||
getUpdater().runBeforeUpdate(
|
||||
|
||||
+6
-6
@@ -106,7 +106,7 @@ public class PsiAwareFileEditorManagerImpl extends FileEditorManagerImpl {
|
||||
* Updates attribute of open files when roots change
|
||||
*/
|
||||
private final class MyPsiTreeChangeListener extends PsiTreeChangeAdapter {
|
||||
public void propertyChanged(final PsiTreeChangeEvent e) {
|
||||
public void propertyChanged(@NotNull final PsiTreeChangeEvent e) {
|
||||
if (PsiTreeChangeEvent.PROP_ROOTS.equals(e.getPropertyName())) {
|
||||
ApplicationManager.getApplication().assertIsDispatchThread();
|
||||
final VirtualFile[] openFiles = getOpenFiles();
|
||||
@@ -118,23 +118,23 @@ public class PsiAwareFileEditorManagerImpl extends FileEditorManagerImpl {
|
||||
}
|
||||
}
|
||||
|
||||
public void childAdded(PsiTreeChangeEvent event) {
|
||||
public void childAdded(@NotNull PsiTreeChangeEvent event) {
|
||||
doChange(event);
|
||||
}
|
||||
|
||||
public void childRemoved(PsiTreeChangeEvent event) {
|
||||
public void childRemoved(@NotNull PsiTreeChangeEvent event) {
|
||||
doChange(event);
|
||||
}
|
||||
|
||||
public void childReplaced(PsiTreeChangeEvent event) {
|
||||
public void childReplaced(@NotNull PsiTreeChangeEvent event) {
|
||||
doChange(event);
|
||||
}
|
||||
|
||||
public void childMoved(PsiTreeChangeEvent event) {
|
||||
public void childMoved(@NotNull PsiTreeChangeEvent event) {
|
||||
doChange(event);
|
||||
}
|
||||
|
||||
public void childrenChanged(PsiTreeChangeEvent event) {
|
||||
public void childrenChanged(@NotNull PsiTreeChangeEvent event) {
|
||||
doChange(event);
|
||||
}
|
||||
|
||||
|
||||
@@ -730,7 +730,7 @@ public class ProjectRootManagerImpl extends ProjectRootManagerEx implements Proj
|
||||
}
|
||||
|
||||
private class MyVirtualFilePointerListener implements VirtualFilePointerListener {
|
||||
public void beforeValidityChanged(VirtualFilePointer[] pointers) {
|
||||
public void beforeValidityChanged(@NotNull VirtualFilePointer[] pointers) {
|
||||
if (!myProject.isDisposed()) {
|
||||
if (myInsideRefresh == 0) {
|
||||
if (affectsRoots(pointers)) {
|
||||
@@ -747,7 +747,7 @@ public class ProjectRootManagerImpl extends ProjectRootManagerEx implements Proj
|
||||
}
|
||||
}
|
||||
|
||||
public void validityChanged(VirtualFilePointer[] pointers) {
|
||||
public void validityChanged(@NotNull VirtualFilePointer[] pointers) {
|
||||
if (!myProject.isDisposed()) {
|
||||
if (myInsideRefresh > 0) {
|
||||
clearScopesCaches();
|
||||
|
||||
+29
-5
@@ -49,6 +49,7 @@ import com.intellij.openapi.util.text.StringUtil;
|
||||
import com.intellij.openapi.vfs.VfsUtil;
|
||||
import com.intellij.openapi.vfs.VirtualFile;
|
||||
import com.intellij.profile.Profile;
|
||||
import com.intellij.profile.ProfileManager;
|
||||
import com.intellij.profile.codeInspection.InspectionProfileManager;
|
||||
import com.intellij.profile.codeInspection.InspectionProjectProfileManager;
|
||||
import com.intellij.ui.components.JBScrollPane;
|
||||
@@ -99,7 +100,8 @@ public abstract class InspectionToolsConfigurable extends BaseConfigurable imple
|
||||
InspectionToolRegistrar.getInstance().buildInspectionSearchIndexIfNecessary();
|
||||
myAddButton.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
final ModifiableModel model = SingleInspectionProfilePanel.createNewProfile(-1, getSelectedObject(), myWholePanel, "");
|
||||
final Set<String> existingProfileNames = myPanels.keySet();
|
||||
final ModifiableModel model = SingleInspectionProfilePanel.createNewProfile(-1, getSelectedObject(), myWholePanel, "", existingProfileNames);
|
||||
if (model != null) {
|
||||
addProfile((InspectionProfileImpl)model);
|
||||
myDeletedProfiles.remove(model.getName());
|
||||
@@ -113,7 +115,7 @@ public abstract class InspectionToolsConfigurable extends BaseConfigurable imple
|
||||
final InspectionProfileImpl selectedProfile = (InspectionProfileImpl)myProfiles.getSelectedItem();
|
||||
((DefaultComboBoxModel)myProfiles.getModel()).removeElement(selectedProfile);
|
||||
myDeletedProfiles.add(selectedProfile.getName());
|
||||
myDeleteButton.setEnabled(myProfiles.getModel().getSize() > 1);
|
||||
myDeleteButton.setEnabled(isDeleteEnabled(selectedProfile));
|
||||
}
|
||||
});
|
||||
|
||||
@@ -216,7 +218,9 @@ public abstract class InspectionToolsConfigurable extends BaseConfigurable imple
|
||||
|
||||
myCopyButton.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
final InspectionProfileImpl model = (InspectionProfileImpl)SingleInspectionProfilePanel.createNewProfile(0, getSelectedObject(), myWholePanel, "");
|
||||
final Set<String> existingProfileNames = myPanels.keySet();
|
||||
final InspectionProfileImpl model = (InspectionProfileImpl)
|
||||
SingleInspectionProfilePanel.createNewProfile(0, getSelectedObject(), myWholePanel, "", existingProfileNames);
|
||||
if (model != null) {
|
||||
final InspectionProfileImpl modifiableModel = (InspectionProfileImpl)model.getModifiableModel();
|
||||
modifiableModel.setModified(true);
|
||||
@@ -285,7 +289,7 @@ public abstract class InspectionToolsConfigurable extends BaseConfigurable imple
|
||||
myProfiles.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
final InspectionProfileImpl profile = (InspectionProfileImpl)myProfiles.getSelectedItem();
|
||||
myDeleteButton.setEnabled(myProfiles.getModel().getSize() > 1);
|
||||
myDeleteButton.setEnabled(isDeleteEnabled(profile));
|
||||
myLayout.show(myPanel, profile.getName());
|
||||
SingleInspectionProfilePanel panel = getSelectedPanel();
|
||||
if (panel != null) {
|
||||
@@ -352,7 +356,7 @@ public abstract class InspectionToolsConfigurable extends BaseConfigurable imple
|
||||
final InspectionProfileImpl inspectionProfile = getCurrentProfile();
|
||||
myProfiles.setSelectedItem(inspectionProfile);
|
||||
myLayout.show(myPanel, inspectionProfile.getName());
|
||||
myDeleteButton.setEnabled(getProfiles().size() > 1 && inspectionProfile.getProfileManager() == myProfileManager);
|
||||
myDeleteButton.setEnabled(isDeleteEnabled(inspectionProfile));
|
||||
final SingleInspectionProfilePanel panel = getSelectedPanel();
|
||||
if (panel != null) {
|
||||
panel.setVisible(true);//make sure that UI was initialized
|
||||
@@ -373,6 +377,26 @@ public abstract class InspectionToolsConfigurable extends BaseConfigurable imple
|
||||
}
|
||||
}
|
||||
|
||||
private boolean isDeleteEnabled(InspectionProfileImpl inspectionProfile) {
|
||||
final ProfileManager profileManager = inspectionProfile.getProfileManager();
|
||||
|
||||
boolean projectProfileFound = false;
|
||||
boolean ideProfileFound = false;
|
||||
|
||||
final ComboBoxModel model = myProfiles.getModel();
|
||||
for (int i = 0; i < model.getSize(); i++) {
|
||||
Profile profile = (Profile)model.getElementAt(i);
|
||||
if (inspectionProfile == profile) continue;
|
||||
final boolean isProjectProfile = profile.getProfileManager() == myProjectProfileManager;
|
||||
projectProfileFound |= isProjectProfile;
|
||||
ideProfileFound |= !isProjectProfile;
|
||||
|
||||
if (ideProfileFound && projectProfileFound) break;
|
||||
}
|
||||
|
||||
return profileManager == myProjectProfileManager ? projectProfileFound : ideProfileFound;
|
||||
}
|
||||
|
||||
protected Collection<Profile> getProfiles() {
|
||||
final Collection<Profile> result = new ArrayList<Profile>();
|
||||
result.addAll(myProfileManager.getProfiles());
|
||||
|
||||
+3
-4
@@ -59,7 +59,6 @@ import com.intellij.psi.search.scope.packageSet.NamedScope;
|
||||
import com.intellij.ui.*;
|
||||
import com.intellij.ui.treeStructure.Tree;
|
||||
import com.intellij.util.Alarm;
|
||||
import com.intellij.util.ArrayUtil;
|
||||
import com.intellij.util.config.StorageAccessors;
|
||||
import com.intellij.util.containers.Convertor;
|
||||
import com.intellij.util.ui.UIUtil;
|
||||
@@ -262,12 +261,12 @@ public class SingleInspectionProfilePanel extends JPanel {
|
||||
public static ModifiableModel createNewProfile(final int initValue,
|
||||
ModifiableModel selectedProfile,
|
||||
JPanel parent,
|
||||
String profileName) {
|
||||
|
||||
String profileName,
|
||||
Set<String> existingProfileNames) {
|
||||
profileName = Messages.showInputDialog(parent, profileName, "Create New Inspection Profile", Messages.getQuestionIcon());
|
||||
if (profileName == null) return null;
|
||||
final ProfileManager profileManager = selectedProfile.getProfileManager();
|
||||
if (ArrayUtil.find(profileManager.getAvailableProfileNames(), profileName) != -1) {
|
||||
if (existingProfileNames.contains(profileName)) {
|
||||
Messages.showErrorDialog(InspectionsBundle.message("inspection.unable.to.create.profile.message", profileName),
|
||||
InspectionsBundle.message("inspection.unable.to.create.profile.dialog.title"));
|
||||
return null;
|
||||
|
||||
@@ -104,7 +104,7 @@ public class PsiToDocumentSynchronizer extends PsiTreeChangeAdapter {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void childAdded(final PsiTreeChangeEvent event) {
|
||||
public void childAdded(@NotNull final PsiTreeChangeEvent event) {
|
||||
doSync(event, false, new DocSyncAction() {
|
||||
@Override
|
||||
public void syncDocument(Document document, PsiTreeChangeEventImpl event) {
|
||||
@@ -114,7 +114,7 @@ public class PsiToDocumentSynchronizer extends PsiTreeChangeAdapter {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void childRemoved(final PsiTreeChangeEvent event) {
|
||||
public void childRemoved(@NotNull final PsiTreeChangeEvent event) {
|
||||
doSync(event, false, new DocSyncAction() {
|
||||
@Override
|
||||
public void syncDocument(Document document, PsiTreeChangeEventImpl event) {
|
||||
@@ -124,7 +124,7 @@ public class PsiToDocumentSynchronizer extends PsiTreeChangeAdapter {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void childReplaced(final PsiTreeChangeEvent event) {
|
||||
public void childReplaced(@NotNull final PsiTreeChangeEvent event) {
|
||||
doSync(event, false, new DocSyncAction() {
|
||||
@Override
|
||||
public void syncDocument(Document document, PsiTreeChangeEventImpl event) {
|
||||
@@ -134,7 +134,7 @@ public class PsiToDocumentSynchronizer extends PsiTreeChangeAdapter {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void childrenChanged(final PsiTreeChangeEvent event) {
|
||||
public void childrenChanged(@NotNull final PsiTreeChangeEvent event) {
|
||||
doSync(event, false, new DocSyncAction() {
|
||||
@Override
|
||||
public void syncDocument(Document document, PsiTreeChangeEventImpl event) {
|
||||
|
||||
@@ -25,7 +25,6 @@ import com.intellij.openapi.application.ModalityState;
|
||||
import com.intellij.openapi.components.*;
|
||||
import com.intellij.openapi.diagnostic.Logger;
|
||||
import com.intellij.openapi.extensions.Extensions;
|
||||
import com.intellij.openapi.progress.ProgressManager;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.util.io.FileUtil;
|
||||
import com.intellij.openapi.vfs.VirtualFile;
|
||||
@@ -218,7 +217,6 @@ public class StubIndexImpl extends StubIndex implements ApplicationComponent, Pe
|
||||
return container.forEach(new ValueContainer.ContainerAction<TIntArrayList>() {
|
||||
@Override
|
||||
public boolean perform(final int id, @NotNull final TIntArrayList value) {
|
||||
ProgressManager.checkCanceled();
|
||||
if (projectFilesFilter != null && !projectFilesFilter.contains(id)) return true;
|
||||
final VirtualFile file = IndexInfrastructure.findFileByIdIfCached(fs, id);
|
||||
if (file == null || scope != null && !scope.contains(file)) {
|
||||
|
||||
+4
-4
@@ -160,7 +160,7 @@ public class ChangeSignatureGestureDetector extends PsiTreeChangeAdapter impleme
|
||||
}
|
||||
|
||||
@Override
|
||||
public void beforeChildRemoval(PsiTreeChangeEvent event) {
|
||||
public void beforeChildRemoval(@NotNull PsiTreeChangeEvent event) {
|
||||
final PsiElement child = event.getChild();
|
||||
if (child instanceof PsiFile) {
|
||||
final PsiFile psiFile = (PsiFile)child;
|
||||
@@ -177,17 +177,17 @@ public class ChangeSignatureGestureDetector extends PsiTreeChangeAdapter impleme
|
||||
}
|
||||
|
||||
@Override
|
||||
public void childRemoved(PsiTreeChangeEvent event) {
|
||||
public void childRemoved(@NotNull PsiTreeChangeEvent event) {
|
||||
change(event.getParent());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void childReplaced(PsiTreeChangeEvent event) {
|
||||
public void childReplaced(@NotNull PsiTreeChangeEvent event) {
|
||||
change(event.getChild());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void childAdded(PsiTreeChangeEvent event) {
|
||||
public void childAdded(@NotNull PsiTreeChangeEvent event) {
|
||||
change(event.getChild());
|
||||
}
|
||||
|
||||
|
||||
+59
-30
@@ -17,6 +17,7 @@ package com.intellij.refactoring.introduce.inplace;
|
||||
|
||||
import com.intellij.codeInsight.lookup.LookupElement;
|
||||
import com.intellij.codeInsight.lookup.LookupElementBuilder;
|
||||
import com.intellij.codeInsight.template.ExpressionContext;
|
||||
import com.intellij.codeInsight.template.TextResult;
|
||||
import com.intellij.codeInsight.template.impl.TemplateManagerImpl;
|
||||
import com.intellij.codeInsight.template.impl.TemplateState;
|
||||
@@ -33,10 +34,13 @@ import com.intellij.openapi.ui.popup.JBPopupFactory;
|
||||
import com.intellij.openapi.util.*;
|
||||
import com.intellij.psi.PsiElement;
|
||||
import com.intellij.psi.PsiNamedElement;
|
||||
import com.intellij.psi.SmartPointerManager;
|
||||
import com.intellij.psi.SmartPsiElementPointer;
|
||||
import com.intellij.psi.codeStyle.SuggestedNameInfo;
|
||||
import com.intellij.refactoring.rename.NameSuggestionProvider;
|
||||
import com.intellij.refactoring.rename.PreferrableNameSuggestionProvider;
|
||||
import com.intellij.refactoring.rename.inplace.InplaceRefactoring;
|
||||
import com.intellij.refactoring.rename.inplace.MyLookupExpression;
|
||||
import com.intellij.ui.awt.RelativePoint;
|
||||
import com.intellij.util.ui.PositionTracker;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
@@ -79,11 +83,6 @@ public abstract class InplaceVariableIntroducer<E extends PsiElement> extends In
|
||||
initOccurrencesMarkers();
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public boolean performInplaceRename() {
|
||||
return performInplaceRefactoring(null);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean shouldSelectAll() {
|
||||
return true;
|
||||
@@ -235,31 +234,61 @@ public abstract class InplaceVariableIntroducer<E extends PsiElement> extends In
|
||||
}
|
||||
|
||||
@Override
|
||||
protected LookupElement[] createLookupItems(LookupElement[] lookupItems, String name) {
|
||||
TemplateState templateState = TemplateManagerImpl.getTemplateState(myEditor);
|
||||
final PsiNamedElement psiVariable = getVariable();
|
||||
if (psiVariable != null) {
|
||||
final TextResult insertedValue =
|
||||
templateState != null ? templateState.getVariableValue(PRIMARY_VARIABLE_NAME) : null;
|
||||
if (insertedValue != null) {
|
||||
final String text = insertedValue.getText();
|
||||
if (!text.isEmpty() && !Comparing.strEqual(text, name)) {
|
||||
final LinkedHashSet<String> names = new LinkedHashSet<String>();
|
||||
names.add(text);
|
||||
for (NameSuggestionProvider provider : Extensions.getExtensions(NameSuggestionProvider.EP_NAME)) {
|
||||
final SuggestedNameInfo suggestedNameInfo = provider.getSuggestedNames(psiVariable, psiVariable, names);
|
||||
if (suggestedNameInfo != null && provider instanceof PreferrableNameSuggestionProvider && !((PreferrableNameSuggestionProvider)provider).shouldCheckOthers()) break;
|
||||
}
|
||||
final LookupElement[] items = new LookupElement[names.size()];
|
||||
final Iterator<String> iterator = names.iterator();
|
||||
for (int i = 0; i < items.length; i++) {
|
||||
items[i] = LookupElementBuilder.create(iterator.next());
|
||||
}
|
||||
return items;
|
||||
}
|
||||
}
|
||||
}
|
||||
return lookupItems;
|
||||
protected MyLookupExpression createLookupExpression() {
|
||||
return new MyIntroduceLookupExpression(getInitialName(), myNameSuggestions, myElementToRename, shouldSelectAll(), myAdvertisementText);
|
||||
}
|
||||
|
||||
private static class MyIntroduceLookupExpression extends MyLookupExpression {
|
||||
private final SmartPsiElementPointer<PsiNamedElement> myPointer;
|
||||
|
||||
public MyIntroduceLookupExpression(final String initialName,
|
||||
final LinkedHashSet<String> names,
|
||||
final PsiNamedElement elementToRename,
|
||||
final boolean shouldSelectAll,
|
||||
final String advertisementText) {
|
||||
super(initialName, names, elementToRename, shouldSelectAll, advertisementText);
|
||||
myPointer = SmartPointerManager.getInstance(elementToRename.getProject()).createSmartPsiElementPointer(elementToRename);
|
||||
}
|
||||
|
||||
@Override
|
||||
public LookupElement[] calculateLookupItems(ExpressionContext context) {
|
||||
return createLookupItems(myName, context.getEditor(), getElement());
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public PsiNamedElement getElement() {
|
||||
return myPointer.getElement();
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private LookupElement[] createLookupItems(String name, Editor editor, PsiNamedElement psiVariable) {
|
||||
TemplateState templateState = TemplateManagerImpl.getTemplateState(editor);
|
||||
if (psiVariable != null) {
|
||||
final TextResult insertedValue =
|
||||
templateState != null ? templateState.getVariableValue(PRIMARY_VARIABLE_NAME) : null;
|
||||
if (insertedValue != null) {
|
||||
final String text = insertedValue.getText();
|
||||
if (!text.isEmpty() && !Comparing.strEqual(text, name)) {
|
||||
final LinkedHashSet<String> names = new LinkedHashSet<String>();
|
||||
names.add(text);
|
||||
for (NameSuggestionProvider provider : Extensions.getExtensions(NameSuggestionProvider.EP_NAME)) {
|
||||
final SuggestedNameInfo suggestedNameInfo = provider.getSuggestedNames(psiVariable, psiVariable, names);
|
||||
if (suggestedNameInfo != null &&
|
||||
provider instanceof PreferrableNameSuggestionProvider &&
|
||||
!((PreferrableNameSuggestionProvider)provider).shouldCheckOthers()) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
final LookupElement[] items = new LookupElement[names.size()];
|
||||
final Iterator<String> iterator = names.iterator();
|
||||
for (int i = 0; i < items.length; i++) {
|
||||
items[i] = LookupElementBuilder.create(iterator.next());
|
||||
}
|
||||
return items;
|
||||
}
|
||||
}
|
||||
}
|
||||
return myLookupItems;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+6
-71
@@ -15,13 +15,9 @@
|
||||
*/
|
||||
package com.intellij.refactoring.rename.inplace;
|
||||
|
||||
import com.intellij.codeInsight.completion.InsertHandler;
|
||||
import com.intellij.codeInsight.completion.InsertionContext;
|
||||
import com.intellij.codeInsight.daemon.DaemonCodeAnalyzer;
|
||||
import com.intellij.codeInsight.daemon.impl.DaemonCodeAnalyzerImpl;
|
||||
import com.intellij.codeInsight.highlighting.HighlightManager;
|
||||
import com.intellij.codeInsight.lookup.LookupElement;
|
||||
import com.intellij.codeInsight.lookup.LookupElementBuilder;
|
||||
import com.intellij.codeInsight.lookup.LookupManager;
|
||||
import com.intellij.codeInsight.lookup.impl.LookupImpl;
|
||||
import com.intellij.codeInsight.template.*;
|
||||
@@ -43,7 +39,6 @@ import com.intellij.openapi.editor.colors.EditorColorsManager;
|
||||
import com.intellij.openapi.editor.impl.EditorImpl;
|
||||
import com.intellij.openapi.editor.markup.RangeHighlighter;
|
||||
import com.intellij.openapi.editor.markup.TextAttributes;
|
||||
import com.intellij.openapi.extensions.Extensions;
|
||||
import com.intellij.openapi.fileEditor.FileEditor;
|
||||
import com.intellij.openapi.fileEditor.FileEditorManager;
|
||||
import com.intellij.openapi.fileEditor.OpenFileDescriptor;
|
||||
@@ -60,7 +55,6 @@ import com.intellij.openapi.util.Pair;
|
||||
import com.intellij.openapi.util.TextRange;
|
||||
import com.intellij.openapi.vfs.VirtualFile;
|
||||
import com.intellij.psi.*;
|
||||
import com.intellij.psi.codeStyle.SuggestedNameInfo;
|
||||
import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil;
|
||||
import com.intellij.psi.search.LocalSearchScope;
|
||||
import com.intellij.psi.search.ProjectScope;
|
||||
@@ -68,8 +62,6 @@ import com.intellij.psi.search.PsiSearchHelper;
|
||||
import com.intellij.psi.search.SearchScope;
|
||||
import com.intellij.psi.search.searches.ReferencesSearch;
|
||||
import com.intellij.psi.util.PsiTreeUtil;
|
||||
import com.intellij.refactoring.rename.NameSuggestionProvider;
|
||||
import com.intellij.refactoring.rename.PreferrableNameSuggestionProvider;
|
||||
import com.intellij.refactoring.util.CommonRefactoringUtil;
|
||||
import com.intellij.util.containers.Stack;
|
||||
import org.jetbrains.annotations.NonNls;
|
||||
@@ -93,7 +85,7 @@ public abstract class InplaceRefactoring {
|
||||
protected final Editor myEditor;
|
||||
protected final Project myProject;
|
||||
protected RangeMarker myRenameOffset;
|
||||
private String myAdvertisementText;
|
||||
protected String myAdvertisementText;
|
||||
private ArrayList<RangeHighlighter> myHighlighters;
|
||||
protected String myInitialName;
|
||||
protected final String myOldName;
|
||||
@@ -205,7 +197,9 @@ public abstract class InplaceRefactoring {
|
||||
|
||||
protected abstract boolean shouldSelectAll();
|
||||
|
||||
protected abstract LookupElement[] createLookupItems(LookupElement[] lookupItems, String name);
|
||||
protected MyLookupExpression createLookupExpression() {
|
||||
return new MyLookupExpression(getInitialName(), myNameSuggestions, myElementToRename, shouldSelectAll(), myAdvertisementText);
|
||||
}
|
||||
|
||||
protected Collection<PsiReference> collectRefs(SearchScope referencesSearchScope) {
|
||||
return ReferencesSearch.search(myElementToRename, referencesSearchScope, false).findAll();
|
||||
@@ -536,8 +530,7 @@ public abstract class InplaceRefactoring {
|
||||
int offset) {
|
||||
if (reference.getElement() == selectedElement &&
|
||||
contains(reference.getRangeInElement().shiftRight(selectedElement.getTextRange().getStartOffset()), offset)) {
|
||||
Expression expression = new MyExpression(getInitialName(), myNameSuggestions);
|
||||
builder.replaceElement(reference, PRIMARY_VARIABLE_NAME, expression, true);
|
||||
builder.replaceElement(reference, PRIMARY_VARIABLE_NAME, createLookupExpression(), true);
|
||||
}
|
||||
else {
|
||||
builder.replaceElement(reference, OTHER_VARIABLE_NAME, PRIMARY_VARIABLE_NAME, false);
|
||||
@@ -555,8 +548,7 @@ public abstract class InplaceRefactoring {
|
||||
final PsiElement selectedElement,
|
||||
final TemplateBuilderImpl builder) {
|
||||
if (element == selectedElement) {
|
||||
Expression expression = new MyExpression(getInitialName(), myNameSuggestions);
|
||||
builder.replaceElement(element, PRIMARY_VARIABLE_NAME, expression, true);
|
||||
builder.replaceElement(element, PRIMARY_VARIABLE_NAME, createLookupExpression(), true);
|
||||
}
|
||||
else if (textRange != null) {
|
||||
builder.replaceElement(element, textRange, OTHER_VARIABLE_NAME, PRIMARY_VARIABLE_NAME, false);
|
||||
@@ -614,63 +606,6 @@ public abstract class InplaceRefactoring {
|
||||
return range.getStartOffset() <= offset && offset <= range.getEndOffset();
|
||||
}
|
||||
|
||||
protected class MyExpression extends Expression {
|
||||
private final String myName;
|
||||
private final LookupElement[] myLookupItems;
|
||||
|
||||
protected MyExpression(String name, LinkedHashSet<String> names) {
|
||||
myName = name;
|
||||
if (names == null) {
|
||||
names = new LinkedHashSet<String>();
|
||||
for (NameSuggestionProvider provider : Extensions.getExtensions(NameSuggestionProvider.EP_NAME)) {
|
||||
final SuggestedNameInfo suggestedNameInfo = provider.getSuggestedNames(myElementToRename, myElementToRename, names);
|
||||
if (suggestedNameInfo != null && provider instanceof PreferrableNameSuggestionProvider && !((PreferrableNameSuggestionProvider)provider).shouldCheckOthers()) break;
|
||||
}
|
||||
}
|
||||
myLookupItems = new LookupElement[names.size()];
|
||||
final Iterator<String> iterator = names.iterator();
|
||||
for (int i = 0; i < myLookupItems.length; i++) {
|
||||
final String suggestion = iterator.next();
|
||||
myLookupItems[i] = LookupElementBuilder.create(suggestion).setInsertHandler(new InsertHandler<LookupElement>() {
|
||||
@Override
|
||||
public void handleInsert(InsertionContext context, LookupElement item) {
|
||||
if (shouldSelectAll()) return;
|
||||
final Editor topLevelEditor = InjectedLanguageUtil.getTopLevelEditor(myEditor);
|
||||
final TemplateState templateState = TemplateManagerImpl.getTemplateState(topLevelEditor);
|
||||
if (templateState != null) {
|
||||
final TextRange range = templateState.getCurrentVariableRange();
|
||||
if (range != null) {
|
||||
topLevelEditor.getDocument().replaceString(range.getStartOffset(), range.getEndOffset(), suggestion);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
public LookupElement[] calculateLookupItems(ExpressionContext context) {
|
||||
return createLookupItems(myLookupItems, myName);
|
||||
}
|
||||
|
||||
public Result calculateQuickResult(ExpressionContext context) {
|
||||
return calculateResult(context);
|
||||
}
|
||||
|
||||
public Result calculateResult(ExpressionContext context) {
|
||||
TemplateState templateState = TemplateManagerImpl.getTemplateState(myEditor);
|
||||
final TextResult insertedValue = templateState != null ? templateState.getVariableValue(PRIMARY_VARIABLE_NAME) : null;
|
||||
if (insertedValue != null) {
|
||||
if (!insertedValue.getText().isEmpty()) return insertedValue;
|
||||
}
|
||||
return new TextResult(myName);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getAdvertisingText() {
|
||||
return myAdvertisementText;
|
||||
}
|
||||
}
|
||||
|
||||
private abstract class MyTemplateListener extends TemplateEditingAdapter {
|
||||
|
||||
protected abstract void restoreDaemonUpdateState();
|
||||
|
||||
+25
-9
@@ -16,15 +16,19 @@
|
||||
package com.intellij.refactoring.rename.inplace;
|
||||
|
||||
import com.intellij.codeInsight.lookup.LookupManager;
|
||||
import com.intellij.codeInsight.template.impl.TemplateManagerImpl;
|
||||
import com.intellij.codeInsight.template.impl.TemplateState;
|
||||
import com.intellij.lang.LanguageRefactoringSupport;
|
||||
import com.intellij.lang.refactoring.RefactoringSupportProvider;
|
||||
import com.intellij.openapi.actionSystem.DataContext;
|
||||
import com.intellij.openapi.command.impl.StartMarkAction;
|
||||
import com.intellij.openapi.editor.Editor;
|
||||
import com.intellij.openapi.util.Pass;
|
||||
import com.intellij.psi.PsiElement;
|
||||
import com.intellij.psi.PsiFile;
|
||||
import com.intellij.psi.PsiNameIdentifierOwner;
|
||||
import com.intellij.psi.PsiNamedElement;
|
||||
import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil;
|
||||
import com.intellij.psi.util.PsiTreeUtil;
|
||||
import com.intellij.refactoring.rename.RenamePsiElementProcessor;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
@@ -52,17 +56,29 @@ public class MemberInplaceRenameHandler extends VariableInplaceRenameHandler {
|
||||
if (elementToRename instanceof PsiNameIdentifierOwner) {
|
||||
final RenamePsiElementProcessor processor = RenamePsiElementProcessor.forElement(elementToRename);
|
||||
if (processor.isInplaceRenameSupported()) {
|
||||
processor.substituteElementToRename(elementToRename, editor, new Pass<PsiElement>() {
|
||||
@Override
|
||||
public void pass(PsiElement element) {
|
||||
final MemberInplaceRenamer renamer = new MemberInplaceRenamer((PsiNameIdentifierOwner)elementToRename, element, editor);
|
||||
boolean startedRename = renamer.performInplaceRename();
|
||||
if (!startedRename) {
|
||||
performDialogRename(elementToRename, editor, dataContext);
|
||||
final StartMarkAction startMarkAction = StartMarkAction.canStart(elementToRename.getProject());
|
||||
if (startMarkAction == null) {
|
||||
processor.substituteElementToRename(elementToRename, editor, new Pass<PsiElement>() {
|
||||
@Override
|
||||
public void pass(PsiElement element) {
|
||||
final MemberInplaceRenamer renamer = new MemberInplaceRenamer((PsiNameIdentifierOwner)elementToRename, element, editor);
|
||||
boolean startedRename = renamer.performInplaceRename();
|
||||
if (!startedRename) {
|
||||
performDialogRename(elementToRename, editor, dataContext);
|
||||
}
|
||||
}
|
||||
});
|
||||
return null;
|
||||
}
|
||||
else {
|
||||
final InplaceRefactoring inplaceRefactoring = editor.getUserData(InplaceRefactoring.INPLACE_RENAMER);
|
||||
if (inplaceRefactoring != null && inplaceRefactoring.getClass() == MemberInplaceRenamer.class) {
|
||||
final TemplateState templateState = TemplateManagerImpl.getTemplateState(InjectedLanguageUtil.getTopLevelEditor(editor));
|
||||
if (templateState != null) {
|
||||
templateState.gotoEnd(true);
|
||||
}
|
||||
}
|
||||
});
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
performDialogRename(elementToRename, editor, dataContext);
|
||||
|
||||
+3
-6
@@ -233,12 +233,9 @@ public class MemberInplaceRenamer extends VariableInplaceRenamer {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void finish(boolean success) {
|
||||
super.finish(success);
|
||||
if (success) {
|
||||
((EditorImpl)InjectedLanguageUtil.getTopLevelEditor(myEditor)).startDumb();
|
||||
revertState();
|
||||
}
|
||||
protected void revertStateOnFinish() {
|
||||
((EditorImpl)InjectedLanguageUtil.getTopLevelEditor(myEditor)).startDumb();
|
||||
revertState();
|
||||
}
|
||||
|
||||
@Nullable
|
||||
|
||||
+116
@@ -0,0 +1,116 @@
|
||||
/*
|
||||
* Copyright 2000-2012 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.refactoring.rename.inplace;
|
||||
|
||||
import com.intellij.codeInsight.completion.InsertHandler;
|
||||
import com.intellij.codeInsight.completion.InsertionContext;
|
||||
import com.intellij.codeInsight.lookup.LookupElement;
|
||||
import com.intellij.codeInsight.lookup.LookupElementBuilder;
|
||||
import com.intellij.codeInsight.template.Expression;
|
||||
import com.intellij.codeInsight.template.ExpressionContext;
|
||||
import com.intellij.codeInsight.template.Result;
|
||||
import com.intellij.codeInsight.template.TextResult;
|
||||
import com.intellij.codeInsight.template.impl.TemplateManagerImpl;
|
||||
import com.intellij.codeInsight.template.impl.TemplateState;
|
||||
import com.intellij.openapi.editor.Editor;
|
||||
import com.intellij.openapi.extensions.Extensions;
|
||||
import com.intellij.openapi.util.TextRange;
|
||||
import com.intellij.psi.PsiNamedElement;
|
||||
import com.intellij.psi.codeStyle.SuggestedNameInfo;
|
||||
import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil;
|
||||
import com.intellij.refactoring.rename.NameSuggestionProvider;
|
||||
import com.intellij.refactoring.rename.PreferrableNameSuggestionProvider;
|
||||
|
||||
import java.util.Iterator;
|
||||
import java.util.LinkedHashSet;
|
||||
|
||||
/**
|
||||
* User: anna
|
||||
* Date: 3/16/12
|
||||
*/
|
||||
public class MyLookupExpression extends Expression {
|
||||
protected final String myName;
|
||||
protected final LookupElement[] myLookupItems;
|
||||
private final String myAdvertisementText;
|
||||
|
||||
public MyLookupExpression(final String name,
|
||||
final LinkedHashSet<String> names,
|
||||
final PsiNamedElement elementToRename,
|
||||
final boolean shouldSelectAll,
|
||||
final String advertisement) {
|
||||
myName = name;
|
||||
myAdvertisementText = advertisement;
|
||||
myLookupItems = initLookupItems(names, elementToRename, shouldSelectAll);
|
||||
}
|
||||
|
||||
private static LookupElement[] initLookupItems(LinkedHashSet<String> names,
|
||||
PsiNamedElement elementToRename,
|
||||
final boolean shouldSelectAll) {
|
||||
if (names == null) {
|
||||
names = new LinkedHashSet<String>();
|
||||
for (NameSuggestionProvider provider : Extensions.getExtensions(NameSuggestionProvider.EP_NAME)) {
|
||||
final SuggestedNameInfo suggestedNameInfo = provider.getSuggestedNames(elementToRename, elementToRename, names);
|
||||
if (suggestedNameInfo != null &&
|
||||
provider instanceof PreferrableNameSuggestionProvider &&
|
||||
!((PreferrableNameSuggestionProvider)provider).shouldCheckOthers()) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
final LookupElement[] lookupElements = new LookupElement[names.size()];
|
||||
final Iterator<String> iterator = names.iterator();
|
||||
for (int i = 0; i < lookupElements.length; i++) {
|
||||
final String suggestion = iterator.next();
|
||||
lookupElements[i] = LookupElementBuilder.create(suggestion).setInsertHandler(new InsertHandler<LookupElement>() {
|
||||
@Override
|
||||
public void handleInsert(InsertionContext context, LookupElement item) {
|
||||
if (shouldSelectAll) return;
|
||||
final Editor topLevelEditor = InjectedLanguageUtil.getTopLevelEditor(context.getEditor());
|
||||
final TemplateState templateState = TemplateManagerImpl.getTemplateState(topLevelEditor);
|
||||
if (templateState != null) {
|
||||
final TextRange range = templateState.getCurrentVariableRange();
|
||||
if (range != null) {
|
||||
topLevelEditor.getDocument().replaceString(range.getStartOffset(), range.getEndOffset(), suggestion);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
return lookupElements;
|
||||
}
|
||||
|
||||
public LookupElement[] calculateLookupItems(ExpressionContext context) {
|
||||
return myLookupItems;
|
||||
}
|
||||
|
||||
public Result calculateQuickResult(ExpressionContext context) {
|
||||
return calculateResult(context);
|
||||
}
|
||||
|
||||
public Result calculateResult(ExpressionContext context) {
|
||||
TemplateState templateState = TemplateManagerImpl.getTemplateState(context.getEditor());
|
||||
final TextResult insertedValue = templateState != null ? templateState.getVariableValue(InplaceRefactoring.PRIMARY_VARIABLE_NAME) : null;
|
||||
if (insertedValue != null) {
|
||||
if (!insertedValue.getText().isEmpty()) return insertedValue;
|
||||
}
|
||||
return new TextResult(myName);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getAdvertisingText() {
|
||||
return myAdvertisementText;
|
||||
}
|
||||
}
|
||||
+20
-6
@@ -15,7 +15,6 @@
|
||||
*/
|
||||
package com.intellij.refactoring.rename.inplace;
|
||||
|
||||
import com.intellij.codeInsight.lookup.LookupElement;
|
||||
import com.intellij.lang.Language;
|
||||
import com.intellij.lang.LanguageExtension;
|
||||
import com.intellij.lang.LanguageNamesValidation;
|
||||
@@ -192,6 +191,9 @@ public class VariableInplaceRenamer extends InplaceRefactoring {
|
||||
protected void performRefactoringRename(final String newName,
|
||||
final StartMarkAction markAction) {
|
||||
try {
|
||||
if (!isIdentifier(newName)) {
|
||||
return;
|
||||
}
|
||||
PsiNamedElement elementToRename = getVariable();
|
||||
if (elementToRename != null) {
|
||||
new WriteCommandAction(myProject, getCommandName()) {
|
||||
@@ -288,14 +290,26 @@ public class VariableInplaceRenamer extends InplaceRefactoring {
|
||||
return bind;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void finish(boolean success) {
|
||||
super.finish(success);
|
||||
if (success) {
|
||||
revertStateOnFinish();
|
||||
}
|
||||
else {
|
||||
((EditorImpl)InjectedLanguageUtil.getTopLevelEditor(myEditor)).stopDumb();
|
||||
}
|
||||
}
|
||||
|
||||
protected void revertStateOnFinish() {
|
||||
if (!isIdentifier(myInsertedName)) {
|
||||
revertState();
|
||||
}
|
||||
}
|
||||
|
||||
private boolean isIdentifier(final String newName) {
|
||||
|
||||
final NamesValidator namesValidator = LanguageNamesValidation.INSTANCE.forLanguage(myLanguage);
|
||||
return namesValidator == null || namesValidator.isIdentifier(newName, myProject);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected LookupElement[] createLookupItems(final LookupElement[] lookupItems, final String name) {
|
||||
return lookupItems;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -139,9 +139,9 @@ class ChangeTrackingValueContainer<Value> extends UpdatableValueContainer<Value>
|
||||
final ValueContainerImpl<Value> newMerged;
|
||||
|
||||
if (fromDisk instanceof ValueContainerImpl) {
|
||||
newMerged = ((ValueContainerImpl<Value>)fromDisk).clone();
|
||||
newMerged = ((ValueContainerImpl<Value>)fromDisk).copy();
|
||||
} else {
|
||||
newMerged = ((ChangeTrackingValueContainer<Value>)fromDisk).getMergedData().clone();
|
||||
newMerged = ((ChangeTrackingValueContainer<Value>)fromDisk).getMergedData().copy();
|
||||
}
|
||||
myInvalidated.forEach(new TIntProcedure() {
|
||||
@Override
|
||||
|
||||
@@ -234,6 +234,22 @@ class ValueContainerImpl<Value> extends UpdatableValueContainer<Value> implement
|
||||
}
|
||||
};
|
||||
|
||||
public ValueContainerImpl<Value> copy() {
|
||||
final ValueContainerImpl<Value> container = new ValueContainerImpl<Value>();
|
||||
myInputIdMapping.forEachEntry(new TObjectObjectProcedure<Value, Object>() {
|
||||
@Override
|
||||
public boolean execute(Value key, Object val) {
|
||||
if (val instanceof TIntHashSet) {
|
||||
container.myInputIdMapping.put(key, ((TIntHashSet)val).clone());
|
||||
} else {
|
||||
container.myInputIdMapping.put(key, val);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
});
|
||||
return container;
|
||||
}
|
||||
|
||||
private static class SingleValueIterator implements IntIterator {
|
||||
private final int myValue;
|
||||
private boolean myValueRead = false;
|
||||
|
||||
@@ -28,7 +28,6 @@ import com.intellij.openapi.components.Storage;
|
||||
import com.intellij.openapi.util.Disposer;
|
||||
import com.intellij.openapi.util.SystemInfo;
|
||||
import com.intellij.util.PlatformUtils;
|
||||
import com.intellij.util.ui.GraphicsUtil;
|
||||
import com.intellij.util.xmlb.Accessor;
|
||||
import com.intellij.util.xmlb.SerializationFilter;
|
||||
import com.intellij.util.xmlb.XmlSerializerUtil;
|
||||
@@ -300,7 +299,25 @@ public class UISettings implements PersistentStateComponent<UISettings>, Exporta
|
||||
UISettings uiSettings=getInstance();
|
||||
|
||||
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_OFF);
|
||||
GraphicsUtil.setupAntialiasing(g2d, uiSettings == null || uiSettings.ANTIALIASING_IN_EDITOR, true);
|
||||
if (uiSettings == null || uiSettings.ANTIALIASING_IN_EDITOR) {
|
||||
Toolkit tk = Toolkit.getDefaultToolkit();
|
||||
//noinspection HardCodedStringLiteral
|
||||
Map map = (Map)tk.getDesktopProperty("awt.font.desktophints");
|
||||
if (map != null) {
|
||||
if (isRemoteDesktopConnected()) {
|
||||
g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.VALUE_TEXT_ANTIALIAS_DEFAULT);
|
||||
}
|
||||
else {
|
||||
g2d.addRenderingHints(map);
|
||||
}
|
||||
}
|
||||
else {
|
||||
g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
|
||||
}
|
||||
}
|
||||
else {
|
||||
g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.VALUE_TEXT_ANTIALIAS_OFF);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
+7
-1
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2000-2009 JetBrains s.r.o.
|
||||
* Copyright 2000-2012 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.
|
||||
@@ -15,12 +15,18 @@
|
||||
*/
|
||||
package com.intellij.openapi.actionSystem;
|
||||
|
||||
import org.intellij.lang.annotations.MagicConstant;
|
||||
|
||||
public interface ActionButtonComponent {
|
||||
int NORMAL = 0;
|
||||
int POPPED = 1;
|
||||
int PUSHED = -1;
|
||||
int SELECTED = 2;
|
||||
|
||||
@MagicConstant(flags = {NORMAL, POPPED, PUSHED, SELECTED})
|
||||
@interface ButtonState { }
|
||||
|
||||
@ButtonState
|
||||
int getPopState();
|
||||
|
||||
int getWidth();
|
||||
|
||||
+3
-2
@@ -16,10 +16,11 @@
|
||||
package com.intellij.openapi.vfs.pointers;
|
||||
|
||||
import com.intellij.util.messages.Topic;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
public interface VirtualFilePointerListener {
|
||||
Topic<VirtualFilePointerListener> TOPIC = Topic.create("VirtualFilePointer", VirtualFilePointerListener.class);
|
||||
|
||||
void beforeValidityChanged(VirtualFilePointer[] pointers);
|
||||
void validityChanged(VirtualFilePointer[] pointers);
|
||||
void beforeValidityChanged(@NotNull VirtualFilePointer[] pointers);
|
||||
void validityChanged(@NotNull VirtualFilePointer[] pointers);
|
||||
}
|
||||
|
||||
@@ -53,11 +53,7 @@ public class JBOptionButton extends JButton implements MouseMotionListener {
|
||||
private boolean myOkToProcessDefaultMnemonics = true;
|
||||
|
||||
private IdeGlassPane myGlassPane;
|
||||
private final Disposable myDisposable = new Disposable() {
|
||||
@Override
|
||||
public void dispose() {
|
||||
}
|
||||
};
|
||||
private final Disposable myDisposable = Disposer.newDisposable();
|
||||
|
||||
public JBOptionButton(Action action, Action[] options) {
|
||||
super(action);
|
||||
|
||||
@@ -76,11 +76,7 @@ public class SwitchingSession implements KeyEventDispatcher, Disposable {
|
||||
};
|
||||
|
||||
private boolean myFadingAway;
|
||||
private Disposable myPainterDisposable = new Disposable() {
|
||||
@Override
|
||||
public void dispose() {
|
||||
}
|
||||
};
|
||||
private Disposable myPainterDisposable = Disposer.newDisposable();
|
||||
|
||||
public SwitchingSession(SwitchManager mgr, SwitchProvider provider, KeyEvent e, @Nullable SwitchTarget preselected, boolean showSpots) {
|
||||
myManager = mgr;
|
||||
|
||||
@@ -25,8 +25,6 @@ import org.jetbrains.annotations.NonNls;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
public class PathUtil {
|
||||
private PathUtil() {
|
||||
}
|
||||
@@ -63,8 +61,9 @@ public class PathUtil {
|
||||
|
||||
@NotNull
|
||||
public static String getJarPathForClass(@NotNull Class aClass) {
|
||||
String resourceRoot = PathManager.getResourceRoot(aClass, "/" + aClass.getName().replace('.', '/') + ".class");
|
||||
return new File(resourceRoot).getAbsoluteFile().getAbsolutePath();
|
||||
final String pathForClass = PathManager.getJarPathForClass(aClass);
|
||||
assert pathForClass != null : aClass;
|
||||
return pathForClass;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2000-2011 JetBrains s.r.o.
|
||||
* Copyright 2000-2012 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.
|
||||
@@ -15,7 +15,7 @@
|
||||
*/
|
||||
package com.intellij.help.impl;
|
||||
|
||||
import com.intellij.ide.ui.UISettings;
|
||||
import com.intellij.util.ui.GraphicsUtil;
|
||||
|
||||
import javax.help.DefaultHelpModel;
|
||||
import javax.help.HelpSet;
|
||||
@@ -53,7 +53,7 @@ class IdeaJHelp extends JHelp{
|
||||
|
||||
@Override
|
||||
public void paint(Graphics g) {
|
||||
UISettings.setupAntialiasing(g);
|
||||
GraphicsUtil.setupAntialiasing(g);
|
||||
super.paint(g);
|
||||
}
|
||||
}
|
||||
@@ -47,6 +47,8 @@ import java.util.*;
|
||||
public class ActionInstallPlugin extends AnAction implements DumbAware {
|
||||
final private static String updateMessage = IdeBundle.message("action.update.plugin");
|
||||
|
||||
private static final Set<IdeaPluginDescriptor> ourInstallingNodes = new HashSet<IdeaPluginDescriptor>();
|
||||
|
||||
private final PluginManagerMain installed;
|
||||
private final PluginManagerMain host;
|
||||
|
||||
@@ -65,6 +67,7 @@ public class ActionInstallPlugin extends AnAction implements DumbAware {
|
||||
for (IdeaPluginDescriptor descr : selection) {
|
||||
presentation.setText(IdeBundle.message("action.download.and.install.plugin"));
|
||||
presentation.setDescription(IdeBundle.message("action.download.and.install.plugin"));
|
||||
enabled &= !ourInstallingNodes.contains(descr);
|
||||
if (descr instanceof PluginNode) {
|
||||
enabled &= !PluginManagerColumnInfo.isDownloaded((PluginNode)descr);
|
||||
if (((PluginNode)descr).getStatus() == PluginNode.STATUS_INSTALLED) {
|
||||
@@ -108,6 +111,7 @@ public class ActionInstallPlugin extends AnAction implements DumbAware {
|
||||
|
||||
if (pluginNode != null) {
|
||||
list.add(pluginNode);
|
||||
ourInstallingNodes.add(pluginNode);
|
||||
}
|
||||
}
|
||||
try {
|
||||
@@ -143,7 +147,12 @@ public class ActionInstallPlugin extends AnAction implements DumbAware {
|
||||
}
|
||||
}
|
||||
};
|
||||
PluginManagerMain.downloadPlugins(list, host.getPluginsModel().view, onInstallRunnable);
|
||||
PluginManagerMain.downloadPlugins(list, host.getPluginsModel().view, onInstallRunnable, new Runnable(){
|
||||
@Override
|
||||
public void run() {
|
||||
ourInstallingNodes.removeAll(list);
|
||||
}
|
||||
});
|
||||
}
|
||||
catch (IOException e1) {
|
||||
PluginManagerMain.LOG.error(e1);
|
||||
|
||||
@@ -116,7 +116,9 @@ public class InstalledPluginsManagerMain extends PluginManagerMain {
|
||||
final Set<PluginId> notInstalled = new HashSet<PluginId>();
|
||||
final Set<PluginId> disabledIds = new HashSet<PluginId>();
|
||||
final PluginId[] dependentPluginIds = pluginDescriptor.getDependentPluginIds();
|
||||
final PluginId[] optionalDependentPluginIds = pluginDescriptor.getOptionalDependentPluginIds();
|
||||
for (PluginId id : dependentPluginIds) {
|
||||
if (Arrays.binarySearch(optionalDependentPluginIds, id) > -1) continue;
|
||||
final boolean disabled = ((InstalledPluginsTableModel)pluginsModel).isDisabled(id);
|
||||
final boolean enabled = ((InstalledPluginsTableModel)pluginsModel).isEnabled(id);
|
||||
if (!enabled && !disabled && !PluginManager.isModuleDependency(id)) {
|
||||
|
||||
@@ -288,7 +288,10 @@ public abstract class PluginManagerMain implements Disposable {
|
||||
loadPluginsFromHostInBackground();
|
||||
}
|
||||
|
||||
public static boolean downloadPlugins(final List<PluginNode> plugins, final List<IdeaPluginDescriptor> allPlugins, final Runnable onSuccess) throws IOException {
|
||||
public static boolean downloadPlugins(final List<PluginNode> plugins,
|
||||
final List<IdeaPluginDescriptor> allPlugins,
|
||||
final Runnable onSuccess,
|
||||
final Runnable cleanup) throws IOException {
|
||||
final boolean[] result = new boolean[1];
|
||||
try {
|
||||
ProgressManager.getInstance().run(new Task.Backgroundable(null, IdeBundle.message("progress.download.plugins"), true) {
|
||||
@@ -299,6 +302,18 @@ public abstract class PluginManagerMain implements Disposable {
|
||||
result[0] = true;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCancel() {
|
||||
cleanup.run();
|
||||
super.onCancel();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSuccess() {
|
||||
super.onSuccess();
|
||||
cleanup.run();
|
||||
}
|
||||
});
|
||||
}
|
||||
catch (RuntimeException e) {
|
||||
|
||||
+7
-5
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2000-2009 JetBrains s.r.o.
|
||||
* Copyright 2000-2012 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.
|
||||
@@ -32,12 +32,14 @@ public abstract class ActionButtonLook {
|
||||
paintBorder(g, button, getState(button));
|
||||
}
|
||||
|
||||
public abstract void paintBackground(Graphics g, JComponent component, int state);
|
||||
public abstract void paintBackground(Graphics g, JComponent component, @ActionButtonComponent.ButtonState int state);
|
||||
|
||||
public abstract void paintBorder(Graphics g, JComponent component, int state);
|
||||
public abstract void paintBorder(Graphics g, JComponent component, @ActionButtonComponent.ButtonState int state);
|
||||
|
||||
protected int getState(ActionButtonComponent button) { // Do NOT inline this method.
|
||||
// Because of compiler bug upcast from ButtonType to ActionButtonComponent is important
|
||||
@SuppressWarnings("MethodMayBeStatic")
|
||||
@ActionButtonComponent.ButtonState
|
||||
protected int getState(ActionButtonComponent button) {
|
||||
// DO NOT inline this method! Because of compiler bug up-cast from ButtonType to ActionButtonComponent is important!
|
||||
return button.getPopState();
|
||||
}
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user