diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/BytecodeAnalysisConverter.java b/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/BytecodeAnalysisConverter.java index c8cfeee241c9..b696f45a325c 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/BytecodeAnalysisConverter.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/BytecodeAnalysisConverter.java @@ -16,6 +16,7 @@ package com.intellij.codeInspection.bytecodeAnalysis; import com.intellij.openapi.progress.ProgressManager; +import com.intellij.openapi.util.ThreadLocalCachedValue; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.*; import com.intellij.psi.util.PsiTreeUtil; @@ -41,8 +42,24 @@ public class BytecodeAnalysisConverter { public static final int SIGNATURE_HASH_SIZE = 4; public static final int HASH_SIZE = CLASS_HASH_SIZE + SIGNATURE_HASH_SIZE; + private static final ThreadLocalCachedValue HASHER_CACHE = new ThreadLocalCachedValue() { + @Override + public MessageDigest create() { + try { + return MessageDigest.getInstance("MD5"); + } catch (NoSuchAlgorithmException exception) { + throw new RuntimeException(exception); + } + } + + @Override + protected void init(MessageDigest value) { + value.reset(); + } + }; + public static MessageDigest getMessageDigest() throws NoSuchAlgorithmException { - return MessageDigest.getInstance("MD5"); + return HASHER_CACHE.getValue(); } /** diff --git a/platform/lang-impl/src/com/intellij/find/impl/FindDialog.java b/platform/lang-impl/src/com/intellij/find/impl/FindDialog.java index 747393298e67..d44e4a25cb17 100644 --- a/platform/lang-impl/src/com/intellij/find/impl/FindDialog.java +++ b/platform/lang-impl/src/com/intellij/find/impl/FindDialog.java @@ -44,8 +44,6 @@ import com.intellij.openapi.progress.util.ProgressIndicatorUtils; import com.intellij.openapi.progress.util.ReadTask; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.*; -import com.intellij.openapi.ui.popup.JBPopup; -import com.intellij.openapi.ui.popup.JBPopupFactory; import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.registry.Registry; import com.intellij.openapi.util.text.StringUtil; @@ -58,7 +56,6 @@ import com.intellij.psi.PsiFile; import com.intellij.psi.PsiFileFactory; import com.intellij.psi.search.SearchScope; import com.intellij.ui.*; -import com.intellij.ui.awt.RelativePoint; import com.intellij.ui.components.JBScrollPane; import com.intellij.ui.table.JBTable; import com.intellij.usageView.UsageInfo; @@ -123,9 +120,11 @@ public class FindDialog extends DialogWrapper { protected JLabel myReplacePrompt; private HideableTitledPanel myScopePanel; private static boolean myPreviousResultsExpandedState; + private static boolean myPreviewResultsTabWasSelected; + private static final int RESULTS_PREVIEW_TAB_INDEX = 1; private JBTable myResultsPreviewTable; - private JBPopup myResultsPopup; + private TabbedPane myContent; private volatile ProgressIndicatorBase myResultsPreviewSearchProgress; public FindDialog(@NotNull Project project, @NotNull FindModel model, @NotNull Consumer myOkHandler){ @@ -179,6 +178,7 @@ public class FindDialog extends DialogWrapper { } myComboBoxListeners.clear(); if (myScopePanel != null) myPreviousResultsExpandedState = myScopePanel.isExpanded(); + if (myResultsPreviewTable != null) myPreviewResultsTabWasSelected = myContent.getSelectedIndex() == RESULTS_PREVIEW_TAB_INDEX; super.dispose(); } @@ -342,13 +342,9 @@ public class FindDialog extends DialogWrapper { myResultsPreviewTable.setModel(model); myResultsPreviewTable.getColumnModel().getColumn(0).setCellRenderer(new UsageTableCellRenderer()); - myResultsPopup = JBPopupFactory.getInstance().createComponentPopupBuilder(new JBScrollPane(myResultsPreviewTable), - myResultsPreviewTable) - .setRequestFocus(false).createPopup(); myResultsPreviewTable.getEmptyText().setText("Searching..."); - myResultsPopup.show(new RelativePoint(myInputComboBox, new Point(0, myInputComboBox.getHeight()))); final AtomicInteger resultsCount = new AtomicInteger(); ProgressIndicatorUtils.scheduleWithWriteActionPriority(myResultsPreviewSearchProgress, new ReadTask() { @@ -400,7 +396,6 @@ public class FindDialog extends DialogWrapper { private void finishPreviousPreviewSearch() { if (myResultsPreviewSearchProgress != null && !myResultsPreviewSearchProgress.isCanceled()) { myResultsPreviewSearchProgress.cancel(); - if (myResultsPopup != null) myResultsPopup.cancel(); } } @@ -518,6 +513,16 @@ public class FindDialog extends DialogWrapper { resultsOptionPanel.add(myCbToOpenInNewTab); } + if (myResultsPreviewTable != null) { + TabbedPane pane = new TabbedPaneImpl(SwingConstants.TOP); + pane.insertTab("Options", null, optionsPanel, null, 0); + pane.insertTab("Preview", null, new JBScrollPane(myResultsPreviewTable), null, RESULTS_PREVIEW_TAB_INDEX); + myContent = pane; + if (myPreviewResultsTabWasSelected) myContent.setSelectedIndex(RESULTS_PREVIEW_TAB_INDEX); + + return pane.getComponent(); + } + return optionsPanel; } @@ -1397,6 +1402,7 @@ public class FindDialog extends DialogWrapper { public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { myUsageRenderer.clear(); myFileAndLineNumber.clear(); + setBackground(isSelected && hasFocus ? UIUtil.getTableSelectionBackground() : UIUtil.getTableBackground()); if (value instanceof UsageInfo2UsageAdapter) { UsageInfo2UsageAdapter usageAdapter = (UsageInfo2UsageAdapter)value; diff --git a/platform/platform-resources-en/src/messages/FindBundle.properties b/platform/platform-resources-en/src/messages/FindBundle.properties index 818c84f1149f..cd107a4692fa 100644 --- a/platform/platform-resources-en/src/messages/FindBundle.properties +++ b/platform/platform-resources-en/src/messages/FindBundle.properties @@ -26,7 +26,7 @@ find.dialog.find.button=Find find.usages.in.file.dialog.title=Find Usages in File find.usages.dialog.title=Find Usages find.open.in.new.tab.checkbox=Open in new ta&b -find.options.group=Options +find.options.group=General find.options.search.for.text.occurences.checkbox=Search for text &occurrences find.options.skip.results.tab.with.one.usage.checkbox=S&kip results tab with one usage find.options.skip.results.tab.with.one.occurrence.checkbox=S&kip results tab when only one occurrence is found diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/serialization/SerializableStoresNonSerializableInspection.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/serialization/SerializableStoresNonSerializableInspection.java index bfe91f3f8963..dff5bbf147bc 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/serialization/SerializableStoresNonSerializableInspection.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/serialization/SerializableStoresNonSerializableInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2014 JetBrains s.r.o. + * Copyright 2000-2015 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. @@ -70,6 +70,9 @@ public class SerializableStoresNonSerializableInspection extends BaseInspection if (!(parent instanceof PsiDeclarationStatement) && !(aClass instanceof PsiAnonymousClass)) { return; } + if (!SerializationUtils.isSerializable(aClass)) { + return; + } final LocalVariableReferenceFinder visitor = new LocalVariableReferenceFinder(aClass); aClass.accept(visitor); } @@ -77,6 +80,15 @@ public class SerializableStoresNonSerializableInspection extends BaseInspection @Override public void visitLambdaExpression(PsiLambdaExpression lambda) { super.visitLambdaExpression(lambda); + final PsiType type = lambda.getFunctionalInterfaceType(); + if (!(type instanceof PsiClassType)) { + return; + } + final PsiClassType classType = (PsiClassType)type; + final PsiClass aClass = classType.resolve(); + if (!SerializationUtils.isSerializable(aClass)) { + return; + } final LocalVariableReferenceFinder visitor = new LocalVariableReferenceFinder(lambda); lambda.accept(visitor); } diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/serialization/serializable_stores_non_serializable/SerializableStoresNonSerializable.java b/plugins/InspectionGadgets/test/com/siyeh/igtest/serialization/serializable_stores_non_serializable/SerializableStoresNonSerializable.java index dd36daacc3ba..11612526142f 100644 --- a/plugins/InspectionGadgets/test/com/siyeh/igtest/serialization/serializable_stores_non_serializable/SerializableStoresNonSerializable.java +++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/serialization/serializable_stores_non_serializable/SerializableStoresNonSerializable.java @@ -1,6 +1,14 @@ class SerializableStoresNonSerializable { - void f(B b, C c) { + void f(final B b, final C c) { + new Object() { + @Override + public String toString() { + System.out.println(c); + System.out.println(b); + return super.toString(); + } + }; new A() { @Override public void m() { @@ -21,7 +29,7 @@ class SerializableStoresNonSerializable { } } } -interface A { +interface A extends java.io.Serializable { void m(); } class B {}